From 3ff46723b8cfec1d5c04bee8928809930dd20ce5 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Sat, 5 Mar 2022 00:30:50 -0600 Subject: [PATCH] initial commit --- .clang-format | 127 + .clang-tidy | 38 + .default_session | 1 + .gitignore | 15 + .jenkins_linux_builds | 283 + .jenkins_osx | 27 + .jenkins_windows | 23 + .nvimrc | 9 + .vim/coc-settings.json | 101 + .vimspector.json | 20 + 3rd_party/cacert.pem | 3311 +++ 3rd_party/config.guess | 1667 ++ 3rd_party/config.sub | 1793 ++ 3rd_party/glue/pthread.h | 38 + 3rd_party/glue/strings.h | 9 + 3rd_party/glue/sys/socket.h | 6 + 3rd_party/glue/sys/time.h | 8 + 3rd_party/glue/unistd.h | 8 + 3rd_party/json/json.hpp | 22109 ++++++++++++++++ 3rd_party/jsonrpcpp-1.1.1/.gitignore | 33 + 3rd_party/jsonrpcpp-1.1.1/.travis.yml | 29 + 3rd_party/jsonrpcpp-1.1.1/CMakeLists.txt | 65 + 3rd_party/jsonrpcpp-1.1.1/LICENSE | 21 + 3rd_party/jsonrpcpp-1.1.1/Makefile | 19 + 3rd_party/jsonrpcpp-1.1.1/README.md | 75 + .../jsonrpcpp-1.1.1/cmake/jsonrpcpp.pc.cmake | 12 + 3rd_party/jsonrpcpp-1.1.1/jsonrpctest.cpp | 244 + 3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.cpp | 1017 + 3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.hpp | 461 + .../.github/ISSUE_TEMPLATE/bug_report.md | 56 + .../.github/ISSUE_TEMPLATE/feature_request.md | 23 + .../.github/PULL_REQUEST_TEMPLATE/bug_fix.md | 59 + .../PULL_REQUEST_TEMPLATE/documentation.md | 30 + .../PULL_REQUEST_TEMPLATE/feature_change.md | 62 + .../performance_improvement.md | 55 + .../.github/workflows/codeql-analysis.yml | 73 + 3rd_party/libhttpserver-0.18.2/.gitignore | 59 + 3rd_party/libhttpserver-0.18.2/.gitmodules | 0 3rd_party/libhttpserver-0.18.2/.travis.yml | 358 + 3rd_party/libhttpserver-0.18.2/AUTHORS | 44 + .../libhttpserver-0.18.2/CODE_OF_CONDUCT.md | 76 + .../libhttpserver-0.18.2/CONTRIBUTING.md | 229 + 3rd_party/libhttpserver-0.18.2/COPYING.LESSER | 504 + 3rd_party/libhttpserver-0.18.2/ChangeLog | 290 + 3rd_party/libhttpserver-0.18.2/INSTALL | 367 + 3rd_party/libhttpserver-0.18.2/LICENSE | 504 + 3rd_party/libhttpserver-0.18.2/Makefile.am | 61 + 3rd_party/libhttpserver-0.18.2/Makefile.cvs | 27 + 3rd_party/libhttpserver-0.18.2/NEWS | 0 .../PULL_REQUEST_TEMPLATE.md | 10 + .../libhttpserver-0.18.2/README.CentOS-7 | 7 + 3rd_party/libhttpserver-0.18.2/README.FreeBSD | 9 + 3rd_party/libhttpserver-0.18.2/README.md | 1945 ++ 3rd_party/libhttpserver-0.18.2/acinclude.m4 | 321 + 3rd_party/libhttpserver-0.18.2/aminclude.am | 186 + 3rd_party/libhttpserver-0.18.2/appveyor.yml | 24 + 3rd_party/libhttpserver-0.18.2/bootstrap | 36 + .../libhttpserver-0.18.2/ci-report-coverage | 19 + .../cmakemodule/FindLibHttpServer.cmake | 31 + 3rd_party/libhttpserver-0.18.2/configure.ac | 378 + .../libhttpserver-0.18.2/custom_iwyu.imp | 17 + .../libhttpserver-0.18.2/doc/Makefile.am | 20 + .../libhttpserver-0.18.2/doc/libhttpserver.3 | 59 + .../libhttpserver-0.18.2/examples/Makefile.am | 43 + .../libhttpserver-0.18.2/examples/README.md | 58 + .../examples/allowing_disallowing_methods.cpp | 42 + .../examples/basic_authentication.cpp | 46 + .../examples/benchmark_nodelay.cpp | 42 + .../examples/benchmark_select.cpp | 41 + .../examples/benchmark_threads.cpp | 40 + .../libhttpserver-0.18.2/examples/cert.pem | 17 + .../examples/custom_access_log.cpp | 47 + .../examples/custom_error.cpp | 54 + .../examples/deferred_with_accumulator.cpp | 74 + .../examples/digest_authentication.cpp | 51 + .../examples/handlers.cpp | 45 + .../examples/hello_with_get_arg.cpp | 40 + .../examples/hello_world.cpp | 67 + .../libhttpserver-0.18.2/examples/key.pem | 27 + .../examples/minimal_deferred.cpp | 55 + .../examples/minimal_file_response.cpp | 42 + .../examples/minimal_hello_world.cpp | 40 + .../examples/minimal_https.cpp | 43 + .../examples/minimal_ip_ban.cpp | 43 + .../libhttpserver-0.18.2/examples/service.cpp | 242 + .../examples/setting_headers.cpp | 42 + .../examples/test_content | 1 + .../examples/url_registration.cpp | 63 + .../libhttpserver-0.18.2/m4/ax_have_epoll.m4 | 104 + .../m4/ax_valgrind_check.m4 | 239 + 3rd_party/libhttpserver-0.18.2/m4/python.m4 | 168 + .../libhttpserver-0.18.2/src/Makefile.am | 46 + .../src/basic_auth_fail_response.cpp | 41 + .../src/deferred_response.cpp | 41 + .../src/details/http_endpoint.cpp | 194 + .../src/digest_auth_fail_response.cpp | 43 + .../src/file_response.cpp | 52 + 3rd_party/libhttpserver-0.18.2/src/gettext.h | 111 + .../libhttpserver-0.18.2/src/http_request.cpp | 316 + .../src/http_resource.cpp | 55 + .../src/http_response.cpp | 83 + .../libhttpserver-0.18.2/src/http_utils.cpp | 627 + .../libhttpserver-0.18.2/src/httpserver.hpp | 37 + .../httpserver/basic_auth_fail_response.hpp | 68 + .../src/httpserver/create_webserver.hpp | 306 + .../src/httpserver/deferred_response.hpp | 87 + .../src/httpserver/details/http_endpoint.hpp | 206 + .../src/httpserver/details/modded_request.hpp | 76 + .../httpserver/digest_auth_fail_response.hpp | 75 + .../src/httpserver/file_response.hpp | 67 + .../src/httpserver/http_request.hpp | 355 + .../src/httpserver/http_resource.hpp | 225 + .../src/httpserver/http_response.hpp | 157 + .../src/httpserver/http_utils.hpp | 395 + .../src/httpserver/string_response.hpp | 68 + .../src/httpserver/string_utilities.hpp | 51 + .../src/httpserver/webserver.hpp | 251 + .../src/string_response.cpp | 42 + .../src/string_utilities.cpp | 85 + .../libhttpserver-0.18.2/src/webserver.cpp | 650 + .../libhttpserver-0.18.2/test/Makefile.am | 50 + 3rd_party/libhttpserver-0.18.2/test/cert.pem | 17 + .../test/integ/authentication.cpp | 231 + .../test/integ/ban_system.cpp | 166 + .../libhttpserver-0.18.2/test/integ/basic.cpp | 1016 + .../test/integ/deferred.cpp | 165 + .../test/integ/nodelay.cpp | 75 + .../test/integ/threaded.cpp | 75 + .../test/integ/ws_start_stop.cpp | 607 + 3rd_party/libhttpserver-0.18.2/test/key.pem | 27 + .../test/libhttpserver.supp | 5 + .../libhttpserver-0.18.2/test/littletest.hpp | 591 + .../libhttpserver-0.18.2/test/test_content | 1 + .../test/test_root_ca.pem | 25 + .../test/unit/http_endpoint_test.cpp | 353 + .../test/unit/http_utils_test.cpp | 608 + .../test/unit/string_utilities_test.cpp | 98 + 3rd_party/libmicrohttpd/build.cmd | 5 + 3rd_party/ttmath-0.9.3/CHANGELOG | 601 + 3rd_party/ttmath-0.9.3/COPYRIGHT | 28 + 3rd_party/ttmath-0.9.3/README | 23 + 3rd_party/ttmath-0.9.3/samples/Makefile | 46 + 3rd_party/ttmath-0.9.3/samples/big.cpp | 100 + 3rd_party/ttmath-0.9.3/samples/big2.cpp | 113 + 3rd_party/ttmath-0.9.3/samples/int.cpp | 92 + 3rd_party/ttmath-0.9.3/samples/parser.cpp | 39 + 3rd_party/ttmath-0.9.3/samples/uint.cpp | 93 + 3rd_party/ttmath-0.9.3/ttmath/ttmath.h | 2853 ++ 3rd_party/ttmath-0.9.3/ttmath/ttmathbig.h | 6045 +++++ 3rd_party/ttmath-0.9.3/ttmath/ttmathdec.h | 419 + 3rd_party/ttmath-0.9.3/ttmath/ttmathint.h | 1922 ++ 3rd_party/ttmath-0.9.3/ttmath/ttmathmisc.h | 250 + 3rd_party/ttmath-0.9.3/ttmath/ttmathobjects.h | 809 + 3rd_party/ttmath-0.9.3/ttmath/ttmathparser.h | 2777 ++ 3rd_party/ttmath-0.9.3/ttmath/ttmaththreads.h | 250 + 3rd_party/ttmath-0.9.3/ttmath/ttmathtypes.h | 676 + 3rd_party/ttmath-0.9.3/ttmath/ttmathuint.h | 4165 +++ .../ttmath-0.9.3/ttmath/ttmathuint_noasm.h | 1017 + .../ttmath-0.9.3/ttmath/ttmathuint_x86.h | 1602 ++ .../ttmath-0.9.3/ttmath/ttmathuint_x86_64.h | 1146 + .../ttmath/ttmathuint_x86_64_msvc.asm | 548 + 3rd_party/winfsp-1.10/License.txt | 708 + 3rd_party/winfsp-1.10/bin/diag.bat | 29 + 3rd_party/winfsp-1.10/bin/fsptool-x64.exe | Bin 0 -> 10240 bytes 3rd_party/winfsp-1.10/bin/fsptool-x86.exe | Bin 0 -> 9216 bytes 3rd_party/winfsp-1.10/bin/fsreg.bat | 42 + 3rd_party/winfsp-1.10/bin/launchctl-x64.exe | Bin 0 -> 7168 bytes 3rd_party/winfsp-1.10/bin/launchctl-x86.exe | Bin 0 -> 7168 bytes 3rd_party/winfsp-1.10/bin/launcher-x64.exe | Bin 0 -> 26112 bytes 3rd_party/winfsp-1.10/bin/launcher-x86.exe | Bin 0 -> 20480 bytes .../winfsp-1.10/bin/memfs-dotnet-msil.exe | Bin 0 -> 26624 bytes 3rd_party/winfsp-1.10/bin/memfs-x64.exe | Bin 0 -> 152576 bytes 3rd_party/winfsp-1.10/bin/memfs-x86.exe | Bin 0 -> 123392 bytes 3rd_party/winfsp-1.10/bin/winfsp-msil.dll | Bin 0 -> 178176 bytes 3rd_party/winfsp-1.10/bin/winfsp-msil.xml | 1345 + 3rd_party/winfsp-1.10/bin/winfsp-x64.dll | Bin 0 -> 173056 bytes 3rd_party/winfsp-1.10/bin/winfsp-x64.sys | Bin 0 -> 173840 bytes 3rd_party/winfsp-1.10/bin/winfsp-x86.dll | Bin 0 -> 141312 bytes 3rd_party/winfsp-1.10/bin/winfsp-x86.sys | Bin 0 -> 148240 bytes 3rd_party/winfsp-1.10/inc/fuse/fuse.h | 269 + 3rd_party/winfsp-1.10/inc/fuse/fuse_common.h | 199 + 3rd_party/winfsp-1.10/inc/fuse/fuse_opt.h | 133 + 3rd_party/winfsp-1.10/inc/fuse/winfsp_fuse.h | 434 + 3rd_party/winfsp-1.10/inc/fuse3/fuse.h | 338 + 3rd_party/winfsp-1.10/inc/fuse3/fuse_common.h | 238 + 3rd_party/winfsp-1.10/inc/fuse3/fuse_opt.h | 23 + 3rd_party/winfsp-1.10/inc/fuse3/winfsp_fuse.h | 82 + 3rd_party/winfsp-1.10/inc/winfsp/fsctl.h | 690 + 3rd_party/winfsp-1.10/inc/winfsp/launch.h | 349 + 3rd_party/winfsp-1.10/inc/winfsp/winfsp.h | 2191 ++ 3rd_party/winfsp-1.10/inc/winfsp/winfsp.hpp | 1320 + 3rd_party/winfsp-1.10/lib/fuse.pc | 11 + 3rd_party/winfsp-1.10/lib/fuse3.pc | 11 + 3rd_party/winfsp-1.10/lib/winfsp-x64.lib | Bin 0 -> 52896 bytes 3rd_party/winfsp-1.10/lib/winfsp-x86.lib | Bin 0 -> 54030 bytes 3rd_party/winfsp-1.10/samples/airfs/airfs.cpp | 1448 + 3rd_party/winfsp-1.10/samples/airfs/airfs.sln | 28 + .../winfsp-1.10/samples/airfs/airfs.vcxproj | 182 + .../samples/airfs/airfs.vcxproj.filters | 22 + 3rd_party/winfsp-1.10/samples/airfs/common.h | 210 + .../winfsp-1.10/samples/airfs/persistence.cpp | 594 + .../samples/memfs-dotnet/Program.cs | 1526 ++ .../winfsp-1.10/samples/memfs-fuse/Makefile | 18 + .../winfsp-1.10/samples/memfs-fuse/README.md | 7 + .../winfsp-1.10/samples/memfs-fuse/compat.h | 104 + .../samples/memfs-fuse/memfs-fuse.cpp | 693 + .../samples/memfs-fuse/memfs-fuse.sln | 28 + .../samples/memfs-fuse/memfs-fuse.vcxproj | 189 + .../memfs-fuse/memfs-fuse.vcxproj.filters | 19 + .../winfsp-1.10/samples/memfs-fuse3/Makefile | 18 + .../winfsp-1.10/samples/memfs-fuse3/README.md | 7 + .../winfsp-1.10/samples/memfs-fuse3/compat.h | 104 + .../samples/memfs-fuse3/memfs-fuse3.cpp | 619 + .../samples/memfs-fuse3/memfs-fuse3.sln | 28 + .../samples/memfs-fuse3/memfs-fuse3.vcxproj | 189 + .../memfs-fuse3/memfs-fuse3.vcxproj.filters | 19 + .../winfsp-1.10/samples/memfs/memfs-main.c | 241 + 3rd_party/winfsp-1.10/samples/memfs/memfs.cpp | 2509 ++ 3rd_party/winfsp-1.10/samples/memfs/memfs.h | 79 + .../samples/notifyfs-dotnet/Program.cs | 394 + .../notifyfs-dotnet/notifyfs-dotnet.csproj | 77 + .../notifyfs-dotnet/notifyfs-dotnet.sln | 25 + .../winfsp-1.10/samples/notifyfs/notifyfs.c | 508 + .../winfsp-1.10/samples/notifyfs/notifyfs.sln | 31 + .../samples/notifyfs/notifyfs.vcxproj | 175 + .../samples/notifyfs/notifyfs.vcxproj.filters | 14 + .../samples/passthrough-dotnet/Program.cs | 859 + .../passthrough-dotnet.csproj | 84 + .../passthrough-dotnet/passthrough-dotnet.sln | 22 + .../samples/passthrough-fuse/Makefile | 18 + .../samples/passthrough-fuse/README.md | 7 + .../passthrough-fuse/passthrough-fuse.c | 417 + .../passthrough-fuse/passthrough-fuse.sln | 28 + .../passthrough-fuse/passthrough-fuse.vcxproj | 190 + .../passthrough-fuse.vcxproj.filters | 22 + .../samples/passthrough-fuse/winposix.c | 892 + .../samples/passthrough-fuse/winposix.h | 86 + .../samples/passthrough-fuse3/Makefile | 18 + .../samples/passthrough-fuse3/README.md | 7 + .../passthrough-fuse3/passthrough-fuse3.c | 369 + .../passthrough-fuse3/passthrough-fuse3.sln | 28 + .../passthrough-fuse3.vcxproj | 190 + .../passthrough-fuse3.vcxproj.filters | 21 + .../samples/passthrough-fuse3/winposix.c | 892 + .../samples/passthrough-fuse3/winposix.h | 86 + .../samples/passthrough/passthrough.c | 940 + .../samples/passthrough/passthrough.sln | 28 + .../samples/passthrough/passthrough.vcxproj | 182 + .../passthrough/passthrough.vcxproj.filters | 14 + 3rd_party/winfsp-1.10/sym/fsptool-x64.pdb | Bin 0 -> 77824 bytes 3rd_party/winfsp-1.10/sym/fsptool-x86.pdb | Bin 0 -> 86016 bytes 3rd_party/winfsp-1.10/sym/launchctl-x64.pdb | Bin 0 -> 77824 bytes 3rd_party/winfsp-1.10/sym/launchctl-x86.pdb | Bin 0 -> 86016 bytes 3rd_party/winfsp-1.10/sym/launcher-x64.pdb | Bin 0 -> 94208 bytes 3rd_party/winfsp-1.10/sym/launcher-x86.pdb | Bin 0 -> 102400 bytes 3rd_party/winfsp-1.10/sym/memfs-x64.pdb | Bin 0 -> 479232 bytes 3rd_party/winfsp-1.10/sym/memfs-x86.pdb | Bin 0 -> 536576 bytes 3rd_party/winfsp-1.10/sym/winfsp-x64.dll.pdb | Bin 0 -> 266240 bytes 3rd_party/winfsp-1.10/sym/winfsp-x64.sys.pdb | Bin 0 -> 307200 bytes 3rd_party/winfsp-1.10/sym/winfsp-x86.dll.pdb | Bin 0 -> 307200 bytes 3rd_party/winfsp-1.10/sym/winfsp-x86.sys.pdb | Bin 0 -> 372736 bytes CHANGELOG.md | 20 + CMakeLists.txt | 508 + CONTRIBUTORS.md | 8 + CPPLINT.cfg | 2 + LICENSE.md | 923 + README.md | 498 + arm64/debian10 | 39 + arm64/debian11 | 39 + arm64/debian9 | 39 + bin/7za.dll | Bin 0 -> 381952 bytes bin/7za.exe | Bin 0 -> 1152000 bytes bin/7zxa.dll | Bin 0 -> 209408 bytes bin/b64.exe | Bin 0 -> 7680 bytes bin/curl/BUILD-HOMEPAGE.url | 2 + bin/curl/BUILD-README.txt | 3 + bin/curl/CHANGES.txt | 7904 ++++++ bin/curl/COPYING-brotli.txt | 19 + bin/curl/COPYING-libssh2.txt | 42 + bin/curl/COPYING-nghttp2.txt | 23 + bin/curl/COPYING-zlib.txt | 115 + bin/curl/COPYING.txt | 22 + bin/curl/LICENSE-openssl.txt | 125 + bin/curl/README.txt | 55 + bin/curl/RELEASE-NOTES.txt | 250 + bin/curl/bin/curl-ca-bundle.crt | 3507 +++ bin/curl/bin/curl.exe | Bin 0 -> 4119672 bytes bin/curl/bin/libcurl-x64.dll | Bin 0 -> 1020024 bytes bin/curl/docs/ALTSVC.md | 59 + bin/curl/docs/BINDINGS.md | 118 + bin/curl/docs/BUG-BOUNTY.md | 106 + bin/curl/docs/BUGS.txt | 302 + bin/curl/docs/CHECKSRC.md | 162 + bin/curl/docs/CIPHERS.md | 503 + bin/curl/docs/CODE_OF_CONDUCT.md | 32 + bin/curl/docs/CODE_STYLE.md | 246 + bin/curl/docs/CONTRIBUTE.md | 267 + bin/curl/docs/DEPRECATE.md | 21 + bin/curl/docs/FAQ.txt | 1559 ++ bin/curl/docs/FEATURES.txt | 204 + bin/curl/docs/GOVERNANCE.md | 144 + bin/curl/docs/HELP-US.md | 70 + bin/curl/docs/HISTORY.md | 346 + bin/curl/docs/HTTP-COOKIES.md | 113 + bin/curl/docs/HTTP2.md | 127 + bin/curl/docs/INSTALL.md | 468 + bin/curl/docs/INSTALL.txt | 9 + bin/curl/docs/INTERNALS.md | 1100 + bin/curl/docs/KNOWN_BUGS.txt | 759 + bin/curl/docs/LICENSE-MIXING.md | 123 + bin/curl/docs/MAIL-ETIQUETTE.txt | 285 + bin/curl/docs/README.md | 12 + bin/curl/docs/RELEASE-PROCEDURE.md | 98 + bin/curl/docs/RESOURCES.txt | 85 + bin/curl/docs/ROADMAP.md | 59 + bin/curl/docs/SECURITY-PROCESS.md | 132 + bin/curl/docs/SSL-PROBLEMS.md | 87 + bin/curl/docs/SSLCERTS.md | 173 + bin/curl/docs/THANKS.txt | 1959 ++ bin/curl/docs/TODO.txt | 1324 + bin/curl/docs/TheArtOfHttpScripting.txt | 758 + bin/curl/docs/VERSIONS.txt | 56 + bin/curl/docs/libcurl/ABI.txt | 68 + bin/curl/docs/libcurl/symbols-in-versions.txt | 946 + bin/curl/include/curl/curl.h | 2867 ++ bin/curl/include/curl/curlver.h | 77 + bin/curl/include/curl/easy.h | 112 + bin/curl/include/curl/mprintf.h | 50 + bin/curl/include/curl/multi.h | 441 + bin/curl/include/curl/stdcheaders.h | 33 + bin/curl/include/curl/system.h | 493 + bin/curl/include/curl/typecheck-gcc.h | 694 + bin/curl/include/curl/urlapi.h | 123 + bin/curl/lib/libcurl.a | Bin 0 -> 806000 bytes bin/curl/lib/libcurl.dll.a | Bin 0 -> 50866 bytes bin/curl/mk-ca-bundle.pl | 558 + bin/grep.exe | Bin 0 -> 96256 bytes bin/libiconv2.dll | Bin 0 -> 1008128 bytes bin/libintl3.dll | Bin 0 -> 103424 bytes bin/pcre3.dll | Bin 0 -> 140288 bytes bin/regex2.dll | Bin 0 -> 79360 bytes bin/sed.exe | Bin 0 -> 77824 bytes blockstorage_dev_public.pem | 25 + cmake/awscpp.cmake | 98 + cmake/boost.cmake | 117 + cmake/cryptopp.cmake | 51 + cmake/curl.cmake | 48 + cmake/libhttpserver.cmake | 59 + cmake/libmicrohttpd.cmake | 42 + cmake/libuuid.cmake | 17 + cmake/openssl.cmake | 37 + cmake/rocksdb.cmake | 60 + cmake/testing.cmake | 126 + cmake/zlib.cmake | 22 + compile_tag.sh | 192 + create_containers.sh | 39 + detect_linux_build.sh | 81 + docker/64_bit/arch | 26 + docker/64_bit/centos7 | 36 + docker/64_bit/debian10 | 34 + docker/64_bit/debian11 | 34 + docker/64_bit/debian9 | 34 + docker/64_bit/fedora29 | 32 + docker/64_bit/fedora30 | 33 + docker/64_bit/fedora31 | 33 + docker/64_bit/fedora32 | 33 + docker/64_bit/fedora33 | 34 + docker/64_bit/fedora34 | 34 + docker/64_bit/fedora35 | 24 + docker/64_bit/opensuse15 | 35 + docker/64_bit/opensuse15.1 | 35 + docker/64_bit/opensuse15.2 | 35 + docker/64_bit/opensuse15.3 | 35 + docker/64_bit/tumbleweed | 26 + docker/64_bit/ubuntu18.04 | 35 + docker/64_bit/ubuntu20.04 | 39 + docker/64_bit/ubuntu21.10 | 39 + include/app_config.hpp | 382 + include/cli/actions.hpp | 96 + include/cli/check_version.hpp | 63 + include/cli/display_config.hpp | 53 + include/cli/drive_information.hpp | 53 + include/cli/export.hpp | 53 + include/cli/export_all.hpp | 49 + include/cli/get.hpp | 60 + include/cli/get_directory_items.hpp | 53 + include/cli/get_pinned_files.hpp | 48 + include/cli/help.hpp | 106 + include/cli/import.hpp | 62 + include/cli/import_json.hpp | 68 + include/cli/mount.hpp | 159 + include/cli/open_files.hpp | 52 + include/cli/pin_file.hpp | 53 + include/cli/pinned_status.hpp | 53 + include/cli/set.hpp | 72 + include/cli/status.hpp | 44 + include/cli/test_skynet_auth.hpp | 91 + include/cli/unmount.hpp | 49 + include/cli/unpin_file.hpp | 53 + include/cli/version.hpp | 32 + include/comm/aws_s3/aws_s3_comm.hpp | 124 + include/comm/curl/curl_comm.hpp | 270 + include/comm/curl/curl_resolver.hpp | 45 + include/comm/curl/multi_request.hpp | 41 + include/comm/curl/session_manager.hpp | 43 + include/comm/i_comm.hpp | 107 + include/comm/i_s3_comm.hpp | 92 + include/comm/packet/client_pool.hpp | 89 + include/comm/packet/packet.hpp | 213 + include/comm/packet/packet_client.hpp | 84 + include/comm/packet/packet_server.hpp | 90 + include/common.hpp | 324 + include/db/directory_db.hpp | 101 + include/db/meta_db.hpp | 81 + include/db/retry_db.hpp | 63 + include/download/buffered_reader.hpp | 78 + include/download/direct_download.hpp | 99 + include/download/download.hpp | 191 + include/download/download_manager.hpp | 102 + include/download/events.hpp | 85 + include/download/i_download.hpp | 76 + include/download/i_download_manager.hpp | 61 + include/download/reader_pool.hpp | 87 + include/download/ring_download.hpp | 136 + include/download/utils.hpp | 41 + include/drives/directory_cache.hpp | 68 + include/drives/directory_iterator.hpp | 71 + include/drives/eviction.hpp | 59 + include/drives/fuse/events.hpp | 39 + include/drives/fuse/fuse_base.hpp | 506 + include/drives/fuse/fuse_drive.hpp | 217 + include/drives/fuse/i_fuse_drive.hpp | 71 + .../fuse/remotefuse/i_remote_instance.hpp | 151 + .../drives/fuse/remotefuse/remote_client.hpp | 172 + .../fuse/remotefuse/remote_fuse_drive.hpp | 257 + .../fuse/remotefuse/remote_fuse_drive2.hpp | 101 + .../drives/fuse/remotefuse/remote_server.hpp | 253 + include/drives/i_open_file_table.hpp | 64 + include/drives/open_file_table.hpp | 751 + include/drives/remote/i_remote_json.hpp | 44 + .../drives/remote/remote_open_file_table.hpp | 95 + include/drives/remote/remote_server_base.hpp | 1348 + include/drives/winfsp/i_winfsp_drive.hpp | 61 + .../winfsp/remotewinfsp/i_remote_instance.hpp | 94 + .../winfsp/remotewinfsp/remote_client.hpp | 125 + .../winfsp/remotewinfsp/remote_server.hpp | 241 + .../remotewinfsp/remote_winfsp_drive.hpp | 140 + include/drives/winfsp/winfsp_drive.hpp | 177 + include/events/consumers/console_consumer.hpp | 51 + include/events/consumers/logging_consumer.hpp | 62 + include/events/event.hpp | 63 + include/events/event_system.hpp | 243 + include/events/events.hpp | 417 + include/events/t_event_system.hpp | 178 + include/platform/platform.hpp | 25 + include/platform/unix_platform.hpp | 62 + include/platform/win32_platform.hpp | 65 + include/providers/base_provider.hpp | 123 + include/providers/i_provider.hpp | 115 + .../passthrough/passthroughprovider.hpp | 115 + include/providers/provider.hpp | 31 + include/providers/s3/s3_provider.hpp | 114 + include/providers/sia/sia_provider.hpp | 136 + include/providers/skynet/skynet_provider.hpp | 139 + include/rpc/client/client.hpp | 70 + include/rpc/server/full_server.hpp | 44 + include/rpc/server/server.hpp | 99 + include/types/remote.hpp | 147 + include/types/repertory.hpp | 310 + include/types/rpc.hpp | 56 + include/types/skynet.hpp | 60 + include/types/startup_exception.hpp | 31 + include/upload/upload_manager.hpp | 97 + include/utils/Base64.hpp | 123 + include/utils/cli_utils.hpp | 119 + include/utils/com_init_wrapper.hpp | 42 + include/utils/encrypting_reader.hpp | 87 + include/utils/encryption.hpp | 123 + include/utils/file_utils.hpp | 106 + include/utils/global_data.hpp | 68 + include/utils/native_file.hpp | 89 + include/utils/optional.h | 105 + include/utils/path_utils.hpp | 61 + include/utils/polling.hpp | 75 + include/utils/rocksdb_utils.hpp | 37 + include/utils/string_utils.hpp | 114 + include/utils/throttle.hpp | 58 + include/utils/timeout.hpp | 49 + include/utils/unix/unix_utils.hpp | 71 + include/utils/utils.hpp | 143 + include/utils/uuid++.hh | 325 + include/utils/windows/windows_utils.hpp | 65 + run_arm64_shell.sh | 24 + run_builds.sh | 141 + run_docker_shell.sh | 19 + scripts/32_bit/build_win32_debug.cmd | 5 + .../32_bit/build_win32_debug_no_signing.cmd | 5 + scripts/32_bit/build_win32_release.cmd | 5 + .../32_bit/build_win32_release_no_signing.cmd | 5 + scripts/32_bit/package_win32_debug.cmd | 5 + scripts/32_bit/package_win32_release.cmd | 5 + .../32_bit/package_win32_release_final.cmd | 5 + .../package_win32_release_no_testing.cmd | 5 + .../package_win32_release_testing_final.cmd | 5 + scripts/64_bit/build_win64_debug.cmd | 5 + .../64_bit/build_win64_debug_no_signing.cmd | 5 + scripts/64_bit/build_win64_release.cmd | 5 + scripts/64_bit/package_win64_debug.cmd | 5 + scripts/64_bit/package_win64_release.cmd | 5 + .../64_bit/package_win64_release_final.cmd | 5 + .../package_win64_release_no_testing.cmd | 5 + .../package_win64_release_testing_final.cmd | 5 + scripts/build_branch.sh | 31 + scripts/build_win.cmd | 175 + scripts/make_debug.cmd | 9 + scripts/make_debug.sh | 14 + scripts/make_release.cmd | 9 + scripts/make_release.sh | 14 + scripts/make_unix.sh | 7 + scripts/make_win32.cmd | 7 + src/app_config.cpp | 733 + src/comm/aws_s3/aws_s3_comm.cpp | 677 + src/comm/curl/curl_comm.cpp | 849 + src/comm/curl/curl_resolver.cpp | 43 + src/comm/curl/multi_request.cpp | 58 + src/comm/curl/session_manager.cpp | 73 + src/comm/packet/client_pool.cpp | 150 + src/comm/packet/packet.cpp | 555 + src/comm/packet/packet_client.cpp | 227 + src/comm/packet/packet_server.cpp | 225 + src/common.cpp.in | 29 + src/db/directory_db.cpp | 350 + src/db/meta_db.cpp | 251 + src/db/retry_db.cpp | 81 + src/download/buffered_reader.cpp | 204 + src/download/direct_download.cpp | 116 + src/download/download.cpp | 855 + src/download/download_manager.cpp | 502 + src/download/reader_pool.cpp | 166 + src/download/ring_download.cpp | 450 + src/drives/directory_cache.cpp | 110 + src/drives/directory_iterator.cpp | 129 + src/drives/eviction.cpp | 145 + src/drives/fuse/fuse_base.cpp | 844 + src/drives/fuse/fuse_drive.cpp | 1182 + src/drives/fuse/remotefuse/remote_client.cpp | 716 + .../fuse/remotefuse/remote_fuse_drive.cpp | 617 + .../fuse/remotefuse/remote_fuse_drive2.cpp | 51 + src/drives/fuse/remotefuse/remote_server.cpp | 1473 + src/drives/remote/remote_open_file_table.cpp | 192 + .../winfsp/remotewinfsp/remote_client.cpp | 462 + .../winfsp/remotewinfsp/remote_server.cpp | 1144 + .../remotewinfsp/remote_winfsp_drive.cpp | 401 + src/drives/winfsp/winfsp_drive.cpp | 1039 + src/events/consumers/logging_consumer.cpp | 145 + src/events/event.cpp | 55 + src/events/t_event_system.cpp | 29 + src/main.cpp | 135 + src/platform/unix_platform.cpp | 148 + src/platform/win32_platform.cpp | 145 + src/providers/base_provider.cpp | 209 + .../passthrough/passthroughprovider.cpp | 192 + src/providers/provider.cpp | 76 + src/providers/s3/s3_provider.cpp | 562 + src/providers/sia/sia_provider.cpp | 700 + src/providers/skynet/skynet_provider.cpp | 649 + src/rpc/client/client.cpp | 240 + src/rpc/server/full_server.cpp | 165 + src/rpc/server/server.cpp | 163 + src/types/remote.cpp | 183 + src/types/repertory.cpp | 73 + src/types/skynet.cpp | 111 + src/upload/upload_manager.cpp | 259 + src/utils/cli_utils.cpp | 236 + src/utils/encrypting_reader.cpp | 244 + src/utils/encryption.cpp | 95 + src/utils/file_utils.cpp | 612 + src/utils/global_data.cpp | 40 + src/utils/native_file.cpp | 255 + src/utils/path_utils.cpp | 181 + src/utils/polling.cpp | 91 + src/utils/rocksdb_utils.cpp | 65 + src/utils/string_utils.cpp | 195 + src/utils/throttle.cpp | 60 + src/utils/timeout.cpp | 49 + src/utils/unix/unix_utils.cpp | 191 + src/utils/utils.cpp | 371 + src/utils/windows/windows_utils.cpp | 196 + tests/aws_s3_comm_test.cpp | 155 + tests/config_test.cpp | 944 + tests/directory_db_test.cpp | 315 + tests/download_manager_test.cpp | 689 + tests/download_test.cpp | 221 + tests/downloaders_test.cpp | 429 + tests/encrypting_reader_test.cpp | 236 + tests/encryption_test.cpp | 125 + tests/fixtures/aws_s3_comm_fixture.hpp | 69 + tests/fixtures/directory_db_fixture.hpp | 52 + tests/fixtures/fuse_fixture.hpp | 133 + tests/fixtures/skynet_provider_fixture.hpp | 105 + tests/fixtures/winfsp_fixture.hpp | 85 + tests/fuse_test.cpp | 1589 ++ tests/lock_data_test.cpp | 119 + tests/mocks/mock_comm.hpp | 176 + tests/mocks/mock_fuse_drive.hpp | 134 + tests/mocks/mock_open_file_table.hpp | 70 + tests/mocks/mock_provider.hpp | 84 + tests/mocks/mock_s3_comm.hpp | 80 + tests/mocks/mock_winfsp_drive.hpp | 142 + tests/packet_test.cpp | 37 + tests/path_utils_test.cpp | 129 + tests/remote_fuse_test.cpp | 917 + tests/remote_winfsp_test.cpp | 492 + tests/retry_db_test.cpp | 126 + tests/skynet_provider_test.cpp | 803 + tests/skynet_test/sub_dir/test_03 | 1 + tests/skynet_test/sub_dir/test_04 | 1 + tests/skynet_test/test_01 | 1 + tests/skynet_test/test_02 | 1 + tests/test_common.cpp | 50 + tests/test_common.hpp | 90 + tests/utils/event_capture.hpp | 99 + tests/utils_test.cpp | 69 + tests/version_test.cpp | 53 + tests/winfsp_test.cpp | 685 + version.rc.in | 64 + 626 files changed, 178600 insertions(+) create mode 100644 .clang-format create mode 100644 .clang-tidy create mode 100644 .default_session create mode 100644 .gitignore create mode 100644 .jenkins_linux_builds create mode 100644 .jenkins_osx create mode 100644 .jenkins_windows create mode 100644 .nvimrc create mode 100644 .vim/coc-settings.json create mode 100644 .vimspector.json create mode 100644 3rd_party/cacert.pem create mode 100644 3rd_party/config.guess create mode 100644 3rd_party/config.sub create mode 100644 3rd_party/glue/pthread.h create mode 100644 3rd_party/glue/strings.h create mode 100644 3rd_party/glue/sys/socket.h create mode 100644 3rd_party/glue/sys/time.h create mode 100644 3rd_party/glue/unistd.h create mode 100644 3rd_party/json/json.hpp create mode 100644 3rd_party/jsonrpcpp-1.1.1/.gitignore create mode 100644 3rd_party/jsonrpcpp-1.1.1/.travis.yml create mode 100644 3rd_party/jsonrpcpp-1.1.1/CMakeLists.txt create mode 100644 3rd_party/jsonrpcpp-1.1.1/LICENSE create mode 100644 3rd_party/jsonrpcpp-1.1.1/Makefile create mode 100644 3rd_party/jsonrpcpp-1.1.1/README.md create mode 100644 3rd_party/jsonrpcpp-1.1.1/cmake/jsonrpcpp.pc.cmake create mode 100644 3rd_party/jsonrpcpp-1.1.1/jsonrpctest.cpp create mode 100644 3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.cpp create mode 100644 3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 3rd_party/libhttpserver-0.18.2/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/bug_fix.md create mode 100644 3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/documentation.md create mode 100644 3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/feature_change.md create mode 100644 3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/performance_improvement.md create mode 100644 3rd_party/libhttpserver-0.18.2/.github/workflows/codeql-analysis.yml create mode 100644 3rd_party/libhttpserver-0.18.2/.gitignore create mode 100644 3rd_party/libhttpserver-0.18.2/.gitmodules create mode 100644 3rd_party/libhttpserver-0.18.2/.travis.yml create mode 100644 3rd_party/libhttpserver-0.18.2/AUTHORS create mode 100644 3rd_party/libhttpserver-0.18.2/CODE_OF_CONDUCT.md create mode 100644 3rd_party/libhttpserver-0.18.2/CONTRIBUTING.md create mode 100644 3rd_party/libhttpserver-0.18.2/COPYING.LESSER create mode 100644 3rd_party/libhttpserver-0.18.2/ChangeLog create mode 100644 3rd_party/libhttpserver-0.18.2/INSTALL create mode 100644 3rd_party/libhttpserver-0.18.2/LICENSE create mode 100644 3rd_party/libhttpserver-0.18.2/Makefile.am create mode 100644 3rd_party/libhttpserver-0.18.2/Makefile.cvs create mode 100644 3rd_party/libhttpserver-0.18.2/NEWS create mode 100644 3rd_party/libhttpserver-0.18.2/PULL_REQUEST_TEMPLATE.md create mode 100644 3rd_party/libhttpserver-0.18.2/README.CentOS-7 create mode 100644 3rd_party/libhttpserver-0.18.2/README.FreeBSD create mode 100644 3rd_party/libhttpserver-0.18.2/README.md create mode 100644 3rd_party/libhttpserver-0.18.2/acinclude.m4 create mode 100644 3rd_party/libhttpserver-0.18.2/aminclude.am create mode 100644 3rd_party/libhttpserver-0.18.2/appveyor.yml create mode 100644 3rd_party/libhttpserver-0.18.2/bootstrap create mode 100644 3rd_party/libhttpserver-0.18.2/ci-report-coverage create mode 100644 3rd_party/libhttpserver-0.18.2/cmakemodule/FindLibHttpServer.cmake create mode 100644 3rd_party/libhttpserver-0.18.2/configure.ac create mode 100644 3rd_party/libhttpserver-0.18.2/custom_iwyu.imp create mode 100644 3rd_party/libhttpserver-0.18.2/doc/Makefile.am create mode 100644 3rd_party/libhttpserver-0.18.2/doc/libhttpserver.3 create mode 100644 3rd_party/libhttpserver-0.18.2/examples/Makefile.am create mode 100644 3rd_party/libhttpserver-0.18.2/examples/README.md create mode 100644 3rd_party/libhttpserver-0.18.2/examples/allowing_disallowing_methods.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/basic_authentication.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/benchmark_nodelay.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/benchmark_select.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/benchmark_threads.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/cert.pem create mode 100644 3rd_party/libhttpserver-0.18.2/examples/custom_access_log.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/custom_error.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/deferred_with_accumulator.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/digest_authentication.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/handlers.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/hello_with_get_arg.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/hello_world.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/key.pem create mode 100644 3rd_party/libhttpserver-0.18.2/examples/minimal_deferred.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/minimal_file_response.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/minimal_hello_world.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/minimal_https.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/minimal_ip_ban.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/service.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/setting_headers.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/examples/test_content create mode 100644 3rd_party/libhttpserver-0.18.2/examples/url_registration.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/m4/ax_have_epoll.m4 create mode 100644 3rd_party/libhttpserver-0.18.2/m4/ax_valgrind_check.m4 create mode 100644 3rd_party/libhttpserver-0.18.2/m4/python.m4 create mode 100644 3rd_party/libhttpserver-0.18.2/src/Makefile.am create mode 100644 3rd_party/libhttpserver-0.18.2/src/basic_auth_fail_response.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/deferred_response.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/details/http_endpoint.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/digest_auth_fail_response.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/file_response.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/gettext.h create mode 100644 3rd_party/libhttpserver-0.18.2/src/http_request.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/http_resource.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/http_response.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/http_utils.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/basic_auth_fail_response.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/create_webserver.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/deferred_response.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/details/http_endpoint.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/details/modded_request.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/digest_auth_fail_response.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/file_response.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/http_request.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/http_resource.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/http_response.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/http_utils.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/string_response.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/string_utilities.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/httpserver/webserver.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/string_response.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/string_utilities.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/src/webserver.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/Makefile.am create mode 100644 3rd_party/libhttpserver-0.18.2/test/cert.pem create mode 100644 3rd_party/libhttpserver-0.18.2/test/integ/authentication.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/integ/ban_system.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/integ/basic.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/integ/deferred.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/integ/nodelay.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/integ/threaded.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/integ/ws_start_stop.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/key.pem create mode 100644 3rd_party/libhttpserver-0.18.2/test/libhttpserver.supp create mode 100644 3rd_party/libhttpserver-0.18.2/test/littletest.hpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/test_content create mode 100644 3rd_party/libhttpserver-0.18.2/test/test_root_ca.pem create mode 100644 3rd_party/libhttpserver-0.18.2/test/unit/http_endpoint_test.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/unit/http_utils_test.cpp create mode 100644 3rd_party/libhttpserver-0.18.2/test/unit/string_utilities_test.cpp create mode 100644 3rd_party/libmicrohttpd/build.cmd create mode 100644 3rd_party/ttmath-0.9.3/CHANGELOG create mode 100644 3rd_party/ttmath-0.9.3/COPYRIGHT create mode 100644 3rd_party/ttmath-0.9.3/README create mode 100644 3rd_party/ttmath-0.9.3/samples/Makefile create mode 100644 3rd_party/ttmath-0.9.3/samples/big.cpp create mode 100644 3rd_party/ttmath-0.9.3/samples/big2.cpp create mode 100644 3rd_party/ttmath-0.9.3/samples/int.cpp create mode 100644 3rd_party/ttmath-0.9.3/samples/parser.cpp create mode 100644 3rd_party/ttmath-0.9.3/samples/uint.cpp create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmath.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathbig.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathdec.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathint.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathmisc.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathobjects.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathparser.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmaththreads.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathtypes.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathuint.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathuint_noasm.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86_64.h create mode 100644 3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86_64_msvc.asm create mode 100644 3rd_party/winfsp-1.10/License.txt create mode 100644 3rd_party/winfsp-1.10/bin/diag.bat create mode 100644 3rd_party/winfsp-1.10/bin/fsptool-x64.exe create mode 100644 3rd_party/winfsp-1.10/bin/fsptool-x86.exe create mode 100644 3rd_party/winfsp-1.10/bin/fsreg.bat create mode 100644 3rd_party/winfsp-1.10/bin/launchctl-x64.exe create mode 100644 3rd_party/winfsp-1.10/bin/launchctl-x86.exe create mode 100644 3rd_party/winfsp-1.10/bin/launcher-x64.exe create mode 100644 3rd_party/winfsp-1.10/bin/launcher-x86.exe create mode 100644 3rd_party/winfsp-1.10/bin/memfs-dotnet-msil.exe create mode 100644 3rd_party/winfsp-1.10/bin/memfs-x64.exe create mode 100644 3rd_party/winfsp-1.10/bin/memfs-x86.exe create mode 100644 3rd_party/winfsp-1.10/bin/winfsp-msil.dll create mode 100644 3rd_party/winfsp-1.10/bin/winfsp-msil.xml create mode 100644 3rd_party/winfsp-1.10/bin/winfsp-x64.dll create mode 100644 3rd_party/winfsp-1.10/bin/winfsp-x64.sys create mode 100644 3rd_party/winfsp-1.10/bin/winfsp-x86.dll create mode 100644 3rd_party/winfsp-1.10/bin/winfsp-x86.sys create mode 100644 3rd_party/winfsp-1.10/inc/fuse/fuse.h create mode 100644 3rd_party/winfsp-1.10/inc/fuse/fuse_common.h create mode 100644 3rd_party/winfsp-1.10/inc/fuse/fuse_opt.h create mode 100644 3rd_party/winfsp-1.10/inc/fuse/winfsp_fuse.h create mode 100644 3rd_party/winfsp-1.10/inc/fuse3/fuse.h create mode 100644 3rd_party/winfsp-1.10/inc/fuse3/fuse_common.h create mode 100644 3rd_party/winfsp-1.10/inc/fuse3/fuse_opt.h create mode 100644 3rd_party/winfsp-1.10/inc/fuse3/winfsp_fuse.h create mode 100644 3rd_party/winfsp-1.10/inc/winfsp/fsctl.h create mode 100644 3rd_party/winfsp-1.10/inc/winfsp/launch.h create mode 100644 3rd_party/winfsp-1.10/inc/winfsp/winfsp.h create mode 100644 3rd_party/winfsp-1.10/inc/winfsp/winfsp.hpp create mode 100644 3rd_party/winfsp-1.10/lib/fuse.pc create mode 100644 3rd_party/winfsp-1.10/lib/fuse3.pc create mode 100644 3rd_party/winfsp-1.10/lib/winfsp-x64.lib create mode 100644 3rd_party/winfsp-1.10/lib/winfsp-x86.lib create mode 100644 3rd_party/winfsp-1.10/samples/airfs/airfs.cpp create mode 100644 3rd_party/winfsp-1.10/samples/airfs/airfs.sln create mode 100644 3rd_party/winfsp-1.10/samples/airfs/airfs.vcxproj create mode 100644 3rd_party/winfsp-1.10/samples/airfs/airfs.vcxproj.filters create mode 100644 3rd_party/winfsp-1.10/samples/airfs/common.h create mode 100644 3rd_party/winfsp-1.10/samples/airfs/persistence.cpp create mode 100644 3rd_party/winfsp-1.10/samples/memfs-dotnet/Program.cs create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse/Makefile create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse/README.md create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse/compat.h create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.cpp create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.sln create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.vcxproj create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.vcxproj.filters create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse3/Makefile create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse3/README.md create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse3/compat.h create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.cpp create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.sln create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.vcxproj create mode 100644 3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.vcxproj.filters create mode 100644 3rd_party/winfsp-1.10/samples/memfs/memfs-main.c create mode 100644 3rd_party/winfsp-1.10/samples/memfs/memfs.cpp create mode 100644 3rd_party/winfsp-1.10/samples/memfs/memfs.h create mode 100644 3rd_party/winfsp-1.10/samples/notifyfs-dotnet/Program.cs create mode 100644 3rd_party/winfsp-1.10/samples/notifyfs-dotnet/notifyfs-dotnet.csproj create mode 100644 3rd_party/winfsp-1.10/samples/notifyfs-dotnet/notifyfs-dotnet.sln create mode 100644 3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.c create mode 100644 3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.sln create mode 100644 3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.vcxproj create mode 100644 3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.vcxproj.filters create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-dotnet/Program.cs create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-dotnet/passthrough-dotnet.csproj create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-dotnet/passthrough-dotnet.sln create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse/Makefile create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse/README.md create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.c create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.sln create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.vcxproj create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.vcxproj.filters create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse/winposix.c create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse/winposix.h create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse3/Makefile create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse3/README.md create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.c create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.sln create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.vcxproj create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.vcxproj.filters create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse3/winposix.c create mode 100644 3rd_party/winfsp-1.10/samples/passthrough-fuse3/winposix.h create mode 100644 3rd_party/winfsp-1.10/samples/passthrough/passthrough.c create mode 100644 3rd_party/winfsp-1.10/samples/passthrough/passthrough.sln create mode 100644 3rd_party/winfsp-1.10/samples/passthrough/passthrough.vcxproj create mode 100644 3rd_party/winfsp-1.10/samples/passthrough/passthrough.vcxproj.filters create mode 100644 3rd_party/winfsp-1.10/sym/fsptool-x64.pdb create mode 100644 3rd_party/winfsp-1.10/sym/fsptool-x86.pdb create mode 100644 3rd_party/winfsp-1.10/sym/launchctl-x64.pdb create mode 100644 3rd_party/winfsp-1.10/sym/launchctl-x86.pdb create mode 100644 3rd_party/winfsp-1.10/sym/launcher-x64.pdb create mode 100644 3rd_party/winfsp-1.10/sym/launcher-x86.pdb create mode 100644 3rd_party/winfsp-1.10/sym/memfs-x64.pdb create mode 100644 3rd_party/winfsp-1.10/sym/memfs-x86.pdb create mode 100644 3rd_party/winfsp-1.10/sym/winfsp-x64.dll.pdb create mode 100644 3rd_party/winfsp-1.10/sym/winfsp-x64.sys.pdb create mode 100644 3rd_party/winfsp-1.10/sym/winfsp-x86.dll.pdb create mode 100644 3rd_party/winfsp-1.10/sym/winfsp-x86.sys.pdb create mode 100644 CHANGELOG.md create mode 100644 CMakeLists.txt create mode 100644 CONTRIBUTORS.md create mode 100644 CPPLINT.cfg create mode 100644 LICENSE.md create mode 100644 README.md create mode 100755 arm64/debian10 create mode 100755 arm64/debian11 create mode 100755 arm64/debian9 create mode 100644 bin/7za.dll create mode 100644 bin/7za.exe create mode 100644 bin/7zxa.dll create mode 100644 bin/b64.exe create mode 100644 bin/curl/BUILD-HOMEPAGE.url create mode 100644 bin/curl/BUILD-README.txt create mode 100644 bin/curl/CHANGES.txt create mode 100644 bin/curl/COPYING-brotli.txt create mode 100644 bin/curl/COPYING-libssh2.txt create mode 100644 bin/curl/COPYING-nghttp2.txt create mode 100644 bin/curl/COPYING-zlib.txt create mode 100644 bin/curl/COPYING.txt create mode 100644 bin/curl/LICENSE-openssl.txt create mode 100644 bin/curl/README.txt create mode 100644 bin/curl/RELEASE-NOTES.txt create mode 100644 bin/curl/bin/curl-ca-bundle.crt create mode 100644 bin/curl/bin/curl.exe create mode 100644 bin/curl/bin/libcurl-x64.dll create mode 100644 bin/curl/docs/ALTSVC.md create mode 100644 bin/curl/docs/BINDINGS.md create mode 100644 bin/curl/docs/BUG-BOUNTY.md create mode 100644 bin/curl/docs/BUGS.txt create mode 100644 bin/curl/docs/CHECKSRC.md create mode 100644 bin/curl/docs/CIPHERS.md create mode 100644 bin/curl/docs/CODE_OF_CONDUCT.md create mode 100644 bin/curl/docs/CODE_STYLE.md create mode 100644 bin/curl/docs/CONTRIBUTE.md create mode 100644 bin/curl/docs/DEPRECATE.md create mode 100644 bin/curl/docs/FAQ.txt create mode 100644 bin/curl/docs/FEATURES.txt create mode 100644 bin/curl/docs/GOVERNANCE.md create mode 100644 bin/curl/docs/HELP-US.md create mode 100644 bin/curl/docs/HISTORY.md create mode 100644 bin/curl/docs/HTTP-COOKIES.md create mode 100644 bin/curl/docs/HTTP2.md create mode 100644 bin/curl/docs/INSTALL.md create mode 100644 bin/curl/docs/INSTALL.txt create mode 100644 bin/curl/docs/INTERNALS.md create mode 100644 bin/curl/docs/KNOWN_BUGS.txt create mode 100644 bin/curl/docs/LICENSE-MIXING.md create mode 100644 bin/curl/docs/MAIL-ETIQUETTE.txt create mode 100644 bin/curl/docs/README.md create mode 100644 bin/curl/docs/RELEASE-PROCEDURE.md create mode 100644 bin/curl/docs/RESOURCES.txt create mode 100644 bin/curl/docs/ROADMAP.md create mode 100644 bin/curl/docs/SECURITY-PROCESS.md create mode 100644 bin/curl/docs/SSL-PROBLEMS.md create mode 100644 bin/curl/docs/SSLCERTS.md create mode 100644 bin/curl/docs/THANKS.txt create mode 100644 bin/curl/docs/TODO.txt create mode 100644 bin/curl/docs/TheArtOfHttpScripting.txt create mode 100644 bin/curl/docs/VERSIONS.txt create mode 100644 bin/curl/docs/libcurl/ABI.txt create mode 100644 bin/curl/docs/libcurl/symbols-in-versions.txt create mode 100644 bin/curl/include/curl/curl.h create mode 100644 bin/curl/include/curl/curlver.h create mode 100644 bin/curl/include/curl/easy.h create mode 100644 bin/curl/include/curl/mprintf.h create mode 100644 bin/curl/include/curl/multi.h create mode 100644 bin/curl/include/curl/stdcheaders.h create mode 100644 bin/curl/include/curl/system.h create mode 100644 bin/curl/include/curl/typecheck-gcc.h create mode 100644 bin/curl/include/curl/urlapi.h create mode 100644 bin/curl/lib/libcurl.a create mode 100644 bin/curl/lib/libcurl.dll.a create mode 100644 bin/curl/mk-ca-bundle.pl create mode 100644 bin/grep.exe create mode 100644 bin/libiconv2.dll create mode 100644 bin/libintl3.dll create mode 100644 bin/pcre3.dll create mode 100644 bin/regex2.dll create mode 100644 bin/sed.exe create mode 100644 blockstorage_dev_public.pem create mode 100644 cmake/awscpp.cmake create mode 100644 cmake/boost.cmake create mode 100644 cmake/cryptopp.cmake create mode 100644 cmake/curl.cmake create mode 100644 cmake/libhttpserver.cmake create mode 100644 cmake/libmicrohttpd.cmake create mode 100644 cmake/libuuid.cmake create mode 100644 cmake/openssl.cmake create mode 100644 cmake/rocksdb.cmake create mode 100644 cmake/testing.cmake create mode 100644 cmake/zlib.cmake create mode 100755 compile_tag.sh create mode 100755 create_containers.sh create mode 100755 detect_linux_build.sh create mode 100644 docker/64_bit/arch create mode 100644 docker/64_bit/centos7 create mode 100644 docker/64_bit/debian10 create mode 100644 docker/64_bit/debian11 create mode 100644 docker/64_bit/debian9 create mode 100644 docker/64_bit/fedora29 create mode 100644 docker/64_bit/fedora30 create mode 100644 docker/64_bit/fedora31 create mode 100644 docker/64_bit/fedora32 create mode 100644 docker/64_bit/fedora33 create mode 100644 docker/64_bit/fedora34 create mode 100644 docker/64_bit/fedora35 create mode 100644 docker/64_bit/opensuse15 create mode 100644 docker/64_bit/opensuse15.1 create mode 100644 docker/64_bit/opensuse15.2 create mode 100644 docker/64_bit/opensuse15.3 create mode 100644 docker/64_bit/tumbleweed create mode 100644 docker/64_bit/ubuntu18.04 create mode 100644 docker/64_bit/ubuntu20.04 create mode 100644 docker/64_bit/ubuntu21.10 create mode 100644 include/app_config.hpp create mode 100644 include/cli/actions.hpp create mode 100644 include/cli/check_version.hpp create mode 100644 include/cli/display_config.hpp create mode 100644 include/cli/drive_information.hpp create mode 100644 include/cli/export.hpp create mode 100644 include/cli/export_all.hpp create mode 100644 include/cli/get.hpp create mode 100644 include/cli/get_directory_items.hpp create mode 100644 include/cli/get_pinned_files.hpp create mode 100644 include/cli/help.hpp create mode 100644 include/cli/import.hpp create mode 100644 include/cli/import_json.hpp create mode 100644 include/cli/mount.hpp create mode 100644 include/cli/open_files.hpp create mode 100644 include/cli/pin_file.hpp create mode 100644 include/cli/pinned_status.hpp create mode 100644 include/cli/set.hpp create mode 100644 include/cli/status.hpp create mode 100644 include/cli/test_skynet_auth.hpp create mode 100644 include/cli/unmount.hpp create mode 100644 include/cli/unpin_file.hpp create mode 100644 include/cli/version.hpp create mode 100644 include/comm/aws_s3/aws_s3_comm.hpp create mode 100644 include/comm/curl/curl_comm.hpp create mode 100644 include/comm/curl/curl_resolver.hpp create mode 100644 include/comm/curl/multi_request.hpp create mode 100644 include/comm/curl/session_manager.hpp create mode 100644 include/comm/i_comm.hpp create mode 100644 include/comm/i_s3_comm.hpp create mode 100644 include/comm/packet/client_pool.hpp create mode 100644 include/comm/packet/packet.hpp create mode 100644 include/comm/packet/packet_client.hpp create mode 100644 include/comm/packet/packet_server.hpp create mode 100644 include/common.hpp create mode 100644 include/db/directory_db.hpp create mode 100644 include/db/meta_db.hpp create mode 100644 include/db/retry_db.hpp create mode 100644 include/download/buffered_reader.hpp create mode 100644 include/download/direct_download.hpp create mode 100644 include/download/download.hpp create mode 100644 include/download/download_manager.hpp create mode 100644 include/download/events.hpp create mode 100644 include/download/i_download.hpp create mode 100644 include/download/i_download_manager.hpp create mode 100644 include/download/reader_pool.hpp create mode 100644 include/download/ring_download.hpp create mode 100644 include/download/utils.hpp create mode 100644 include/drives/directory_cache.hpp create mode 100644 include/drives/directory_iterator.hpp create mode 100644 include/drives/eviction.hpp create mode 100644 include/drives/fuse/events.hpp create mode 100644 include/drives/fuse/fuse_base.hpp create mode 100644 include/drives/fuse/fuse_drive.hpp create mode 100644 include/drives/fuse/i_fuse_drive.hpp create mode 100644 include/drives/fuse/remotefuse/i_remote_instance.hpp create mode 100644 include/drives/fuse/remotefuse/remote_client.hpp create mode 100644 include/drives/fuse/remotefuse/remote_fuse_drive.hpp create mode 100644 include/drives/fuse/remotefuse/remote_fuse_drive2.hpp create mode 100644 include/drives/fuse/remotefuse/remote_server.hpp create mode 100644 include/drives/i_open_file_table.hpp create mode 100644 include/drives/open_file_table.hpp create mode 100644 include/drives/remote/i_remote_json.hpp create mode 100644 include/drives/remote/remote_open_file_table.hpp create mode 100644 include/drives/remote/remote_server_base.hpp create mode 100644 include/drives/winfsp/i_winfsp_drive.hpp create mode 100644 include/drives/winfsp/remotewinfsp/i_remote_instance.hpp create mode 100644 include/drives/winfsp/remotewinfsp/remote_client.hpp create mode 100644 include/drives/winfsp/remotewinfsp/remote_server.hpp create mode 100644 include/drives/winfsp/remotewinfsp/remote_winfsp_drive.hpp create mode 100644 include/drives/winfsp/winfsp_drive.hpp create mode 100644 include/events/consumers/console_consumer.hpp create mode 100644 include/events/consumers/logging_consumer.hpp create mode 100644 include/events/event.hpp create mode 100644 include/events/event_system.hpp create mode 100644 include/events/events.hpp create mode 100644 include/events/t_event_system.hpp create mode 100644 include/platform/platform.hpp create mode 100644 include/platform/unix_platform.hpp create mode 100644 include/platform/win32_platform.hpp create mode 100644 include/providers/base_provider.hpp create mode 100644 include/providers/i_provider.hpp create mode 100644 include/providers/passthrough/passthroughprovider.hpp create mode 100644 include/providers/provider.hpp create mode 100644 include/providers/s3/s3_provider.hpp create mode 100644 include/providers/sia/sia_provider.hpp create mode 100644 include/providers/skynet/skynet_provider.hpp create mode 100644 include/rpc/client/client.hpp create mode 100644 include/rpc/server/full_server.hpp create mode 100644 include/rpc/server/server.hpp create mode 100644 include/types/remote.hpp create mode 100644 include/types/repertory.hpp create mode 100644 include/types/rpc.hpp create mode 100644 include/types/skynet.hpp create mode 100644 include/types/startup_exception.hpp create mode 100644 include/upload/upload_manager.hpp create mode 100644 include/utils/Base64.hpp create mode 100644 include/utils/cli_utils.hpp create mode 100644 include/utils/com_init_wrapper.hpp create mode 100644 include/utils/encrypting_reader.hpp create mode 100644 include/utils/encryption.hpp create mode 100644 include/utils/file_utils.hpp create mode 100644 include/utils/global_data.hpp create mode 100644 include/utils/native_file.hpp create mode 100644 include/utils/optional.h create mode 100644 include/utils/path_utils.hpp create mode 100644 include/utils/polling.hpp create mode 100644 include/utils/rocksdb_utils.hpp create mode 100644 include/utils/string_utils.hpp create mode 100644 include/utils/throttle.hpp create mode 100644 include/utils/timeout.hpp create mode 100644 include/utils/unix/unix_utils.hpp create mode 100644 include/utils/utils.hpp create mode 100644 include/utils/uuid++.hh create mode 100644 include/utils/windows/windows_utils.hpp create mode 100755 run_arm64_shell.sh create mode 100755 run_builds.sh create mode 100755 run_docker_shell.sh create mode 100644 scripts/32_bit/build_win32_debug.cmd create mode 100644 scripts/32_bit/build_win32_debug_no_signing.cmd create mode 100644 scripts/32_bit/build_win32_release.cmd create mode 100644 scripts/32_bit/build_win32_release_no_signing.cmd create mode 100644 scripts/32_bit/package_win32_debug.cmd create mode 100644 scripts/32_bit/package_win32_release.cmd create mode 100644 scripts/32_bit/package_win32_release_final.cmd create mode 100644 scripts/32_bit/package_win32_release_no_testing.cmd create mode 100644 scripts/32_bit/package_win32_release_testing_final.cmd create mode 100644 scripts/64_bit/build_win64_debug.cmd create mode 100644 scripts/64_bit/build_win64_debug_no_signing.cmd create mode 100644 scripts/64_bit/build_win64_release.cmd create mode 100644 scripts/64_bit/package_win64_debug.cmd create mode 100644 scripts/64_bit/package_win64_release.cmd create mode 100644 scripts/64_bit/package_win64_release_final.cmd create mode 100644 scripts/64_bit/package_win64_release_no_testing.cmd create mode 100644 scripts/64_bit/package_win64_release_testing_final.cmd create mode 100755 scripts/build_branch.sh create mode 100644 scripts/build_win.cmd create mode 100644 scripts/make_debug.cmd create mode 100755 scripts/make_debug.sh create mode 100644 scripts/make_release.cmd create mode 100755 scripts/make_release.sh create mode 100755 scripts/make_unix.sh create mode 100644 scripts/make_win32.cmd create mode 100644 src/app_config.cpp create mode 100644 src/comm/aws_s3/aws_s3_comm.cpp create mode 100644 src/comm/curl/curl_comm.cpp create mode 100644 src/comm/curl/curl_resolver.cpp create mode 100644 src/comm/curl/multi_request.cpp create mode 100644 src/comm/curl/session_manager.cpp create mode 100644 src/comm/packet/client_pool.cpp create mode 100644 src/comm/packet/packet.cpp create mode 100644 src/comm/packet/packet_client.cpp create mode 100644 src/comm/packet/packet_server.cpp create mode 100644 src/common.cpp.in create mode 100644 src/db/directory_db.cpp create mode 100644 src/db/meta_db.cpp create mode 100644 src/db/retry_db.cpp create mode 100644 src/download/buffered_reader.cpp create mode 100644 src/download/direct_download.cpp create mode 100644 src/download/download.cpp create mode 100644 src/download/download_manager.cpp create mode 100644 src/download/reader_pool.cpp create mode 100644 src/download/ring_download.cpp create mode 100644 src/drives/directory_cache.cpp create mode 100644 src/drives/directory_iterator.cpp create mode 100644 src/drives/eviction.cpp create mode 100644 src/drives/fuse/fuse_base.cpp create mode 100644 src/drives/fuse/fuse_drive.cpp create mode 100644 src/drives/fuse/remotefuse/remote_client.cpp create mode 100644 src/drives/fuse/remotefuse/remote_fuse_drive.cpp create mode 100644 src/drives/fuse/remotefuse/remote_fuse_drive2.cpp create mode 100644 src/drives/fuse/remotefuse/remote_server.cpp create mode 100644 src/drives/remote/remote_open_file_table.cpp create mode 100644 src/drives/winfsp/remotewinfsp/remote_client.cpp create mode 100644 src/drives/winfsp/remotewinfsp/remote_server.cpp create mode 100644 src/drives/winfsp/remotewinfsp/remote_winfsp_drive.cpp create mode 100644 src/drives/winfsp/winfsp_drive.cpp create mode 100644 src/events/consumers/logging_consumer.cpp create mode 100644 src/events/event.cpp create mode 100644 src/events/t_event_system.cpp create mode 100644 src/main.cpp create mode 100644 src/platform/unix_platform.cpp create mode 100644 src/platform/win32_platform.cpp create mode 100644 src/providers/base_provider.cpp create mode 100644 src/providers/passthrough/passthroughprovider.cpp create mode 100644 src/providers/provider.cpp create mode 100644 src/providers/s3/s3_provider.cpp create mode 100644 src/providers/sia/sia_provider.cpp create mode 100644 src/providers/skynet/skynet_provider.cpp create mode 100644 src/rpc/client/client.cpp create mode 100644 src/rpc/server/full_server.cpp create mode 100644 src/rpc/server/server.cpp create mode 100644 src/types/remote.cpp create mode 100644 src/types/repertory.cpp create mode 100644 src/types/skynet.cpp create mode 100644 src/upload/upload_manager.cpp create mode 100644 src/utils/cli_utils.cpp create mode 100644 src/utils/encrypting_reader.cpp create mode 100644 src/utils/encryption.cpp create mode 100644 src/utils/file_utils.cpp create mode 100644 src/utils/global_data.cpp create mode 100644 src/utils/native_file.cpp create mode 100644 src/utils/path_utils.cpp create mode 100644 src/utils/polling.cpp create mode 100644 src/utils/rocksdb_utils.cpp create mode 100644 src/utils/string_utils.cpp create mode 100644 src/utils/throttle.cpp create mode 100644 src/utils/timeout.cpp create mode 100644 src/utils/unix/unix_utils.cpp create mode 100644 src/utils/utils.cpp create mode 100644 src/utils/windows/windows_utils.cpp create mode 100644 tests/aws_s3_comm_test.cpp create mode 100644 tests/config_test.cpp create mode 100644 tests/directory_db_test.cpp create mode 100644 tests/download_manager_test.cpp create mode 100644 tests/download_test.cpp create mode 100644 tests/downloaders_test.cpp create mode 100644 tests/encrypting_reader_test.cpp create mode 100644 tests/encryption_test.cpp create mode 100644 tests/fixtures/aws_s3_comm_fixture.hpp create mode 100644 tests/fixtures/directory_db_fixture.hpp create mode 100644 tests/fixtures/fuse_fixture.hpp create mode 100644 tests/fixtures/skynet_provider_fixture.hpp create mode 100644 tests/fixtures/winfsp_fixture.hpp create mode 100644 tests/fuse_test.cpp create mode 100644 tests/lock_data_test.cpp create mode 100644 tests/mocks/mock_comm.hpp create mode 100644 tests/mocks/mock_fuse_drive.hpp create mode 100644 tests/mocks/mock_open_file_table.hpp create mode 100644 tests/mocks/mock_provider.hpp create mode 100644 tests/mocks/mock_s3_comm.hpp create mode 100644 tests/mocks/mock_winfsp_drive.hpp create mode 100644 tests/packet_test.cpp create mode 100644 tests/path_utils_test.cpp create mode 100644 tests/remote_fuse_test.cpp create mode 100644 tests/remote_winfsp_test.cpp create mode 100644 tests/retry_db_test.cpp create mode 100644 tests/skynet_provider_test.cpp create mode 100644 tests/skynet_test/sub_dir/test_03 create mode 100644 tests/skynet_test/sub_dir/test_04 create mode 100644 tests/skynet_test/test_01 create mode 100644 tests/skynet_test/test_02 create mode 100644 tests/test_common.cpp create mode 100644 tests/test_common.hpp create mode 100644 tests/utils/event_capture.hpp create mode 100644 tests/utils_test.cpp create mode 100644 tests/version_test.cpp create mode 100644 tests/winfsp_test.cpp create mode 100644 version.rc.in diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..9927ff03 --- /dev/null +++ b/.clang-format @@ -0,0 +1,127 @@ +--- +Language: Cpp +# BasedOnStyle: LLVM +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: false +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Right +AlignOperands: true +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 100 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '(Test)?$' +IndentCaseLabels: false +IndentPPDirectives: None +IndentWidth: 2 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +ReflowComments: true +SortIncludes: false +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Auto +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseTab: Never +... + diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 00000000..09cf22ac --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,38 @@ +--- +Checks: 'clang-diagnostic-*,clang-analyzer-*' +WarningsAsErrors: '' +HeaderFilterRegex: '' +AnalyzeTemporaryDtors: false +FormatStyle: none +User: sgraves +CheckOptions: + - key: cert-dcl16-c.NewSuffixes + value: 'L;LL;LU;LLU' + - key: cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField + value: '0' + - key: cppcoreguidelines-explicit-virtual-functions.IgnoreDestructors + value: '1' + - key: cppcoreguidelines-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic + value: '1' + - key: google-readability-braces-around-statements.ShortStatementLines + value: '1' + - key: google-readability-function-size.StatementThreshold + value: '800' + - key: google-readability-namespace-comments.ShortNamespaceLines + value: '10' + - key: google-readability-namespace-comments.SpacesBeforeComments + value: '2' + - key: modernize-loop-convert.MaxCopySize + value: '16' + - key: modernize-loop-convert.MinConfidence + value: reasonable + - key: modernize-loop-convert.NamingStyle + value: CamelCase + - key: modernize-pass-by-value.IncludeStyle + value: llvm + - key: modernize-replace-auto-ptr.IncludeStyle + value: llvm + - key: modernize-use-nullptr.NullMacros + value: 'NULL' +... + diff --git a/.default_session b/.default_session new file mode 100644 index 00000000..65ed8f6d --- /dev/null +++ b/.default_session @@ -0,0 +1 @@ +{"breakpoints": {"line": {"/data/src/repertory/src/main.cpp": [{"state": "ENABLED", "line": 59, "options": {}}]}, "function": [], "exception": null}, "session": {"user_choices": {}}, "variables": {}} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..709ac792 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +cmake-build-*/ +.idea/ +build*/ +/3rd_party/winfsp-*/tst/passthrough-cpp/passthrough-cpp.VC.db +/src/version.rc +tag_builds/ +/codelite/ +blockstorage_dev_private.pem +compile_commands.json +.clangd/ +tags +/cacert.pem +/arm64_debian*/ +.cache/ +src/common.cpp diff --git a/.jenkins_linux_builds b/.jenkins_linux_builds new file mode 100644 index 00000000..f7fbdfed --- /dev/null +++ b/.jenkins_linux_builds @@ -0,0 +1,283 @@ +pipeline { + agent none + + environment { + BUILD_ARGS = '--build . -j 8' + CONFIGURE_ARGS = '../.. -DCMAKE_BUILD_TYPE=Release -DREPERTORY_ENABLE_S3=ON' + } + + options { + disableConcurrentBuilds() + } + + stages { + stage('arch') { + agent { + dockerfile { + filename 'arch' + dir 'docker/64_bit' + } + } + + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/arch' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/arch' + } + } + + stage('centos7') { + agent { + dockerfile { + filename 'centos7' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/centos7' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/centos7' + } + } + + stage('debian9') { + agent { + dockerfile { + filename 'debian9' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/debian9' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/debian9' + } + } + + stage('debian10') { + agent { + dockerfile { + filename 'debian10' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/debian10' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/debian10' + } + } + + stage('debian11') { + agent { + dockerfile { + filename 'debian11' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/debian11' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/debian11' + } + } + + stage('fedora29') { + agent { + dockerfile { + filename 'fedora29' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora29' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora29' + } + } + + stage('fedora30') { + agent { + dockerfile { + filename 'fedora30' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora30' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora30' + } + } + + stage('fedora31') { + agent { + dockerfile { + filename 'fedora31' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora31' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora31' + } + } + + stage('fedora32') { + agent { + dockerfile { + filename 'fedora32' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora32' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora32' + } + } + + stage('fedora33') { + agent { + dockerfile { + filename 'fedora33' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora33' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora33' + } + } + + stage('fedora34') { + agent { + dockerfile { + filename 'fedora34' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora34' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora34' + } + } + + stage('fedora35') { + agent { + dockerfile { + filename 'fedora35' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora35' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/fedora35' + } + } + + stage('opensuse15') { + agent { + dockerfile { + filename 'opensuse15' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/opensuse15' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/opensuse15' + } + } + + stage('opensuse15.1') { + agent { + dockerfile { + filename 'opensuse15.1' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/opensuse15.1' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/opensuse15.1' + } + } + + stage('opensuse15.2') { + agent { + dockerfile { + filename 'opensuse15.2' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/opensuse15.2' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/opensuse15.2' + } + } + + stage('opensuse15.3') { + agent { + dockerfile { + filename 'opensuse15.3' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/opensuse15.3' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/opensuse15.3' + } + } + + stage('solus') { + agent any + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/solus' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/solus' + } + } + + stage('tumbleweed') { + agent { + dockerfile { + filename 'tumbleweed' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/tumbleweed' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/tumbleweed' + } + } + + stage('ubuntu18.04') { + agent { + dockerfile { + filename 'ubuntu18.04' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/ubuntu18.04' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/ubuntu18.04' + } + } + + stage('ubuntu20.04') { + agent { + dockerfile { + filename 'ubuntu20.04' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/ubuntu20.04' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/ubuntu20.04' + } + } + + stage('ubuntu21.10') { + agent { + dockerfile { + filename 'ubuntu21.10' + dir 'docker/64_bit' + } + } + steps { + cmake arguments: "${env.CONFIGURE_ARGS}", installation: 'InSearchPath', workingDir: 'build/ubuntu21.10' + cmake arguments: "${env.BUILD_ARGS}", installation: 'InSearchPath', workingDir: 'build/ubuntu21.10' + } + } + } +} diff --git a/.jenkins_osx b/.jenkins_osx new file mode 100644 index 00000000..91abffac --- /dev/null +++ b/.jenkins_osx @@ -0,0 +1,27 @@ +#!groovy + +pipeline { + agent any + + options { + disableConcurrentBuilds() + } + + stages { + stage('configure') { + steps { + cmake arguments: '.. -DCMAKE_BUILD_TYPE=Release -DREPERTORY_ENABLE_S3=ON', installation: 'InSearchPath', workingDir: 'build' + } + } + + stage('build') { + environment { + PATH = "/usr/local/bin:${env.PATH}" + } + + steps { + cmake arguments: '--build . -j 8', installation: 'InSearchPath', workingDir: 'build' + } + } + } +} diff --git a/.jenkins_windows b/.jenkins_windows new file mode 100644 index 00000000..0fea9ab0 --- /dev/null +++ b/.jenkins_windows @@ -0,0 +1,23 @@ +#!groovy + +pipeline { + agent any + + options { + disableConcurrentBuilds() + } + + stages { + stage('configure') { + steps { + cmake arguments: '.. -DCMAKE_BUILD_TYPE=Release -DREPERTORY_ENABLE_S3=ON', installation: 'InSearchPath', workingDir: 'build' + } + } + + stage('build') { + steps { + cmake arguments: '--build . --target ALL_BUILD --config Release -j 4', installation: 'InSearchPath', workingDir: 'build' + } + } + } +} diff --git a/.nvimrc b/.nvimrc new file mode 100644 index 00000000..29609842 --- /dev/null +++ b/.nvimrc @@ -0,0 +1,9 @@ +if has('win32') || has('win64') + let &makeprg=".\\scripts\\make_win32.cmd $*" + let g:gtest#gtest_command = "cd build2 && .\\unittests" +else + let &makeprg="./scripts/make_unix.sh $*" + let g:gtest#gtest_command = "cd build && ./unittests" +endif +set path+=.,include/**,src/**,tests/**,3rd_party/json/**,3rd_party/jsonrpcpp-1.1.1/lib/**,3rd_party/ttmath-0.9.3/ttmath/** +autocmd! VimEnter * :VimspectorLoadSession .default_session diff --git a/.vim/coc-settings.json b/.vim/coc-settings.json new file mode 100644 index 00000000..5cbc8a90 --- /dev/null +++ b/.vim/coc-settings.json @@ -0,0 +1,101 @@ +{ + "cSpell.words": [ + "AWSS", + "BDMV", + "Bignum", + "Bodhi", + "CAWSS", + "CRing", + "DACL", + "DCMAKE", + "DENYNO", + "DIRDB", + "DIRECTORYDB", + "DISTRO", + "FOLDERID", + "HKEY", + "ICOMM", + "IDOWNLOAD", + "IDOWNLOADMANAGER", + "IFUSEDRIVE", + "IPROVIDER", + "IREMOTEJSONINSTANCE", + "IWINFSPDRIVE", + "LOCALAPPDATA", + "LPBYTE", + "LPDWORD", + "LPSTR", + "LPTR", + "LPWSTR", + "MOCKWINFSPDRIVE", + "NOCLOSEPROCESS", + "NTFS", + "NTSTATUS", + "OSSP", + "PSECURITY", + "PUINT", + "PVOID", + "PWSTR", + "Plex", + "REMOTEWINFSP", + "REMOTEWINFSPDRIVE", + "RETRYDB", + "Redistributable", + "SDDL", + "SIAPROVIDER", + "STRCASEEQ", + "STREQ", + "STRNE", + "Skynet", + "TEVENTSYSTEM", + "ULARGE", + "WINFSP", + "WINFSPDRIVE", + "aarch", + "centos", + "cmake", + "cpptools", + "csrf", + "ctim", + "dirh", + "dylib", + "fallocate", + "fgetattr", + "fsetattr", + "fsopen", + "fusefs", + "fusermount", + "futimens", + "gtest", + "hwnd", + "iarchive", + "jsonrpcpp", + "kldload", + "kratos", + "libfuse", + "libhttpserver", + "libmicrohttpd", + "libosxfuse", + "netdev", + "nlohmann", + "noappledouble", + "nopath", + "pfsi", + "reventsp", + "rocksdb", + "runas", + "siadir", + "siapath", + "siasky", + "skylink", + "smatch", + "sopen", + "stbuf", + "struct", + "ttmath", + "unmount", + "usermount", + "utimens", + "utimensat" + ] +} diff --git a/.vimspector.json b/.vimspector.json new file mode 100644 index 00000000..5a34117b --- /dev/null +++ b/.vimspector.json @@ -0,0 +1,20 @@ +{ + "configurations": { + "UnixDebug": { + "adapter": "vscode-cpptools", + "configuration": { + "request": "launch", + "program": "${workspaceRoot}/build/debug/repertory", + "args": ["-f", "-sk", "./skynet_mount"], + "cwd": "${workspaceRoot}/build/debug", + "environment": [], + "externalConsole": true, + "MIMode": "gdb", + "stopAtEntry": true, + "logging": { + "engineLogging": false + } + } + } + } +} diff --git a/3rd_party/cacert.pem b/3rd_party/cacert.pem new file mode 100644 index 00000000..632fc248 --- /dev/null +++ b/3rd_party/cacert.pem @@ -0,0 +1,3311 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Tue Feb 1 04:12:05 2022 GMT +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.28. +## SHA256: 187ef9dc231135324fe78830cf4462f1ecdeab3e6c9d5e38d623391e88dc5d3c +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +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 +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +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 +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +Staat der Nederlanden EV Root CA +================================ +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M +MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl +cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk +SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW +O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r +0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 +Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV +XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr +08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV +0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd +74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx +fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa +ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu +c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq +5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN +b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN +f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi +5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 +WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK +DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy +eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +TrustCor RootCert CA-1 +====================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP +MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig +U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx +MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu +YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe +VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy +dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq +jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 +pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 +JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h +gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw +/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j +BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 +mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C +qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P +3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +TrustCor RootCert CA-2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TrustCor ECA-1 +============== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP +MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig +U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw +N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 +MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y +IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR +MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 +xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc +p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ +fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj +YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL +f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF +AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u +/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs +J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC +jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +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 +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +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 +dBb9HxEGmpv0 +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G4 +========================================= +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu +bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 +dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT +AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D +umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV +3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds +8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ +e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 +ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X +xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV +7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW +Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n +MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q +jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht +7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK +YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt +jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ +m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW +RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA +JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G ++TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT +kcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +Microsoft ECC Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND +IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 +MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 +thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB +eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM ++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf +Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR +eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +Microsoft RSA Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg +UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw +NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml +7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e +S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 +1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ +dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F +yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS +MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr +lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ +0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ +ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og +6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 +dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk ++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex +/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy +AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW +ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE +7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT +c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D +5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +e-Szigno Root CA 2017 +===================== +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw +DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt +MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa +Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE +CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp +Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx +s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv +vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA +tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO +svxyqltZ+efcMQ== +-----END CERTIFICATE----- + +certSIGN Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw +EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy +MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH +TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 +N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk +abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg +wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp +dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh +ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 +jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf +95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc +z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL +iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud +DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB +ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB +/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 +8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 +BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW +atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU +Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M +NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N +0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +Trustwave Global Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +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 +29FpHOTKyeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +Trustwave Global ECC P256 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +Trustwave Global ECC P384 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== +-----END CERTIFICATE----- + +NAVER Global Root Certification Authority +========================================= +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +GLOBALTRUST 2020 +================ +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx +IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT +VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh +BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy +MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi +D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO +VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM +CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm +fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA +A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR +JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG +DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU +clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ +mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud +IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw +4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 +iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS +8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 +HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS +vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 +oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF +YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl +gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +vTrus ECC Root CA +================= +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE----- + +vTrus Root CA +============= +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE----- + +ISRG Root X2 +============ +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +HiPKI Root CA - G1 +================== +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl +e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb +a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS ++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M +kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG +r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q +S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV +J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL +dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD +ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh +swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel +/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn +jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 +9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M +7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 +0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR +WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW +HYbL +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE----- diff --git a/3rd_party/config.guess b/3rd_party/config.guess new file mode 100644 index 00000000..5772f193 --- /dev/null +++ b/3rd_party/config.guess @@ -0,0 +1,1667 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + fi + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-pc-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + # shellcheck disable=SC2154 + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + exit ;; +esac + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: \ No newline at end of file diff --git a/3rd_party/config.sub b/3rd_party/config.sub new file mode 100644 index 00000000..a27949a6 --- /dev/null +++ b/3rd_party/config.sub @@ -0,0 +1,1793 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ + | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + os=linux-android + ;; + *) + basic_machine=$field1-$field2 + os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + os= + ;; + *) + basic_machine=$field1 + os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + os=bsd + ;; + a29khif) + basic_machine=a29k-amd + os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=scout + ;; + alliant) + basic_machine=fx80-alliant + os= + ;; + altos | altos3068) + basic_machine=m68k-altos + os= + ;; + am29k) + basic_machine=a29k-none + os=bsd + ;; + amdahl) + basic_machine=580-amdahl + os=sysv + ;; + amiga) + basic_machine=m68k-unknown + os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=bsd + ;; + aros) + basic_machine=i386-pc + os=aros + ;; + aux) + basic_machine=m68k-apple + os=aux + ;; + balance) + basic_machine=ns32k-sequent + os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=linux + ;; + cegcc) + basic_machine=arm-unknown + os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=bsd + ;; + convex-c2) + basic_machine=c2-convex + os=bsd + ;; + convex-c32) + basic_machine=c32-convex + os=bsd + ;; + convex-c34) + basic_machine=c34-convex + os=bsd + ;; + convex-c38) + basic_machine=c38-convex + os=bsd + ;; + cray) + basic_machine=j90-cray + os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + os= + ;; + da30) + basic_machine=m68k-da30 + os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + os= + ;; + delta88) + basic_machine=m88k-motorola + os=sysv3 + ;; + dicos) + basic_machine=i686-pc + os=dicos + ;; + djgpp) + basic_machine=i586-pc + os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=ose + ;; + gmicro) + basic_machine=tron-gmicro + os=sysv + ;; + go32) + basic_machine=i386-pc + os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=hms + ;; + harris) + basic_machine=m88k-harris + os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=proelf + ;; + i386mach) + basic_machine=i386-mach + os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + os=sysv + ;; + merlin) + basic_machine=ns32k-utek + os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + os=coff + ;; + morphos) + basic_machine=powerpc-unknown + os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=moxiebox + ;; + msdos) + basic_machine=i386-pc + os=msdos + ;; + msys) + basic_machine=i686-pc + os=msys + ;; + mvs) + basic_machine=i370-ibm + os=mvs + ;; + nacl) + basic_machine=le32-unknown + os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=newsos + ;; + news1000) + basic_machine=m68030-sony + os=newsos + ;; + necv70) + basic_machine=v70-nec + os=sysv + ;; + nh3000) + basic_machine=m68k-harris + os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=cxux + ;; + nindy960) + basic_machine=i960-intel + os=nindy + ;; + mon960) + basic_machine=i960-intel + os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=ose + ;; + os68k) + basic_machine=m68k-none + os=os68k + ;; + paragon) + basic_machine=i860-intel + os=osf + ;; + parisc) + basic_machine=hppa-unknown + os=linux + ;; + pw32) + basic_machine=i586-unknown + os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=rdos + ;; + rdos32) + basic_machine=i386-pc + os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=coff + ;; + sa29200) + basic_machine=a29k-amd + os=udi + ;; + sei) + basic_machine=mips-sei + os=seiux + ;; + sequent) + basic_machine=i386-sequent + os= + ;; + sps7) + basic_machine=m68k-bull + os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + os= + ;; + stratus) + basic_machine=i860-stratus + os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + os= + ;; + sun2os3) + basic_machine=m68000-sun + os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + os= + ;; + sun3os3) + basic_machine=m68k-sun + os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + os= + ;; + sun4os3) + basic_machine=sparc-sun + os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + os= + ;; + sv1) + basic_machine=sv1-cray + os=unicos + ;; + symmetry) + basic_machine=i386-sequent + os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=unicos + ;; + t90) + basic_machine=t90-cray + os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + os=tpf + ;; + udi29k) + basic_machine=a29k-amd + os=udi + ;; + ultra3) + basic_machine=a29k-nyu + os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=none + ;; + vaxv) + basic_machine=vax-dec + os=sysv + ;; + vms) + basic_machine=vax-dec + os=vms + ;; + vsta) + basic_machine=i386-pc + os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=vxworks + ;; + xbox) + basic_machine=i686-pc + os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + os=unicos + ;; + *) + basic_machine=$1 + os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + os=${os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + os=${os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $os in + irix*) + ;; + *) + os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + os=nextstep2 + ;; + *) + os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + os=${os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x$os != x ] +then +case $os in + # First match some system type aliases that might get confused + # with valid system types. + # solaris* is a basic system type, with this one exception. + auroraux) + os=auroraux + ;; + bluegene*) + os=cnk + ;; + solaris1 | solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + solaris) + os=solaris2 + ;; + unixware*) + os=sysv4.2uw + ;; + gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # es1800 is here to avoid being matched by es* (a different OS) + es1800*) + os=ose + ;; + # Some version numbers need modification + chorusos*) + os=chorusos + ;; + isc) + os=isc2.2 + ;; + sco6) + os=sco5v6 + ;; + sco5) + os=sco3.2v5 + ;; + sco4) + os=sco3.2v4 + ;; + sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + ;; + sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + scout) + # Don't match below + ;; + sco*) + os=sco3.2v2 + ;; + psos*) + os=psos + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + # sysv* is not here because it comes later, after sysvr4. + gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | kopensolaris* | plan9* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | knetbsd* | mirbsd* | netbsd* \ + | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ + | linux-newlib* | linux-musl* | linux-uclibc* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* \ + | morphos* | superux* | rtmk* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + qnx*) + case $cpu in + x86 | i*86) + ;; + *) + os=nto-$os + ;; + esac + ;; + hiux*) + os=hiuxwe2 + ;; + nto-qnx*) + ;; + nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + sim | xray | os68k* | v88r* \ + | windows* | osx | abug | netware* | os9* \ + | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) + ;; + linux-dietlibc) + os=linux-dietlibc + ;; + linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + lynx*178) + os=lynxos178 + ;; + lynx*5) + os=lynxos5 + ;; + lynx*) + os=lynxos + ;; + mac*) + os=`echo "$os" | sed -e 's|mac|macos|'` + ;; + opened*) + os=openedition + ;; + os400*) + os=os400 + ;; + sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + ;; + sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + ;; + wince*) + os=wince + ;; + utek*) + os=bsd + ;; + dynix*) + os=bsd + ;; + acis*) + os=aos + ;; + atheos*) + os=atheos + ;; + syllable*) + os=syllable + ;; + 386bsd) + os=bsd + ;; + ctix* | uts*) + os=sysv + ;; + nova*) + os=rtmk-nova + ;; + ns2) + os=nextstep2 + ;; + # Preserve the version number of sinix5. + sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + sinix*) + os=sysv4 + ;; + tpf*) + os=tpf + ;; + triton*) + os=sysv3 + ;; + oss*) + os=sysv3 + ;; + svr4*) + os=sysv4 + ;; + svr3) + os=sysv3 + ;; + sysvr4) + os=sysv4 + ;; + # This must come after sysvr4. + sysv*) + ;; + ose*) + os=ose + ;; + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + os=mint + ;; + zvmoe) + os=zvmoe + ;; + dicos*) + os=dicos + ;; + pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $cpu in + arm*) + os=eabi + ;; + *) + os=elf + ;; + esac + ;; + nacl*) + ;; + ios) + ;; + none) + ;; + *-eabi) + ;; + *) + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $cpu-$vendor in + score-*) + os=elf + ;; + spu-*) + os=elf + ;; + *-acorn) + os=riscix1.2 + ;; + arm*-rebel) + os=linux + ;; + arm*-semi) + os=aout + ;; + c4x-* | tic4x-*) + os=coff + ;; + c8051-*) + os=elf + ;; + clipper-intergraph) + os=clix + ;; + hexagon-*) + os=elf + ;; + tic54x-*) + os=coff + ;; + tic55x-*) + os=coff + ;; + tic6x-*) + os=coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=tops20 + ;; + pdp11-*) + os=none + ;; + *-dec | vax-*) + os=ultrix4.2 + ;; + m68*-apollo) + os=domain + ;; + i386-sun) + os=sunos4.0.2 + ;; + m68000-sun) + os=sunos3 + ;; + m68*-cisco) + os=aout + ;; + mep-*) + os=elf + ;; + mips*-cisco) + os=elf + ;; + mips*-*) + os=elf + ;; + or32-*) + os=coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=sysv3 + ;; + sparc-* | *-sun) + os=sunos4.1.1 + ;; + pru-*) + os=elf + ;; + *-be) + os=beos + ;; + *-ibm) + os=aix + ;; + *-knuth) + os=mmixware + ;; + *-wec) + os=proelf + ;; + *-winbond) + os=proelf + ;; + *-oki) + os=proelf + ;; + *-hp) + os=hpux + ;; + *-hitachi) + os=hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=sysv + ;; + *-cbm) + os=amigaos + ;; + *-dg) + os=dgux + ;; + *-dolphin) + os=sysv3 + ;; + m68k-ccur) + os=rtu + ;; + m88k-omron*) + os=luna + ;; + *-next) + os=nextstep + ;; + *-sequent) + os=ptx + ;; + *-crds) + os=unos + ;; + *-ns) + os=genix + ;; + i370-*) + os=mvs + ;; + *-gould) + os=sysv + ;; + *-highlevel) + os=bsd + ;; + *-encore) + os=bsd + ;; + *-sgi) + os=irix + ;; + *-siemens) + os=sysv4 + ;; + *-masscomp) + os=rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=uxpv + ;; + *-rom68k) + os=coff + ;; + *-*bug) + os=coff + ;; + *-apple) + os=macos + ;; + *-atari*) + os=mint + ;; + *-wrs) + os=vxworks + ;; + *) + os=none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $os in + riscix*) + vendor=acorn + ;; + sunos*) + vendor=sun + ;; + cnk*|-aix*) + vendor=ibm + ;; + beos*) + vendor=be + ;; + hpux*) + vendor=hp + ;; + mpeix*) + vendor=hp + ;; + hiux*) + vendor=hitachi + ;; + unos*) + vendor=crds + ;; + dgux*) + vendor=dg + ;; + luna*) + vendor=omron + ;; + genix*) + vendor=ns + ;; + clix*) + vendor=intergraph + ;; + mvs* | opened*) + vendor=ibm + ;; + os400*) + vendor=ibm + ;; + ptx*) + vendor=sequent + ;; + tpf*) + vendor=ibm + ;; + vxsim* | vxworks* | windiss*) + vendor=wrs + ;; + aux*) + vendor=apple + ;; + hms*) + vendor=hitachi + ;; + mpw* | macos*) + vendor=apple + ;; + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + vendor=atari + ;; + vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: \ No newline at end of file diff --git a/3rd_party/glue/pthread.h b/3rd_party/glue/pthread.h new file mode 100644 index 00000000..f6c13c45 --- /dev/null +++ b/3rd_party/glue/pthread.h @@ -0,0 +1,38 @@ +#ifndef REPERTORY_PTHREAD_H +#define REPERTORY_PTHREAD_H +#ifdef _WIN32 + +#include +#include + +#define pthread_mutex_t std::mutex * +#define pthread_cond_t std::condition_variable * + +static void pthread_mutex_init(pthread_mutex_t *mtx, void *) { *mtx = new std::mutex(); } + +static void pthread_mutex_destroy(pthread_mutex_t *mtx) { + delete *mtx; + *mtx = nullptr; +} + +static void pthread_mutex_lock(pthread_mutex_t *mtx) { (*mtx)->lock(); } + +static void pthread_mutex_unlock(pthread_mutex_t *mtx) { (*mtx)->unlock(); } + +static void pthread_cond_init(pthread_cond_t *cond, void *) { + *cond = new std::condition_variable(); +} + +static void pthread_cond_destroy(pthread_cond_t *cond) { + delete *cond; + *cond = nullptr; +} + +static void pthread_cond_signal(pthread_cond_t *cond) { (*cond)->notify_one(); } + +static void pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mtx) { + std::unique_lock l(**mtx); + (*cond)->wait(l); +} +#endif // _WIN32 +#endif // REPERTORY_PTHREAD_H diff --git a/3rd_party/glue/strings.h b/3rd_party/glue/strings.h new file mode 100644 index 00000000..0d0183ee --- /dev/null +++ b/3rd_party/glue/strings.h @@ -0,0 +1,9 @@ +#ifndef REPERTORY_STRINGS_H +#define REPERTORY_STRINGS_H +#ifdef _WIN32 + +#define strncasecmp _strnicmp +#define strcasecmp _stricmp + +#endif // _WIN32 +#endif // REPERTORY_STRINGS_H diff --git a/3rd_party/glue/sys/socket.h b/3rd_party/glue/sys/socket.h new file mode 100644 index 00000000..1a4b3519 --- /dev/null +++ b/3rd_party/glue/sys/socket.h @@ -0,0 +1,6 @@ +#ifndef REPERTORY_SOCKET_H +#define REPERTORY_SOCKET_H +#ifdef _WIN32 + +#endif // _WIN32 +#endif // REPERTORY_SOCKET_H diff --git a/3rd_party/glue/sys/time.h b/3rd_party/glue/sys/time.h new file mode 100644 index 00000000..11328352 --- /dev/null +++ b/3rd_party/glue/sys/time.h @@ -0,0 +1,8 @@ +#ifndef REPERTORY_TIME_H +#define REPERTORY_TIME_H +#ifdef _WIN32 + + + +#endif // _WIN32 +#endif // REPERTORY_TIME_H diff --git a/3rd_party/glue/unistd.h b/3rd_party/glue/unistd.h new file mode 100644 index 00000000..18c79870 --- /dev/null +++ b/3rd_party/glue/unistd.h @@ -0,0 +1,8 @@ +#ifndef REPERTORY_UNISTD_H +#define REPERTORY_UNISTD_H +#ifdef _WIN32 + + + +#endif // _WIN32 +#endif // REPERTORY_UNISTD_H diff --git a/3rd_party/json/json.hpp b/3rd_party/json/json.hpp new file mode 100644 index 00000000..408d83cb --- /dev/null +++ b/3rd_party/json/json.hpp @@ -0,0 +1,22109 @@ +/* + __ _____ _____ _____ + __| | __| | | | JSON for Modern C++ +| | |__ | | | | | | version 3.10.5 +|_____|_____|_____|_|___| https://github.com/nlohmann/json + +Licensed under the MIT License . +SPDX-License-Identifier: MIT +Copyright (c) 2013-2022 Niels Lohmann . + +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. +*/ + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file doc/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#define NLOHMANN_JSON_VERSION_MAJOR 3 +#define NLOHMANN_JSON_VERSION_MINOR 10 +#define NLOHMANN_JSON_VERSION_PATCH 5 + +#include // all_of, find, for_each +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#ifndef JSON_NO_IO + #include // istream, ostream +#endif // JSON_NO_IO +#include // random_access_iterator_tag +#include // unique_ptr +#include // accumulate +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap +#include // vector + +// #include + + +#include +#include + +// #include + + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +// #include + + +#include // exception +#include // runtime_error +#include // to_string +#include // vector + +// #include + + +#include // array +#include // size_t +#include // uint8_t +#include // string + +namespace nlohmann +{ +namespace detail +{ +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +} +} // namespace detail +} // namespace nlohmann + +// #include + + +#include +// #include + + +#include // declval, pair +// #include + + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to + * the public domain worldwide. This software is distributed without + * any warranty. + * + * For details, see . + * SPDX-License-Identifier: CC0-1.0 + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + +// #include + + +#include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; +} // namespace detail +} // namespace nlohmann + + +// https://en.cppreference.com/w/cpp/experimental/is_detected +namespace nlohmann +{ +namespace detail +{ +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; +} // namespace detail +} // namespace nlohmann + + +// This file contains all internal macro definitions +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1914 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); +#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1); + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + + +// inspired from https://stackoverflow.com/a/26745591 +// allows to call any std function as if (e.g. with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + + +namespace nlohmann +{ +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +inline void replace_substring(std::string& s, const std::string& f, + const std::string& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +inline std::string escape(std::string s) +{ + replace_substring(s, "~", "~0"); + replace_substring(s, "/", "~1"); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +static void unescape(std::string& s) +{ + replace_substring(s, "~1", "/"); + replace_substring(s, "~0", "~"); +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // size_t + +namespace nlohmann +{ +namespace detail +{ +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +} // namespace nlohmann + +// #include + + +namespace nlohmann +{ +namespace detail +{ +//////////////// +// exceptions // +//////////////// + +/// @brief general exception of the @ref basic_json class +/// @sa https://json.nlohmann.me/api/basic_json/exception/ +class exception : public std::exception +{ + public: + /// returns the explanatory string + const char* what() const noexcept override + { + return m.what(); + } + + /// the id of the exception + const int id; // NOLINT(cppcoreguidelines-non-private-member-variables-in-classes) + + protected: + JSON_HEDLEY_NON_NULL(3) + exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} // NOLINT(bugprone-throw-keyword-missing) + + static std::string name(const std::string& ename, int id_) + { + return "[json.exception." + ename + "." + std::to_string(id_) + "] "; + } + + template + static std::string diagnostics(const BasicJsonType& leaf_element) + { +#if JSON_DIAGNOSTICS + std::vector tokens; + for (const auto* current = &leaf_element; current->m_parent != nullptr; current = current->m_parent) + { + switch (current->m_parent->type()) + { + case value_t::array: + { + for (std::size_t i = 0; i < current->m_parent->m_value.array->size(); ++i) + { + if (¤t->m_parent->m_value.array->operator[](i) == current) + { + tokens.emplace_back(std::to_string(i)); + break; + } + } + break; + } + + case value_t::object: + { + for (const auto& element : *current->m_parent->m_value.object) + { + if (&element.second == current) + { + tokens.emplace_back(element.first.c_str()); + break; + } + } + break; + } + + case value_t::null: // LCOV_EXCL_LINE + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + break; // LCOV_EXCL_LINE + } + } + + if (tokens.empty()) + { + return ""; + } + + return "(" + std::accumulate(tokens.rbegin(), tokens.rend(), std::string{}, + [](const std::string & a, const std::string & b) + { + return a + "/" + detail::escape(b); + }) + ") "; +#else + static_cast(leaf_element); + return ""; +#endif + } + + private: + /// an exception object as storage for error messages + std::runtime_error m; +}; + +/// @brief exception indicating a parse error +/// @sa https://json.nlohmann.me/api/basic_json/parse_error/ +class parse_error : public exception +{ + public: + /*! + @brief create a parse error exception + @param[in] id_ the id of the exception + @param[in] pos the position where the error occurred (or with + chars_read_total=0 if the position cannot be + determined) + @param[in] what_arg the explanatory string + @return parse_error object + */ + template + static parse_error create(int id_, const position_t& pos, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("parse_error", id_) + "parse error" + + position_string(pos) + ": " + exception::diagnostics(context) + what_arg; + return {id_, pos.chars_read_total, w.c_str()}; + } + + template + static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("parse_error", id_) + "parse error" + + (byte_ != 0 ? (" at byte " + std::to_string(byte_)) : "") + + ": " + exception::diagnostics(context) + what_arg; + return {id_, byte_, w.c_str()}; + } + + /*! + @brief byte index of the parse error + + The byte index of the last read character in the input file. + + @note For an input with n bytes, 1 is the index of the first character and + n+1 is the index of the terminating null byte or the end of file. + This also holds true when reading a byte vector (CBOR or MessagePack). + */ + const std::size_t byte; + + private: + parse_error(int id_, std::size_t byte_, const char* what_arg) + : exception(id_, what_arg), byte(byte_) {} + + static std::string position_string(const position_t& pos) + { + return " at line " + std::to_string(pos.lines_read + 1) + + ", column " + std::to_string(pos.chars_read_current_line); + } +}; + +/// @brief exception indicating errors with iterators +/// @sa https://json.nlohmann.me/api/basic_json/invalid_iterator/ +class invalid_iterator : public exception +{ + public: + template + static invalid_iterator create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("invalid_iterator", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + invalid_iterator(int id_, const char* what_arg) + : exception(id_, what_arg) {} +}; + +/// @brief exception indicating executing a member function with a wrong type +/// @sa https://json.nlohmann.me/api/basic_json/type_error/ +class type_error : public exception +{ + public: + template + static type_error create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("type_error", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + type_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating access out of the defined range +/// @sa https://json.nlohmann.me/api/basic_json/out_of_range/ +class out_of_range : public exception +{ + public: + template + static out_of_range create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("out_of_range", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating other library errors +/// @sa https://json.nlohmann.me/api/basic_json/other_error/ +class other_error : public exception +{ + public: + template + static other_error create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("other_error", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + other_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static constexpr T value{}; +}; + +template +constexpr T static_const::value; // NOLINT(readability-redundant-declaration) + +} // namespace detail +} // namespace nlohmann + +// #include + + +namespace nlohmann +{ +namespace detail +{ +// dispatching helper struct +template struct identity_tag {}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // numeric_limits +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval +#include // tuple + +// #include + + +// #include + + +#include // random_access_iterator_tag + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +// #include + + +namespace nlohmann +{ +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); +} // namespace nlohmann + +// #include + + +// #include + + +namespace nlohmann +{ +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); +} // namespace nlohmann + +// #include + +// #include + +// #include +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ +#define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + +#include // int64_t, uint64_t +#include // map +#include // allocator +#include // string +#include // vector + +/*! +@brief namespace for Niels Lohmann +@see https://github.com/nlohmann +@since version 1.0.0 +*/ +namespace nlohmann +{ +/*! +@brief default JSONSerializer template argument + +This serializer ignores the template arguments and uses ADL +([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) +for serialization. +*/ +template +struct adl_serializer; + +/// a class to store JSON values +/// @sa https://json.nlohmann.me/api/basic_json/ +template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector> +class basic_json; + +/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document +/// @sa https://json.nlohmann.me/api/json_pointer/ +template +class json_pointer; + +/*! +@brief default specialization +@sa https://json.nlohmann.me/api/json/ +*/ +using json = basic_json<>; + +/// @brief a minimal map-like container that preserves insertion order +/// @sa https://json.nlohmann.me/api/ordered_map/ +template +struct ordered_map; + +/// @brief specialization that maintains the insertion order of object keys +/// @sa https://json.nlohmann.me/api/ordered_json/ +using ordered_json = basic_json; + +} // namespace nlohmann + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +namespace nlohmann +{ +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B1 { }; +template +struct conjunction +: std::conditional, B1>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& + is_complete_type < + detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +// a naive helper to check if a type is an ordered_map (exploits the fact that +// ordered_map inherits capacity() from std::vector) +template +struct is_ordered_map +{ + using one = char; + + struct two + { + char x[2]; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + }; + + template static one test( decltype(&C::capacity) ) ; + template static two test(...); + + enum { value = sizeof(test(nullptr)) == sizeof(char) }; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) +}; + +// to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324) +template < typename T, typename U, enable_if_t < !std::is_same::value, int > = 0 > +T conditional_static_cast(U value) +{ + return static_cast(value); +} + +template::value, int> = 0> +T conditional_static_cast(U value) +{ + return value; +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace nlohmann::detail +#elif JSON_HAS_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::filesystem; +} // namespace nlohmann::detail +#endif + +namespace nlohmann +{ +namespace detail +{ +template +void from_json(const BasicJsonType& j, typename std::nullptr_t& n) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_null())) + { + JSON_THROW(type_error::create(302, "type must be null, but is " + std::string(j.type_name()), j)); + } + n = nullptr; +} + +// overloads for basic_json template parameters +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < std::is_arithmetic::value&& + !std::is_same::value, + int > = 0 > +void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast(j)) + { + case value_t::number_unsigned: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_integer: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_float: + { + val = static_cast(*j.template get_ptr()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()), j)); + } +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_boolean())) + { + JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(j.type_name()), j)); + } + b = *j.template get_ptr(); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + s = *j.template get_ptr(); +} + +template < + typename BasicJsonType, typename ConstructibleStringType, + enable_if_t < + is_constructible_string_type::value&& + !std::is_same::value, + int > = 0 > +void from_json(const BasicJsonType& j, ConstructibleStringType& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + + s = *j.template get_ptr(); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) +{ + get_arithmetic_value(j, val); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) +{ + get_arithmetic_value(j, val); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) +{ + get_arithmetic_value(j, val); +} + +template::value, int> = 0> +void from_json(const BasicJsonType& j, EnumType& e) +{ + typename std::underlying_type::type val; + get_arithmetic_value(j, val); + e = static_cast(val); +} + +// forward_list doesn't have an insert method +template::value, int> = 0> +void from_json(const BasicJsonType& j, std::forward_list& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + l.clear(); + std::transform(j.rbegin(), j.rend(), + std::front_inserter(l), [](const BasicJsonType & i) + { + return i.template get(); + }); +} + +// valarray doesn't have an insert method +template::value, int> = 0> +void from_json(const BasicJsonType& j, std::valarray& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + l.resize(j.size()); + std::transform(j.begin(), j.end(), std::begin(l), + [](const BasicJsonType & elem) + { + return elem.template get(); + }); +} + +template +auto from_json(const BasicJsonType& j, T (&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +-> decltype(j.template get(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get(); + } +} + +template +void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) +{ + arr = *j.template get_ptr(); +} + +template +auto from_json_array_impl(const BasicJsonType& j, std::array& arr, + priority_tag<2> /*unused*/) +-> decltype(j.template get(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get(); + } +} + +template::value, + int> = 0> +auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/) +-> decltype( + arr.reserve(std::declval()), + j.template get(), + void()) +{ + using std::end; + + ConstructibleArrayType ret; + ret.reserve(j.size()); + std::transform(j.begin(), j.end(), + std::inserter(ret, end(ret)), [](const BasicJsonType & i) + { + // get() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get(); + }); + arr = std::move(ret); +} + +template::value, + int> = 0> +void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, + priority_tag<0> /*unused*/) +{ + using std::end; + + ConstructibleArrayType ret; + std::transform( + j.begin(), j.end(), std::inserter(ret, end(ret)), + [](const BasicJsonType & i) + { + // get() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get(); + }); + arr = std::move(ret); +} + +template < typename BasicJsonType, typename ConstructibleArrayType, + enable_if_t < + is_constructible_array_type::value&& + !is_constructible_object_type::value&& + !is_constructible_string_type::value&& + !std::is_same::value&& + !is_basic_json::value, + int > = 0 > +auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr) +-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}), +j.template get(), +void()) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + from_json_array_impl(j, arr, priority_tag<3> {}); +} + +template < typename BasicJsonType, typename T, std::size_t... Idx > +std::array from_json_inplace_array_impl(BasicJsonType&& j, + identity_tag> /*unused*/, index_sequence /*unused*/) +{ + return { { std::forward(j).at(Idx).template get()... } }; +} + +template < typename BasicJsonType, typename T, std::size_t N > +auto from_json(BasicJsonType&& j, identity_tag> tag) +-> decltype(from_json_inplace_array_impl(std::forward(j), tag, make_index_sequence {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + return from_json_inplace_array_impl(std::forward(j), tag, make_index_sequence {}); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_binary())) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(j.type_name()), j)); + } + + bin = *j.template get_ptr(); +} + +template::value, int> = 0> +void from_json(const BasicJsonType& j, ConstructibleObjectType& obj) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_object())) + { + JSON_THROW(type_error::create(302, "type must be object, but is " + std::string(j.type_name()), j)); + } + + ConstructibleObjectType ret; + const auto* inner_object = j.template get_ptr(); + using value_type = typename ConstructibleObjectType::value_type; + std::transform( + inner_object->begin(), inner_object->end(), + std::inserter(ret, ret.begin()), + [](typename BasicJsonType::object_t::value_type const & p) + { + return value_type(p.first, p.second.template get()); + }); + obj = std::move(ret); +} + +// overload for arithmetic types, not chosen for basic_json template arguments +// (BooleanType, etc..); note: Is it really necessary to provide explicit +// overloads for boolean_t etc. in case of a custom BooleanType which is not +// an arithmetic type? +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < + std::is_arithmetic::value&& + !std::is_same::value&& + !std::is_same::value&& + !std::is_same::value&& + !std::is_same::value, + int > = 0 > +void from_json(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast(j)) + { + case value_t::number_unsigned: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_integer: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_float: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::boolean: + { + val = static_cast(*j.template get_ptr()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()), j)); + } +} + +template +std::tuple from_json_tuple_impl_base(BasicJsonType&& j, index_sequence /*unused*/) +{ + return std::make_tuple(std::forward(j).at(Idx).template get()...); +} + +template < typename BasicJsonType, class A1, class A2 > +std::pair from_json_tuple_impl(BasicJsonType&& j, identity_tag> /*unused*/, priority_tag<0> /*unused*/) +{ + return {std::forward(j).at(0).template get(), + std::forward(j).at(1).template get()}; +} + +template +void from_json_tuple_impl(BasicJsonType&& j, std::pair& p, priority_tag<1> /*unused*/) +{ + p = from_json_tuple_impl(std::forward(j), identity_tag> {}, priority_tag<0> {}); +} + +template +std::tuple from_json_tuple_impl(BasicJsonType&& j, identity_tag> /*unused*/, priority_tag<2> /*unused*/) +{ + return from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); +} + +template +void from_json_tuple_impl(BasicJsonType&& j, std::tuple& t, priority_tag<3> /*unused*/) +{ + t = from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); +} + +template +auto from_json(BasicJsonType&& j, TupleRelated&& t) +-> decltype(from_json_tuple_impl(std::forward(j), std::forward(t), priority_tag<3> {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + return from_json_tuple_impl(std::forward(j), std::forward(t), priority_tag<3> {}); +} + +template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +void from_json(const BasicJsonType& j, std::map& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()), j)); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +void from_json(const BasicJsonType& j, std::unordered_map& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()), j)); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template +void from_json(const BasicJsonType& j, std_fs::path& p) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + p = *j.template get_ptr(); +} +#endif + +struct from_json_fn +{ + template + auto operator()(const BasicJsonType& j, T&& val) const + noexcept(noexcept(from_json(j, std::forward(val)))) + -> decltype(from_json(j, std::forward(val))) + { + return from_json(j, std::forward(val)); + } +}; +} // namespace detail + +/// namespace to hold default `from_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +constexpr const auto& from_json = detail::static_const::value; // NOLINT(misc-definitions-in-headers) +} // namespace +} // namespace nlohmann + +// #include + + +#include // copy +#include // begin, end +#include // string +#include // tuple, get +#include // is_same, is_constructible, is_floating_point, is_enum, underlying_type +#include // move, forward, declval, pair +#include // valarray +#include // vector + +// #include + +// #include + + +#include // size_t +#include // input_iterator_tag +#include // string, to_string +#include // tuple_size, get, tuple_element +#include // move + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +void int_to_string( string_type& target, std::size_t value ) +{ + // For ADL + using std::to_string; + target = to_string(value); +} +template class iteration_proxy_value +{ + public: + using difference_type = std::ptrdiff_t; + using value_type = iteration_proxy_value; + using pointer = value_type * ; + using reference = value_type & ; + using iterator_category = std::input_iterator_tag; + using string_type = typename std::remove_cv< typename std::remove_reference().key() ) >::type >::type; + + private: + /// the iterator + IteratorType anchor; + /// an index for arrays (used to create key names) + std::size_t array_index = 0; + /// last stringified array index + mutable std::size_t array_index_last = 0; + /// a string representation of the array index + mutable string_type array_index_str = "0"; + /// an empty string (to return a reference for primitive values) + const string_type empty_str{}; + + public: + explicit iteration_proxy_value(IteratorType it) noexcept + : anchor(std::move(it)) + {} + + /// dereference operator (needed for range-based for) + iteration_proxy_value& operator*() + { + return *this; + } + + /// increment operator (needed for range-based for) + iteration_proxy_value& operator++() + { + ++anchor; + ++array_index; + + return *this; + } + + /// equality operator (needed for InputIterator) + bool operator==(const iteration_proxy_value& o) const + { + return anchor == o.anchor; + } + + /// inequality operator (needed for range-based for) + bool operator!=(const iteration_proxy_value& o) const + { + return anchor != o.anchor; + } + + /// return key of the iterator + const string_type& key() const + { + JSON_ASSERT(anchor.m_object != nullptr); + + switch (anchor.m_object->type()) + { + // use integer array index as key + case value_t::array: + { + if (array_index != array_index_last) + { + int_to_string( array_index_str, array_index ); + array_index_last = array_index; + } + return array_index_str; + } + + // use key from the object + case value_t::object: + return anchor.key(); + + // use an empty key for all primitive types + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return empty_str; + } + } + + /// return value of the iterator + typename IteratorType::reference value() const + { + return anchor.value(); + } +}; + +/// proxy class for the items() function +template class iteration_proxy +{ + private: + /// the container to iterate + typename IteratorType::reference container; + + public: + /// construct iteration proxy from a container + explicit iteration_proxy(typename IteratorType::reference cont) noexcept + : container(cont) {} + + /// return iterator begin (needed for range-based for) + iteration_proxy_value begin() noexcept + { + return iteration_proxy_value(container.begin()); + } + + /// return iterator end (needed for range-based for) + iteration_proxy_value end() noexcept + { + return iteration_proxy_value(container.end()); + } +}; +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template = 0> +auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.key()) +{ + return i.key(); +} +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template = 0> +auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.value()) +{ + return i.value(); +} +} // namespace detail +} // namespace nlohmann + +// The Addition to the STD Namespace is required to add +// Structured Bindings Support to the iteration_proxy_value class +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +namespace std +{ +#if defined(__clang__) + // Fix: https://github.com/nlohmann/json/issues/1401 + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wmismatched-tags" +#endif +template +class tuple_size<::nlohmann::detail::iteration_proxy_value> + : public std::integral_constant {}; + +template +class tuple_element> +{ + public: + using type = decltype( + get(std::declval < + ::nlohmann::detail::iteration_proxy_value> ())); +}; +#if defined(__clang__) + #pragma clang diagnostic pop +#endif +} // namespace std + +// #include + +// #include + +// #include + + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace nlohmann::detail +#elif JSON_HAS_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::filesystem; +} // namespace nlohmann::detail +#endif + +namespace nlohmann +{ +namespace detail +{ +////////////////// +// constructors // +////////////////// + +/* + * Note all external_constructor<>::construct functions need to call + * j.m_value.destroy(j.m_type) to avoid a memory leak in case j contains an + * allocated value (e.g., a string). See bug issue + * https://github.com/nlohmann/json/issues/2865 for more information. + */ + +template struct external_constructor; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::boolean; + j.m_value = b; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value = s; + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value = std::move(s); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleStringType, + enable_if_t < !std::is_same::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleStringType& str) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value.string = j.template create(str); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::binary; + j.m_value = typename BasicJsonType::binary_t(b); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::binary; + j.m_value = typename BasicJsonType::binary_t(std::move(b)); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_float; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_unsigned; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_integer; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = arr; + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = std::move(arr); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < !std::is_same::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleArrayType& arr) + { + using std::begin; + using std::end; + + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value.array = j.template create(begin(arr), end(arr)); + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, const std::vector& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = value_t::array; + j.m_value.array->reserve(arr.size()); + for (const bool x : arr) + { + j.m_value.array->push_back(x); + j.set_parent(j.m_value.array->back()); + } + j.assert_invariant(); + } + + template::value, int> = 0> + static void construct(BasicJsonType& j, const std::valarray& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = value_t::array; + j.m_value.array->resize(arr.size()); + if (arr.size() > 0) + { + std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin()); + } + j.set_parents(); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value = obj; + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value = std::move(obj); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < !std::is_same::value, int > = 0 > + static void construct(BasicJsonType& j, const CompatibleObjectType& obj) + { + using std::begin; + using std::end; + + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value.object = j.template create(begin(obj), end(obj)); + j.set_parents(); + j.assert_invariant(); + } +}; + +///////////// +// to_json // +///////////// + +template::value, int> = 0> +void to_json(BasicJsonType& j, T b) noexcept +{ + external_constructor::construct(j, b); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, const CompatibleString& s) +{ + external_constructor::construct(j, s); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) +{ + external_constructor::construct(j, std::move(s)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, FloatType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, EnumType e) noexcept +{ + using underlying_type = typename std::underlying_type::type; + external_constructor::construct(j, static_cast(e)); +} + +template +void to_json(BasicJsonType& j, const std::vector& e) +{ + external_constructor::construct(j, e); +} + +template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < is_compatible_array_type::value&& + !is_compatible_object_type::value&& + !is_compatible_string_type::value&& + !std::is_same::value&& + !is_basic_json::value, + int > = 0 > +void to_json(BasicJsonType& j, const CompatibleArrayType& arr) +{ + external_constructor::construct(j, arr); +} + +template +void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin) +{ + external_constructor::construct(j, bin); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, const std::valarray& arr) +{ + external_constructor::construct(j, std::move(arr)); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) +{ + external_constructor::construct(j, std::move(arr)); +} + +template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < is_compatible_object_type::value&& !is_basic_json::value, int > = 0 > +void to_json(BasicJsonType& j, const CompatibleObjectType& obj) +{ + external_constructor::construct(j, obj); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) +{ + external_constructor::construct(j, std::move(obj)); +} + +template < + typename BasicJsonType, typename T, std::size_t N, + enable_if_t < !std::is_constructible::value, // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + int > = 0 > +void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + external_constructor::construct(j, arr); +} + +template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible::value&& std::is_constructible::value, int > = 0 > +void to_json(BasicJsonType& j, const std::pair& p) +{ + j = { p.first, p.second }; +} + +// for https://github.com/nlohmann/json/pull/1134 +template>::value, int> = 0> +void to_json(BasicJsonType& j, const T& b) +{ + j = { {b.key(), b.value()} }; +} + +template +void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence /*unused*/) +{ + j = { std::get(t)... }; +} + +template::value, int > = 0> +void to_json(BasicJsonType& j, const T& t) +{ + to_json_tuple_impl(j, t, make_index_sequence::value> {}); +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template +void to_json(BasicJsonType& j, const std_fs::path& p) +{ + j = p.string(); +} +#endif + +struct to_json_fn +{ + template + auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward(val)))) + -> decltype(to_json(j, std::forward(val)), void()) + { + return to_json(j, std::forward(val)); + } +}; +} // namespace detail + +/// namespace to hold default `to_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +constexpr const auto& to_json = detail::static_const::value; // NOLINT(misc-definitions-in-headers) +} // namespace +} // namespace nlohmann + +// #include + +// #include + + +namespace nlohmann +{ + +/// @sa https://json.nlohmann.me/api/adl_serializer/ +template +struct adl_serializer +{ + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template + static auto from_json(BasicJsonType && j, TargetType& val) noexcept( + noexcept(::nlohmann::from_json(std::forward(j), val))) + -> decltype(::nlohmann::from_json(std::forward(j), val), void()) + { + ::nlohmann::from_json(std::forward(j), val); + } + + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template + static auto from_json(BasicJsonType && j) noexcept( + noexcept(::nlohmann::from_json(std::forward(j), detail::identity_tag {}))) + -> decltype(::nlohmann::from_json(std::forward(j), detail::identity_tag {})) + { + return ::nlohmann::from_json(std::forward(j), detail::identity_tag {}); + } + + /// @brief convert any value type to a JSON value + /// @sa https://json.nlohmann.me/api/adl_serializer/to_json/ + template + static auto to_json(BasicJsonType& j, TargetType && val) noexcept( + noexcept(::nlohmann::to_json(j, std::forward(val)))) + -> decltype(::nlohmann::to_json(j, std::forward(val)), void()) + { + ::nlohmann::to_json(j, std::forward(val)); + } +}; +} // namespace nlohmann + +// #include + + +#include // uint8_t, uint64_t +#include // tie +#include // move + +namespace nlohmann +{ + +/// @brief an internal type for a backed binary type +/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/ +template +class byte_container_with_subtype : public BinaryType +{ + public: + using container_type = BinaryType; + using subtype_type = std::uint64_t; + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype() noexcept(noexcept(container_type())) + : container_type() + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b))) + : container_type(b) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b, subtype_type subtype_) noexcept(noexcept(container_type(b))) + : container_type(b) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + bool operator==(const byte_container_with_subtype& rhs) const + { + return std::tie(static_cast(*this), m_subtype, m_has_subtype) == + std::tie(static_cast(rhs), rhs.m_subtype, rhs.m_has_subtype); + } + + bool operator!=(const byte_container_with_subtype& rhs) const + { + return !(rhs == *this); + } + + /// @brief sets the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/set_subtype/ + void set_subtype(subtype_type subtype_) noexcept + { + m_subtype = subtype_; + m_has_subtype = true; + } + + /// @brief return the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/subtype/ + constexpr subtype_type subtype() const noexcept + { + return m_has_subtype ? m_subtype : static_cast(-1); + } + + /// @brief return whether the value has a subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/has_subtype/ + constexpr bool has_subtype() const noexcept + { + return m_has_subtype; + } + + /// @brief clears the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/clear_subtype/ + void clear_subtype() noexcept + { + m_subtype = 0; + m_has_subtype = false; + } + + private: + subtype_type m_subtype = 0; + bool m_has_subtype = false; +}; + +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + + +#include // uint8_t +#include // size_t +#include // hash + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +// boost::hash_combine +inline std::size_t combine(std::size_t seed, std::size_t h) noexcept +{ + seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U); + return seed; +} + +/*! +@brief hash a JSON value + +The hash function tries to rely on std::hash where possible. Furthermore, the +type of the JSON value is taken into account to have different hash values for +null, 0, 0U, and false, etc. + +@tparam BasicJsonType basic_json specialization +@param j JSON value to hash +@return hash value of j +*/ +template +std::size_t hash(const BasicJsonType& j) +{ + using string_t = typename BasicJsonType::string_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + + const auto type = static_cast(j.type()); + switch (j.type()) + { + case BasicJsonType::value_t::null: + case BasicJsonType::value_t::discarded: + { + return combine(type, 0); + } + + case BasicJsonType::value_t::object: + { + auto seed = combine(type, j.size()); + for (const auto& element : j.items()) + { + const auto h = std::hash {}(element.key()); + seed = combine(seed, h); + seed = combine(seed, hash(element.value())); + } + return seed; + } + + case BasicJsonType::value_t::array: + { + auto seed = combine(type, j.size()); + for (const auto& element : j) + { + seed = combine(seed, hash(element)); + } + return seed; + } + + case BasicJsonType::value_t::string: + { + const auto h = std::hash {}(j.template get_ref()); + return combine(type, h); + } + + case BasicJsonType::value_t::boolean: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_integer: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_unsigned: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_float: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::binary: + { + auto seed = combine(type, j.get_binary().size()); + const auto h = std::hash {}(j.get_binary().has_subtype()); + seed = combine(seed, h); + seed = combine(seed, static_cast(j.get_binary().subtype())); + for (const auto byte : j.get_binary()) + { + seed = combine(seed, std::hash {}(byte)); + } + return seed; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return 0; // LCOV_EXCL_LINE + } +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // generate_n +#include // array +#include // ldexp +#include // size_t +#include // uint8_t, uint16_t, uint32_t, uint64_t +#include // snprintf +#include // memcpy +#include // back_inserter +#include // numeric_limits +#include // char_traits, string +#include // make_pair, move +#include // vector + +// #include + +// #include + + +#include // array +#include // size_t +#include // strlen +#include // begin, end, iterator_traits, random_access_iterator_tag, distance, next +#include // shared_ptr, make_shared, addressof +#include // accumulate +#include // string, char_traits +#include // enable_if, is_base_of, is_pointer, is_integral, remove_pointer +#include // pair, declval + +#ifndef JSON_NO_IO + #include // FILE * + #include // istream +#endif // JSON_NO_IO + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/// the supported input formats +enum class input_format_t { json, cbor, msgpack, ubjson, bson }; + +//////////////////// +// input adapters // +//////////////////// + +#ifndef JSON_NO_IO +/*! +Input adapter for stdio file access. This adapter read only 1 byte and do not use any + buffer. This adapter is a very low level adapter. +*/ +class file_input_adapter +{ + public: + using char_type = char; + + JSON_HEDLEY_NON_NULL(2) + explicit file_input_adapter(std::FILE* f) noexcept + : m_file(f) + {} + + // make class move-only + file_input_adapter(const file_input_adapter&) = delete; + file_input_adapter(file_input_adapter&&) noexcept = default; + file_input_adapter& operator=(const file_input_adapter&) = delete; + file_input_adapter& operator=(file_input_adapter&&) = delete; + ~file_input_adapter() = default; + + std::char_traits::int_type get_character() noexcept + { + return std::fgetc(m_file); + } + + private: + /// the file pointer to read from + std::FILE* m_file; +}; + + +/*! +Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at +beginning of input. Does not support changing the underlying std::streambuf +in mid-input. Maintains underlying std::istream and std::streambuf to support +subsequent use of standard std::istream operations to process any input +characters following those used in parsing the JSON input. Clears the +std::istream flags; any input errors (e.g., EOF) will be detected by the first +subsequent call for input from the std::istream. +*/ +class input_stream_adapter +{ + public: + using char_type = char; + + ~input_stream_adapter() + { + // clear stream flags; we use underlying streambuf I/O, do not + // maintain ifstream flags, except eof + if (is != nullptr) + { + is->clear(is->rdstate() & std::ios::eofbit); + } + } + + explicit input_stream_adapter(std::istream& i) + : is(&i), sb(i.rdbuf()) + {} + + // delete because of pointer members + input_stream_adapter(const input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&&) = delete; + + input_stream_adapter(input_stream_adapter&& rhs) noexcept + : is(rhs.is), sb(rhs.sb) + { + rhs.is = nullptr; + rhs.sb = nullptr; + } + + // std::istream/std::streambuf use std::char_traits::to_int_type, to + // ensure that std::char_traits::eof() and the character 0xFF do not + // end up as the same value, e.g. 0xFFFFFFFF. + std::char_traits::int_type get_character() + { + auto res = sb->sbumpc(); + // set eof manually, as we don't use the istream interface. + if (JSON_HEDLEY_UNLIKELY(res == std::char_traits::eof())) + { + is->clear(is->rdstate() | std::ios::eofbit); + } + return res; + } + + private: + /// the associated input stream + std::istream* is = nullptr; + std::streambuf* sb = nullptr; +}; +#endif // JSON_NO_IO + +// General-purpose iterator-based adapter. It might not be as fast as +// theoretically possible for some containers, but it is extremely versatile. +template +class iterator_input_adapter +{ + public: + using char_type = typename std::iterator_traits::value_type; + + iterator_input_adapter(IteratorType first, IteratorType last) + : current(std::move(first)), end(std::move(last)) + {} + + typename std::char_traits::int_type get_character() + { + if (JSON_HEDLEY_LIKELY(current != end)) + { + auto result = std::char_traits::to_int_type(*current); + std::advance(current, 1); + return result; + } + + return std::char_traits::eof(); + } + + private: + IteratorType current; + IteratorType end; + + template + friend struct wide_string_input_helper; + + bool empty() const + { + return current == end; + } +}; + + +template +struct wide_string_input_helper; + +template +struct wide_string_input_helper +{ + // UTF-32 + static void fill_buffer(BaseInputAdapter& input, + std::array::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-32 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u) & 0x1Fu)); + utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (wc <= 0xFFFF) + { + utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u) & 0x0Fu)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else if (wc <= 0x10FFFF) + { + utf8_bytes[0] = static_cast::int_type>(0xF0u | ((static_cast(wc) >> 18u) & 0x07u)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + // unknown character + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } +}; + +template +struct wide_string_input_helper +{ + // UTF-16 + static void fill_buffer(BaseInputAdapter& input, + std::array::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-16 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u))); + utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (0xD800 > wc || wc >= 0xE000) + { + utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u))); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else + { + if (JSON_HEDLEY_UNLIKELY(!input.empty())) + { + const auto wc2 = static_cast(input.get_character()); + const auto charcode = 0x10000u + (((static_cast(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu)); + utf8_bytes[0] = static_cast::int_type>(0xF0u | (charcode >> 18u)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast::int_type>(0x80u | (charcode & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } + } +}; + +// Wraps another input apdater to convert wide character types into individual bytes. +template +class wide_string_input_adapter +{ + public: + using char_type = char; + + wide_string_input_adapter(BaseInputAdapter base) + : base_adapter(base) {} + + typename std::char_traits::int_type get_character() noexcept + { + // check if buffer needs to be filled + if (utf8_bytes_index == utf8_bytes_filled) + { + fill_buffer(); + + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index == 0); + } + + // use buffer + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled); + return utf8_bytes[utf8_bytes_index++]; + } + + private: + BaseInputAdapter base_adapter; + + template + void fill_buffer() + { + wide_string_input_helper::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled); + } + + /// a buffer for UTF-8 bytes + std::array::int_type, 4> utf8_bytes = {{0, 0, 0, 0}}; + + /// index to the utf8_codes array for the next valid byte + std::size_t utf8_bytes_index = 0; + /// number of valid bytes in the utf8_codes array + std::size_t utf8_bytes_filled = 0; +}; + + +template +struct iterator_input_adapter_factory +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits::value_type; + using adapter_type = iterator_input_adapter; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(std::move(first), std::move(last)); + } +}; + +template +struct is_iterator_of_multibyte +{ + using value_type = typename std::iterator_traits::value_type; + enum + { + value = sizeof(value_type) > 1 + }; +}; + +template +struct iterator_input_adapter_factory::value>> +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits::value_type; + using base_adapter_type = iterator_input_adapter; + using adapter_type = wide_string_input_adapter; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(base_adapter_type(std::move(first), std::move(last))); + } +}; + +// General purpose iterator-based input +template +typename iterator_input_adapter_factory::adapter_type input_adapter(IteratorType first, IteratorType last) +{ + using factory_type = iterator_input_adapter_factory; + return factory_type::create(first, last); +} + +// Convenience shorthand from container to iterator +// Enables ADL on begin(container) and end(container) +// Encloses the using declarations in namespace for not to leak them to outside scope + +namespace container_input_adapter_factory_impl +{ + +using std::begin; +using std::end; + +template +struct container_input_adapter_factory {}; + +template +struct container_input_adapter_factory< ContainerType, + void_t()), end(std::declval()))>> + { + using adapter_type = decltype(input_adapter(begin(std::declval()), end(std::declval()))); + + static adapter_type create(const ContainerType& container) +{ + return input_adapter(begin(container), end(container)); +} + }; + +} // namespace container_input_adapter_factory_impl + +template +typename container_input_adapter_factory_impl::container_input_adapter_factory::adapter_type input_adapter(const ContainerType& container) +{ + return container_input_adapter_factory_impl::container_input_adapter_factory::create(container); +} + +#ifndef JSON_NO_IO +// Special cases with fast paths +inline file_input_adapter input_adapter(std::FILE* file) +{ + return file_input_adapter(file); +} + +inline input_stream_adapter input_adapter(std::istream& stream) +{ + return input_stream_adapter(stream); +} + +inline input_stream_adapter input_adapter(std::istream&& stream) +{ + return input_stream_adapter(stream); +} +#endif // JSON_NO_IO + +using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval(), std::declval())); + +// Null-delimited strings, and the like. +template < typename CharT, + typename std::enable_if < + std::is_pointer::value&& + !std::is_array::value&& + std::is_integral::type>::value&& + sizeof(typename std::remove_pointer::type) == 1, + int >::type = 0 > +contiguous_bytes_input_adapter input_adapter(CharT b) +{ + auto length = std::strlen(reinterpret_cast(b)); + const auto* ptr = reinterpret_cast(b); + return input_adapter(ptr, ptr + length); +} + +template +auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + return input_adapter(array, array + N); +} + +// This class only handles inputs of input_buffer_adapter type. +// It's required so that expressions like {ptr, len} can be implicitly cast +// to the correct adapter. +class span_input_adapter +{ + public: + template < typename CharT, + typename std::enable_if < + std::is_pointer::value&& + std::is_integral::type>::value&& + sizeof(typename std::remove_pointer::type) == 1, + int >::type = 0 > + span_input_adapter(CharT b, std::size_t l) + : ia(reinterpret_cast(b), reinterpret_cast(b) + l) {} + + template::iterator_category, std::random_access_iterator_tag>::value, + int>::type = 0> + span_input_adapter(IteratorType first, IteratorType last) + : ia(input_adapter(first, last)) {} + + contiguous_bytes_input_adapter&& get() + { + return std::move(ia); // NOLINT(hicpp-move-const-arg,performance-move-const-arg) + } + + private: + contiguous_bytes_input_adapter ia; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include +#include // string +#include // move +#include // vector + +// #include + +// #include + + +namespace nlohmann +{ + +/*! +@brief SAX interface + +This class describes the SAX interface used by @ref nlohmann::json::sax_parse. +Each function is called in different situations while the input is parsed. The +boolean return value informs the parser whether to continue processing the +input. +*/ +template +struct json_sax +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @brief a null value was read + @return whether parsing should proceed + */ + virtual bool null() = 0; + + /*! + @brief a boolean value was read + @param[in] val boolean value + @return whether parsing should proceed + */ + virtual bool boolean(bool val) = 0; + + /*! + @brief an integer number was read + @param[in] val integer value + @return whether parsing should proceed + */ + virtual bool number_integer(number_integer_t val) = 0; + + /*! + @brief an unsigned integer number was read + @param[in] val unsigned integer value + @return whether parsing should proceed + */ + virtual bool number_unsigned(number_unsigned_t val) = 0; + + /*! + @brief a floating-point number was read + @param[in] val floating-point value + @param[in] s raw token value + @return whether parsing should proceed + */ + virtual bool number_float(number_float_t val, const string_t& s) = 0; + + /*! + @brief a string value was read + @param[in] val string value + @return whether parsing should proceed + @note It is safe to move the passed string value. + */ + virtual bool string(string_t& val) = 0; + + /*! + @brief a binary value was read + @param[in] val binary value + @return whether parsing should proceed + @note It is safe to move the passed binary value. + */ + virtual bool binary(binary_t& val) = 0; + + /*! + @brief the beginning of an object was read + @param[in] elements number of object elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_object(std::size_t elements) = 0; + + /*! + @brief an object key was read + @param[in] val object key + @return whether parsing should proceed + @note It is safe to move the passed string. + */ + virtual bool key(string_t& val) = 0; + + /*! + @brief the end of an object was read + @return whether parsing should proceed + */ + virtual bool end_object() = 0; + + /*! + @brief the beginning of an array was read + @param[in] elements number of array elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_array(std::size_t elements) = 0; + + /*! + @brief the end of an array was read + @return whether parsing should proceed + */ + virtual bool end_array() = 0; + + /*! + @brief a parse error occurred + @param[in] position the position in the input where the error occurs + @param[in] last_token the last read token + @param[in] ex an exception object describing the error + @return whether parsing should proceed (must return false) + */ + virtual bool parse_error(std::size_t position, + const std::string& last_token, + const detail::exception& ex) = 0; + + json_sax() = default; + json_sax(const json_sax&) = default; + json_sax(json_sax&&) noexcept = default; + json_sax& operator=(const json_sax&) = default; + json_sax& operator=(json_sax&&) noexcept = default; + virtual ~json_sax() = default; +}; + + +namespace detail +{ +/*! +@brief SAX implementation to create a JSON value from SAX events + +This class implements the @ref json_sax interface and processes the SAX events +to create a JSON value which makes it basically a DOM parser. The structure or +hierarchy of the JSON value is managed by the stack `ref_stack` which contains +a pointer to the respective array or object for each recursion depth. + +After successful parsing, the value that is passed by reference to the +constructor contains the parsed value. + +@tparam BasicJsonType the JSON type +*/ +template +class json_sax_dom_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @param[in,out] r reference to a JSON value that is manipulated while + parsing + @param[in] allow_exceptions_ whether parse errors yield exceptions + */ + explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) + : root(r), allow_exceptions(allow_exceptions_) + {} + + // make class move-only + json_sax_dom_parser(const json_sax_dom_parser&) = delete; + json_sax_dom_parser(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete; + json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + // add null at given key and store the reference for later + object_element = &(ref_stack.back()->m_value.object->operator[](val)); + return true; + } + + bool end_object() + { + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + bool start_array(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool end_array() + { + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + template + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + template + JSON_HEDLEY_RETURNS_NON_NULL + BasicJsonType* handle_value(Value&& v) + { + if (ref_stack.empty()) + { + root = BasicJsonType(std::forward(v)); + return &root; + } + + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->emplace_back(std::forward(v)); + return &(ref_stack.back()->m_value.array->back()); + } + + JSON_ASSERT(ref_stack.back()->is_object()); + JSON_ASSERT(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +template +class json_sax_dom_callback_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using parser_callback_t = typename BasicJsonType::parser_callback_t; + using parse_event_t = typename BasicJsonType::parse_event_t; + + json_sax_dom_callback_parser(BasicJsonType& r, + const parser_callback_t cb, + const bool allow_exceptions_ = true) + : root(r), callback(cb), allow_exceptions(allow_exceptions_) + { + keep_stack.push_back(true); + } + + // make class move-only + json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_callback_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + // check callback for object start + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::object_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::object, true); + ref_stack.push_back(val.second); + + // check object limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + BasicJsonType k = BasicJsonType(val); + + // check callback for key + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::key, k); + key_keep_stack.push_back(keep); + + // add discarded value at given key and store the reference for later + if (keep && ref_stack.back()) + { + object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded); + } + + return true; + } + + bool end_object() + { + if (ref_stack.back()) + { + if (!callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back())) + { + // discard object + *ref_stack.back() = discarded; + } + else + { + ref_stack.back()->set_parents(); + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured()) + { + // remove discarded value + for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) + { + if (it->is_discarded()) + { + ref_stack.back()->erase(it); + break; + } + } + } + + return true; + } + + bool start_array(std::size_t len) + { + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::array_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::array, true); + ref_stack.push_back(val.second); + + // check array limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool end_array() + { + bool keep = true; + + if (ref_stack.back()) + { + keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back()); + if (keep) + { + ref_stack.back()->set_parents(); + } + else + { + // discard array + *ref_stack.back() = discarded; + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + // remove discarded value + if (!keep && !ref_stack.empty() && ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->pop_back(); + } + + return true; + } + + template + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @param[in] v value to add to the JSON value we build during parsing + @param[in] skip_callback whether we should skip calling the callback + function; this is required after start_array() and + start_object() SAX events, because otherwise we would call the + callback function with an empty array or object, respectively. + + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + + @return pair of boolean (whether value should be kept) and pointer (to the + passed value in the ref_stack hierarchy; nullptr if not kept) + */ + template + std::pair handle_value(Value&& v, const bool skip_callback = false) + { + JSON_ASSERT(!keep_stack.empty()); + + // do not handle this value if we know it would be added to a discarded + // container + if (!keep_stack.back()) + { + return {false, nullptr}; + } + + // create value + auto value = BasicJsonType(std::forward(v)); + + // check callback + const bool keep = skip_callback || callback(static_cast(ref_stack.size()), parse_event_t::value, value); + + // do not handle this value if we just learnt it shall be discarded + if (!keep) + { + return {false, nullptr}; + } + + if (ref_stack.empty()) + { + root = std::move(value); + return {true, &root}; + } + + // skip this value if we already decided to skip the parent + // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360) + if (!ref_stack.back()) + { + return {false, nullptr}; + } + + // we now only expect arrays and objects + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + // array + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->emplace_back(std::move(value)); + return {true, &(ref_stack.back()->m_value.array->back())}; + } + + // object + JSON_ASSERT(ref_stack.back()->is_object()); + // check if we should store an element for the current key + JSON_ASSERT(!key_keep_stack.empty()); + const bool store_element = key_keep_stack.back(); + key_keep_stack.pop_back(); + + if (!store_element) + { + return {false, nullptr}; + } + + JSON_ASSERT(object_element); + *object_element = std::move(value); + return {true, object_element}; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack {}; + /// stack to manage which values to keep + std::vector keep_stack {}; + /// stack to manage which object keys to keep + std::vector key_keep_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// callback function + const parser_callback_t callback = nullptr; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; + /// a discarded value for the callback + BasicJsonType discarded = BasicJsonType::value_t::discarded; +}; + +template +class json_sax_acceptor +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + bool null() + { + return true; + } + + bool boolean(bool /*unused*/) + { + return true; + } + + bool number_integer(number_integer_t /*unused*/) + { + return true; + } + + bool number_unsigned(number_unsigned_t /*unused*/) + { + return true; + } + + bool number_float(number_float_t /*unused*/, const string_t& /*unused*/) + { + return true; + } + + bool string(string_t& /*unused*/) + { + return true; + } + + bool binary(binary_t& /*unused*/) + { + return true; + } + + bool start_object(std::size_t /*unused*/ = static_cast(-1)) + { + return true; + } + + bool key(string_t& /*unused*/) + { + return true; + } + + bool end_object() + { + return true; + } + + bool start_array(std::size_t /*unused*/ = static_cast(-1)) + { + return true; + } + + bool end_array() + { + return true; + } + + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/) + { + return false; + } +}; +} // namespace detail + +} // namespace nlohmann + +// #include + + +#include // array +#include // localeconv +#include // size_t +#include // snprintf +#include // strtof, strtod, strtold, strtoll, strtoull +#include // initializer_list +#include // char_traits, string +#include // move +#include // vector + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/////////// +// lexer // +/////////// + +template +class lexer_base +{ + public: + /// token types for the parser + enum class token_type + { + uninitialized, ///< indicating the scanner is uninitialized + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal + value_string, ///< a string -- use get_string() for actual value + value_unsigned, ///< an unsigned integer -- use get_number_unsigned() for actual value + value_integer, ///< a signed integer -- use get_number_integer() for actual value + value_float, ///< an floating point number -- use get_number_float() for actual value + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` + parse_error, ///< indicating a parse error + end_of_input, ///< indicating the end of the input buffer + literal_or_value ///< a literal or the begin of a value (only for diagnostics) + }; + + /// return name of values of type token_type (only used for errors) + JSON_HEDLEY_RETURNS_NON_NULL + JSON_HEDLEY_CONST + static const char* token_type_name(const token_type t) noexcept + { + switch (t) + { + case token_type::uninitialized: + return ""; + case token_type::literal_true: + return "true literal"; + case token_type::literal_false: + return "false literal"; + case token_type::literal_null: + return "null literal"; + case token_type::value_string: + return "string literal"; + case token_type::value_unsigned: + case token_type::value_integer: + case token_type::value_float: + return "number literal"; + case token_type::begin_array: + return "'['"; + case token_type::begin_object: + return "'{'"; + case token_type::end_array: + return "']'"; + case token_type::end_object: + return "'}'"; + case token_type::name_separator: + return "':'"; + case token_type::value_separator: + return "','"; + case token_type::parse_error: + return ""; + case token_type::end_of_input: + return "end of input"; + case token_type::literal_or_value: + return "'[', '{', or a literal"; + // LCOV_EXCL_START + default: // catch non-enum values + return "unknown token"; + // LCOV_EXCL_STOP + } + } +}; +/*! +@brief lexical analysis + +This class organizes the lexical analysis during JSON deserialization. +*/ +template +class lexer : public lexer_base +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename std::char_traits::int_type; + + public: + using token_type = typename lexer_base::token_type; + + explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false) noexcept + : ia(std::move(adapter)) + , ignore_comments(ignore_comments_) + , decimal_point_char(static_cast(get_decimal_point())) + {} + + // delete because of pointer members + lexer(const lexer&) = delete; + lexer(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + lexer& operator=(lexer&) = delete; + lexer& operator=(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~lexer() = default; + + private: + ///////////////////// + // locales + ///////////////////// + + /// return the locale-dependent decimal point + JSON_HEDLEY_PURE + static char get_decimal_point() noexcept + { + const auto* loc = localeconv(); + JSON_ASSERT(loc != nullptr); + return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point); + } + + ///////////////////// + // scan functions + ///////////////////// + + /*! + @brief get codepoint from 4 hex characters following `\u` + + For input "\u c1 c2 c3 c4" the codepoint is: + (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4 + = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0) + + Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f' + must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The + conversion is done by subtracting the offset (0x30, 0x37, and 0x57) + between the ASCII value of the character and the desired integer value. + + @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or + non-hex character) + */ + int get_codepoint() + { + // this function only makes sense after reading `\u` + JSON_ASSERT(current == 'u'); + int codepoint = 0; + + const auto factors = { 12u, 8u, 4u, 0u }; + for (const auto factor : factors) + { + get(); + + if (current >= '0' && current <= '9') + { + codepoint += static_cast((static_cast(current) - 0x30u) << factor); + } + else if (current >= 'A' && current <= 'F') + { + codepoint += static_cast((static_cast(current) - 0x37u) << factor); + } + else if (current >= 'a' && current <= 'f') + { + codepoint += static_cast((static_cast(current) - 0x57u) << factor); + } + else + { + return -1; + } + } + + JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF); + return codepoint; + } + + /*! + @brief check if the next byte(s) are inside a given range + + Adds the current byte and, for each passed range, reads a new byte and + checks if it is inside the range. If a violation was detected, set up an + error message and return false. Otherwise, return true. + + @param[in] ranges list of integers; interpreted as list of pairs of + inclusive lower and upper bound, respectively + + @pre The passed list @a ranges must have 2, 4, or 6 elements; that is, + 1, 2, or 3 pairs. This precondition is enforced by an assertion. + + @return true if and only if no range violation was detected + */ + bool next_byte_in_range(std::initializer_list ranges) + { + JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6); + add(current); + + for (auto range = ranges.begin(); range != ranges.end(); ++range) + { + get(); + if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range))) + { + add(current); + } + else + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return false; + } + } + + return true; + } + + /*! + @brief scan a string literal + + This function scans a string according to Sect. 7 of RFC 8259. While + scanning, bytes are escaped and copied into buffer token_buffer. Then the + function returns successfully, token_buffer is *not* null-terminated (as it + may contain \0 bytes), and token_buffer.size() is the number of bytes in the + string. + + @return token_type::value_string if string could be successfully scanned, + token_type::parse_error otherwise + + @note In case of errors, variable error_message contains a textual + description. + */ + token_type scan_string() + { + // reset token_buffer (ignore opening quote) + reset(); + + // we entered the function by reading an open quote + JSON_ASSERT(current == '\"'); + + while (true) + { + // get next character + switch (get()) + { + // end of file while parsing string + case std::char_traits::eof(): + { + error_message = "invalid string: missing closing quote"; + return token_type::parse_error; + } + + // closing quote + case '\"': + { + return token_type::value_string; + } + + // escapes + case '\\': + { + switch (get()) + { + // quotation mark + case '\"': + add('\"'); + break; + // reverse solidus + case '\\': + add('\\'); + break; + // solidus + case '/': + add('/'); + break; + // backspace + case 'b': + add('\b'); + break; + // form feed + case 'f': + add('\f'); + break; + // line feed + case 'n': + add('\n'); + break; + // carriage return + case 'r': + add('\r'); + break; + // tab + case 't': + add('\t'); + break; + + // unicode escapes + case 'u': + { + const int codepoint1 = get_codepoint(); + int codepoint = codepoint1; // start with codepoint1 + + if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if code point is a high surrogate + if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF) + { + // expect next \uxxxx entry + if (JSON_HEDLEY_LIKELY(get() == '\\' && get() == 'u')) + { + const int codepoint2 = get_codepoint(); + + if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if codepoint2 is a low surrogate + if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF)) + { + // overwrite codepoint + codepoint = static_cast( + // high surrogate occupies the most significant 22 bits + (static_cast(codepoint1) << 10u) + // low surrogate occupies the least significant 15 bits + + static_cast(codepoint2) + // there is still the 0xD800, 0xDC00 and 0x10000 noise + // in the result, so we have to subtract with: + // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 + - 0x35FDC00u); + } + else + { + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; + } + } + else + { + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF)) + { + error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF"; + return token_type::parse_error; + } + } + + // result of the above calculation yields a proper codepoint + JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF); + + // translate codepoint into bytes + if (codepoint < 0x80) + { + // 1-byte characters: 0xxxxxxx (ASCII) + add(static_cast(codepoint)); + } + else if (codepoint <= 0x7FF) + { + // 2-byte characters: 110xxxxx 10xxxxxx + add(static_cast(0xC0u | (static_cast(codepoint) >> 6u))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + else if (codepoint <= 0xFFFF) + { + // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx + add(static_cast(0xE0u | (static_cast(codepoint) >> 12u))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + else + { + // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + add(static_cast(0xF0u | (static_cast(codepoint) >> 18u))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 12u) & 0x3Fu))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + + break; + } + + // other characters after escape + default: + error_message = "invalid string: forbidden character after backslash"; + return token_type::parse_error; + } + + break; + } + + // invalid control characters + case 0x00: + { + error_message = "invalid string: control character U+0000 (NUL) must be escaped to \\u0000"; + return token_type::parse_error; + } + + case 0x01: + { + error_message = "invalid string: control character U+0001 (SOH) must be escaped to \\u0001"; + return token_type::parse_error; + } + + case 0x02: + { + error_message = "invalid string: control character U+0002 (STX) must be escaped to \\u0002"; + return token_type::parse_error; + } + + case 0x03: + { + error_message = "invalid string: control character U+0003 (ETX) must be escaped to \\u0003"; + return token_type::parse_error; + } + + case 0x04: + { + error_message = "invalid string: control character U+0004 (EOT) must be escaped to \\u0004"; + return token_type::parse_error; + } + + case 0x05: + { + error_message = "invalid string: control character U+0005 (ENQ) must be escaped to \\u0005"; + return token_type::parse_error; + } + + case 0x06: + { + error_message = "invalid string: control character U+0006 (ACK) must be escaped to \\u0006"; + return token_type::parse_error; + } + + case 0x07: + { + error_message = "invalid string: control character U+0007 (BEL) must be escaped to \\u0007"; + return token_type::parse_error; + } + + case 0x08: + { + error_message = "invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b"; + return token_type::parse_error; + } + + case 0x09: + { + error_message = "invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t"; + return token_type::parse_error; + } + + case 0x0A: + { + error_message = "invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n"; + return token_type::parse_error; + } + + case 0x0B: + { + error_message = "invalid string: control character U+000B (VT) must be escaped to \\u000B"; + return token_type::parse_error; + } + + case 0x0C: + { + error_message = "invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f"; + return token_type::parse_error; + } + + case 0x0D: + { + error_message = "invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r"; + return token_type::parse_error; + } + + case 0x0E: + { + error_message = "invalid string: control character U+000E (SO) must be escaped to \\u000E"; + return token_type::parse_error; + } + + case 0x0F: + { + error_message = "invalid string: control character U+000F (SI) must be escaped to \\u000F"; + return token_type::parse_error; + } + + case 0x10: + { + error_message = "invalid string: control character U+0010 (DLE) must be escaped to \\u0010"; + return token_type::parse_error; + } + + case 0x11: + { + error_message = "invalid string: control character U+0011 (DC1) must be escaped to \\u0011"; + return token_type::parse_error; + } + + case 0x12: + { + error_message = "invalid string: control character U+0012 (DC2) must be escaped to \\u0012"; + return token_type::parse_error; + } + + case 0x13: + { + error_message = "invalid string: control character U+0013 (DC3) must be escaped to \\u0013"; + return token_type::parse_error; + } + + case 0x14: + { + error_message = "invalid string: control character U+0014 (DC4) must be escaped to \\u0014"; + return token_type::parse_error; + } + + case 0x15: + { + error_message = "invalid string: control character U+0015 (NAK) must be escaped to \\u0015"; + return token_type::parse_error; + } + + case 0x16: + { + error_message = "invalid string: control character U+0016 (SYN) must be escaped to \\u0016"; + return token_type::parse_error; + } + + case 0x17: + { + error_message = "invalid string: control character U+0017 (ETB) must be escaped to \\u0017"; + return token_type::parse_error; + } + + case 0x18: + { + error_message = "invalid string: control character U+0018 (CAN) must be escaped to \\u0018"; + return token_type::parse_error; + } + + case 0x19: + { + error_message = "invalid string: control character U+0019 (EM) must be escaped to \\u0019"; + return token_type::parse_error; + } + + case 0x1A: + { + error_message = "invalid string: control character U+001A (SUB) must be escaped to \\u001A"; + return token_type::parse_error; + } + + case 0x1B: + { + error_message = "invalid string: control character U+001B (ESC) must be escaped to \\u001B"; + return token_type::parse_error; + } + + case 0x1C: + { + error_message = "invalid string: control character U+001C (FS) must be escaped to \\u001C"; + return token_type::parse_error; + } + + case 0x1D: + { + error_message = "invalid string: control character U+001D (GS) must be escaped to \\u001D"; + return token_type::parse_error; + } + + case 0x1E: + { + error_message = "invalid string: control character U+001E (RS) must be escaped to \\u001E"; + return token_type::parse_error; + } + + case 0x1F: + { + error_message = "invalid string: control character U+001F (US) must be escaped to \\u001F"; + return token_type::parse_error; + } + + // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace)) + case 0x20: + case 0x21: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + { + add(current); + break; + } + + // U+0080..U+07FF: bytes C2..DF 80..BF + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: + case 0xD8: + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: + { + if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF}))) + { + return token_type::parse_error; + } + break; + } + + // U+0800..U+0FFF: bytes E0 A0..BF 80..BF + case 0xE0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF + // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xEE: + case 0xEF: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+D000..U+D7FF: bytes ED 80..9F 80..BF + case 0xED: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF + case 0xF0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF + case 0xF1: + case 0xF2: + case 0xF3: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF + case 0xF4: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // remaining bytes (80..C1 and F5..FF) are ill-formed + default: + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return token_type::parse_error; + } + } + } + } + + /*! + * @brief scan a comment + * @return whether comment could be scanned successfully + */ + bool scan_comment() + { + switch (get()) + { + // single-line comments skip input until a newline or EOF is read + case '/': + { + while (true) + { + switch (get()) + { + case '\n': + case '\r': + case std::char_traits::eof(): + case '\0': + return true; + + default: + break; + } + } + } + + // multi-line comments skip input until */ is read + case '*': + { + while (true) + { + switch (get()) + { + case std::char_traits::eof(): + case '\0': + { + error_message = "invalid comment; missing closing '*/'"; + return false; + } + + case '*': + { + switch (get()) + { + case '/': + return true; + + default: + { + unget(); + continue; + } + } + } + + default: + continue; + } + } + } + + // unexpected character after reading '/' + default: + { + error_message = "invalid comment; expecting '/' or '*' after '/'"; + return false; + } + } + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(float& f, const char* str, char** endptr) noexcept + { + f = std::strtof(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(double& f, const char* str, char** endptr) noexcept + { + f = std::strtod(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(long double& f, const char* str, char** endptr) noexcept + { + f = std::strtold(str, endptr); + } + + /*! + @brief scan a number literal + + This function scans a string according to Sect. 6 of RFC 8259. + + The function is realized with a deterministic finite state machine derived + from the grammar described in RFC 8259. Starting in state "init", the + input is read and used to determined the next state. Only state "done" + accepts the number. State "error" is a trap state to model errors. In the + table below, "anything" means any character but the ones listed before. + + state | 0 | 1-9 | e E | + | - | . | anything + ---------|----------|----------|----------|---------|---------|----------|----------- + init | zero | any1 | [error] | [error] | minus | [error] | [error] + minus | zero | any1 | [error] | [error] | [error] | [error] | [error] + zero | done | done | exponent | done | done | decimal1 | done + any1 | any1 | any1 | exponent | done | done | decimal1 | done + decimal1 | decimal2 | decimal2 | [error] | [error] | [error] | [error] | [error] + decimal2 | decimal2 | decimal2 | exponent | done | done | done | done + exponent | any2 | any2 | [error] | sign | sign | [error] | [error] + sign | any2 | any2 | [error] | [error] | [error] | [error] | [error] + any2 | any2 | any2 | done | done | done | done | done + + The state machine is realized with one label per state (prefixed with + "scan_number_") and `goto` statements between them. The state machine + contains cycles, but any cycle can be left when EOF is read. Therefore, + the function is guaranteed to terminate. + + During scanning, the read bytes are stored in token_buffer. This string is + then converted to a signed integer, an unsigned integer, or a + floating-point number. + + @return token_type::value_unsigned, token_type::value_integer, or + token_type::value_float if number could be successfully scanned, + token_type::parse_error otherwise + + @note The scanner is independent of the current locale. Internally, the + locale's decimal point is used instead of `.` to work with the + locale-dependent converters. + */ + token_type scan_number() // lgtm [cpp/use-of-goto] + { + // reset token_buffer to store the number's bytes + reset(); + + // the type of the parsed number; initially set to unsigned; will be + // changed if minus sign, decimal point or exponent is read + token_type number_type = token_type::value_unsigned; + + // state (init): we just found out we need to scan a number + switch (current) + { + case '-': + { + add(current); + goto scan_number_minus; + } + + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + // all other characters are rejected outside scan_number() + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + +scan_number_minus: + // state: we just parsed a leading minus sign + number_type = token_type::value_integer; + switch (get()) + { + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + default: + { + error_message = "invalid number; expected digit after '-'"; + return token_type::parse_error; + } + } + +scan_number_zero: + // state: we just parse a zero (maybe with a leading minus sign) + switch (get()) + { + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_any1: + // state: we just parsed a number 0-9 (maybe with a leading minus sign) + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_decimal1: + // state: we just parsed a decimal point + number_type = token_type::value_float; + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + default: + { + error_message = "invalid number; expected digit after '.'"; + return token_type::parse_error; + } + } + +scan_number_decimal2: + // we just parsed at least one number after a decimal point + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_exponent: + // we just parsed an exponent + number_type = token_type::value_float; + switch (get()) + { + case '+': + case '-': + { + add(current); + goto scan_number_sign; + } + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = + "invalid number; expected '+', '-', or digit after exponent"; + return token_type::parse_error; + } + } + +scan_number_sign: + // we just parsed an exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = "invalid number; expected digit after exponent sign"; + return token_type::parse_error; + } + } + +scan_number_any2: + // we just parsed a number after the exponent or exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + goto scan_number_done; + } + +scan_number_done: + // unget the character after the number (we only read it to know that + // we are done scanning a number) + unget(); + + char* endptr = nullptr; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + errno = 0; + + // try to parse integers first and fall back to floats + if (number_type == token_type::value_unsigned) + { + const auto x = std::strtoull(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_unsigned = static_cast(x); + if (value_unsigned == x) + { + return token_type::value_unsigned; + } + } + } + else if (number_type == token_type::value_integer) + { + const auto x = std::strtoll(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_integer = static_cast(x); + if (value_integer == x) + { + return token_type::value_integer; + } + } + } + + // this code is reached if we parse a floating-point number or if an + // integer conversion above failed + strtof(value_float, token_buffer.data(), &endptr); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + return token_type::value_float; + } + + /*! + @param[in] literal_text the literal text to expect + @param[in] length the length of the passed literal text + @param[in] return_type the token type to return on success + */ + JSON_HEDLEY_NON_NULL(2) + token_type scan_literal(const char_type* literal_text, const std::size_t length, + token_type return_type) + { + JSON_ASSERT(std::char_traits::to_char_type(current) == literal_text[0]); + for (std::size_t i = 1; i < length; ++i) + { + if (JSON_HEDLEY_UNLIKELY(std::char_traits::to_char_type(get()) != literal_text[i])) + { + error_message = "invalid literal"; + return token_type::parse_error; + } + } + return return_type; + } + + ///////////////////// + // input management + ///////////////////// + + /// reset token_buffer; current character is beginning of token + void reset() noexcept + { + token_buffer.clear(); + token_string.clear(); + token_string.push_back(std::char_traits::to_char_type(current)); + } + + /* + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a + `std::char_traits::eof()` in that case. Stores the scanned characters + for use in error messages. + + @return character read from the input + */ + char_int_type get() + { + ++position.chars_read_total; + ++position.chars_read_current_line; + + if (next_unget) + { + // just reset the next_unget variable and work with current + next_unget = false; + } + else + { + current = ia.get_character(); + } + + if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) + { + token_string.push_back(std::char_traits::to_char_type(current)); + } + + if (current == '\n') + { + ++position.lines_read; + position.chars_read_current_line = 0; + } + + return current; + } + + /*! + @brief unget current character (read it again on next get) + + We implement unget by setting variable next_unget to true. The input is not + changed - we just simulate ungetting by modifying chars_read_total, + chars_read_current_line, and token_string. The next call to get() will + behave as if the unget character is read again. + */ + void unget() + { + next_unget = true; + + --position.chars_read_total; + + // in case we "unget" a newline, we have to also decrement the lines_read + if (position.chars_read_current_line == 0) + { + if (position.lines_read > 0) + { + --position.lines_read; + } + } + else + { + --position.chars_read_current_line; + } + + if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) + { + JSON_ASSERT(!token_string.empty()); + token_string.pop_back(); + } + } + + /// add a character to token_buffer + void add(char_int_type c) + { + token_buffer.push_back(static_cast(c)); + } + + public: + ///////////////////// + // value getters + ///////////////////// + + /// return integer value + constexpr number_integer_t get_number_integer() const noexcept + { + return value_integer; + } + + /// return unsigned integer value + constexpr number_unsigned_t get_number_unsigned() const noexcept + { + return value_unsigned; + } + + /// return floating-point value + constexpr number_float_t get_number_float() const noexcept + { + return value_float; + } + + /// return current string value (implicitly resets the token; useful only once) + string_t& get_string() + { + return token_buffer; + } + + ///////////////////// + // diagnostics + ///////////////////// + + /// return position of last read token + constexpr position_t get_position() const noexcept + { + return position; + } + + /// return the last read token (for errors only). Will never contain EOF + /// (an arbitrary value that is not a valid char value, often -1), because + /// 255 may legitimately occur. May contain NUL, which should be escaped. + std::string get_token_string() const + { + // escape control characters + std::string result; + for (const auto c : token_string) + { + if (static_cast(c) <= '\x1F') + { + // escape control characters + std::array cs{{}}; + static_cast((std::snprintf)(cs.data(), cs.size(), "", static_cast(c))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + result += cs.data(); + } + else + { + // add character as is + result.push_back(static_cast(c)); + } + } + + return result; + } + + /// return syntax error message + JSON_HEDLEY_RETURNS_NON_NULL + constexpr const char* get_error_message() const noexcept + { + return error_message; + } + + ///////////////////// + // actual scanner + ///////////////////// + + /*! + @brief skip the UTF-8 byte order mark + @return true iff there is no BOM or the correct BOM has been skipped + */ + bool skip_bom() + { + if (get() == 0xEF) + { + // check if we completely parse the BOM + return get() == 0xBB && get() == 0xBF; + } + + // the first character is not the beginning of the BOM; unget it to + // process is later + unget(); + return true; + } + + void skip_whitespace() + { + do + { + get(); + } + while (current == ' ' || current == '\t' || current == '\n' || current == '\r'); + } + + token_type scan() + { + // initially, skip the BOM + if (position.chars_read_total == 0 && !skip_bom()) + { + error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given"; + return token_type::parse_error; + } + + // read next character and ignore whitespace + skip_whitespace(); + + // ignore comments + while (ignore_comments && current == '/') + { + if (!scan_comment()) + { + return token_type::parse_error; + } + + // skip following whitespace + skip_whitespace(); + } + + switch (current) + { + // structural characters + case '[': + return token_type::begin_array; + case ']': + return token_type::end_array; + case '{': + return token_type::begin_object; + case '}': + return token_type::end_object; + case ':': + return token_type::name_separator; + case ',': + return token_type::value_separator; + + // literals + case 't': + { + std::array true_literal = {{static_cast('t'), static_cast('r'), static_cast('u'), static_cast('e')}}; + return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true); + } + case 'f': + { + std::array false_literal = {{static_cast('f'), static_cast('a'), static_cast('l'), static_cast('s'), static_cast('e')}}; + return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false); + } + case 'n': + { + std::array null_literal = {{static_cast('n'), static_cast('u'), static_cast('l'), static_cast('l')}}; + return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null); + } + + // string + case '\"': + return scan_string(); + + // number + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return scan_number(); + + // end of input (the null byte is needed when parsing from + // string literals) + case '\0': + case std::char_traits::eof(): + return token_type::end_of_input; + + // error + default: + error_message = "invalid literal"; + return token_type::parse_error; + } + } + + private: + /// input adapter + InputAdapterType ia; + + /// whether comments should be ignored (true) or signaled as errors (false) + const bool ignore_comments = false; + + /// the current character + char_int_type current = std::char_traits::eof(); + + /// whether the next get() call should just return current + bool next_unget = false; + + /// the start position of the current token + position_t position {}; + + /// raw input token string (for error messages) + std::vector token_string {}; + + /// buffer for variable-length tokens (numbers, strings) + string_t token_buffer {}; + + /// a description of occurred lexer errors + const char* error_message = ""; + + // number values + number_integer_t value_integer = 0; + number_unsigned_t value_unsigned = 0; + number_float_t value_float = 0; + + /// the decimal point + const char_int_type decimal_point_char = '.'; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // size_t +#include // declval +#include // string + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +using null_function_t = decltype(std::declval().null()); + +template +using boolean_function_t = + decltype(std::declval().boolean(std::declval())); + +template +using number_integer_function_t = + decltype(std::declval().number_integer(std::declval())); + +template +using number_unsigned_function_t = + decltype(std::declval().number_unsigned(std::declval())); + +template +using number_float_function_t = decltype(std::declval().number_float( + std::declval(), std::declval())); + +template +using string_function_t = + decltype(std::declval().string(std::declval())); + +template +using binary_function_t = + decltype(std::declval().binary(std::declval())); + +template +using start_object_function_t = + decltype(std::declval().start_object(std::declval())); + +template +using key_function_t = + decltype(std::declval().key(std::declval())); + +template +using end_object_function_t = decltype(std::declval().end_object()); + +template +using start_array_function_t = + decltype(std::declval().start_array(std::declval())); + +template +using end_array_function_t = decltype(std::declval().end_array()); + +template +using parse_error_function_t = decltype(std::declval().parse_error( + std::declval(), std::declval(), + std::declval())); + +template +struct is_sax +{ + private: + static_assert(is_basic_json::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static constexpr bool value = + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value; +}; + +template +struct is_sax_static_asserts +{ + private: + static_assert(is_basic_json::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static_assert(is_detected_exact::value, + "Missing/invalid function: bool null()"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool number_integer(number_integer_t)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool number_unsigned(number_unsigned_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool number_float(number_float_t, const string_t&)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool string(string_t&)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool binary(binary_t&)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool start_object(std::size_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool key(string_t&)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool end_object()"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool start_array(std::size_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool end_array()"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool parse_error(std::size_t, const " + "std::string&, const exception&)"); +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +/// how to treat CBOR tags +enum class cbor_tag_handler_t +{ + error, ///< throw a parse_error exception in case of a tag + ignore, ///< ignore tags + store ///< store tags as binary type +}; + +/*! +@brief determine system byte order + +@return true if and only if system's byte order is little endian + +@note from https://stackoverflow.com/a/1001328/266378 +*/ +static inline bool little_endianness(int num = 1) noexcept +{ + return *reinterpret_cast(&num) == 1; +} + + +/////////////////// +// binary reader // +/////////////////// + +/*! +@brief deserialization of CBOR, MessagePack, and UBJSON values +*/ +template> +class binary_reader +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using json_sax_t = SAX; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename std::char_traits::int_type; + + public: + /*! + @brief create a binary reader + + @param[in] adapter input adapter to read from + */ + explicit binary_reader(InputAdapterType&& adapter) noexcept : ia(std::move(adapter)) + { + (void)detail::is_sax_static_asserts {}; + } + + // make class move-only + binary_reader(const binary_reader&) = delete; + binary_reader(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + binary_reader& operator=(const binary_reader&) = delete; + binary_reader& operator=(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~binary_reader() = default; + + /*! + @param[in] format the binary format to parse + @param[in] sax_ a SAX event processor + @param[in] strict whether to expect the input to be consumed completed + @param[in] tag_handler how to treat CBOR tags + + @return whether parsing was successful + */ + JSON_HEDLEY_NON_NULL(3) + bool sax_parse(const input_format_t format, + json_sax_t* sax_, + const bool strict = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + sax = sax_; + bool result = false; + + switch (format) + { + case input_format_t::bson: + result = parse_bson_internal(); + break; + + case input_format_t::cbor: + result = parse_cbor_internal(true, tag_handler); + break; + + case input_format_t::msgpack: + result = parse_msgpack_internal(); + break; + + case input_format_t::ubjson: + result = parse_ubjson_internal(); + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + // strict mode: next byte must be EOF + if (result && strict) + { + if (format == input_format_t::ubjson) + { + get_ignore_noop(); + } + else + { + get(); + } + + if (JSON_HEDLEY_UNLIKELY(current != std::char_traits::eof())) + { + return sax->parse_error(chars_read, get_token_string(), + parse_error::create(110, chars_read, exception_message(format, "expected end of input; last byte: 0x" + get_token_string(), "value"), BasicJsonType())); + } + } + + return result; + } + + private: + ////////// + // BSON // + ////////// + + /*! + @brief Reads in a BSON-object and passes it to the SAX-parser. + @return whether a valid BSON-value was passed to the SAX parser + */ + bool parse_bson_internal() + { + std::int32_t document_size{}; + get_number(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false))) + { + return false; + } + + return sax->end_object(); + } + + /*! + @brief Parses a C-style string from the BSON input. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @return `true` if the \x00-byte indicating the end of the string was + encountered before the EOF; false` indicates an unexpected EOF. + */ + bool get_bson_cstr(string_t& result) + { + auto out = std::back_inserter(result); + while (true) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "cstring"))) + { + return false; + } + if (current == 0x00) + { + return true; + } + *out++ = static_cast(current); + } + } + + /*! + @brief Parses a zero-terminated string of length @a len from the BSON + input. + @param[in] len The length (including the zero-byte at the end) of the + string to be read. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 1 + @return `true` if the string was successfully parsed + */ + template + bool get_bson_string(const NumberType len, string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 1)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "string length must be at least 1, is " + std::to_string(len), "string"), BasicJsonType())); + } + + return get_string(input_format_t::bson, len - static_cast(1), result) && get() != std::char_traits::eof(); + } + + /*! + @brief Parses a byte array input of length @a len from the BSON input. + @param[in] len The length of the byte array to be read. + @param[in,out] result A reference to the binary variable where the read + array is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 0 + @return `true` if the byte array was successfully parsed + */ + template + bool get_bson_binary(const NumberType len, binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 0)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "byte array length cannot be negative, is " + std::to_string(len), "binary"), BasicJsonType())); + } + + // All BSON binary values have a subtype + std::uint8_t subtype{}; + get_number(input_format_t::bson, subtype); + result.set_subtype(subtype); + + return get_binary(input_format_t::bson, len, result); + } + + /*! + @brief Read a BSON document element of the given @a element_type. + @param[in] element_type The BSON element type, c.f. http://bsonspec.org/spec.html + @param[in] element_type_parse_position The position in the input stream, + where the `element_type` was read. + @warning Not all BSON element types are supported yet. An unsupported + @a element_type will give rise to a parse_error.114: + Unsupported BSON record type 0x... + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_internal(const char_int_type element_type, + const std::size_t element_type_parse_position) + { + switch (element_type) + { + case 0x01: // double + { + double number{}; + return get_number(input_format_t::bson, number) && sax->number_float(static_cast(number), ""); + } + + case 0x02: // string + { + std::int32_t len{}; + string_t value; + return get_number(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value); + } + + case 0x03: // object + { + return parse_bson_internal(); + } + + case 0x04: // array + { + return parse_bson_array(); + } + + case 0x05: // binary + { + std::int32_t len{}; + binary_t value; + return get_number(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value); + } + + case 0x08: // boolean + { + return sax->boolean(get() != 0); + } + + case 0x0A: // null + { + return sax->null(); + } + + case 0x10: // int32 + { + std::int32_t value{}; + return get_number(input_format_t::bson, value) && sax->number_integer(value); + } + + case 0x12: // int64 + { + std::int64_t value{}; + return get_number(input_format_t::bson, value) && sax->number_integer(value); + } + + default: // anything else not supported (yet) + { + std::array cr{{}}; + static_cast((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + return sax->parse_error(element_type_parse_position, std::string(cr.data()), parse_error::create(114, element_type_parse_position, "Unsupported BSON record type 0x" + std::string(cr.data()), BasicJsonType())); + } + } + } + + /*! + @brief Read a BSON element list (as specified in the BSON-spec) + + The same binary layout is used for objects and arrays, hence it must be + indicated with the argument @a is_array which one is expected + (true --> array, false --> object). + + @param[in] is_array Determines if the element list being read is to be + treated as an object (@a is_array == false), or as an + array (@a is_array == true). + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_list(const bool is_array) + { + string_t key; + + while (auto element_type = get()) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "element list"))) + { + return false; + } + + const std::size_t element_type_parse_position = chars_read; + if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key))) + { + return false; + } + + if (!is_array && !sax->key(key)) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position))) + { + return false; + } + + // get_bson_cstr only appends + key.clear(); + } + + return true; + } + + /*! + @brief Reads an array from the BSON input and passes it to the SAX-parser. + @return whether a valid BSON-array was passed to the SAX parser + */ + bool parse_bson_array() + { + std::int32_t document_size{}; + get_number(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true))) + { + return false; + } + + return sax->end_array(); + } + + ////////// + // CBOR // + ////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true) or whether the last read character should + be considered instead (false) + @param[in] tag_handler how CBOR tags should be treated + + @return whether a valid CBOR value was passed to the SAX parser + */ + bool parse_cbor_internal(const bool get_char, + const cbor_tag_handler_t tag_handler) + { + switch (get_char ? get() : current) + { + // EOF + case std::char_traits::eof(): + return unexpect_eof(input_format_t::cbor, "value"); + + // Integer 0x00..0x17 (0..23) + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + return sax->number_unsigned(static_cast(current)); + + case 0x18: // Unsigned integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x19: // Unsigned integer (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1A: // Unsigned integer (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1B: // Unsigned integer (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + // Negative integer -1-0x00..-1-0x17 (-1..-24) + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + return sax->number_integer(static_cast(0x20 - 1 - current)); + + case 0x38: // Negative integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x39: // Negative integer -1-n (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) + - static_cast(number)); + } + + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: // Binary data (one-byte uint8_t for n follows) + case 0x59: // Binary data (two-byte uint16_t for n follow) + case 0x5A: // Binary data (four-byte uint32_t for n follow) + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + case 0x5F: // Binary data (indefinite length) + { + binary_t b; + return get_cbor_binary(b) && sax->binary(b); + } + + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + case 0x7F: // UTF-8 string (indefinite length) + { + string_t s; + return get_cbor_string(s) && sax->string(s); + } + + // array (0x00..0x17 data items follow) + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + return get_cbor_array(static_cast(static_cast(current) & 0x1Fu), tag_handler); + + case 0x98: // array (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x99: // array (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x9A: // array (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x9B: // array (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(detail::conditional_static_cast(len), tag_handler); + } + + case 0x9F: // array (indefinite length) + return get_cbor_array(static_cast(-1), tag_handler); + + // map (0x00..0x17 pairs of data items follow) + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + return get_cbor_object(static_cast(static_cast(current) & 0x1Fu), tag_handler); + + case 0xB8: // map (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xB9: // map (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xBA: // map (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xBB: // map (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(detail::conditional_static_cast(len), tag_handler); + } + + case 0xBF: // map (indefinite length) + return get_cbor_object(static_cast(-1), tag_handler); + + case 0xC6: // tagged item + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD8: // tagged item (1 bytes follow) + case 0xD9: // tagged item (2 bytes follow) + case 0xDA: // tagged item (4 bytes follow) + case 0xDB: // tagged item (8 bytes follow) + { + switch (tag_handler) + { + case cbor_tag_handler_t::error: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + + case cbor_tag_handler_t::ignore: + { + // ignore binary subtype + switch (current) + { + case 0xD8: + { + std::uint8_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xD9: + { + std::uint16_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDA: + { + std::uint32_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDB: + { + std::uint64_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + default: + break; + } + return parse_cbor_internal(true, tag_handler); + } + + case cbor_tag_handler_t::store: + { + binary_t b; + // use binary subtype and store in binary container + switch (current) + { + case 0xD8: + { + std::uint8_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xD9: + { + std::uint16_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xDA: + { + std::uint32_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xDB: + { + std::uint64_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + default: + return parse_cbor_internal(true, tag_handler); + } + get(); + return get_cbor_binary(b) && sax->binary(b); + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + case 0xF4: // false + return sax->boolean(false); + + case 0xF5: // true + return sax->boolean(true); + + case 0xF6: // null + return sax->null(); + + case 0xF9: // Half-Precision Float (two-byte IEEE 754) + { + const auto byte1_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + const auto byte2_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + + const auto byte1 = static_cast(byte1_raw); + const auto byte2 = static_cast(byte2_raw); + + // code from RFC 7049, Appendix D, Figure 3: + // As half-precision floating-point numbers were only added + // to IEEE 754 in 2008, today's programming platforms often + // still only have limited support for them. It is very + // easy to include at least decoding support for them even + // without such support. An example of a small decoder for + // half-precision floating-point numbers in the C language + // is shown in Fig. 3. + const auto half = static_cast((byte1 << 8u) + byte2); + const double val = [&half] + { + const int exp = (half >> 10u) & 0x1Fu; + const unsigned int mant = half & 0x3FFu; + JSON_ASSERT(0 <= exp&& exp <= 32); + JSON_ASSERT(mant <= 1024); + switch (exp) + { + case 0: + return std::ldexp(mant, -24); + case 31: + return (mant == 0) + ? std::numeric_limits::infinity() + : std::numeric_limits::quiet_NaN(); + default: + return std::ldexp(mant + 1024, exp - 25); + } + }(); + return sax->number_float((half & 0x8000u) != 0 + ? static_cast(-val) + : static_cast(val), ""); + } + + case 0xFA: // Single-Precision Float (four-byte IEEE 754) + { + float number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); + } + + case 0xFB: // Double-Precision Float (eight-byte IEEE 754) + { + double number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); + } + + default: // anything else (0xFF is handled inside the other types) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @brief reads a CBOR string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + Additionally, CBOR's strings with indefinite lengths are supported. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_cbor_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "string"))) + { + return false; + } + + switch (current) + { + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + { + return get_string(input_format_t::cbor, static_cast(current) & 0x1Fu, result); + } + + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7F: // UTF-8 string (indefinite length) + { + while (get() != 0xFF) + { + string_t chunk; + if (!get_cbor_string(chunk)) + { + return false; + } + result.append(chunk); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + } + + /*! + @brief reads a CBOR byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into the byte array. + Additionally, CBOR's byte arrays with indefinite lengths are supported. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_cbor_binary(binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "binary"))) + { + return false; + } + + switch (current) + { + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + { + return get_binary(input_format_t::cbor, static_cast(current) & 0x1Fu, result); + } + + case 0x58: // Binary data (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x59: // Binary data (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5A: // Binary data (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5F: // Binary data (indefinite length) + { + while (get() != 0xFF) + { + binary_t chunk; + if (!get_cbor_binary(chunk)) + { + return false; + } + result.insert(result.end(), chunk.begin(), chunk.end()); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x" + last_token, "binary"), BasicJsonType())); + } + } + } + + /*! + @param[in] len the length of the array or static_cast(-1) for an + array of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether array creation completed + */ + bool get_cbor_array(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + if (len != static_cast(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler))) + { + return false; + } + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object or static_cast(-1) for an + object of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether object creation completed + */ + bool get_cbor_object(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + if (len != 0) + { + string_t key; + if (len != static_cast(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + } + + return sax->end_object(); + } + + ///////////// + // MsgPack // + ///////////// + + /*! + @return whether a valid MessagePack value was passed to the SAX parser + */ + bool parse_msgpack_internal() + { + switch (get()) + { + // EOF + case std::char_traits::eof(): + return unexpect_eof(input_format_t::msgpack, "value"); + + // positive fixint + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + return sax->number_unsigned(static_cast(current)); + + // fixmap + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + return get_msgpack_object(static_cast(static_cast(current) & 0x0Fu)); + + // fixarray + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + case 0x98: + case 0x99: + case 0x9A: + case 0x9B: + case 0x9C: + case 0x9D: + case 0x9E: + case 0x9F: + return get_msgpack_array(static_cast(static_cast(current) & 0x0Fu)); + + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + case 0xD9: // str 8 + case 0xDA: // str 16 + case 0xDB: // str 32 + { + string_t s; + return get_msgpack_string(s) && sax->string(s); + } + + case 0xC0: // nil + return sax->null(); + + case 0xC2: // false + return sax->boolean(false); + + case 0xC3: // true + return sax->boolean(true); + + case 0xC4: // bin 8 + case 0xC5: // bin 16 + case 0xC6: // bin 32 + case 0xC7: // ext 8 + case 0xC8: // ext 16 + case 0xC9: // ext 32 + case 0xD4: // fixext 1 + case 0xD5: // fixext 2 + case 0xD6: // fixext 4 + case 0xD7: // fixext 8 + case 0xD8: // fixext 16 + { + binary_t b; + return get_msgpack_binary(b) && sax->binary(b); + } + + case 0xCA: // float 32 + { + float number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); + } + + case 0xCB: // float 64 + { + double number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); + } + + case 0xCC: // uint 8 + { + std::uint8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCD: // uint 16 + { + std::uint16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCE: // uint 32 + { + std::uint32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCF: // uint 64 + { + std::uint64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xD0: // int 8 + { + std::int8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD1: // int 16 + { + std::int16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD2: // int 32 + { + std::int32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD3: // int 64 + { + std::int64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xDC: // array 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); + } + + case 0xDD: // array 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); + } + + case 0xDE: // map 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); + } + + case 0xDF: // map 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); + } + + // negative fixint + case 0xE0: + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + case 0xF0: + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + case 0xF8: + case 0xF9: + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: + return sax->number_integer(static_cast(current)); + + default: // anything else + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::msgpack, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @brief reads a MessagePack string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_msgpack_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, "string"))) + { + return false; + } + + switch (current) + { + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + { + return get_string(input_format_t::msgpack, static_cast(current) & 0x1Fu, result); + } + + case 0xD9: // str 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDA: // str 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDB: // str 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::msgpack, "expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + } + + /*! + @brief reads a MessagePack byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into a byte array. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_msgpack_binary(binary_t& result) + { + // helper function to set the subtype + auto assign_and_return_true = [&result](std::int8_t subtype) + { + result.set_subtype(static_cast(subtype)); + return true; + }; + + switch (current) + { + case 0xC4: // bin 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC5: // bin 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC6: // bin 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC7: // ext 8 + { + std::uint8_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC8: // ext 16 + { + std::uint16_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC9: // ext 32 + { + std::uint32_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xD4: // fixext 1 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 1, result) && + assign_and_return_true(subtype); + } + + case 0xD5: // fixext 2 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 2, result) && + assign_and_return_true(subtype); + } + + case 0xD6: // fixext 4 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 4, result) && + assign_and_return_true(subtype); + } + + case 0xD7: // fixext 8 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 8, result) && + assign_and_return_true(subtype); + } + + case 0xD8: // fixext 16 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 16, result) && + assign_and_return_true(subtype); + } + + default: // LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + /*! + @param[in] len the length of the array + @return whether array creation completed + */ + bool get_msgpack_array(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object + @return whether object creation completed + */ + bool get_msgpack_object(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + string_t key; + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + key.clear(); + } + + return sax->end_object(); + } + + //////////// + // UBJSON // + //////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether a valid UBJSON value was passed to the SAX parser + */ + bool parse_ubjson_internal(const bool get_char = true) + { + return get_ubjson_value(get_char ? get_ignore_noop() : current); + } + + /*! + @brief reads a UBJSON string + + This function is either called after reading the 'S' byte explicitly + indicating a string, or in case of an object key where the 'S' byte can be + left out. + + @param[out] result created string + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether string creation completed + */ + bool get_ubjson_string(string_t& result, const bool get_char = true) + { + if (get_char) + { + get(); // TODO(niels): may we ignore N here? + } + + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value"))) + { + return false; + } + + switch (current) + { + case 'U': + { + std::uint8_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'i': + { + std::int8_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'I': + { + std::int16_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'l': + { + std::int32_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'L': + { + std::int64_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + default: + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + + /*! + @param[out] result determined size + @return whether size determination completed + */ + bool get_ubjson_size_value(std::size_t& result) + { + switch (get_ignore_noop()) + { + case 'U': + { + std::uint8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'i': + { + std::int8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): number is not a char + return true; + } + + case 'I': + { + std::int16_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'l': + { + std::int32_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'L': + { + std::int64_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token, "size"), BasicJsonType())); + } + } + } + + /*! + @brief determine the type and size for a container + + In the optimized UBJSON format, a type and a size can be provided to allow + for a more compact representation. + + @param[out] result pair of the size and the type + + @return whether pair creation completed + */ + bool get_ubjson_size_type(std::pair& result) + { + result.first = string_t::npos; // size + result.second = 0; // type + + get_ignore_noop(); + + if (current == '$') + { + result.second = get(); // must not ignore 'N', because 'N' maybe the type + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "type"))) + { + return false; + } + + get_ignore_noop(); + if (JSON_HEDLEY_UNLIKELY(current != '#')) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value"))) + { + return false; + } + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "expected '#' after type information; last byte: 0x" + last_token, "size"), BasicJsonType())); + } + + return get_ubjson_size_value(result.first); + } + + if (current == '#') + { + return get_ubjson_size_value(result.first); + } + + return true; + } + + /*! + @param prefix the previously read or set type prefix + @return whether value creation completed + */ + bool get_ubjson_value(const char_int_type prefix) + { + switch (prefix) + { + case std::char_traits::eof(): // EOF + return unexpect_eof(input_format_t::ubjson, "value"); + + case 'T': // true + return sax->boolean(true); + case 'F': // false + return sax->boolean(false); + + case 'Z': // null + return sax->null(); + + case 'U': + { + std::uint8_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_unsigned(number); + } + + case 'i': + { + std::int8_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'I': + { + std::int16_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'l': + { + std::int32_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'L': + { + std::int64_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'd': + { + float number{}; + return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast(number), ""); + } + + case 'D': + { + double number{}; + return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast(number), ""); + } + + case 'H': + { + return get_ubjson_high_precision_number(); + } + + case 'C': // char + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "char"))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(current > 127)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token, "char"), BasicJsonType())); + } + string_t s(1, static_cast(current)); + return sax->string(s); + } + + case 'S': // string + { + string_t s; + return get_ubjson_string(s) && sax->string(s); + } + + case '[': // array + return get_ubjson_array(); + + case '{': // object + return get_ubjson_object(); + + default: // anything else + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @return whether array creation completed + */ + bool get_ubjson_array() + { + std::pair size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + if (size_and_type.first != string_t::npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + if (size_and_type.second != 'N') + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + } + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + while (current != ']') + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false))) + { + return false; + } + get_ignore_noop(); + } + } + + return sax->end_array(); + } + + /*! + @return whether object creation completed + */ + bool get_ubjson_object() + { + std::pair size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + string_t key; + if (size_and_type.first != string_t::npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + key.clear(); + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + key.clear(); + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + while (current != '}') + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + get_ignore_noop(); + key.clear(); + } + } + + return sax->end_object(); + } + + // Note, no reader for UBJSON binary types is implemented because they do + // not exist + + bool get_ubjson_high_precision_number() + { + // get size of following number string + std::size_t size{}; + auto res = get_ubjson_size_value(size); + if (JSON_HEDLEY_UNLIKELY(!res)) + { + return res; + } + + // get number string + std::vector number_vector; + for (std::size_t i = 0; i < size; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "number"))) + { + return false; + } + number_vector.push_back(static_cast(current)); + } + + // parse number string + using ia_type = decltype(detail::input_adapter(number_vector)); + auto number_lexer = detail::lexer(detail::input_adapter(number_vector), false); + const auto result_number = number_lexer.scan(); + const auto number_string = number_lexer.get_token_string(); + const auto result_remainder = number_lexer.scan(); + + using token_type = typename detail::lexer_base::token_type; + + if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input)) + { + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number"), BasicJsonType())); + } + + switch (result_number) + { + case token_type::value_integer: + return sax->number_integer(number_lexer.get_number_integer()); + case token_type::value_unsigned: + return sax->number_unsigned(number_lexer.get_number_unsigned()); + case token_type::value_float: + return sax->number_float(number_lexer.get_number_float(), std::move(number_string)); + case token_type::uninitialized: + case token_type::literal_true: + case token_type::literal_false: + case token_type::literal_null: + case token_type::value_string: + case token_type::begin_array: + case token_type::begin_object: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::parse_error: + case token_type::end_of_input: + case token_type::literal_or_value: + default: + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number"), BasicJsonType())); + } + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /*! + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a -'ve valued + `std::char_traits::eof()` in that case. + + @return character read from the input + */ + char_int_type get() + { + ++chars_read; + return current = ia.get_character(); + } + + /*! + @return character read from the input after ignoring all 'N' entries + */ + char_int_type get_ignore_noop() + { + do + { + get(); + } + while (current == 'N'); + + return current; + } + + /* + @brief read a number from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[out] result number of type @a NumberType + + @return whether conversion completed + + @note This function needs to respect the system's endianness, because + bytes in CBOR, MessagePack, and UBJSON are stored in network order + (big endian) and therefore need reordering on little endian systems. + */ + template + bool get_number(const input_format_t format, NumberType& result) + { + // step 1: read input into array with system's byte order + std::array vec{}; + for (std::size_t i = 0; i < sizeof(NumberType); ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "number"))) + { + return false; + } + + // reverse byte order prior to conversion if necessary + if (is_little_endian != InputIsLittleEndian) + { + vec[sizeof(NumberType) - i - 1] = static_cast(current); + } + else + { + vec[i] = static_cast(current); // LCOV_EXCL_LINE + } + } + + // step 2: convert array into number of type T and return + std::memcpy(&result, vec.data(), sizeof(NumberType)); + return true; + } + + /*! + @brief create a string by reading characters from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of characters to read + @param[out] result string created by reading @a len bytes + + @return whether string creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of string memory. + */ + template + bool get_string(const input_format_t format, + const NumberType len, + string_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) + { + success = false; + break; + } + result.push_back(static_cast(current)); + } + return success; + } + + /*! + @brief create a byte array by reading bytes from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of bytes to read + @param[out] result byte array created by reading @a len bytes + + @return whether byte array creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of memory. + */ + template + bool get_binary(const input_format_t format, + const NumberType len, + binary_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) + { + success = false; + break; + } + result.push_back(static_cast(current)); + } + return success; + } + + /*! + @param[in] format the current format (for diagnostics) + @param[in] context further context information (for diagnostics) + @return whether the last read character is not EOF + */ + JSON_HEDLEY_NON_NULL(3) + bool unexpect_eof(const input_format_t format, const char* context) const + { + if (JSON_HEDLEY_UNLIKELY(current == std::char_traits::eof())) + { + return sax->parse_error(chars_read, "", + parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context), BasicJsonType())); + } + return true; + } + + /*! + @return a string representation of the last read byte + */ + std::string get_token_string() const + { + std::array cr{{}}; + static_cast((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(current))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + return std::string{cr.data()}; + } + + /*! + @param[in] format the current format + @param[in] detail a detailed error message + @param[in] context further context information + @return a message string to use in the parse_error exceptions + */ + std::string exception_message(const input_format_t format, + const std::string& detail, + const std::string& context) const + { + std::string error_msg = "syntax error while parsing "; + + switch (format) + { + case input_format_t::cbor: + error_msg += "CBOR"; + break; + + case input_format_t::msgpack: + error_msg += "MessagePack"; + break; + + case input_format_t::ubjson: + error_msg += "UBJSON"; + break; + + case input_format_t::bson: + error_msg += "BSON"; + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + return error_msg + " " + context + ": " + detail; + } + + private: + /// input adapter + InputAdapterType ia; + + /// the current character + char_int_type current = std::char_traits::eof(); + + /// the number of characters read + std::size_t chars_read = 0; + + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// the SAX parser + json_sax_t* sax = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + + +#include // isfinite +#include // uint8_t +#include // function +#include // string +#include // move +#include // vector + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +//////////// +// parser // +//////////// + +enum class parse_event_t : std::uint8_t +{ + /// the parser read `{` and started to process a JSON object + object_start, + /// the parser read `}` and finished processing a JSON object + object_end, + /// the parser read `[` and started to process a JSON array + array_start, + /// the parser read `]` and finished processing a JSON array + array_end, + /// the parser read a key of a value in an object + key, + /// the parser finished reading a JSON value + value +}; + +template +using parser_callback_t = + std::function; + +/*! +@brief syntax analysis + +This class implements a recursive descent parser. +*/ +template +class parser +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using lexer_t = lexer; + using token_type = typename lexer_t::token_type; + + public: + /// a parser reading from an input adapter + explicit parser(InputAdapterType&& adapter, + const parser_callback_t cb = nullptr, + const bool allow_exceptions_ = true, + const bool skip_comments = false) + : callback(cb) + , m_lexer(std::move(adapter), skip_comments) + , allow_exceptions(allow_exceptions_) + { + // read first token + get_token(); + } + + /*! + @brief public parser interface + + @param[in] strict whether to expect the last token to be EOF + @param[in,out] result parsed JSON value + + @throw parse_error.101 in case of an unexpected token + @throw parse_error.102 if to_unicode fails or surrogate error + @throw parse_error.103 if to_unicode fails + */ + void parse(const bool strict, BasicJsonType& result) + { + if (callback) + { + json_sax_dom_callback_parser sdp(result, callback, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), + exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + + // set top-level value to null if it was discarded by the callback + // function + if (result.is_discarded()) + { + result = nullptr; + } + } + else + { + json_sax_dom_parser sdp(result, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + } + + result.assert_invariant(); + } + + /*! + @brief public accept interface + + @param[in] strict whether to expect the last token to be EOF + @return whether the input is a proper JSON text + */ + bool accept(const bool strict = true) + { + json_sax_acceptor sax_acceptor; + return sax_parse(&sax_acceptor, strict); + } + + template + JSON_HEDLEY_NON_NULL(2) + bool sax_parse(SAX* sax, const bool strict = true) + { + (void)detail::is_sax_static_asserts {}; + const bool result = sax_parse_internal(sax); + + // strict mode: next byte must be EOF + if (result && strict && (get_token() != token_type::end_of_input)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + return result; + } + + private: + template + JSON_HEDLEY_NON_NULL(2) + bool sax_parse_internal(SAX* sax) + { + // stack to remember the hierarchy of structured values we are parsing + // true = array; false = object + std::vector states; + // value to avoid a goto (see comment where set to true) + bool skip_to_state_evaluation = false; + + while (true) + { + if (!skip_to_state_evaluation) + { + // invariant: get_token() was called before each iteration + switch (last_token) + { + case token_type::begin_object: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + // closing } -> we are done + if (get_token() == token_type::end_object) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + break; + } + + // parse key + if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), BasicJsonType())); + } + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), BasicJsonType())); + } + + // remember we are now inside an object + states.push_back(false); + + // parse values + get_token(); + continue; + } + + case token_type::begin_array: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + // closing ] -> we are done + if (get_token() == token_type::end_array) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + break; + } + + // remember we are now inside an array + states.push_back(true); + + // parse values (no need to call get_token) + continue; + } + + case token_type::value_float: + { + const auto res = m_lexer.get_number_float(); + + if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res))) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'", BasicJsonType())); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string()))) + { + return false; + } + + break; + } + + case token_type::literal_false: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false))) + { + return false; + } + break; + } + + case token_type::literal_null: + { + if (JSON_HEDLEY_UNLIKELY(!sax->null())) + { + return false; + } + break; + } + + case token_type::literal_true: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true))) + { + return false; + } + break; + } + + case token_type::value_integer: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer()))) + { + return false; + } + break; + } + + case token_type::value_string: + { + if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string()))) + { + return false; + } + break; + } + + case token_type::value_unsigned: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned()))) + { + return false; + } + break; + } + + case token_type::parse_error: + { + // using "uninitialized" to avoid "expected" message + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized, "value"), BasicJsonType())); + } + + case token_type::uninitialized: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::end_of_input: + case token_type::literal_or_value: + default: // the last token was unexpected + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), BasicJsonType())); + } + } + } + else + { + skip_to_state_evaluation = false; + } + + // we reached this line after we successfully parsed a value + if (states.empty()) + { + // empty stack: we reached the end of the hierarchy: done + return true; + } + + if (states.back()) // array + { + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse a new value + get_token(); + continue; + } + + // closing ] + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + + // We are done with this array. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array, "array"), BasicJsonType())); + } + + // states.back() is false -> object + + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse key + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), BasicJsonType())); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), BasicJsonType())); + } + + // parse values + get_token(); + continue; + } + + // closing } + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + + // We are done with this object. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object, "object"), BasicJsonType())); + } + } + + /// get next token from lexer + token_type get_token() + { + return last_token = m_lexer.scan(); + } + + std::string exception_message(const token_type expected, const std::string& context) + { + std::string error_msg = "syntax error "; + + if (!context.empty()) + { + error_msg += "while parsing " + context + " "; + } + + error_msg += "- "; + + if (last_token == token_type::parse_error) + { + error_msg += std::string(m_lexer.get_error_message()) + "; last read: '" + + m_lexer.get_token_string() + "'"; + } + else + { + error_msg += "unexpected " + std::string(lexer_t::token_type_name(last_token)); + } + + if (expected != token_type::uninitialized) + { + error_msg += "; expected " + std::string(lexer_t::token_type_name(expected)); + } + + return error_msg; + } + + private: + /// callback function + const parser_callback_t callback = nullptr; + /// the type of the last read token + token_type last_token = token_type::uninitialized; + /// the lexer + lexer_t m_lexer; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +} // namespace detail +} // namespace nlohmann + +// #include + + +// #include + + +#include // ptrdiff_t +#include // numeric_limits + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/* +@brief an iterator for primitive JSON types + +This class models an iterator for primitive JSON types (boolean, number, +string). It's only purpose is to allow the iterator/const_iterator classes +to "iterate" over primitive values. Internally, the iterator is modeled by +a `difference_type` variable. Value begin_value (`0`) models the begin, +end_value (`1`) models past the end. +*/ +class primitive_iterator_t +{ + private: + using difference_type = std::ptrdiff_t; + static constexpr difference_type begin_value = 0; + static constexpr difference_type end_value = begin_value + 1; + + JSON_PRIVATE_UNLESS_TESTED: + /// iterator as signed integer type + difference_type m_it = (std::numeric_limits::min)(); + + public: + constexpr difference_type get_value() const noexcept + { + return m_it; + } + + /// set iterator to a defined beginning + void set_begin() noexcept + { + m_it = begin_value; + } + + /// set iterator to a defined past the end + void set_end() noexcept + { + m_it = end_value; + } + + /// return whether the iterator can be dereferenced + constexpr bool is_begin() const noexcept + { + return m_it == begin_value; + } + + /// return whether the iterator is at end + constexpr bool is_end() const noexcept + { + return m_it == end_value; + } + + friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it == rhs.m_it; + } + + friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it < rhs.m_it; + } + + primitive_iterator_t operator+(difference_type n) noexcept + { + auto result = *this; + result += n; + return result; + } + + friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it - rhs.m_it; + } + + primitive_iterator_t& operator++() noexcept + { + ++m_it; + return *this; + } + + primitive_iterator_t const operator++(int) noexcept // NOLINT(readability-const-return-type) + { + auto result = *this; + ++m_it; + return result; + } + + primitive_iterator_t& operator--() noexcept + { + --m_it; + return *this; + } + + primitive_iterator_t const operator--(int) noexcept // NOLINT(readability-const-return-type) + { + auto result = *this; + --m_it; + return result; + } + + primitive_iterator_t& operator+=(difference_type n) noexcept + { + m_it += n; + return *this; + } + + primitive_iterator_t& operator-=(difference_type n) noexcept + { + m_it -= n; + return *this; + } +}; +} // namespace detail +} // namespace nlohmann + + +namespace nlohmann +{ +namespace detail +{ +/*! +@brief an iterator value + +@note This structure could easily be a union, but MSVC currently does not allow +unions members with complex constructors, see https://github.com/nlohmann/json/pull/105. +*/ +template struct internal_iterator +{ + /// iterator for JSON objects + typename BasicJsonType::object_t::iterator object_iterator {}; + /// iterator for JSON arrays + typename BasicJsonType::array_t::iterator array_iterator {}; + /// generic iterator for all other types + primitive_iterator_t primitive_iterator {}; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next +#include // conditional, is_const, remove_const + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +// forward declare, to be able to friend it later on +template class iteration_proxy; +template class iteration_proxy_value; + +/*! +@brief a template for a bidirectional iterator for the @ref basic_json class +This class implements a both iterators (iterator and const_iterator) for the +@ref basic_json class. +@note An iterator is called *initialized* when a pointer to a JSON value has + been set (e.g., by a constructor or a copy assignment). If the iterator is + default-constructed, it is *uninitialized* and most methods are undefined. + **The library uses assertions to detect calls on uninitialized iterators.** +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +@since version 1.0.0, simplified in version 2.0.9, change to bidirectional + iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593) +*/ +template +class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) +{ + /// the iterator with BasicJsonType of different const-ness + using other_iter_impl = iter_impl::value, typename std::remove_const::type, const BasicJsonType>::type>; + /// allow basic_json to access private members + friend other_iter_impl; + friend BasicJsonType; + friend iteration_proxy; + friend iteration_proxy_value; + + using object_t = typename BasicJsonType::object_t; + using array_t = typename BasicJsonType::array_t; + // make sure BasicJsonType is basic_json or const basic_json + static_assert(is_basic_json::type>::value, + "iter_impl only accepts (const) basic_json"); + + public: + + /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. + /// The C++ Standard has never required user-defined iterators to derive from std::iterator. + /// A user-defined iterator should provide publicly accessible typedefs named + /// iterator_category, value_type, difference_type, pointer, and reference. + /// Note that value_type is required to be non-const, even for constant iterators. + using iterator_category = std::bidirectional_iterator_tag; + + /// the type of the values when the iterator is dereferenced + using value_type = typename BasicJsonType::value_type; + /// a type to represent differences between iterators + using difference_type = typename BasicJsonType::difference_type; + /// defines a pointer to the type iterated over (value_type) + using pointer = typename std::conditional::value, + typename BasicJsonType::const_pointer, + typename BasicJsonType::pointer>::type; + /// defines a reference to the type iterated over (value_type) + using reference = + typename std::conditional::value, + typename BasicJsonType::const_reference, + typename BasicJsonType::reference>::type; + + iter_impl() = default; + ~iter_impl() = default; + iter_impl(iter_impl&&) noexcept = default; + iter_impl& operator=(iter_impl&&) noexcept = default; + + /*! + @brief constructor for a given JSON instance + @param[in] object pointer to a JSON object for this iterator + @pre object != nullptr + @post The iterator is initialized; i.e. `m_object != nullptr`. + */ + explicit iter_impl(pointer object) noexcept : m_object(object) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = typename object_t::iterator(); + break; + } + + case value_t::array: + { + m_it.array_iterator = typename array_t::iterator(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator = primitive_iterator_t(); + break; + } + } + } + + /*! + @note The conventional copy constructor and copy assignment are implicitly + defined. Combined with the following converting constructor and + assignment, they support: (1) copy from iterator to iterator, (2) + copy from const iterator to const iterator, and (3) conversion from + iterator to const iterator. However conversion from const iterator + to iterator is not defined. + */ + + /*! + @brief const copy constructor + @param[in] other const iterator to copy from + @note This copy constructor had to be defined explicitly to circumvent a bug + occurring on msvc v19.0 compiler (VS 2015) debug build. For more + information refer to: https://github.com/nlohmann/json/issues/1608 + */ + iter_impl(const iter_impl& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl& other) noexcept + { + if (&other != this) + { + m_object = other.m_object; + m_it = other.m_it; + } + return *this; + } + + /*! + @brief converting constructor + @param[in] other non-const iterator to copy from + @note It is not checked whether @a other is initialized. + */ + iter_impl(const iter_impl::type>& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other non-const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl::type>& other) noexcept // NOLINT(cert-oop54-cpp) + { + m_object = other.m_object; + m_it = other.m_it; + return *this; + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief set the iterator to the first value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_begin() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_value.object->begin(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_value.array->begin(); + break; + } + + case value_t::null: + { + // set to end so begin()==end() is true: null is empty + m_it.primitive_iterator.set_end(); + break; + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_begin(); + break; + } + } + } + + /*! + @brief set the iterator past the last value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_end() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_value.object->end(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_value.array->end(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_end(); + break; + } + } + } + + public: + /*! + @brief return a reference to the value pointed to by the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator*() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); + return m_it.object_iterator->second; + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); + return *m_it.array_iterator; + } + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief dereference the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + pointer operator->() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); + return &(m_it.object_iterator->second); + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); + return &*m_it.array_iterator; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief post-increment (it++) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl const operator++(int) // NOLINT(readability-const-return-type) + { + auto result = *this; + ++(*this); + return result; + } + + /*! + @brief pre-increment (++it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator++() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, 1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, 1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + ++m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief post-decrement (it--) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl const operator--(int) // NOLINT(readability-const-return-type) + { + auto result = *this; + --(*this); + return result; + } + + /*! + @brief pre-decrement (--it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator--() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, -1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, -1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + --m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief comparison: equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same::value || std::is_same::value), std::nullptr_t > = nullptr > + bool operator==(const IterImpl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", *m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + return (m_it.object_iterator == other.m_it.object_iterator); + + case value_t::array: + return (m_it.array_iterator == other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator == other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: not equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same::value || std::is_same::value), std::nullptr_t > = nullptr > + bool operator!=(const IterImpl& other) const + { + return !operator==(other); + } + + /*! + @brief comparison: smaller + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<(const iter_impl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", *m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators", *m_object)); + + case value_t::array: + return (m_it.array_iterator < other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator < other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: less than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<=(const iter_impl& other) const + { + return !other.operator < (*this); + } + + /*! + @brief comparison: greater than + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>(const iter_impl& other) const + { + return !operator<=(other); + } + + /*! + @brief comparison: greater than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>=(const iter_impl& other) const + { + return !operator<(other); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator+=(difference_type i) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", *m_object)); + + case value_t::array: + { + std::advance(m_it.array_iterator, i); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator += i; + break; + } + } + + return *this; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator-=(difference_type i) + { + return operator+=(-i); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator+(difference_type i) const + { + auto result = *this; + result += i; + return result; + } + + /*! + @brief addition of distance and iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + friend iter_impl operator+(difference_type i, const iter_impl& it) + { + auto result = it; + result += i; + return result; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator-(difference_type i) const + { + auto result = *this; + result -= i; + return result; + } + + /*! + @brief return difference + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + difference_type operator-(const iter_impl& other) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", *m_object)); + + case value_t::array: + return m_it.array_iterator - other.m_it.array_iterator; + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return m_it.primitive_iterator - other.m_it.primitive_iterator; + } + } + + /*! + @brief access to successor + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator[](difference_type n) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators", *m_object)); + + case value_t::array: + return *std::next(m_it.array_iterator, n); + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n)) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief return the key of an object iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const typename object_t::key_type& key() const + { + JSON_ASSERT(m_object != nullptr); + + if (JSON_HEDLEY_LIKELY(m_object->is_object())) + { + return m_it.object_iterator->first; + } + + JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators", *m_object)); + } + + /*! + @brief return the value of an iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference value() const + { + return operator*(); + } + + JSON_PRIVATE_UNLESS_TESTED: + /// associated JSON instance + pointer m_object = nullptr; + /// the actual iterator of the associated instance + internal_iterator::type> m_it {}; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // ptrdiff_t +#include // reverse_iterator +#include // declval + +namespace nlohmann +{ +namespace detail +{ +////////////////////// +// reverse_iterator // +////////////////////// + +/*! +@brief a template for a reverse iterator class + +@tparam Base the base iterator type to reverse. Valid types are @ref +iterator (to create @ref reverse_iterator) and @ref const_iterator (to +create @ref const_reverse_iterator). + +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator): + It is possible to write to the pointed-to element (only if @a Base is + @ref iterator). + +@since version 1.0.0 +*/ +template +class json_reverse_iterator : public std::reverse_iterator +{ + public: + using difference_type = std::ptrdiff_t; + /// shortcut to the reverse iterator adapter + using base_iterator = std::reverse_iterator; + /// the reference type for the pointed-to element + using reference = typename Base::reference; + + /// create reverse iterator from iterator + explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept + : base_iterator(it) {} + + /// create reverse iterator from base class + explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} + + /// post-increment (it++) + json_reverse_iterator const operator++(int) // NOLINT(readability-const-return-type) + { + return static_cast(base_iterator::operator++(1)); + } + + /// pre-increment (++it) + json_reverse_iterator& operator++() + { + return static_cast(base_iterator::operator++()); + } + + /// post-decrement (it--) + json_reverse_iterator const operator--(int) // NOLINT(readability-const-return-type) + { + return static_cast(base_iterator::operator--(1)); + } + + /// pre-decrement (--it) + json_reverse_iterator& operator--() + { + return static_cast(base_iterator::operator--()); + } + + /// add to iterator + json_reverse_iterator& operator+=(difference_type i) + { + return static_cast(base_iterator::operator+=(i)); + } + + /// add to iterator + json_reverse_iterator operator+(difference_type i) const + { + return static_cast(base_iterator::operator+(i)); + } + + /// subtract from iterator + json_reverse_iterator operator-(difference_type i) const + { + return static_cast(base_iterator::operator-(i)); + } + + /// return difference + difference_type operator-(const json_reverse_iterator& other) const + { + return base_iterator(*this) - base_iterator(other); + } + + /// access to successor + reference operator[](difference_type n) const + { + return *(this->operator+(n)); + } + + /// return the key of an object iterator + auto key() const -> decltype(std::declval().key()) + { + auto it = --this->base(); + return it.key(); + } + + /// return the value of an iterator + reference value() const + { + auto it = --this->base(); + return it.operator * (); + } +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // all_of +#include // isdigit +#include // max +#include // accumulate +#include // string +#include // move +#include // vector + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ + +/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document +/// @sa https://json.nlohmann.me/api/json_pointer/ +template +class json_pointer +{ + // allow basic_json to access private members + NLOHMANN_BASIC_JSON_TPL_DECLARATION + friend class basic_json; + + public: + /// @brief create JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/json_pointer/ + explicit json_pointer(const std::string& s = "") + : reference_tokens(split(s)) + {} + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/to_string/ + std::string to_string() const + { + return std::accumulate(reference_tokens.begin(), reference_tokens.end(), + std::string{}, + [](const std::string & a, const std::string & b) + { + return a + "/" + detail::escape(b); + }); + } + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_string/ + operator std::string() const + { + return to_string(); + } + + /// @brief append another JSON pointer at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(const json_pointer& ptr) + { + reference_tokens.insert(reference_tokens.end(), + ptr.reference_tokens.begin(), + ptr.reference_tokens.end()); + return *this; + } + + /// @brief append an unescaped reference token at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(std::string token) + { + push_back(std::move(token)); + return *this; + } + + /// @brief append an array index at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(std::size_t array_idx) + { + return *this /= std::to_string(array_idx); + } + + /// @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, + const json_pointer& rhs) + { + return json_pointer(lhs) /= rhs; + } + + /// @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, std::string token) // NOLINT(performance-unnecessary-value-param) + { + return json_pointer(lhs) /= std::move(token); + } + + /// @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, std::size_t array_idx) + { + return json_pointer(lhs) /= array_idx; + } + + /// @brief returns the parent of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/parent_pointer/ + json_pointer parent_pointer() const + { + if (empty()) + { + return *this; + } + + json_pointer res = *this; + res.pop_back(); + return res; + } + + /// @brief remove last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/pop_back/ + void pop_back() + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + reference_tokens.pop_back(); + } + + /// @brief return last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/back/ + const std::string& back() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + return reference_tokens.back(); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(const std::string& token) + { + reference_tokens.push_back(token); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(std::string&& token) + { + reference_tokens.push_back(std::move(token)); + } + + /// @brief return whether pointer points to the root document + /// @sa https://json.nlohmann.me/api/json_pointer/empty/ + bool empty() const noexcept + { + return reference_tokens.empty(); + } + + private: + /*! + @param[in] s reference token to be converted into an array index + + @return integer representation of @a s + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index begins not with a digit + @throw out_of_range.404 if string @a s could not be converted to an integer + @throw out_of_range.410 if an array index exceeds size_type + */ + static typename BasicJsonType::size_type array_index(const std::string& s) + { + using size_type = typename BasicJsonType::size_type; + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0')) + { + JSON_THROW(detail::parse_error::create(106, 0, "array index '" + s + "' must not begin with '0'", BasicJsonType())); + } + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9'))) + { + JSON_THROW(detail::parse_error::create(109, 0, "array index '" + s + "' is not a number", BasicJsonType())); + } + + std::size_t processed_chars = 0; + unsigned long long res = 0; // NOLINT(runtime/int) + JSON_TRY + { + res = std::stoull(s, &processed_chars); + } + JSON_CATCH(std::out_of_range&) + { + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'", BasicJsonType())); + } + + // check if the string was completely read + if (JSON_HEDLEY_UNLIKELY(processed_chars != s.size())) + { + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'", BasicJsonType())); + } + + // only triggered on special platforms (like 32bit), see also + // https://github.com/nlohmann/json/pull/2203 + if (res >= static_cast((std::numeric_limits::max)())) // NOLINT(runtime/int) + { + JSON_THROW(detail::out_of_range::create(410, "array index " + s + " exceeds size_type", BasicJsonType())); // LCOV_EXCL_LINE + } + + return static_cast(res); + } + + JSON_PRIVATE_UNLESS_TESTED: + json_pointer top() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + + private: + /*! + @brief create and return a reference to the pointed to value + + @complexity Linear in the number of reference tokens. + + @throw parse_error.109 if array index is not a number + @throw type_error.313 if value cannot be unflattened + */ + BasicJsonType& get_and_create(BasicJsonType& j) const + { + auto* result = &j; + + // in case no reference tokens exist, return a reference to the JSON value + // j which will be overwritten by a primitive value + for (const auto& reference_token : reference_tokens) + { + switch (result->type()) + { + case detail::value_t::null: + { + if (reference_token == "0") + { + // start a new array if reference token is 0 + result = &result->operator[](0); + } + else + { + // start a new object otherwise + result = &result->operator[](reference_token); + } + break; + } + + case detail::value_t::object: + { + // create an entry in the object + result = &result->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + // create an entry in the array + result = &result->operator[](array_index(reference_token)); + break; + } + + /* + The following code is only reached if there exists a reference + token _and_ the current value is primitive. In this case, we have + an error situation, because primitive values may only occur as + single value; that is, with an empty list of reference tokens. + */ + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::type_error::create(313, "invalid value to unflatten", j)); + } + } + + return *result; + } + + /*! + @brief return a reference to the pointed to value + + @note This version does not throw if a value is not present, but tries to + create nested values instead. For instance, calling this function + with pointer `"/this/that"` on a null value is equivalent to calling + `operator[]("this").operator[]("that")` on that value, effectively + changing the null value to an object. + + @param[in] ptr a JSON value + + @return reference to the JSON value pointed to by the JSON pointer + + @complexity Linear in the length of the JSON pointer. + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + BasicJsonType& get_unchecked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + // convert null values to arrays or objects before continuing + if (ptr->is_null()) + { + // check if reference token is a number + const bool nums = + std::all_of(reference_token.begin(), reference_token.end(), + [](const unsigned char x) + { + return std::isdigit(x); + }); + + // change value to array for numbers or "-" or to object otherwise + *ptr = (nums || reference_token == "-") + ? detail::value_t::array + : detail::value_t::object; + } + + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (reference_token == "-") + { + // explicitly treat "-" as index beyond the end + ptr = &ptr->operator[](ptr->m_value.array->size()); + } + else + { + // convert array index to number; unchecked access + ptr = &ptr->operator[](array_index(reference_token)); + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + BasicJsonType& get_checked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, + "array index '-' (" + std::to_string(ptr->m_value.array->size()) + + ") is out of range", *ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @brief return a const reference to the pointed to value + + @param[in] ptr a JSON value + + @return const reference to the JSON value pointed to by the JSON + pointer + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" cannot be used for const access + JSON_THROW(detail::out_of_range::create(402, "array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range", *ptr)); + } + + // use unchecked array access + ptr = &ptr->operator[](array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + const BasicJsonType& get_checked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, + "array index '-' (" + std::to_string(ptr->m_value.array->size()) + + ") is out of range", *ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + */ + bool contains(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + if (!ptr->contains(reference_token)) + { + // we did not find the key in the object + return false; + } + + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9"))) + { + // invalid char + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1)) + { + if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9'))) + { + // first char should be between '1' and '9' + return false; + } + for (std::size_t i = 1; i < reference_token.size(); i++) + { + if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9'))) + { + // other char should be between '0' and '9' + return false; + } + } + } + + const auto idx = array_index(reference_token); + if (idx >= ptr->size()) + { + // index out of range + return false; + } + + ptr = &ptr->operator[](idx); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // we do not expect primitive values if there is still a + // reference token to process + return false; + } + } + } + + // no reference token left means we found a primitive value + return true; + } + + /*! + @brief split the string input to reference tokens + + @note This function is only called by the json_pointer constructor. + All exceptions below are documented there. + + @throw parse_error.107 if the pointer is not empty or begins with '/' + @throw parse_error.108 if character '~' is not followed by '0' or '1' + */ + static std::vector split(const std::string& reference_string) + { + std::vector result; + + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) + { + return result; + } + + // check if nonempty reference string begins with slash + if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/')) + { + JSON_THROW(detail::parse_error::create(107, 1, "JSON pointer must be empty or begin with '/' - was: '" + reference_string + "'", BasicJsonType())); + } + + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + std::size_t slash = reference_string.find_first_of('/', 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == 0 (if slash == std::string::npos) + start != 0; + // set the beginning of the next reference token + // (will eventually be 0 if slash == std::string::npos) + start = (slash == std::string::npos) ? 0 : slash + 1, + // find next slash + slash = reference_string.find_first_of('/', start)) + { + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); + + // check reference tokens are properly escaped + for (std::size_t pos = reference_token.find_first_of('~'); + pos != std::string::npos; + pos = reference_token.find_first_of('~', pos + 1)) + { + JSON_ASSERT(reference_token[pos] == '~'); + + // ~ must be followed by 0 or 1 + if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 || + (reference_token[pos + 1] != '0' && + reference_token[pos + 1] != '1'))) + { + JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'", BasicJsonType())); + } + } + + // finally, store the reference token + detail::unescape(reference_token); + result.push_back(reference_token); + } + + return result; + } + + private: + /*! + @param[in] reference_string the reference string to the current value + @param[in] value the value to consider + @param[in,out] result the result object to insert values to + + @note Empty objects or arrays are flattened to `null`. + */ + static void flatten(const std::string& reference_string, + const BasicJsonType& value, + BasicJsonType& result) + { + switch (value.type()) + { + case detail::value_t::array: + { + if (value.m_value.array->empty()) + { + // flatten empty array as null + result[reference_string] = nullptr; + } + else + { + // iterate array and use index as reference string + for (std::size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } + } + break; + } + + case detail::value_t::object: + { + if (value.m_value.object->empty()) + { + // flatten empty object as null + result[reference_string] = nullptr; + } + else + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + flatten(reference_string + "/" + detail::escape(element.first), element.second, result); + } + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } + } + } + + /*! + @param[in] value flattened JSON + + @return unflattened JSON + + @throw parse_error.109 if array index is not a number + @throw type_error.314 if value is not an object + @throw type_error.315 if object values are not primitive + @throw type_error.313 if value cannot be unflattened + */ + static BasicJsonType + unflatten(const BasicJsonType& value) + { + if (JSON_HEDLEY_UNLIKELY(!value.is_object())) + { + JSON_THROW(detail::type_error::create(314, "only objects can be unflattened", value)); + } + + BasicJsonType result; + + // iterate the JSON object values + for (const auto& element : *value.m_value.object) + { + if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive())) + { + JSON_THROW(detail::type_error::create(315, "values in object must be primitive", element.second)); + } + + // assign value to reference pointed to by JSON pointer; Note that if + // the JSON pointer is "" (i.e., points to the whole value), function + // get_and_create returns a reference to result itself. An assignment + // will then create a primitive value. + json_pointer(element.first).get_and_create(result) = element.second; + } + + return result; + } + + /*! + @brief compares two JSON pointers for equality + + @param[in] lhs JSON pointer to compare + @param[in] rhs JSON pointer to compare + @return whether @a lhs is equal to @a rhs + + @complexity Linear in the length of the JSON pointer + + @exceptionsafety No-throw guarantee: this function never throws exceptions. + */ + friend bool operator==(json_pointer const& lhs, + json_pointer const& rhs) noexcept + { + return lhs.reference_tokens == rhs.reference_tokens; + } + + /*! + @brief compares two JSON pointers for inequality + + @param[in] lhs JSON pointer to compare + @param[in] rhs JSON pointer to compare + @return whether @a lhs is not equal @a rhs + + @complexity Linear in the length of the JSON pointer + + @exceptionsafety No-throw guarantee: this function never throws exceptions. + */ + friend bool operator!=(json_pointer const& lhs, + json_pointer const& rhs) noexcept + { + return !(lhs == rhs); + } + + /// the reference tokens + std::vector reference_tokens; +}; +} // namespace nlohmann + +// #include + + +#include +#include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +class json_ref +{ + public: + using value_type = BasicJsonType; + + json_ref(value_type&& value) + : owned_value(std::move(value)) + {} + + json_ref(const value_type& value) + : value_ref(&value) + {} + + json_ref(std::initializer_list init) + : owned_value(init) + {} + + template < + class... Args, + enable_if_t::value, int> = 0 > + json_ref(Args && ... args) + : owned_value(std::forward(args)...) + {} + + // class should be movable only + json_ref(json_ref&&) noexcept = default; + json_ref(const json_ref&) = delete; + json_ref& operator=(const json_ref&) = delete; + json_ref& operator=(json_ref&&) = delete; + ~json_ref() = default; + + value_type moved_or_copied() const + { + if (value_ref == nullptr) + { + return std::move(owned_value); + } + return *value_ref; + } + + value_type const& operator*() const + { + return value_ref ? *value_ref : owned_value; + } + + value_type const* operator->() const + { + return &** this; + } + + private: + mutable value_type owned_value = nullptr; + value_type const* value_ref = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + +// #include + + +#include // reverse +#include // array +#include // isnan, isinf +#include // uint8_t, uint16_t, uint32_t, uint64_t +#include // memcpy +#include // numeric_limits +#include // string +#include // move + +// #include + +// #include + +// #include + + +#include // copy +#include // size_t +#include // back_inserter +#include // shared_ptr, make_shared +#include // basic_string +#include // vector + +#ifndef JSON_NO_IO + #include // streamsize + #include // basic_ostream +#endif // JSON_NO_IO + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/// abstract output adapter interface +template struct output_adapter_protocol +{ + virtual void write_character(CharType c) = 0; + virtual void write_characters(const CharType* s, std::size_t length) = 0; + virtual ~output_adapter_protocol() = default; + + output_adapter_protocol() = default; + output_adapter_protocol(const output_adapter_protocol&) = default; + output_adapter_protocol(output_adapter_protocol&&) noexcept = default; + output_adapter_protocol& operator=(const output_adapter_protocol&) = default; + output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = default; +}; + +/// a type to simplify interfaces +template +using output_adapter_t = std::shared_ptr>; + +/// output adapter for byte vectors +template> +class output_vector_adapter : public output_adapter_protocol +{ + public: + explicit output_vector_adapter(std::vector& vec) noexcept + : v(vec) + {} + + void write_character(CharType c) override + { + v.push_back(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + std::copy(s, s + length, std::back_inserter(v)); + } + + private: + std::vector& v; +}; + +#ifndef JSON_NO_IO +/// output adapter for output streams +template +class output_stream_adapter : public output_adapter_protocol +{ + public: + explicit output_stream_adapter(std::basic_ostream& s) noexcept + : stream(s) + {} + + void write_character(CharType c) override + { + stream.put(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + stream.write(s, static_cast(length)); + } + + private: + std::basic_ostream& stream; +}; +#endif // JSON_NO_IO + +/// output adapter for basic_string +template> +class output_string_adapter : public output_adapter_protocol +{ + public: + explicit output_string_adapter(StringType& s) noexcept + : str(s) + {} + + void write_character(CharType c) override + { + str.push_back(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + str.append(s, length); + } + + private: + StringType& str; +}; + +template> +class output_adapter +{ + public: + template> + output_adapter(std::vector& vec) + : oa(std::make_shared>(vec)) {} + +#ifndef JSON_NO_IO + output_adapter(std::basic_ostream& s) + : oa(std::make_shared>(s)) {} +#endif // JSON_NO_IO + + output_adapter(StringType& s) + : oa(std::make_shared>(s)) {} + + operator output_adapter_t() + { + return oa; + } + + private: + output_adapter_t oa = nullptr; +}; +} // namespace detail +} // namespace nlohmann + + +namespace nlohmann +{ +namespace detail +{ +/////////////////// +// binary writer // +/////////////////// + +/*! +@brief serialization to CBOR and MessagePack values +*/ +template +class binary_writer +{ + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using number_float_t = typename BasicJsonType::number_float_t; + + public: + /*! + @brief create a binary writer + + @param[in] adapter output adapter to write to + */ + explicit binary_writer(output_adapter_t adapter) : oa(std::move(adapter)) + { + JSON_ASSERT(oa); + } + + /*! + @param[in] j JSON value to serialize + @pre j.type() == value_t::object + */ + void write_bson(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::object: + { + write_bson_object(*j.m_value.object); + break; + } + + case value_t::null: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + JSON_THROW(type_error::create(317, "to serialize to BSON, top-level type must be object, but is " + std::string(j.type_name()), j)); + } + } + } + + /*! + @param[in] j JSON value to serialize + */ + void write_cbor(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::null: + { + oa->write_character(to_char_type(0xF6)); + break; + } + + case value_t::boolean: + { + oa->write_character(j.m_value.boolean + ? to_char_type(0xF5) + : to_char_type(0xF4)); + break; + } + + case value_t::number_integer: + { + if (j.m_value.number_integer >= 0) + { + // CBOR does not differentiate between positive signed + // integers and unsigned integers. Therefore, we used the + // code from the value_t::number_unsigned case here. + if (j.m_value.number_integer <= 0x17) + { + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x18)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x19)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x1A)); + write_number(static_cast(j.m_value.number_integer)); + } + else + { + oa->write_character(to_char_type(0x1B)); + write_number(static_cast(j.m_value.number_integer)); + } + } + else + { + // The conversions below encode the sign in the first + // byte, and the value is converted to a positive number. + const auto positive_number = -1 - j.m_value.number_integer; + if (j.m_value.number_integer >= -24) + { + write_number(static_cast(0x20 + positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x38)); + write_number(static_cast(positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x39)); + write_number(static_cast(positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x3A)); + write_number(static_cast(positive_number)); + } + else + { + oa->write_character(to_char_type(0x3B)); + write_number(static_cast(positive_number)); + } + } + break; + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned <= 0x17) + { + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x18)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x19)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x1A)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else + { + oa->write_character(to_char_type(0x1B)); + write_number(static_cast(j.m_value.number_unsigned)); + } + break; + } + + case value_t::number_float: + { + if (std::isnan(j.m_value.number_float)) + { + // NaN is 0xf97e00 in CBOR + oa->write_character(to_char_type(0xF9)); + oa->write_character(to_char_type(0x7E)); + oa->write_character(to_char_type(0x00)); + } + else if (std::isinf(j.m_value.number_float)) + { + // Infinity is 0xf97c00, -Infinity is 0xf9fc00 + oa->write_character(to_char_type(0xf9)); + oa->write_character(j.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC)); + oa->write_character(to_char_type(0x00)); + } + else + { + write_compact_float(j.m_value.number_float, detail::input_format_t::cbor); + } + break; + } + + case value_t::string: + { + // step 1: write control byte and the string length + const auto N = j.m_value.string->size(); + if (N <= 0x17) + { + write_number(static_cast(0x60 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x78)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x79)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x7A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x7B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write the string + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + // step 1: write control byte and the array size + const auto N = j.m_value.array->size(); + if (N <= 0x17) + { + write_number(static_cast(0x80 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x98)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x99)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x9A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x9B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + for (const auto& el : *j.m_value.array) + { + write_cbor(el); + } + break; + } + + case value_t::binary: + { + if (j.m_value.binary->has_subtype()) + { + if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xd8)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xd9)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xda)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xdb)); + write_number(static_cast(j.m_value.binary->subtype())); + } + } + + // step 1: write control byte and the binary array size + const auto N = j.m_value.binary->size(); + if (N <= 0x17) + { + write_number(static_cast(0x40 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x58)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x59)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x5A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x5B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + N); + + break; + } + + case value_t::object: + { + // step 1: write control byte and the object size + const auto N = j.m_value.object->size(); + if (N <= 0x17) + { + write_number(static_cast(0xA0 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xB8)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xB9)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xBA)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xBB)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + for (const auto& el : *j.m_value.object) + { + write_cbor(el.first); + write_cbor(el.second); + } + break; + } + + case value_t::discarded: + default: + break; + } + } + + /*! + @param[in] j JSON value to serialize + */ + void write_msgpack(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::null: // nil + { + oa->write_character(to_char_type(0xC0)); + break; + } + + case value_t::boolean: // true and false + { + oa->write_character(j.m_value.boolean + ? to_char_type(0xC3) + : to_char_type(0xC2)); + break; + } + + case value_t::number_integer: + { + if (j.m_value.number_integer >= 0) + { + // MessagePack does not differentiate between positive + // signed integers and unsigned integers. Therefore, we used + // the code from the value_t::number_unsigned case here. + if (j.m_value.number_unsigned < 128) + { + // positive fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 8 + oa->write_character(to_char_type(0xCC)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 16 + oa->write_character(to_char_type(0xCD)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 32 + oa->write_character(to_char_type(0xCE)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 64 + oa->write_character(to_char_type(0xCF)); + write_number(static_cast(j.m_value.number_integer)); + } + } + else + { + if (j.m_value.number_integer >= -32) + { + // negative fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 8 + oa->write_character(to_char_type(0xD0)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 16 + oa->write_character(to_char_type(0xD1)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 32 + oa->write_character(to_char_type(0xD2)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 64 + oa->write_character(to_char_type(0xD3)); + write_number(static_cast(j.m_value.number_integer)); + } + } + break; + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned < 128) + { + // positive fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 8 + oa->write_character(to_char_type(0xCC)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 16 + oa->write_character(to_char_type(0xCD)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 32 + oa->write_character(to_char_type(0xCE)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 64 + oa->write_character(to_char_type(0xCF)); + write_number(static_cast(j.m_value.number_integer)); + } + break; + } + + case value_t::number_float: + { + write_compact_float(j.m_value.number_float, detail::input_format_t::msgpack); + break; + } + + case value_t::string: + { + // step 1: write control byte and the string length + const auto N = j.m_value.string->size(); + if (N <= 31) + { + // fixstr + write_number(static_cast(0xA0 | N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 8 + oa->write_character(to_char_type(0xD9)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 16 + oa->write_character(to_char_type(0xDA)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 32 + oa->write_character(to_char_type(0xDB)); + write_number(static_cast(N)); + } + + // step 2: write the string + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + // step 1: write control byte and the array size + const auto N = j.m_value.array->size(); + if (N <= 15) + { + // fixarray + write_number(static_cast(0x90 | N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // array 16 + oa->write_character(to_char_type(0xDC)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // array 32 + oa->write_character(to_char_type(0xDD)); + write_number(static_cast(N)); + } + + // step 2: write each element + for (const auto& el : *j.m_value.array) + { + write_msgpack(el); + } + break; + } + + case value_t::binary: + { + // step 0: determine if the binary type has a set subtype to + // determine whether or not to use the ext or fixext types + const bool use_ext = j.m_value.binary->has_subtype(); + + // step 1: write control byte and the byte string length + const auto N = j.m_value.binary->size(); + if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type{}; + bool fixed = true; + if (use_ext) + { + switch (N) + { + case 1: + output_type = 0xD4; // fixext 1 + break; + case 2: + output_type = 0xD5; // fixext 2 + break; + case 4: + output_type = 0xD6; // fixext 4 + break; + case 8: + output_type = 0xD7; // fixext 8 + break; + case 16: + output_type = 0xD8; // fixext 16 + break; + default: + output_type = 0xC7; // ext 8 + fixed = false; + break; + } + + } + else + { + output_type = 0xC4; // bin 8 + fixed = false; + } + + oa->write_character(to_char_type(output_type)); + if (!fixed) + { + write_number(static_cast(N)); + } + } + else if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type = use_ext + ? 0xC8 // ext 16 + : 0xC5; // bin 16 + + oa->write_character(to_char_type(output_type)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type = use_ext + ? 0xC9 // ext 32 + : 0xC6; // bin 32 + + oa->write_character(to_char_type(output_type)); + write_number(static_cast(N)); + } + + // step 1.5: if this is an ext type, write the subtype + if (use_ext) + { + write_number(static_cast(j.m_value.binary->subtype())); + } + + // step 2: write the byte string + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + N); + + break; + } + + case value_t::object: + { + // step 1: write control byte and the object size + const auto N = j.m_value.object->size(); + if (N <= 15) + { + // fixmap + write_number(static_cast(0x80 | (N & 0xF))); + } + else if (N <= (std::numeric_limits::max)()) + { + // map 16 + oa->write_character(to_char_type(0xDE)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // map 32 + oa->write_character(to_char_type(0xDF)); + write_number(static_cast(N)); + } + + // step 2: write each element + for (const auto& el : *j.m_value.object) + { + write_msgpack(el.first); + write_msgpack(el.second); + } + break; + } + + case value_t::discarded: + default: + break; + } + } + + /*! + @param[in] j JSON value to serialize + @param[in] use_count whether to use '#' prefixes (optimized format) + @param[in] use_type whether to use '$' prefixes (optimized format) + @param[in] add_prefix whether prefixes need to be used for this value + */ + void write_ubjson(const BasicJsonType& j, const bool use_count, + const bool use_type, const bool add_prefix = true) + { + switch (j.type()) + { + case value_t::null: + { + if (add_prefix) + { + oa->write_character(to_char_type('Z')); + } + break; + } + + case value_t::boolean: + { + if (add_prefix) + { + oa->write_character(j.m_value.boolean + ? to_char_type('T') + : to_char_type('F')); + } + break; + } + + case value_t::number_integer: + { + write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix); + break; + } + + case value_t::number_unsigned: + { + write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix); + break; + } + + case value_t::number_float: + { + write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix); + break; + } + + case value_t::string: + { + if (add_prefix) + { + oa->write_character(to_char_type('S')); + } + write_number_with_ubjson_prefix(j.m_value.string->size(), true); + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + if (add_prefix) + { + oa->write_character(to_char_type('[')); + } + + bool prefix_required = true; + if (use_type && !j.m_value.array->empty()) + { + JSON_ASSERT(use_count); + const CharType first_prefix = ubjson_prefix(j.front()); + const bool same_prefix = std::all_of(j.begin() + 1, j.end(), + [this, first_prefix](const BasicJsonType & v) + { + return ubjson_prefix(v) == first_prefix; + }); + + if (same_prefix) + { + prefix_required = false; + oa->write_character(to_char_type('$')); + oa->write_character(first_prefix); + } + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.array->size(), true); + } + + for (const auto& el : *j.m_value.array) + { + write_ubjson(el, use_count, use_type, prefix_required); + } + + if (!use_count) + { + oa->write_character(to_char_type(']')); + } + + break; + } + + case value_t::binary: + { + if (add_prefix) + { + oa->write_character(to_char_type('[')); + } + + if (use_type && !j.m_value.binary->empty()) + { + JSON_ASSERT(use_count); + oa->write_character(to_char_type('$')); + oa->write_character('U'); + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.binary->size(), true); + } + + if (use_type) + { + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + j.m_value.binary->size()); + } + else + { + for (size_t i = 0; i < j.m_value.binary->size(); ++i) + { + oa->write_character(to_char_type('U')); + oa->write_character(j.m_value.binary->data()[i]); + } + } + + if (!use_count) + { + oa->write_character(to_char_type(']')); + } + + break; + } + + case value_t::object: + { + if (add_prefix) + { + oa->write_character(to_char_type('{')); + } + + bool prefix_required = true; + if (use_type && !j.m_value.object->empty()) + { + JSON_ASSERT(use_count); + const CharType first_prefix = ubjson_prefix(j.front()); + const bool same_prefix = std::all_of(j.begin(), j.end(), + [this, first_prefix](const BasicJsonType & v) + { + return ubjson_prefix(v) == first_prefix; + }); + + if (same_prefix) + { + prefix_required = false; + oa->write_character(to_char_type('$')); + oa->write_character(first_prefix); + } + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.object->size(), true); + } + + for (const auto& el : *j.m_value.object) + { + write_number_with_ubjson_prefix(el.first.size(), true); + oa->write_characters( + reinterpret_cast(el.first.c_str()), + el.first.size()); + write_ubjson(el.second, use_count, use_type, prefix_required); + } + + if (!use_count) + { + oa->write_character(to_char_type('}')); + } + + break; + } + + case value_t::discarded: + default: + break; + } + } + + private: + ////////// + // BSON // + ////////// + + /*! + @return The size of a BSON document entry header, including the id marker + and the entry name size (and its null-terminator). + */ + static std::size_t calc_bson_entry_header_size(const string_t& name, const BasicJsonType& j) + { + const auto it = name.find(static_cast(0)); + if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos)) + { + JSON_THROW(out_of_range::create(409, "BSON key cannot contain code point U+0000 (at byte " + std::to_string(it) + ")", j)); + static_cast(j); + } + + return /*id*/ 1ul + name.size() + /*zero-terminator*/1u; + } + + /*! + @brief Writes the given @a element_type and @a name to the output adapter + */ + void write_bson_entry_header(const string_t& name, + const std::uint8_t element_type) + { + oa->write_character(to_char_type(element_type)); // boolean + oa->write_characters( + reinterpret_cast(name.c_str()), + name.size() + 1u); + } + + /*! + @brief Writes a BSON element with key @a name and boolean value @a value + */ + void write_bson_boolean(const string_t& name, + const bool value) + { + write_bson_entry_header(name, 0x08); + oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00)); + } + + /*! + @brief Writes a BSON element with key @a name and double value @a value + */ + void write_bson_double(const string_t& name, + const double value) + { + write_bson_entry_header(name, 0x01); + write_number(value); + } + + /*! + @return The size of the BSON-encoded string in @a value + */ + static std::size_t calc_bson_string_size(const string_t& value) + { + return sizeof(std::int32_t) + value.size() + 1ul; + } + + /*! + @brief Writes a BSON element with key @a name and string value @a value + */ + void write_bson_string(const string_t& name, + const string_t& value) + { + write_bson_entry_header(name, 0x02); + + write_number(static_cast(value.size() + 1ul)); + oa->write_characters( + reinterpret_cast(value.c_str()), + value.size() + 1); + } + + /*! + @brief Writes a BSON element with key @a name and null value + */ + void write_bson_null(const string_t& name) + { + write_bson_entry_header(name, 0x0A); + } + + /*! + @return The size of the BSON-encoded integer @a value + */ + static std::size_t calc_bson_integer_size(const std::int64_t value) + { + return (std::numeric_limits::min)() <= value && value <= (std::numeric_limits::max)() + ? sizeof(std::int32_t) + : sizeof(std::int64_t); + } + + /*! + @brief Writes a BSON element with key @a name and integer @a value + */ + void write_bson_integer(const string_t& name, + const std::int64_t value) + { + if ((std::numeric_limits::min)() <= value && value <= (std::numeric_limits::max)()) + { + write_bson_entry_header(name, 0x10); // int32 + write_number(static_cast(value)); + } + else + { + write_bson_entry_header(name, 0x12); // int64 + write_number(static_cast(value)); + } + } + + /*! + @return The size of the BSON-encoded unsigned integer in @a j + */ + static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept + { + return (value <= static_cast((std::numeric_limits::max)())) + ? sizeof(std::int32_t) + : sizeof(std::int64_t); + } + + /*! + @brief Writes a BSON element with key @a name and unsigned @a value + */ + void write_bson_unsigned(const string_t& name, + const BasicJsonType& j) + { + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + write_bson_entry_header(name, 0x10 /* int32 */); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + write_bson_entry_header(name, 0x12 /* int64 */); + write_number(static_cast(j.m_value.number_unsigned)); + } + else + { + JSON_THROW(out_of_range::create(407, "integer number " + std::to_string(j.m_value.number_unsigned) + " cannot be represented by BSON as it does not fit int64", j)); + } + } + + /*! + @brief Writes a BSON element with key @a name and object @a value + */ + void write_bson_object_entry(const string_t& name, + const typename BasicJsonType::object_t& value) + { + write_bson_entry_header(name, 0x03); // object + write_bson_object(value); + } + + /*! + @return The size of the BSON-encoded array @a value + */ + static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value) + { + std::size_t array_index = 0ul; + + const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), static_cast(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el) + { + return result + calc_bson_element_size(std::to_string(array_index++), el); + }); + + return sizeof(std::int32_t) + embedded_document_size + 1ul; + } + + /*! + @return The size of the BSON-encoded binary array @a value + */ + static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value) + { + return sizeof(std::int32_t) + value.size() + 1ul; + } + + /*! + @brief Writes a BSON element with key @a name and array @a value + */ + void write_bson_array(const string_t& name, + const typename BasicJsonType::array_t& value) + { + write_bson_entry_header(name, 0x04); // array + write_number(static_cast(calc_bson_array_size(value))); + + std::size_t array_index = 0ul; + + for (const auto& el : value) + { + write_bson_element(std::to_string(array_index++), el); + } + + oa->write_character(to_char_type(0x00)); + } + + /*! + @brief Writes a BSON element with key @a name and binary value @a value + */ + void write_bson_binary(const string_t& name, + const binary_t& value) + { + write_bson_entry_header(name, 0x05); + + write_number(static_cast(value.size())); + write_number(value.has_subtype() ? static_cast(value.subtype()) : static_cast(0x00)); + + oa->write_characters(reinterpret_cast(value.data()), value.size()); + } + + /*! + @brief Calculates the size necessary to serialize the JSON value @a j with its @a name + @return The calculated size for the BSON document entry for @a j with the given @a name. + */ + static std::size_t calc_bson_element_size(const string_t& name, + const BasicJsonType& j) + { + const auto header_size = calc_bson_entry_header_size(name, j); + switch (j.type()) + { + case value_t::object: + return header_size + calc_bson_object_size(*j.m_value.object); + + case value_t::array: + return header_size + calc_bson_array_size(*j.m_value.array); + + case value_t::binary: + return header_size + calc_bson_binary_size(*j.m_value.binary); + + case value_t::boolean: + return header_size + 1ul; + + case value_t::number_float: + return header_size + 8ul; + + case value_t::number_integer: + return header_size + calc_bson_integer_size(j.m_value.number_integer); + + case value_t::number_unsigned: + return header_size + calc_bson_unsigned_size(j.m_value.number_unsigned); + + case value_t::string: + return header_size + calc_bson_string_size(*j.m_value.string); + + case value_t::null: + return header_size + 0ul; + + // LCOV_EXCL_START + case value_t::discarded: + default: + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + return 0ul; + // LCOV_EXCL_STOP + } + } + + /*! + @brief Serializes the JSON value @a j to BSON and associates it with the + key @a name. + @param name The name to associate with the JSON entity @a j within the + current BSON document + */ + void write_bson_element(const string_t& name, + const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::object: + return write_bson_object_entry(name, *j.m_value.object); + + case value_t::array: + return write_bson_array(name, *j.m_value.array); + + case value_t::binary: + return write_bson_binary(name, *j.m_value.binary); + + case value_t::boolean: + return write_bson_boolean(name, j.m_value.boolean); + + case value_t::number_float: + return write_bson_double(name, j.m_value.number_float); + + case value_t::number_integer: + return write_bson_integer(name, j.m_value.number_integer); + + case value_t::number_unsigned: + return write_bson_unsigned(name, j); + + case value_t::string: + return write_bson_string(name, *j.m_value.string); + + case value_t::null: + return write_bson_null(name); + + // LCOV_EXCL_START + case value_t::discarded: + default: + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + return; + // LCOV_EXCL_STOP + } + } + + /*! + @brief Calculates the size of the BSON serialization of the given + JSON-object @a j. + @param[in] value JSON value to serialize + @pre value.type() == value_t::object + */ + static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value) + { + std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast(0), + [](size_t result, const typename BasicJsonType::object_t::value_type & el) + { + return result += calc_bson_element_size(el.first, el.second); + }); + + return sizeof(std::int32_t) + document_size + 1ul; + } + + /*! + @param[in] value JSON value to serialize + @pre value.type() == value_t::object + */ + void write_bson_object(const typename BasicJsonType::object_t& value) + { + write_number(static_cast(calc_bson_object_size(value))); + + for (const auto& el : value) + { + write_bson_element(el.first, el.second); + } + + oa->write_character(to_char_type(0x00)); + } + + ////////// + // CBOR // + ////////// + + static constexpr CharType get_cbor_float_prefix(float /*unused*/) + { + return to_char_type(0xFA); // Single-Precision Float + } + + static constexpr CharType get_cbor_float_prefix(double /*unused*/) + { + return to_char_type(0xFB); // Double-Precision Float + } + + ///////////// + // MsgPack // + ///////////// + + static constexpr CharType get_msgpack_float_prefix(float /*unused*/) + { + return to_char_type(0xCA); // float 32 + } + + static constexpr CharType get_msgpack_float_prefix(double /*unused*/) + { + return to_char_type(0xCB); // float 64 + } + + //////////// + // UBJSON // + //////////// + + // UBJSON: write number (floating point) + template::value, int>::type = 0> + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if (add_prefix) + { + oa->write_character(get_ubjson_float_prefix(n)); + } + write_number(n); + } + + // UBJSON: write number (unsigned integer) + template::value, int>::type = 0> + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('i')); // int8 + } + write_number(static_cast(n)); + } + else if (n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('U')); // uint8 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('I')); // int16 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('l')); // int32 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('L')); // int64 + } + write_number(static_cast(n)); + } + else + { + if (add_prefix) + { + oa->write_character(to_char_type('H')); // high-precision number + } + + const auto number = BasicJsonType(n).dump(); + write_number_with_ubjson_prefix(number.size(), true); + for (std::size_t i = 0; i < number.size(); ++i) + { + oa->write_character(to_char_type(static_cast(number[i]))); + } + } + } + + // UBJSON: write number (signed integer) + template < typename NumberType, typename std::enable_if < + std::is_signed::value&& + !std::is_floating_point::value, int >::type = 0 > + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('i')); // int8 + } + write_number(static_cast(n)); + } + else if (static_cast((std::numeric_limits::min)()) <= n && n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('U')); // uint8 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('I')); // int16 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('l')); // int32 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('L')); // int64 + } + write_number(static_cast(n)); + } + // LCOV_EXCL_START + else + { + if (add_prefix) + { + oa->write_character(to_char_type('H')); // high-precision number + } + + const auto number = BasicJsonType(n).dump(); + write_number_with_ubjson_prefix(number.size(), true); + for (std::size_t i = 0; i < number.size(); ++i) + { + oa->write_character(to_char_type(static_cast(number[i]))); + } + } + // LCOV_EXCL_STOP + } + + /*! + @brief determine the type prefix of container values + */ + CharType ubjson_prefix(const BasicJsonType& j) const noexcept + { + switch (j.type()) + { + case value_t::null: + return 'Z'; + + case value_t::boolean: + return j.m_value.boolean ? 'T' : 'F'; + + case value_t::number_integer: + { + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'i'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'U'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'I'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'l'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'L'; + } + // anything else is treated as high-precision number + return 'H'; // LCOV_EXCL_LINE + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'i'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'U'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'I'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'l'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'L'; + } + // anything else is treated as high-precision number + return 'H'; // LCOV_EXCL_LINE + } + + case value_t::number_float: + return get_ubjson_float_prefix(j.m_value.number_float); + + case value_t::string: + return 'S'; + + case value_t::array: // fallthrough + case value_t::binary: + return '['; + + case value_t::object: + return '{'; + + case value_t::discarded: + default: // discarded values + return 'N'; + } + } + + static constexpr CharType get_ubjson_float_prefix(float /*unused*/) + { + return 'd'; // float 32 + } + + static constexpr CharType get_ubjson_float_prefix(double /*unused*/) + { + return 'D'; // float 64 + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /* + @brief write a number to output input + @param[in] n number of type @a NumberType + @tparam NumberType the type of the number + @tparam OutputIsLittleEndian Set to true if output data is + required to be little endian + + @note This function needs to respect the system's endianness, because bytes + in CBOR, MessagePack, and UBJSON are stored in network order (big + endian) and therefore need reordering on little endian systems. + */ + template + void write_number(const NumberType n) + { + // step 1: write number to array of length NumberType + std::array vec{}; + std::memcpy(vec.data(), &n, sizeof(NumberType)); + + // step 2: write array to output (with possible reordering) + if (is_little_endian != OutputIsLittleEndian) + { + // reverse byte order prior to conversion if necessary + std::reverse(vec.begin(), vec.end()); + } + + oa->write_characters(vec.data(), sizeof(NumberType)); + } + + void write_compact_float(const number_float_t n, detail::input_format_t format) + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (static_cast(n) >= static_cast(std::numeric_limits::lowest()) && + static_cast(n) <= static_cast((std::numeric_limits::max)()) && + static_cast(static_cast(n)) == static_cast(n)) + { + oa->write_character(format == detail::input_format_t::cbor + ? get_cbor_float_prefix(static_cast(n)) + : get_msgpack_float_prefix(static_cast(n))); + write_number(static_cast(n)); + } + else + { + oa->write_character(format == detail::input_format_t::cbor + ? get_cbor_float_prefix(n) + : get_msgpack_float_prefix(n)); + write_number(n); + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + public: + // The following to_char_type functions are implement the conversion + // between uint8_t and CharType. In case CharType is not unsigned, + // such a conversion is required to allow values greater than 128. + // See for a discussion. + template < typename C = CharType, + enable_if_t < std::is_signed::value && std::is_signed::value > * = nullptr > + static constexpr CharType to_char_type(std::uint8_t x) noexcept + { + return *reinterpret_cast(&x); + } + + template < typename C = CharType, + enable_if_t < std::is_signed::value && std::is_unsigned::value > * = nullptr > + static CharType to_char_type(std::uint8_t x) noexcept + { + static_assert(sizeof(std::uint8_t) == sizeof(CharType), "size of CharType must be equal to std::uint8_t"); + static_assert(std::is_trivial::value, "CharType must be trivial"); + CharType result; + std::memcpy(&result, &x, sizeof(x)); + return result; + } + + template::value>* = nullptr> + static constexpr CharType to_char_type(std::uint8_t x) noexcept + { + return x; + } + + template < typename InputCharType, typename C = CharType, + enable_if_t < + std::is_signed::value && + std::is_signed::value && + std::is_same::type>::value + > * = nullptr > + static constexpr CharType to_char_type(InputCharType x) noexcept + { + return x; + } + + private: + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// the output + output_adapter_t oa = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // reverse, remove, fill, find, none_of +#include // array +#include // localeconv, lconv +#include // labs, isfinite, isnan, signbit +#include // size_t, ptrdiff_t +#include // uint8_t +#include // snprintf +#include // numeric_limits +#include // string, char_traits +#include // setfill, setw +#include // is_same +#include // move + +// #include + + +#include // array +#include // signbit, isfinite +#include // intN_t, uintN_t +#include // memcpy, memmove +#include // numeric_limits +#include // conditional + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +/*! +@brief implements the Grisu2 algorithm for binary to decimal floating-point +conversion. + +This implementation is a slightly modified version of the reference +implementation which may be obtained from +http://florian.loitsch.com/publications (bench.tar.gz). + +The code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch. + +For a detailed description of the algorithm see: + +[1] Loitsch, "Printing Floating-Point Numbers Quickly and Accurately with + Integers", Proceedings of the ACM SIGPLAN 2010 Conference on Programming + Language Design and Implementation, PLDI 2010 +[2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and Accurately", + Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language + Design and Implementation, PLDI 1996 +*/ +namespace dtoa_impl +{ + +template +Target reinterpret_bits(const Source source) +{ + static_assert(sizeof(Target) == sizeof(Source), "size mismatch"); + + Target target; + std::memcpy(&target, &source, sizeof(Source)); + return target; +} + +struct diyfp // f * 2^e +{ + static constexpr int kPrecision = 64; // = q + + std::uint64_t f = 0; + int e = 0; + + constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {} + + /*! + @brief returns x - y + @pre x.e == y.e and x.f >= y.f + */ + static diyfp sub(const diyfp& x, const diyfp& y) noexcept + { + JSON_ASSERT(x.e == y.e); + JSON_ASSERT(x.f >= y.f); + + return {x.f - y.f, x.e}; + } + + /*! + @brief returns x * y + @note The result is rounded. (Only the upper q bits are returned.) + */ + static diyfp mul(const diyfp& x, const diyfp& y) noexcept + { + static_assert(kPrecision == 64, "internal error"); + + // Computes: + // f = round((x.f * y.f) / 2^q) + // e = x.e + y.e + q + + // Emulate the 64-bit * 64-bit multiplication: + // + // p = u * v + // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi) + // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi ) + // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 ) + // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 ) + // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3) + // = (p0_lo ) + 2^32 (Q ) + 2^64 (H ) + // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H ) + // + // (Since Q might be larger than 2^32 - 1) + // + // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H) + // + // (Q_hi + H does not overflow a 64-bit int) + // + // = p_lo + 2^64 p_hi + + const std::uint64_t u_lo = x.f & 0xFFFFFFFFu; + const std::uint64_t u_hi = x.f >> 32u; + const std::uint64_t v_lo = y.f & 0xFFFFFFFFu; + const std::uint64_t v_hi = y.f >> 32u; + + const std::uint64_t p0 = u_lo * v_lo; + const std::uint64_t p1 = u_lo * v_hi; + const std::uint64_t p2 = u_hi * v_lo; + const std::uint64_t p3 = u_hi * v_hi; + + const std::uint64_t p0_hi = p0 >> 32u; + const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu; + const std::uint64_t p1_hi = p1 >> 32u; + const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu; + const std::uint64_t p2_hi = p2 >> 32u; + + std::uint64_t Q = p0_hi + p1_lo + p2_lo; + + // The full product might now be computed as + // + // p_hi = p3 + p2_hi + p1_hi + (Q >> 32) + // p_lo = p0_lo + (Q << 32) + // + // But in this particular case here, the full p_lo is not required. + // Effectively we only need to add the highest bit in p_lo to p_hi (and + // Q_hi + 1 does not overflow). + + Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up + + const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u); + + return {h, x.e + y.e + 64}; + } + + /*! + @brief normalize x such that the significand is >= 2^(q-1) + @pre x.f != 0 + */ + static diyfp normalize(diyfp x) noexcept + { + JSON_ASSERT(x.f != 0); + + while ((x.f >> 63u) == 0) + { + x.f <<= 1u; + x.e--; + } + + return x; + } + + /*! + @brief normalize x such that the result has the exponent E + @pre e >= x.e and the upper e - x.e bits of x.f must be zero. + */ + static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept + { + const int delta = x.e - target_exponent; + + JSON_ASSERT(delta >= 0); + JSON_ASSERT(((x.f << delta) >> delta) == x.f); + + return {x.f << delta, target_exponent}; + } +}; + +struct boundaries +{ + diyfp w; + diyfp minus; + diyfp plus; +}; + +/*! +Compute the (normalized) diyfp representing the input number 'value' and its +boundaries. + +@pre value must be finite and positive +*/ +template +boundaries compute_boundaries(FloatType value) +{ + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // Convert the IEEE representation into a diyfp. + // + // If v is denormal: + // value = 0.F * 2^(1 - bias) = ( F) * 2^(1 - bias - (p-1)) + // If v is normalized: + // value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1)) + + static_assert(std::numeric_limits::is_iec559, + "internal error: dtoa_short requires an IEEE-754 floating-point implementation"); + + constexpr int kPrecision = std::numeric_limits::digits; // = p (includes the hidden bit) + constexpr int kBias = std::numeric_limits::max_exponent - 1 + (kPrecision - 1); + constexpr int kMinExp = 1 - kBias; + constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1); // = 2^(p-1) + + using bits_type = typename std::conditional::type; + + const auto bits = static_cast(reinterpret_bits(value)); + const std::uint64_t E = bits >> (kPrecision - 1); + const std::uint64_t F = bits & (kHiddenBit - 1); + + const bool is_denormal = E == 0; + const diyfp v = is_denormal + ? diyfp(F, kMinExp) + : diyfp(F + kHiddenBit, static_cast(E) - kBias); + + // Compute the boundaries m- and m+ of the floating-point value + // v = f * 2^e. + // + // Determine v- and v+, the floating-point predecessor and successor if v, + // respectively. + // + // v- = v - 2^e if f != 2^(p-1) or e == e_min (A) + // = v - 2^(e-1) if f == 2^(p-1) and e > e_min (B) + // + // v+ = v + 2^e + // + // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_ + // between m- and m+ round to v, regardless of how the input rounding + // algorithm breaks ties. + // + // ---+-------------+-------------+-------------+-------------+--- (A) + // v- m- v m+ v+ + // + // -----------------+------+------+-------------+-------------+--- (B) + // v- m- v m+ v+ + + const bool lower_boundary_is_closer = F == 0 && E > 1; + const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1); + const diyfp m_minus = lower_boundary_is_closer + ? diyfp(4 * v.f - 1, v.e - 2) // (B) + : diyfp(2 * v.f - 1, v.e - 1); // (A) + + // Determine the normalized w+ = m+. + const diyfp w_plus = diyfp::normalize(m_plus); + + // Determine w- = m- such that e_(w-) = e_(w+). + const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e); + + return {diyfp::normalize(v), w_minus, w_plus}; +} + +// Given normalized diyfp w, Grisu needs to find a (normalized) cached +// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies +// within a certain range [alpha, gamma] (Definition 3.2 from [1]) +// +// alpha <= e = e_c + e_w + q <= gamma +// +// or +// +// f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q +// <= f_c * f_w * 2^gamma +// +// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies +// +// 2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma +// +// or +// +// 2^(q - 2 + alpha) <= c * w < 2^(q + gamma) +// +// The choice of (alpha,gamma) determines the size of the table and the form of +// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well +// in practice: +// +// The idea is to cut the number c * w = f * 2^e into two parts, which can be +// processed independently: An integral part p1, and a fractional part p2: +// +// f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e +// = (f div 2^-e) + (f mod 2^-e) * 2^e +// = p1 + p2 * 2^e +// +// The conversion of p1 into decimal form requires a series of divisions and +// modulos by (a power of) 10. These operations are faster for 32-bit than for +// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be +// achieved by choosing +// +// -e >= 32 or e <= -32 := gamma +// +// In order to convert the fractional part +// +// p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ... +// +// into decimal form, the fraction is repeatedly multiplied by 10 and the digits +// d[-i] are extracted in order: +// +// (10 * p2) div 2^-e = d[-1] +// (10 * p2) mod 2^-e = d[-2] / 10^1 + ... +// +// The multiplication by 10 must not overflow. It is sufficient to choose +// +// 10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64. +// +// Since p2 = f mod 2^-e < 2^-e, +// +// -e <= 60 or e >= -60 := alpha + +constexpr int kAlpha = -60; +constexpr int kGamma = -32; + +struct cached_power // c = f * 2^e ~= 10^k +{ + std::uint64_t f; + int e; + int k; +}; + +/*! +For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached +power-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c +satisfies (Definition 3.2 from [1]) + + alpha <= e_c + e + q <= gamma. +*/ +inline cached_power get_cached_power_for_binary_exponent(int e) +{ + // Now + // + // alpha <= e_c + e + q <= gamma (1) + // ==> f_c * 2^alpha <= c * 2^e * 2^q + // + // and since the c's are normalized, 2^(q-1) <= f_c, + // + // ==> 2^(q - 1 + alpha) <= c * 2^(e + q) + // ==> 2^(alpha - e - 1) <= c + // + // If c were an exact power of ten, i.e. c = 10^k, one may determine k as + // + // k = ceil( log_10( 2^(alpha - e - 1) ) ) + // = ceil( (alpha - e - 1) * log_10(2) ) + // + // From the paper: + // "In theory the result of the procedure could be wrong since c is rounded, + // and the computation itself is approximated [...]. In practice, however, + // this simple function is sufficient." + // + // For IEEE double precision floating-point numbers converted into + // normalized diyfp's w = f * 2^e, with q = 64, + // + // e >= -1022 (min IEEE exponent) + // -52 (p - 1) + // -52 (p - 1, possibly normalize denormal IEEE numbers) + // -11 (normalize the diyfp) + // = -1137 + // + // and + // + // e <= +1023 (max IEEE exponent) + // -52 (p - 1) + // -11 (normalize the diyfp) + // = 960 + // + // This binary exponent range [-1137,960] results in a decimal exponent + // range [-307,324]. One does not need to store a cached power for each + // k in this range. For each such k it suffices to find a cached power + // such that the exponent of the product lies in [alpha,gamma]. + // This implies that the difference of the decimal exponents of adjacent + // table entries must be less than or equal to + // + // floor( (gamma - alpha) * log_10(2) ) = 8. + // + // (A smaller distance gamma-alpha would require a larger table.) + + // NB: + // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34. + + constexpr int kCachedPowersMinDecExp = -300; + constexpr int kCachedPowersDecStep = 8; + + static constexpr std::array kCachedPowers = + { + { + { 0xAB70FE17C79AC6CA, -1060, -300 }, + { 0xFF77B1FCBEBCDC4F, -1034, -292 }, + { 0xBE5691EF416BD60C, -1007, -284 }, + { 0x8DD01FAD907FFC3C, -980, -276 }, + { 0xD3515C2831559A83, -954, -268 }, + { 0x9D71AC8FADA6C9B5, -927, -260 }, + { 0xEA9C227723EE8BCB, -901, -252 }, + { 0xAECC49914078536D, -874, -244 }, + { 0x823C12795DB6CE57, -847, -236 }, + { 0xC21094364DFB5637, -821, -228 }, + { 0x9096EA6F3848984F, -794, -220 }, + { 0xD77485CB25823AC7, -768, -212 }, + { 0xA086CFCD97BF97F4, -741, -204 }, + { 0xEF340A98172AACE5, -715, -196 }, + { 0xB23867FB2A35B28E, -688, -188 }, + { 0x84C8D4DFD2C63F3B, -661, -180 }, + { 0xC5DD44271AD3CDBA, -635, -172 }, + { 0x936B9FCEBB25C996, -608, -164 }, + { 0xDBAC6C247D62A584, -582, -156 }, + { 0xA3AB66580D5FDAF6, -555, -148 }, + { 0xF3E2F893DEC3F126, -529, -140 }, + { 0xB5B5ADA8AAFF80B8, -502, -132 }, + { 0x87625F056C7C4A8B, -475, -124 }, + { 0xC9BCFF6034C13053, -449, -116 }, + { 0x964E858C91BA2655, -422, -108 }, + { 0xDFF9772470297EBD, -396, -100 }, + { 0xA6DFBD9FB8E5B88F, -369, -92 }, + { 0xF8A95FCF88747D94, -343, -84 }, + { 0xB94470938FA89BCF, -316, -76 }, + { 0x8A08F0F8BF0F156B, -289, -68 }, + { 0xCDB02555653131B6, -263, -60 }, + { 0x993FE2C6D07B7FAC, -236, -52 }, + { 0xE45C10C42A2B3B06, -210, -44 }, + { 0xAA242499697392D3, -183, -36 }, + { 0xFD87B5F28300CA0E, -157, -28 }, + { 0xBCE5086492111AEB, -130, -20 }, + { 0x8CBCCC096F5088CC, -103, -12 }, + { 0xD1B71758E219652C, -77, -4 }, + { 0x9C40000000000000, -50, 4 }, + { 0xE8D4A51000000000, -24, 12 }, + { 0xAD78EBC5AC620000, 3, 20 }, + { 0x813F3978F8940984, 30, 28 }, + { 0xC097CE7BC90715B3, 56, 36 }, + { 0x8F7E32CE7BEA5C70, 83, 44 }, + { 0xD5D238A4ABE98068, 109, 52 }, + { 0x9F4F2726179A2245, 136, 60 }, + { 0xED63A231D4C4FB27, 162, 68 }, + { 0xB0DE65388CC8ADA8, 189, 76 }, + { 0x83C7088E1AAB65DB, 216, 84 }, + { 0xC45D1DF942711D9A, 242, 92 }, + { 0x924D692CA61BE758, 269, 100 }, + { 0xDA01EE641A708DEA, 295, 108 }, + { 0xA26DA3999AEF774A, 322, 116 }, + { 0xF209787BB47D6B85, 348, 124 }, + { 0xB454E4A179DD1877, 375, 132 }, + { 0x865B86925B9BC5C2, 402, 140 }, + { 0xC83553C5C8965D3D, 428, 148 }, + { 0x952AB45CFA97A0B3, 455, 156 }, + { 0xDE469FBD99A05FE3, 481, 164 }, + { 0xA59BC234DB398C25, 508, 172 }, + { 0xF6C69A72A3989F5C, 534, 180 }, + { 0xB7DCBF5354E9BECE, 561, 188 }, + { 0x88FCF317F22241E2, 588, 196 }, + { 0xCC20CE9BD35C78A5, 614, 204 }, + { 0x98165AF37B2153DF, 641, 212 }, + { 0xE2A0B5DC971F303A, 667, 220 }, + { 0xA8D9D1535CE3B396, 694, 228 }, + { 0xFB9B7CD9A4A7443C, 720, 236 }, + { 0xBB764C4CA7A44410, 747, 244 }, + { 0x8BAB8EEFB6409C1A, 774, 252 }, + { 0xD01FEF10A657842C, 800, 260 }, + { 0x9B10A4E5E9913129, 827, 268 }, + { 0xE7109BFBA19C0C9D, 853, 276 }, + { 0xAC2820D9623BF429, 880, 284 }, + { 0x80444B5E7AA7CF85, 907, 292 }, + { 0xBF21E44003ACDD2D, 933, 300 }, + { 0x8E679C2F5E44FF8F, 960, 308 }, + { 0xD433179D9C8CB841, 986, 316 }, + { 0x9E19DB92B4E31BA9, 1013, 324 }, + } + }; + + // This computation gives exactly the same results for k as + // k = ceil((kAlpha - e - 1) * 0.30102999566398114) + // for |e| <= 1500, but doesn't require floating-point operations. + // NB: log_10(2) ~= 78913 / 2^18 + JSON_ASSERT(e >= -1500); + JSON_ASSERT(e <= 1500); + const int f = kAlpha - e - 1; + const int k = (f * 78913) / (1 << 18) + static_cast(f > 0); + + const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep; + JSON_ASSERT(index >= 0); + JSON_ASSERT(static_cast(index) < kCachedPowers.size()); + + const cached_power cached = kCachedPowers[static_cast(index)]; + JSON_ASSERT(kAlpha <= cached.e + e + 64); + JSON_ASSERT(kGamma >= cached.e + e + 64); + + return cached; +} + +/*! +For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k. +For n == 0, returns 1 and sets pow10 := 1. +*/ +inline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10) +{ + // LCOV_EXCL_START + if (n >= 1000000000) + { + pow10 = 1000000000; + return 10; + } + // LCOV_EXCL_STOP + if (n >= 100000000) + { + pow10 = 100000000; + return 9; + } + if (n >= 10000000) + { + pow10 = 10000000; + return 8; + } + if (n >= 1000000) + { + pow10 = 1000000; + return 7; + } + if (n >= 100000) + { + pow10 = 100000; + return 6; + } + if (n >= 10000) + { + pow10 = 10000; + return 5; + } + if (n >= 1000) + { + pow10 = 1000; + return 4; + } + if (n >= 100) + { + pow10 = 100; + return 3; + } + if (n >= 10) + { + pow10 = 10; + return 2; + } + + pow10 = 1; + return 1; +} + +inline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta, + std::uint64_t rest, std::uint64_t ten_k) +{ + JSON_ASSERT(len >= 1); + JSON_ASSERT(dist <= delta); + JSON_ASSERT(rest <= delta); + JSON_ASSERT(ten_k > 0); + + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // ten_k + // <------> + // <---- rest ----> + // --------------[------------------+----+--------------]-------------- + // w V + // = buf * 10^k + // + // ten_k represents a unit-in-the-last-place in the decimal representation + // stored in buf. + // Decrement buf by ten_k while this takes buf closer to w. + + // The tests are written in this order to avoid overflow in unsigned + // integer arithmetic. + + while (rest < dist + && delta - rest >= ten_k + && (rest + ten_k < dist || dist - rest > rest + ten_k - dist)) + { + JSON_ASSERT(buf[len - 1] != '0'); + buf[len - 1]--; + rest += ten_k; + } +} + +/*! +Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+. +M- and M+ must be normalized and share the same exponent -60 <= e <= -32. +*/ +inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent, + diyfp M_minus, diyfp w, diyfp M_plus) +{ + static_assert(kAlpha >= -60, "internal error"); + static_assert(kGamma <= -32, "internal error"); + + // Generates the digits (and the exponent) of a decimal floating-point + // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's + // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma. + // + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // Grisu2 generates the digits of M+ from left to right and stops as soon as + // V is in [M-,M+]. + + JSON_ASSERT(M_plus.e >= kAlpha); + JSON_ASSERT(M_plus.e <= kGamma); + + std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e) + std::uint64_t dist = diyfp::sub(M_plus, w ).f; // (significand of (M+ - w ), implicit exponent is e) + + // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0): + // + // M+ = f * 2^e + // = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e + // = ((p1 ) * 2^-e + (p2 )) * 2^e + // = p1 + p2 * 2^e + + const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e); + + auto p1 = static_cast(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.) + std::uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e + + // 1) + // + // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0] + + JSON_ASSERT(p1 > 0); + + std::uint32_t pow10{}; + const int k = find_largest_pow10(p1, pow10); + + // 10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1) + // + // p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1)) + // = (d[k-1] ) * 10^(k-1) + (p1 mod 10^(k-1)) + // + // M+ = p1 + p2 * 2^e + // = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1)) + p2 * 2^e + // = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e + // = d[k-1] * 10^(k-1) + ( rest) * 2^e + // + // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0) + // + // p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0] + // + // but stop as soon as + // + // rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e + + int n = k; + while (n > 0) + { + // Invariants: + // M+ = buffer * 10^n + (p1 + p2 * 2^e) (buffer = 0 for n = k) + // pow10 = 10^(n-1) <= p1 < 10^n + // + const std::uint32_t d = p1 / pow10; // d = p1 div 10^(n-1) + const std::uint32_t r = p1 % pow10; // r = p1 mod 10^(n-1) + // + // M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e + // = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e) + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(n-1) + (r + p2 * 2^e) + // + p1 = r; + n--; + // + // M+ = buffer * 10^n + (p1 + p2 * 2^e) + // pow10 = 10^n + // + + // Now check if enough digits have been generated. + // Compute + // + // p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e + // + // Note: + // Since rest and delta share the same exponent e, it suffices to + // compare the significands. + const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2; + if (rest <= delta) + { + // V = buffer * 10^n, with M- <= V <= M+. + + decimal_exponent += n; + + // We may now just stop. But instead look if the buffer could be + // decremented to bring V closer to w. + // + // pow10 = 10^n is now 1 ulp in the decimal representation V. + // The rounding procedure works with diyfp's with an implicit + // exponent of e. + // + // 10^n = (10^n * 2^-e) * 2^e = ulp * 2^e + // + const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e; + grisu2_round(buffer, length, dist, delta, rest, ten_n); + + return; + } + + pow10 /= 10; + // + // pow10 = 10^(n-1) <= p1 < 10^n + // Invariants restored. + } + + // 2) + // + // The digits of the integral part have been generated: + // + // M+ = d[k-1]...d[1]d[0] + p2 * 2^e + // = buffer + p2 * 2^e + // + // Now generate the digits of the fractional part p2 * 2^e. + // + // Note: + // No decimal point is generated: the exponent is adjusted instead. + // + // p2 actually represents the fraction + // + // p2 * 2^e + // = p2 / 2^-e + // = d[-1] / 10^1 + d[-2] / 10^2 + ... + // + // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...) + // + // p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m + // + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...) + // + // using + // + // 10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e) + // = ( d) * 2^-e + ( r) + // + // or + // 10^m * p2 * 2^e = d + r * 2^e + // + // i.e. + // + // M+ = buffer + p2 * 2^e + // = buffer + 10^-m * (d + r * 2^e) + // = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e + // + // and stop as soon as 10^-m * r * 2^e <= delta * 2^e + + JSON_ASSERT(p2 > delta); + + int m = 0; + for (;;) + { + // Invariant: + // M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e + // = buffer * 10^-m + 10^-m * (p2 ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (10 * p2) ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e + // + JSON_ASSERT(p2 <= (std::numeric_limits::max)() / 10); + p2 *= 10; + const std::uint64_t d = p2 >> -one.e; // d = (10 * p2) div 2^-e + const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e + // + // M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e)) + // = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + p2 = r; + m++; + // + // M+ = buffer * 10^-m + 10^-m * p2 * 2^e + // Invariant restored. + + // Check if enough digits have been generated. + // + // 10^-m * p2 * 2^e <= delta * 2^e + // p2 * 2^e <= 10^m * delta * 2^e + // p2 <= 10^m * delta + delta *= 10; + dist *= 10; + if (p2 <= delta) + { + break; + } + } + + // V = buffer * 10^-m, with M- <= V <= M+. + + decimal_exponent -= m; + + // 1 ulp in the decimal representation is now 10^-m. + // Since delta and dist are now scaled by 10^m, we need to do the + // same with ulp in order to keep the units in sync. + // + // 10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e + // + const std::uint64_t ten_m = one.f; + grisu2_round(buffer, length, dist, delta, p2, ten_m); + + // By construction this algorithm generates the shortest possible decimal + // number (Loitsch, Theorem 6.2) which rounds back to w. + // For an input number of precision p, at least + // + // N = 1 + ceil(p * log_10(2)) + // + // decimal digits are sufficient to identify all binary floating-point + // numbers (Matula, "In-and-Out conversions"). + // This implies that the algorithm does not produce more than N decimal + // digits. + // + // N = 17 for p = 53 (IEEE double precision) + // N = 9 for p = 24 (IEEE single precision) +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +JSON_HEDLEY_NON_NULL(1) +inline void grisu2(char* buf, int& len, int& decimal_exponent, + diyfp m_minus, diyfp v, diyfp m_plus) +{ + JSON_ASSERT(m_plus.e == m_minus.e); + JSON_ASSERT(m_plus.e == v.e); + + // --------(-----------------------+-----------------------)-------- (A) + // m- v m+ + // + // --------------------(-----------+-----------------------)-------- (B) + // m- v m+ + // + // First scale v (and m- and m+) such that the exponent is in the range + // [alpha, gamma]. + + const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e); + + const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k + + // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma] + const diyfp w = diyfp::mul(v, c_minus_k); + const diyfp w_minus = diyfp::mul(m_minus, c_minus_k); + const diyfp w_plus = diyfp::mul(m_plus, c_minus_k); + + // ----(---+---)---------------(---+---)---------------(---+---)---- + // w- w w+ + // = c*m- = c*v = c*m+ + // + // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and + // w+ are now off by a small amount. + // In fact: + // + // w - v * 10^k < 1 ulp + // + // To account for this inaccuracy, add resp. subtract 1 ulp. + // + // --------+---[---------------(---+---)---------------]---+-------- + // w- M- w M+ w+ + // + // Now any number in [M-, M+] (bounds included) will round to w when input, + // regardless of how the input rounding algorithm breaks ties. + // + // And digit_gen generates the shortest possible such number in [M-, M+]. + // Note that this does not mean that Grisu2 always generates the shortest + // possible number in the interval (m-, m+). + const diyfp M_minus(w_minus.f + 1, w_minus.e); + const diyfp M_plus (w_plus.f - 1, w_plus.e ); + + decimal_exponent = -cached.k; // = -(-k) = k + + grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus); +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +template +JSON_HEDLEY_NON_NULL(1) +void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) +{ + static_assert(diyfp::kPrecision >= std::numeric_limits::digits + 3, + "internal error: not enough precision"); + + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // If the neighbors (and boundaries) of 'value' are always computed for double-precision + // numbers, all float's can be recovered using strtod (and strtof). However, the resulting + // decimal representations are not exactly "short". + // + // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars) + // says "value is converted to a string as if by std::sprintf in the default ("C") locale" + // and since sprintf promotes floats to doubles, I think this is exactly what 'std::to_chars' + // does. + // On the other hand, the documentation for 'std::to_chars' requires that "parsing the + // representation using the corresponding std::from_chars function recovers value exactly". That + // indicates that single precision floating-point numbers should be recovered using + // 'std::strtof'. + // + // NB: If the neighbors are computed for single-precision numbers, there is a single float + // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision + // value is off by 1 ulp. +#if 0 + const boundaries w = compute_boundaries(static_cast(value)); +#else + const boundaries w = compute_boundaries(value); +#endif + + grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus); +} + +/*! +@brief appends a decimal representation of e to buf +@return a pointer to the element following the exponent. +@pre -1000 < e < 1000 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* append_exponent(char* buf, int e) +{ + JSON_ASSERT(e > -1000); + JSON_ASSERT(e < 1000); + + if (e < 0) + { + e = -e; + *buf++ = '-'; + } + else + { + *buf++ = '+'; + } + + auto k = static_cast(e); + if (k < 10) + { + // Always print at least two digits in the exponent. + // This is for compatibility with printf("%g"). + *buf++ = '0'; + *buf++ = static_cast('0' + k); + } + else if (k < 100) + { + *buf++ = static_cast('0' + k / 10); + k %= 10; + *buf++ = static_cast('0' + k); + } + else + { + *buf++ = static_cast('0' + k / 100); + k %= 100; + *buf++ = static_cast('0' + k / 10); + k %= 10; + *buf++ = static_cast('0' + k); + } + + return buf; +} + +/*! +@brief prettify v = buf * 10^decimal_exponent + +If v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point +notation. Otherwise it will be printed in exponential notation. + +@pre min_exp < 0 +@pre max_exp > 0 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* format_buffer(char* buf, int len, int decimal_exponent, + int min_exp, int max_exp) +{ + JSON_ASSERT(min_exp < 0); + JSON_ASSERT(max_exp > 0); + + const int k = len; + const int n = len + decimal_exponent; + + // v = buf * 10^(n-k) + // k is the length of the buffer (number of decimal digits) + // n is the position of the decimal point relative to the start of the buffer. + + if (k <= n && n <= max_exp) + { + // digits[000] + // len <= max_exp + 2 + + std::memset(buf + k, '0', static_cast(n) - static_cast(k)); + // Make it look like a floating-point number (#362, #378) + buf[n + 0] = '.'; + buf[n + 1] = '0'; + return buf + (static_cast(n) + 2); + } + + if (0 < n && n <= max_exp) + { + // dig.its + // len <= max_digits10 + 1 + + JSON_ASSERT(k > n); + + std::memmove(buf + (static_cast(n) + 1), buf + n, static_cast(k) - static_cast(n)); + buf[n] = '.'; + return buf + (static_cast(k) + 1U); + } + + if (min_exp < n && n <= 0) + { + // 0.[000]digits + // len <= 2 + (-min_exp - 1) + max_digits10 + + std::memmove(buf + (2 + static_cast(-n)), buf, static_cast(k)); + buf[0] = '0'; + buf[1] = '.'; + std::memset(buf + 2, '0', static_cast(-n)); + return buf + (2U + static_cast(-n) + static_cast(k)); + } + + if (k == 1) + { + // dE+123 + // len <= 1 + 5 + + buf += 1; + } + else + { + // d.igitsE+123 + // len <= max_digits10 + 1 + 5 + + std::memmove(buf + 2, buf + 1, static_cast(k) - 1); + buf[1] = '.'; + buf += 1 + static_cast(k); + } + + *buf++ = 'e'; + return append_exponent(buf, n - 1); +} + +} // namespace dtoa_impl + +/*! +@brief generates a decimal representation of the floating-point number value in [first, last). + +The format of the resulting decimal representation is similar to printf's %g +format. Returns an iterator pointing past-the-end of the decimal representation. + +@note The input number must be finite, i.e. NaN's and Inf's are not supported. +@note The buffer must be large enough. +@note The result is NOT null-terminated. +*/ +template +JSON_HEDLEY_NON_NULL(1, 2) +JSON_HEDLEY_RETURNS_NON_NULL +char* to_chars(char* first, const char* last, FloatType value) +{ + static_cast(last); // maybe unused - fix warning + JSON_ASSERT(std::isfinite(value)); + + // Use signbit(value) instead of (value < 0) since signbit works for -0. + if (std::signbit(value)) + { + value = -value; + *first++ = '-'; + } + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (value == 0) // +-0 + { + *first++ = '0'; + // Make it look like a floating-point number (#362, #378) + *first++ = '.'; + *first++ = '0'; + return first; + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + + JSON_ASSERT(last - first >= std::numeric_limits::max_digits10); + + // Compute v = buffer * 10^decimal_exponent. + // The decimal digits are stored in the buffer, which needs to be interpreted + // as an unsigned decimal integer. + // len is the length of the buffer, i.e. the number of decimal digits. + int len = 0; + int decimal_exponent = 0; + dtoa_impl::grisu2(first, len, decimal_exponent, value); + + JSON_ASSERT(len <= std::numeric_limits::max_digits10); + + // Format the buffer like printf("%.*g", prec, value) + constexpr int kMinExp = -4; + // Use digits10 here to increase compatibility with version 2. + constexpr int kMaxExp = std::numeric_limits::digits10; + + JSON_ASSERT(last - first >= kMaxExp + 2); + JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits::max_digits10); + JSON_ASSERT(last - first >= std::numeric_limits::max_digits10 + 6); + + return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp); +} + +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/////////////////// +// serialization // +/////////////////// + +/// how to treat decoding errors +enum class error_handler_t +{ + strict, ///< throw a type_error exception in case of invalid UTF-8 + replace, ///< replace invalid UTF-8 sequences with U+FFFD + ignore ///< ignore invalid UTF-8 sequences +}; + +template +class serializer +{ + using string_t = typename BasicJsonType::string_t; + using number_float_t = typename BasicJsonType::number_float_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using binary_char_t = typename BasicJsonType::binary_t::value_type; + static constexpr std::uint8_t UTF8_ACCEPT = 0; + static constexpr std::uint8_t UTF8_REJECT = 1; + + public: + /*! + @param[in] s output stream to serialize to + @param[in] ichar indentation character to use + @param[in] error_handler_ how to react on decoding errors + */ + serializer(output_adapter_t s, const char ichar, + error_handler_t error_handler_ = error_handler_t::strict) + : o(std::move(s)) + , loc(std::localeconv()) + , thousands_sep(loc->thousands_sep == nullptr ? '\0' : std::char_traits::to_char_type(* (loc->thousands_sep))) + , decimal_point(loc->decimal_point == nullptr ? '\0' : std::char_traits::to_char_type(* (loc->decimal_point))) + , indent_char(ichar) + , indent_string(512, indent_char) + , error_handler(error_handler_) + {} + + // delete because of pointer members + serializer(const serializer&) = delete; + serializer& operator=(const serializer&) = delete; + serializer(serializer&&) = delete; + serializer& operator=(serializer&&) = delete; + ~serializer() = default; + + /*! + @brief internal implementation of the serialization function + + This function is called by the public member function dump and organizes + the serialization internally. The indentation level is propagated as + additional parameter. In case of arrays and objects, the function is + called recursively. + + - strings and object keys are escaped using `escape_string()` + - integer numbers are converted implicitly via `operator<<` + - floating-point numbers are converted to a string using `"%g"` format + - binary values are serialized as objects containing the subtype and the + byte array + + @param[in] val value to serialize + @param[in] pretty_print whether the output shall be pretty-printed + @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters + in the output are escaped with `\uXXXX` sequences, and the result consists + of ASCII characters only. + @param[in] indent_step the indent level + @param[in] current_indent the current indent level (only used internally) + */ + void dump(const BasicJsonType& val, + const bool pretty_print, + const bool ensure_ascii, + const unsigned int indent_step, + const unsigned int current_indent = 0) + { + switch (val.m_type) + { + case value_t::object: + { + if (val.m_value.object->empty()) + { + o->write_characters("{}", 2); + return; + } + + if (pretty_print) + { + o->write_characters("{\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + // first n-1 elements + auto i = val.m_value.object->cbegin(); + for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) + { + o->write_characters(indent_string.c_str(), new_indent); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\": ", 3); + dump(i->second, true, ensure_ascii, indent_step, new_indent); + o->write_characters(",\n", 2); + } + + // last element + JSON_ASSERT(i != val.m_value.object->cend()); + JSON_ASSERT(std::next(i) == val.m_value.object->cend()); + o->write_characters(indent_string.c_str(), new_indent); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\": ", 3); + dump(i->second, true, ensure_ascii, indent_step, new_indent); + + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character('}'); + } + else + { + o->write_character('{'); + + // first n-1 elements + auto i = val.m_value.object->cbegin(); + for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) + { + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\":", 2); + dump(i->second, false, ensure_ascii, indent_step, current_indent); + o->write_character(','); + } + + // last element + JSON_ASSERT(i != val.m_value.object->cend()); + JSON_ASSERT(std::next(i) == val.m_value.object->cend()); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\":", 2); + dump(i->second, false, ensure_ascii, indent_step, current_indent); + + o->write_character('}'); + } + + return; + } + + case value_t::array: + { + if (val.m_value.array->empty()) + { + o->write_characters("[]", 2); + return; + } + + if (pretty_print) + { + o->write_characters("[\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + // first n-1 elements + for (auto i = val.m_value.array->cbegin(); + i != val.m_value.array->cend() - 1; ++i) + { + o->write_characters(indent_string.c_str(), new_indent); + dump(*i, true, ensure_ascii, indent_step, new_indent); + o->write_characters(",\n", 2); + } + + // last element + JSON_ASSERT(!val.m_value.array->empty()); + o->write_characters(indent_string.c_str(), new_indent); + dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent); + + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character(']'); + } + else + { + o->write_character('['); + + // first n-1 elements + for (auto i = val.m_value.array->cbegin(); + i != val.m_value.array->cend() - 1; ++i) + { + dump(*i, false, ensure_ascii, indent_step, current_indent); + o->write_character(','); + } + + // last element + JSON_ASSERT(!val.m_value.array->empty()); + dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent); + + o->write_character(']'); + } + + return; + } + + case value_t::string: + { + o->write_character('\"'); + dump_escaped(*val.m_value.string, ensure_ascii); + o->write_character('\"'); + return; + } + + case value_t::binary: + { + if (pretty_print) + { + o->write_characters("{\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + o->write_characters(indent_string.c_str(), new_indent); + + o->write_characters("\"bytes\": [", 10); + + if (!val.m_value.binary->empty()) + { + for (auto i = val.m_value.binary->cbegin(); + i != val.m_value.binary->cend() - 1; ++i) + { + dump_integer(*i); + o->write_characters(", ", 2); + } + dump_integer(val.m_value.binary->back()); + } + + o->write_characters("],\n", 3); + o->write_characters(indent_string.c_str(), new_indent); + + o->write_characters("\"subtype\": ", 11); + if (val.m_value.binary->has_subtype()) + { + dump_integer(val.m_value.binary->subtype()); + } + else + { + o->write_characters("null", 4); + } + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character('}'); + } + else + { + o->write_characters("{\"bytes\":[", 10); + + if (!val.m_value.binary->empty()) + { + for (auto i = val.m_value.binary->cbegin(); + i != val.m_value.binary->cend() - 1; ++i) + { + dump_integer(*i); + o->write_character(','); + } + dump_integer(val.m_value.binary->back()); + } + + o->write_characters("],\"subtype\":", 12); + if (val.m_value.binary->has_subtype()) + { + dump_integer(val.m_value.binary->subtype()); + o->write_character('}'); + } + else + { + o->write_characters("null}", 5); + } + } + return; + } + + case value_t::boolean: + { + if (val.m_value.boolean) + { + o->write_characters("true", 4); + } + else + { + o->write_characters("false", 5); + } + return; + } + + case value_t::number_integer: + { + dump_integer(val.m_value.number_integer); + return; + } + + case value_t::number_unsigned: + { + dump_integer(val.m_value.number_unsigned); + return; + } + + case value_t::number_float: + { + dump_float(val.m_value.number_float); + return; + } + + case value_t::discarded: + { + o->write_characters("", 11); + return; + } + + case value_t::null: + { + o->write_characters("null", 4); + return; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief dump escaped string + + Escape a string by replacing certain special characters by a sequence of an + escape character (backslash) and another character and other control + characters by a sequence of "\u" followed by a four-digit hex + representation. The escaped string is written to output stream @a o. + + @param[in] s the string to escape + @param[in] ensure_ascii whether to escape non-ASCII characters with + \uXXXX sequences + + @complexity Linear in the length of string @a s. + */ + void dump_escaped(const string_t& s, const bool ensure_ascii) + { + std::uint32_t codepoint{}; + std::uint8_t state = UTF8_ACCEPT; + std::size_t bytes = 0; // number of bytes written to string_buffer + + // number of bytes written at the point of the last valid byte + std::size_t bytes_after_last_accept = 0; + std::size_t undumped_chars = 0; + + for (std::size_t i = 0; i < s.size(); ++i) + { + const auto byte = static_cast(s[i]); + + switch (decode(state, codepoint, byte)) + { + case UTF8_ACCEPT: // decode found a new code point + { + switch (codepoint) + { + case 0x08: // backspace + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'b'; + break; + } + + case 0x09: // horizontal tab + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 't'; + break; + } + + case 0x0A: // newline + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'n'; + break; + } + + case 0x0C: // formfeed + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'f'; + break; + } + + case 0x0D: // carriage return + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'r'; + break; + } + + case 0x22: // quotation mark + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = '\"'; + break; + } + + case 0x5C: // reverse solidus + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = '\\'; + break; + } + + default: + { + // escape control characters (0x00..0x1F) or, if + // ensure_ascii parameter is used, non-ASCII characters + if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F))) + { + if (codepoint <= 0xFFFF) + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)(string_buffer.data() + bytes, 7, "\\u%04x", + static_cast(codepoint))); + bytes += 6; + } + else + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)(string_buffer.data() + bytes, 13, "\\u%04x\\u%04x", + static_cast(0xD7C0u + (codepoint >> 10u)), + static_cast(0xDC00u + (codepoint & 0x3FFu)))); + bytes += 12; + } + } + else + { + // copy byte to buffer (all previous bytes + // been copied have in default case above) + string_buffer[bytes++] = s[i]; + } + break; + } + } + + // write buffer and reset index; there must be 13 bytes + // left, as this is the maximal number of bytes to be + // written ("\uxxxx\uxxxx\0") for one code point + if (string_buffer.size() - bytes < 13) + { + o->write_characters(string_buffer.data(), bytes); + bytes = 0; + } + + // remember the byte position of this accept + bytes_after_last_accept = bytes; + undumped_chars = 0; + break; + } + + case UTF8_REJECT: // decode found invalid UTF-8 byte + { + switch (error_handler) + { + case error_handler_t::strict: + { + JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + hex_bytes(byte | 0), BasicJsonType())); + } + + case error_handler_t::ignore: + case error_handler_t::replace: + { + // in case we saw this character the first time, we + // would like to read it again, because the byte + // may be OK for itself, but just not OK for the + // previous sequence + if (undumped_chars > 0) + { + --i; + } + + // reset length buffer to the last accepted index; + // thus removing/ignoring the invalid characters + bytes = bytes_after_last_accept; + + if (error_handler == error_handler_t::replace) + { + // add a replacement character + if (ensure_ascii) + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'u'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'd'; + } + else + { + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xEF'); + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xBF'); + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xBD'); + } + + // write buffer and reset index; there must be 13 bytes + // left, as this is the maximal number of bytes to be + // written ("\uxxxx\uxxxx\0") for one code point + if (string_buffer.size() - bytes < 13) + { + o->write_characters(string_buffer.data(), bytes); + bytes = 0; + } + + bytes_after_last_accept = bytes; + } + + undumped_chars = 0; + + // continue processing the string + state = UTF8_ACCEPT; + break; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + break; + } + + default: // decode found yet incomplete multi-byte code point + { + if (!ensure_ascii) + { + // code point will not be escaped - copy byte to buffer + string_buffer[bytes++] = s[i]; + } + ++undumped_chars; + break; + } + } + } + + // we finished processing the string + if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT)) + { + // write buffer + if (bytes > 0) + { + o->write_characters(string_buffer.data(), bytes); + } + } + else + { + // we finish reading, but do not accept: string was incomplete + switch (error_handler) + { + case error_handler_t::strict: + { + JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + hex_bytes(static_cast(s.back() | 0)), BasicJsonType())); + } + + case error_handler_t::ignore: + { + // write all accepted bytes + o->write_characters(string_buffer.data(), bytes_after_last_accept); + break; + } + + case error_handler_t::replace: + { + // write all accepted bytes + o->write_characters(string_buffer.data(), bytes_after_last_accept); + // add a replacement character + if (ensure_ascii) + { + o->write_characters("\\ufffd", 6); + } + else + { + o->write_characters("\xEF\xBF\xBD", 3); + } + break; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + } + } + + private: + /*! + @brief count digits + + Count the number of decimal (base 10) digits for an input unsigned integer. + + @param[in] x unsigned integer number to count its digits + @return number of decimal digits + */ + inline unsigned int count_digits(number_unsigned_t x) noexcept + { + unsigned int n_digits = 1; + for (;;) + { + if (x < 10) + { + return n_digits; + } + if (x < 100) + { + return n_digits + 1; + } + if (x < 1000) + { + return n_digits + 2; + } + if (x < 10000) + { + return n_digits + 3; + } + x = x / 10000u; + n_digits += 4; + } + } + + /*! + * @brief convert a byte to a uppercase hex representation + * @param[in] byte byte to represent + * @return representation ("00".."FF") + */ + static std::string hex_bytes(std::uint8_t byte) + { + std::string result = "FF"; + constexpr const char* nibble_to_hex = "0123456789ABCDEF"; + result[0] = nibble_to_hex[byte / 16]; + result[1] = nibble_to_hex[byte % 16]; + return result; + } + + // templates to avoid warnings about useless casts + template ::value, int> = 0> + bool is_negative_number(NumberType x) + { + return x < 0; + } + + template < typename NumberType, enable_if_t ::value, int > = 0 > + bool is_negative_number(NumberType /*unused*/) + { + return false; + } + + /*! + @brief dump an integer + + Dump a given integer to output stream @a o. Works internally with + @a number_buffer. + + @param[in] x integer number (signed or unsigned) to dump + @tparam NumberType either @a number_integer_t or @a number_unsigned_t + */ + template < typename NumberType, detail::enable_if_t < + std::is_integral::value || + std::is_same::value || + std::is_same::value || + std::is_same::value, + int > = 0 > + void dump_integer(NumberType x) + { + static constexpr std::array, 100> digits_to_99 + { + { + {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}}, + {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}}, + {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}}, + {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}}, + {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}}, + {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}}, + {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}}, + {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}}, + {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}}, + {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}}, + } + }; + + // special case for "0" + if (x == 0) + { + o->write_character('0'); + return; + } + + // use a pointer to fill the buffer + auto buffer_ptr = number_buffer.begin(); // NOLINT(llvm-qualified-auto,readability-qualified-auto,cppcoreguidelines-pro-type-vararg,hicpp-vararg) + + number_unsigned_t abs_value; + + unsigned int n_chars{}; + + if (is_negative_number(x)) + { + *buffer_ptr = '-'; + abs_value = remove_sign(static_cast(x)); + + // account one more byte for the minus sign + n_chars = 1 + count_digits(abs_value); + } + else + { + abs_value = static_cast(x); + n_chars = count_digits(abs_value); + } + + // spare 1 byte for '\0' + JSON_ASSERT(n_chars < number_buffer.size() - 1); + + // jump to the end to generate the string from backward, + // so we later avoid reversing the result + buffer_ptr += n_chars; + + // Fast int2ascii implementation inspired by "Fastware" talk by Andrei Alexandrescu + // See: https://www.youtube.com/watch?v=o4-CwDo2zpg + while (abs_value >= 100) + { + const auto digits_index = static_cast((abs_value % 100)); + abs_value /= 100; + *(--buffer_ptr) = digits_to_99[digits_index][1]; + *(--buffer_ptr) = digits_to_99[digits_index][0]; + } + + if (abs_value >= 10) + { + const auto digits_index = static_cast(abs_value); + *(--buffer_ptr) = digits_to_99[digits_index][1]; + *(--buffer_ptr) = digits_to_99[digits_index][0]; + } + else + { + *(--buffer_ptr) = static_cast('0' + abs_value); + } + + o->write_characters(number_buffer.data(), n_chars); + } + + /*! + @brief dump a floating-point number + + Dump a given floating-point number to output stream @a o. Works internally + with @a number_buffer. + + @param[in] x floating-point number to dump + */ + void dump_float(number_float_t x) + { + // NaN / inf + if (!std::isfinite(x)) + { + o->write_characters("null", 4); + return; + } + + // If number_float_t is an IEEE-754 single or double precision number, + // use the Grisu2 algorithm to produce short numbers which are + // guaranteed to round-trip, using strtof and strtod, resp. + // + // NB: The test below works if == . + static constexpr bool is_ieee_single_or_double + = (std::numeric_limits::is_iec559 && std::numeric_limits::digits == 24 && std::numeric_limits::max_exponent == 128) || + (std::numeric_limits::is_iec559 && std::numeric_limits::digits == 53 && std::numeric_limits::max_exponent == 1024); + + dump_float(x, std::integral_constant()); + } + + void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/) + { + auto* begin = number_buffer.data(); + auto* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x); + + o->write_characters(begin, static_cast(end - begin)); + } + + void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/) + { + // get number of digits for a float -> text -> float round-trip + static constexpr auto d = std::numeric_limits::max_digits10; + + // the actual conversion + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), "%.*g", d, x); + + // negative value indicates an error + JSON_ASSERT(len > 0); + // check if buffer was large enough + JSON_ASSERT(static_cast(len) < number_buffer.size()); + + // erase thousands separator + if (thousands_sep != '\0') + { + // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::remove returns an iterator, see https://github.com/nlohmann/json/issues/3081 + const auto end = std::remove(number_buffer.begin(), number_buffer.begin() + len, thousands_sep); + std::fill(end, number_buffer.end(), '\0'); + JSON_ASSERT((end - number_buffer.begin()) <= len); + len = (end - number_buffer.begin()); + } + + // convert decimal point to '.' + if (decimal_point != '\0' && decimal_point != '.') + { + // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::find returns an iterator, see https://github.com/nlohmann/json/issues/3081 + const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point); + if (dec_pos != number_buffer.end()) + { + *dec_pos = '.'; + } + } + + o->write_characters(number_buffer.data(), static_cast(len)); + + // determine if we need to append ".0" + const bool value_is_int_like = + std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1, + [](char c) + { + return c == '.' || c == 'e'; + }); + + if (value_is_int_like) + { + o->write_characters(".0", 2); + } + } + + /*! + @brief check whether a string is UTF-8 encoded + + The function checks each byte of a string whether it is UTF-8 encoded. The + result of the check is stored in the @a state parameter. The function must + be called initially with state 0 (accept). State 1 means the string must + be rejected, because the current byte is not allowed. If the string is + completely processed, but the state is non-zero, the string ended + prematurely; that is, the last byte indicated more bytes should have + followed. + + @param[in,out] state the state of the decoding + @param[in,out] codep codepoint (valid only if resulting state is UTF8_ACCEPT) + @param[in] byte next byte to decode + @return new state + + @note The function has been edited: a std::array is used. + + @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann + @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + */ + static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept + { + static const std::array utf8d = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // A0..BF + 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF + 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF + 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF + 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2 + 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4 + 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6 + 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8 + } + }; + + JSON_ASSERT(byte < utf8d.size()); + const std::uint8_t type = utf8d[byte]; + + codep = (state != UTF8_ACCEPT) + ? (byte & 0x3fu) | (codep << 6u) + : (0xFFu >> type) & (byte); + + std::size_t index = 256u + static_cast(state) * 16u + static_cast(type); + JSON_ASSERT(index < 400); + state = utf8d[index]; + return state; + } + + /* + * Overload to make the compiler happy while it is instantiating + * dump_integer for number_unsigned_t. + * Must never be called. + */ + number_unsigned_t remove_sign(number_unsigned_t x) + { + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return x; // LCOV_EXCL_LINE + } + + /* + * Helper function for dump_integer + * + * This function takes a negative signed integer and returns its absolute + * value as unsigned integer. The plus/minus shuffling is necessary as we can + * not directly remove the sign of an arbitrary signed integer as the + * absolute values of INT_MIN and INT_MAX are usually not the same. See + * #1708 for details. + */ + inline number_unsigned_t remove_sign(number_integer_t x) noexcept + { + JSON_ASSERT(x < 0 && x < (std::numeric_limits::max)()); // NOLINT(misc-redundant-expression) + return static_cast(-(x + 1)) + 1; + } + + private: + /// the output of the serializer + output_adapter_t o = nullptr; + + /// a (hopefully) large enough character buffer + std::array number_buffer{{}}; + + /// the locale + const std::lconv* loc = nullptr; + /// the locale's thousand separator character + const char thousands_sep = '\0'; + /// the locale's decimal point character + const char decimal_point = '\0'; + + /// string buffer + std::array string_buffer{{}}; + + /// the indentation character + const char indent_char; + /// the indentation string + string_t indent_string; + + /// error_handler how to react on decoding errors + const error_handler_t error_handler; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + + +#include // less +#include // initializer_list +#include // input_iterator_tag, iterator_traits +#include // allocator +#include // for out_of_range +#include // enable_if, is_convertible +#include // pair +#include // vector + +// #include + + +namespace nlohmann +{ + +/// ordered_map: a minimal map-like container that preserves insertion order +/// for use within nlohmann::basic_json +template , + class Allocator = std::allocator>> + struct ordered_map : std::vector, Allocator> +{ + using key_type = Key; + using mapped_type = T; + using Container = std::vector, Allocator>; + using iterator = typename Container::iterator; + using const_iterator = typename Container::const_iterator; + using size_type = typename Container::size_type; + using value_type = typename Container::value_type; + + // Explicit constructors instead of `using Container::Container` + // otherwise older compilers choke on it (GCC <= 5.5, xcode <= 9.4) + ordered_map(const Allocator& alloc = Allocator()) : Container{alloc} {} + template + ordered_map(It first, It last, const Allocator& alloc = Allocator()) + : Container{first, last, alloc} {} + ordered_map(std::initializer_list init, const Allocator& alloc = Allocator() ) + : Container{init, alloc} {} + + std::pair emplace(const key_type& key, T&& t) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return {it, false}; + } + } + Container::emplace_back(key, t); + return {--this->end(), true}; + } + + T& operator[](const Key& key) + { + return emplace(key, T{}).first->second; + } + + const T& operator[](const Key& key) const + { + return at(key); + } + + T& at(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + const T& at(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + size_type erase(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + // Since we cannot move const Keys, re-construct them in place + for (auto next = it; ++next != this->end(); ++it) + { + it->~value_type(); // Destroy but keep allocation + new (&*it) value_type{std::move(*next)}; + } + Container::pop_back(); + return 1; + } + } + return 0; + } + + iterator erase(iterator pos) + { + return erase(pos, std::next(pos)); + } + + iterator erase(iterator first, iterator last) + { + const auto elements_affected = std::distance(first, last); + const auto offset = std::distance(Container::begin(), first); + + // This is the start situation. We need to delete elements_affected + // elements (3 in this example: e, f, g), and need to return an + // iterator past the last deleted element (h in this example). + // Note that offset is the distance from the start of the vector + // to first. We will need this later. + + // [ a, b, c, d, e, f, g, h, i, j ] + // ^ ^ + // first last + + // Since we cannot move const Keys, we re-construct them in place. + // We start at first and re-construct (viz. copy) the elements from + // the back of the vector. Example for first iteration: + + // ,--------. + // v | destroy e and re-construct with h + // [ a, b, c, d, e, f, g, h, i, j ] + // ^ ^ + // it it + elements_affected + + for (auto it = first; std::next(it, elements_affected) != Container::end(); ++it) + { + it->~value_type(); // destroy but keep allocation + new (&*it) value_type{std::move(*std::next(it, elements_affected))}; // "move" next element to it + } + + // [ a, b, c, d, h, i, j, h, i, j ] + // ^ ^ + // first last + + // remove the unneeded elements at the end of the vector + Container::resize(this->size() - static_cast(elements_affected)); + + // [ a, b, c, d, h, i, j ] + // ^ ^ + // first last + + // first is now pointing past the last deleted element, but we cannot + // use this iterator, because it may have been invalidated by the + // resize call. Instead, we can return begin() + offset. + return Container::begin() + offset; + } + + size_type count(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return 1; + } + } + return 0; + } + + iterator find(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + const_iterator find(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + std::pair insert( value_type&& value ) + { + return emplace(value.first, std::move(value.second)); + } + + std::pair insert( const value_type& value ) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == value.first) + { + return {it, false}; + } + } + Container::push_back(value); + return {--this->end(), true}; + } + + template + using require_input_iter = typename std::enable_if::iterator_category, + std::input_iterator_tag>::value>::type; + + template> + void insert(InputIt first, InputIt last) + { + for (auto it = first; it != last; ++it) + { + insert(*it); + } + } +}; + +} // namespace nlohmann + + +#if defined(JSON_HAS_CPP_17) + #include +#endif + +/*! +@brief namespace for Niels Lohmann +@see https://github.com/nlohmann +@since version 1.0.0 +*/ +namespace nlohmann +{ + +/*! +@brief a class to store JSON values + +@internal +@invariant The member variables @a m_value and @a m_type have the following +relationship: +- If `m_type == value_t::object`, then `m_value.object != nullptr`. +- If `m_type == value_t::array`, then `m_value.array != nullptr`. +- If `m_type == value_t::string`, then `m_value.string != nullptr`. +The invariants are checked by member function assert_invariant(). + +@note ObjectType trick from https://stackoverflow.com/a/9860911 +@endinternal + +@since version 1.0.0 + +@nosubgrouping +*/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) +{ + private: + template friend struct detail::external_constructor; + friend ::nlohmann::json_pointer; + + template + friend class ::nlohmann::detail::parser; + friend ::nlohmann::detail::serializer; + template + friend class ::nlohmann::detail::iter_impl; + template + friend class ::nlohmann::detail::binary_writer; + template + friend class ::nlohmann::detail::binary_reader; + template + friend class ::nlohmann::detail::json_sax_dom_parser; + template + friend class ::nlohmann::detail::json_sax_dom_callback_parser; + friend class ::nlohmann::detail::exception; + + /// workaround type for MSVC + using basic_json_t = NLOHMANN_BASIC_JSON_TPL; + + JSON_PRIVATE_UNLESS_TESTED: + // convenience aliases for types residing in namespace detail; + using lexer = ::nlohmann::detail::lexer_base; + + template + static ::nlohmann::detail::parser parser( + InputAdapterType adapter, + detail::parser_callback_tcb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false + ) + { + return ::nlohmann::detail::parser(std::move(adapter), + std::move(cb), allow_exceptions, ignore_comments); + } + + private: + using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t; + template + using internal_iterator = ::nlohmann::detail::internal_iterator; + template + using iter_impl = ::nlohmann::detail::iter_impl; + template + using iteration_proxy = ::nlohmann::detail::iteration_proxy; + template using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator; + + template + using output_adapter_t = ::nlohmann::detail::output_adapter_t; + + template + using binary_reader = ::nlohmann::detail::binary_reader; + template using binary_writer = ::nlohmann::detail::binary_writer; + + JSON_PRIVATE_UNLESS_TESTED: + using serializer = ::nlohmann::detail::serializer; + + public: + using value_t = detail::value_t; + /// JSON Pointer, see @ref nlohmann::json_pointer + using json_pointer = ::nlohmann::json_pointer; + template + using json_serializer = JSONSerializer; + /// how to treat decoding errors + using error_handler_t = detail::error_handler_t; + /// how to treat CBOR tags + using cbor_tag_handler_t = detail::cbor_tag_handler_t; + /// helper type for initializer lists of basic_json values + using initializer_list_t = std::initializer_list>; + + using input_format_t = detail::input_format_t; + /// SAX interface type, see @ref nlohmann::json_sax + using json_sax_t = json_sax; + + //////////////// + // exceptions // + //////////////// + + /// @name exceptions + /// Classes to implement user-defined exceptions. + /// @{ + + using exception = detail::exception; + using parse_error = detail::parse_error; + using invalid_iterator = detail::invalid_iterator; + using type_error = detail::type_error; + using out_of_range = detail::out_of_range; + using other_error = detail::other_error; + + /// @} + + + ///////////////////// + // container types // + ///////////////////// + + /// @name container types + /// The canonic container types to use @ref basic_json like any other STL + /// container. + /// @{ + + /// the type of elements in a basic_json container + using value_type = basic_json; + + /// the type of an element reference + using reference = value_type&; + /// the type of an element const reference + using const_reference = const value_type&; + + /// a type to represent differences between iterators + using difference_type = std::ptrdiff_t; + /// a type to represent container sizes + using size_type = std::size_t; + + /// the allocator type + using allocator_type = AllocatorType; + + /// the type of an element pointer + using pointer = typename std::allocator_traits::pointer; + /// the type of an element const pointer + using const_pointer = typename std::allocator_traits::const_pointer; + + /// an iterator for a basic_json container + using iterator = iter_impl; + /// a const iterator for a basic_json container + using const_iterator = iter_impl; + /// a reverse iterator for a basic_json container + using reverse_iterator = json_reverse_iterator; + /// a const reverse iterator for a basic_json container + using const_reverse_iterator = json_reverse_iterator; + + /// @} + + + /// @brief returns the allocator associated with the container + /// @sa https://json.nlohmann.me/api/basic_json/get_allocator/ + static allocator_type get_allocator() + { + return allocator_type(); + } + + /// @brief returns version information on the library + /// @sa https://json.nlohmann.me/api/basic_json/meta/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json meta() + { + basic_json result; + + result["copyright"] = "(C) 2013-2022 Niels Lohmann"; + result["name"] = "JSON for Modern C++"; + result["url"] = "https://github.com/nlohmann/json"; + result["version"]["string"] = + std::to_string(NLOHMANN_JSON_VERSION_MAJOR) + "." + + std::to_string(NLOHMANN_JSON_VERSION_MINOR) + "." + + std::to_string(NLOHMANN_JSON_VERSION_PATCH); + result["version"]["major"] = NLOHMANN_JSON_VERSION_MAJOR; + result["version"]["minor"] = NLOHMANN_JSON_VERSION_MINOR; + result["version"]["patch"] = NLOHMANN_JSON_VERSION_PATCH; + +#ifdef _WIN32 + result["platform"] = "win32"; +#elif defined __linux__ + result["platform"] = "linux"; +#elif defined __APPLE__ + result["platform"] = "apple"; +#elif defined __unix__ + result["platform"] = "unix"; +#else + result["platform"] = "unknown"; +#endif + +#if defined(__ICC) || defined(__INTEL_COMPILER) + result["compiler"] = {{"family", "icc"}, {"version", __INTEL_COMPILER}}; +#elif defined(__clang__) + result["compiler"] = {{"family", "clang"}, {"version", __clang_version__}}; +#elif defined(__GNUC__) || defined(__GNUG__) + result["compiler"] = {{"family", "gcc"}, {"version", std::to_string(__GNUC__) + "." + std::to_string(__GNUC_MINOR__) + "." + std::to_string(__GNUC_PATCHLEVEL__)}}; +#elif defined(__HP_cc) || defined(__HP_aCC) + result["compiler"] = "hp" +#elif defined(__IBMCPP__) + result["compiler"] = {{"family", "ilecpp"}, {"version", __IBMCPP__}}; +#elif defined(_MSC_VER) + result["compiler"] = {{"family", "msvc"}, {"version", _MSC_VER}}; +#elif defined(__PGI) + result["compiler"] = {{"family", "pgcpp"}, {"version", __PGI}}; +#elif defined(__SUNPRO_CC) + result["compiler"] = {{"family", "sunpro"}, {"version", __SUNPRO_CC}}; +#else + result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}}; +#endif + +#ifdef __cplusplus + result["compiler"]["c++"] = std::to_string(__cplusplus); +#else + result["compiler"]["c++"] = "unknown"; +#endif + return result; + } + + + /////////////////////////// + // JSON value data types // + /////////////////////////// + + /// @name JSON value data types + /// The data types to store a JSON value. These types are derived from + /// the template arguments passed to class @ref basic_json. + /// @{ + + /// @brief object key comparator type + /// @sa https://json.nlohmann.me/api/basic_json/object_comparator_t/ +#if defined(JSON_HAS_CPP_14) + // Use transparent comparator if possible, combined with perfect forwarding + // on find() and count() calls prevents unnecessary string construction. + using object_comparator_t = std::less<>; +#else + using object_comparator_t = std::less; +#endif + + /// @brief a type for an object + /// @sa https://json.nlohmann.me/api/basic_json/object_t/ + using object_t = ObjectType>>; + + /// @brief a type for an array + /// @sa https://json.nlohmann.me/api/basic_json/array_t/ + using array_t = ArrayType>; + + /// @brief a type for a string + /// @sa https://json.nlohmann.me/api/basic_json/string_t/ + using string_t = StringType; + + /// @brief a type for a boolean + /// @sa https://json.nlohmann.me/api/basic_json/boolean_t/ + using boolean_t = BooleanType; + + /// @brief a type for a number (integer) + /// @sa https://json.nlohmann.me/api/basic_json/number_integer_t/ + using number_integer_t = NumberIntegerType; + + /// @brief a type for a number (unsigned) + /// @sa https://json.nlohmann.me/api/basic_json/number_unsigned_t/ + using number_unsigned_t = NumberUnsignedType; + + /// @brief a type for a number (floating-point) + /// @sa https://json.nlohmann.me/api/basic_json/number_float_t/ + using number_float_t = NumberFloatType; + + /// @brief a type for a packed binary type + /// @sa https://json.nlohmann.me/api/basic_json/binary_t/ + using binary_t = nlohmann::byte_container_with_subtype; + + /// @} + + private: + + /// helper for exception-safe object creation + template + JSON_HEDLEY_RETURNS_NON_NULL + static T* create(Args&& ... args) + { + AllocatorType alloc; + using AllocatorTraits = std::allocator_traits>; + + auto deleter = [&](T * obj) + { + AllocatorTraits::deallocate(alloc, obj, 1); + }; + std::unique_ptr obj(AllocatorTraits::allocate(alloc, 1), deleter); + AllocatorTraits::construct(alloc, obj.get(), std::forward(args)...); + JSON_ASSERT(obj != nullptr); + return obj.release(); + } + + //////////////////////// + // JSON value storage // + //////////////////////// + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief a JSON value + + The actual storage for a JSON value of the @ref basic_json class. This + union combines the different storage types for the JSON value types + defined in @ref value_t. + + JSON type | value_t type | used type + --------- | --------------- | ------------------------ + object | object | pointer to @ref object_t + array | array | pointer to @ref array_t + string | string | pointer to @ref string_t + boolean | boolean | @ref boolean_t + number | number_integer | @ref number_integer_t + number | number_unsigned | @ref number_unsigned_t + number | number_float | @ref number_float_t + binary | binary | pointer to @ref binary_t + null | null | *no value is stored* + + @note Variable-length types (objects, arrays, and strings) are stored as + pointers. The size of the union should not exceed 64 bits if the default + value types are used. + + @since version 1.0.0 + */ + union json_value + { + /// object (stored with pointer to save storage) + object_t* object; + /// array (stored with pointer to save storage) + array_t* array; + /// string (stored with pointer to save storage) + string_t* string; + /// binary (stored with pointer to save storage) + binary_t* binary; + /// boolean + boolean_t boolean; + /// number (integer) + number_integer_t number_integer; + /// number (unsigned integer) + number_unsigned_t number_unsigned; + /// number (floating-point) + number_float_t number_float; + + /// default constructor (for null values) + json_value() = default; + /// constructor for booleans + json_value(boolean_t v) noexcept : boolean(v) {} + /// constructor for numbers (integer) + json_value(number_integer_t v) noexcept : number_integer(v) {} + /// constructor for numbers (unsigned) + json_value(number_unsigned_t v) noexcept : number_unsigned(v) {} + /// constructor for numbers (floating-point) + json_value(number_float_t v) noexcept : number_float(v) {} + /// constructor for empty values of a given type + json_value(value_t t) + { + switch (t) + { + case value_t::object: + { + object = create(); + break; + } + + case value_t::array: + { + array = create(); + break; + } + + case value_t::string: + { + string = create(""); + break; + } + + case value_t::binary: + { + binary = create(); + break; + } + + case value_t::boolean: + { + boolean = static_cast(false); + break; + } + + case value_t::number_integer: + { + number_integer = static_cast(0); + break; + } + + case value_t::number_unsigned: + { + number_unsigned = static_cast(0); + break; + } + + case value_t::number_float: + { + number_float = static_cast(0.0); + break; + } + + case value_t::null: + { + object = nullptr; // silence warning, see #821 + break; + } + + case value_t::discarded: + default: + { + object = nullptr; // silence warning, see #821 + if (JSON_HEDLEY_UNLIKELY(t == value_t::null)) + { + JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.10.5", basic_json())); // LCOV_EXCL_LINE + } + break; + } + } + } + + /// constructor for strings + json_value(const string_t& value) : string(create(value)) {} + + /// constructor for rvalue strings + json_value(string_t&& value) : string(create(std::move(value))) {} + + /// constructor for objects + json_value(const object_t& value) : object(create(value)) {} + + /// constructor for rvalue objects + json_value(object_t&& value) : object(create(std::move(value))) {} + + /// constructor for arrays + json_value(const array_t& value) : array(create(value)) {} + + /// constructor for rvalue arrays + json_value(array_t&& value) : array(create(std::move(value))) {} + + /// constructor for binary arrays + json_value(const typename binary_t::container_type& value) : binary(create(value)) {} + + /// constructor for rvalue binary arrays + json_value(typename binary_t::container_type&& value) : binary(create(std::move(value))) {} + + /// constructor for binary arrays (internal type) + json_value(const binary_t& value) : binary(create(value)) {} + + /// constructor for rvalue binary arrays (internal type) + json_value(binary_t&& value) : binary(create(std::move(value))) {} + + void destroy(value_t t) + { + if (t == value_t::array || t == value_t::object) + { + // flatten the current json_value to a heap-allocated stack + std::vector stack; + + // move the top-level items to stack + if (t == value_t::array) + { + stack.reserve(array->size()); + std::move(array->begin(), array->end(), std::back_inserter(stack)); + } + else + { + stack.reserve(object->size()); + for (auto&& it : *object) + { + stack.push_back(std::move(it.second)); + } + } + + while (!stack.empty()) + { + // move the last item to local variable to be processed + basic_json current_item(std::move(stack.back())); + stack.pop_back(); + + // if current_item is array/object, move + // its children to the stack to be processed later + if (current_item.is_array()) + { + std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(), std::back_inserter(stack)); + + current_item.m_value.array->clear(); + } + else if (current_item.is_object()) + { + for (auto&& it : *current_item.m_value.object) + { + stack.push_back(std::move(it.second)); + } + + current_item.m_value.object->clear(); + } + + // it's now safe that current_item get destructed + // since it doesn't have any children + } + } + + switch (t) + { + case value_t::object: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, object); + std::allocator_traits::deallocate(alloc, object, 1); + break; + } + + case value_t::array: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, array); + std::allocator_traits::deallocate(alloc, array, 1); + break; + } + + case value_t::string: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, string); + std::allocator_traits::deallocate(alloc, string, 1); + break; + } + + case value_t::binary: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, binary); + std::allocator_traits::deallocate(alloc, binary, 1); + break; + } + + case value_t::null: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::discarded: + default: + { + break; + } + } + } + }; + + private: + /*! + @brief checks the class invariants + + This function asserts the class invariants. It needs to be called at the + end of every constructor to make sure that created objects respect the + invariant. Furthermore, it has to be called each time the type of a JSON + value is changed, because the invariant expresses a relationship between + @a m_type and @a m_value. + + Furthermore, the parent relation is checked for arrays and objects: If + @a check_parents true and the value is an array or object, then the + container's elements must have the current value as parent. + + @param[in] check_parents whether the parent relation should be checked. + The value is true by default and should only be set to false + during destruction of objects when the invariant does not + need to hold. + */ + void assert_invariant(bool check_parents = true) const noexcept + { + JSON_ASSERT(m_type != value_t::object || m_value.object != nullptr); + JSON_ASSERT(m_type != value_t::array || m_value.array != nullptr); + JSON_ASSERT(m_type != value_t::string || m_value.string != nullptr); + JSON_ASSERT(m_type != value_t::binary || m_value.binary != nullptr); + +#if JSON_DIAGNOSTICS + JSON_TRY + { + // cppcheck-suppress assertWithSideEffect + JSON_ASSERT(!check_parents || !is_structured() || std::all_of(begin(), end(), [this](const basic_json & j) + { + return j.m_parent == this; + })); + } + JSON_CATCH(...) {} // LCOV_EXCL_LINE +#endif + static_cast(check_parents); + } + + void set_parents() + { +#if JSON_DIAGNOSTICS + switch (m_type) + { + case value_t::array: + { + for (auto& element : *m_value.array) + { + element.m_parent = this; + } + break; + } + + case value_t::object: + { + for (auto& element : *m_value.object) + { + element.second.m_parent = this; + } + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + break; + } +#endif + } + + iterator set_parents(iterator it, typename iterator::difference_type count_set_parents) + { +#if JSON_DIAGNOSTICS + for (typename iterator::difference_type i = 0; i < count_set_parents; ++i) + { + (it + i)->m_parent = this; + } +#else + static_cast(count_set_parents); +#endif + return it; + } + + reference set_parent(reference j, std::size_t old_capacity = static_cast(-1)) + { +#if JSON_DIAGNOSTICS + if (old_capacity != static_cast(-1)) + { + // see https://github.com/nlohmann/json/issues/2838 + JSON_ASSERT(type() == value_t::array); + if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity)) + { + // capacity has changed: update all parents + set_parents(); + return j; + } + } + + // ordered_json uses a vector internally, so pointers could have + // been invalidated; see https://github.com/nlohmann/json/issues/2962 +#ifdef JSON_HEDLEY_MSVC_VERSION +#pragma warning(push ) +#pragma warning(disable : 4127) // ignore warning to replace if with if constexpr +#endif + if (detail::is_ordered_map::value) + { + set_parents(); + return j; + } +#ifdef JSON_HEDLEY_MSVC_VERSION +#pragma warning( pop ) +#endif + + j.m_parent = this; +#else + static_cast(j); + static_cast(old_capacity); +#endif + return j; + } + + public: + ////////////////////////// + // JSON parser callback // + ////////////////////////// + + /// @brief parser event types + /// @sa https://json.nlohmann.me/api/basic_json/parse_event_t/ + using parse_event_t = detail::parse_event_t; + + /// @brief per-element parser callback type + /// @sa https://json.nlohmann.me/api/basic_json/parser_callback_t/ + using parser_callback_t = detail::parser_callback_t; + + ////////////////// + // constructors // + ////////////////// + + /// @name constructors and destructors + /// Constructors of class @ref basic_json, copy/move constructor, copy + /// assignment, static functions creating objects, and the destructor. + /// @{ + + /// @brief create an empty value with a given type + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(const value_t v) + : m_type(v), m_value(v) + { + assert_invariant(); + } + + /// @brief create a null object + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(std::nullptr_t = nullptr) noexcept + : basic_json(value_t::null) + { + assert_invariant(); + } + + /// @brief create a JSON value from compatible types + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < typename CompatibleType, + typename U = detail::uncvref_t, + detail::enable_if_t < + !detail::is_basic_json::value && detail::is_compatible_type::value, int > = 0 > + basic_json(CompatibleType && val) noexcept(noexcept( // NOLINT(bugprone-forwarding-reference-overload,bugprone-exception-escape) + JSONSerializer::to_json(std::declval(), + std::forward(val)))) + { + JSONSerializer::to_json(*this, std::forward(val)); + set_parents(); + assert_invariant(); + } + + /// @brief create a JSON value from an existing one + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < typename BasicJsonType, + detail::enable_if_t < + detail::is_basic_json::value&& !std::is_same::value, int > = 0 > + basic_json(const BasicJsonType& val) + { + using other_boolean_t = typename BasicJsonType::boolean_t; + using other_number_float_t = typename BasicJsonType::number_float_t; + using other_number_integer_t = typename BasicJsonType::number_integer_t; + using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using other_string_t = typename BasicJsonType::string_t; + using other_object_t = typename BasicJsonType::object_t; + using other_array_t = typename BasicJsonType::array_t; + using other_binary_t = typename BasicJsonType::binary_t; + + switch (val.type()) + { + case value_t::boolean: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_float: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_integer: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_unsigned: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::string: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::object: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::array: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::binary: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::null: + *this = nullptr; + break; + case value_t::discarded: + m_type = value_t::discarded; + break; + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + set_parents(); + assert_invariant(); + } + + /// @brief create a container (array or object) from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(initializer_list_t init, + bool type_deduction = true, + value_t manual_type = value_t::array) + { + // check if each element is an array with two elements whose first + // element is a string + bool is_an_object = std::all_of(init.begin(), init.end(), + [](const detail::json_ref& element_ref) + { + return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[0].is_string(); + }); + + // adjust type if type deduction is not wanted + if (!type_deduction) + { + // if array is wanted, do not create an object though possible + if (manual_type == value_t::array) + { + is_an_object = false; + } + + // if object is wanted but impossible, throw an exception + if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object)) + { + JSON_THROW(type_error::create(301, "cannot create object from initializer list", basic_json())); + } + } + + if (is_an_object) + { + // the initializer list is a list of pairs -> create object + m_type = value_t::object; + m_value = value_t::object; + + for (auto& element_ref : init) + { + auto element = element_ref.moved_or_copied(); + m_value.object->emplace( + std::move(*((*element.m_value.array)[0].m_value.string)), + std::move((*element.m_value.array)[1])); + } + } + else + { + // the initializer list describes an array -> create array + m_type = value_t::array; + m_value.array = create(init.begin(), init.end()); + } + + set_parents(); + assert_invariant(); + } + + /// @brief explicitly create a binary array (without subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(const typename binary_t::container_type& init) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = init; + return res; + } + + /// @brief explicitly create a binary array (with subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(const typename binary_t::container_type& init, typename binary_t::subtype_type subtype) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = binary_t(init, subtype); + return res; + } + + /// @brief explicitly create a binary array + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(typename binary_t::container_type&& init) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = std::move(init); + return res; + } + + /// @brief explicitly create a binary array (with subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(typename binary_t::container_type&& init, typename binary_t::subtype_type subtype) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = binary_t(std::move(init), subtype); + return res; + } + + /// @brief explicitly create an array from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/array/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json array(initializer_list_t init = {}) + { + return basic_json(init, false, value_t::array); + } + + /// @brief explicitly create an object from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/object/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json object(initializer_list_t init = {}) + { + return basic_json(init, false, value_t::object); + } + + /// @brief construct an array with count copies of given value + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(size_type cnt, const basic_json& val) + : m_type(value_t::array) + { + m_value.array = create(cnt, val); + set_parents(); + assert_invariant(); + } + + /// @brief construct a JSON container given an iterator range + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < class InputIT, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type = 0 > + basic_json(InputIT first, InputIT last) + { + JSON_ASSERT(first.m_object != nullptr); + JSON_ASSERT(last.m_object != nullptr); + + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(201, "iterators are not compatible", basic_json())); + } + + // copy type from first iterator + m_type = first.m_object->m_type; + + // check if iterator range is complete for primitive values + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + { + if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin() + || !last.m_it.primitive_iterator.is_end())) + { + JSON_THROW(invalid_iterator::create(204, "iterators out of range", *first.m_object)); + } + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::binary: + case value_t::discarded: + default: + break; + } + + switch (m_type) + { + case value_t::number_integer: + { + m_value.number_integer = first.m_object->m_value.number_integer; + break; + } + + case value_t::number_unsigned: + { + m_value.number_unsigned = first.m_object->m_value.number_unsigned; + break; + } + + case value_t::number_float: + { + m_value.number_float = first.m_object->m_value.number_float; + break; + } + + case value_t::boolean: + { + m_value.boolean = first.m_object->m_value.boolean; + break; + } + + case value_t::string: + { + m_value = *first.m_object->m_value.string; + break; + } + + case value_t::object: + { + m_value.object = create(first.m_it.object_iterator, + last.m_it.object_iterator); + break; + } + + case value_t::array: + { + m_value.array = create(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } + + case value_t::binary: + { + m_value = *first.m_object->m_value.binary; + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(invalid_iterator::create(206, "cannot construct with iterators from " + std::string(first.m_object->type_name()), *first.m_object)); + } + + set_parents(); + assert_invariant(); + } + + + /////////////////////////////////////// + // other constructors and destructor // + /////////////////////////////////////// + + template, + std::is_same>::value, int> = 0 > + basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {} + + /// @brief copy constructor + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(const basic_json& other) + : m_type(other.m_type) + { + // check of passed value is valid + other.assert_invariant(); + + switch (m_type) + { + case value_t::object: + { + m_value = *other.m_value.object; + break; + } + + case value_t::array: + { + m_value = *other.m_value.array; + break; + } + + case value_t::string: + { + m_value = *other.m_value.string; + break; + } + + case value_t::boolean: + { + m_value = other.m_value.boolean; + break; + } + + case value_t::number_integer: + { + m_value = other.m_value.number_integer; + break; + } + + case value_t::number_unsigned: + { + m_value = other.m_value.number_unsigned; + break; + } + + case value_t::number_float: + { + m_value = other.m_value.number_float; + break; + } + + case value_t::binary: + { + m_value = *other.m_value.binary; + break; + } + + case value_t::null: + case value_t::discarded: + default: + break; + } + + set_parents(); + assert_invariant(); + } + + /// @brief move constructor + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(basic_json&& other) noexcept + : m_type(std::move(other.m_type)), + m_value(std::move(other.m_value)) + { + // check that passed value is valid + other.assert_invariant(false); + + // invalidate payload + other.m_type = value_t::null; + other.m_value = {}; + + set_parents(); + assert_invariant(); + } + + /// @brief copy assignment + /// @sa https://json.nlohmann.me/api/basic_json/operator=/ + basic_json& operator=(basic_json other) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + // check that passed value is valid + other.assert_invariant(); + + using std::swap; + swap(m_type, other.m_type); + swap(m_value, other.m_value); + + set_parents(); + assert_invariant(); + return *this; + } + + /// @brief destructor + /// @sa https://json.nlohmann.me/api/basic_json/~basic_json/ + ~basic_json() noexcept + { + assert_invariant(false); + m_value.destroy(m_type); + } + + /// @} + + public: + /////////////////////// + // object inspection // + /////////////////////// + + /// @name object inspection + /// Functions to inspect the type of a JSON value. + /// @{ + + /// @brief serialization + /// @sa https://json.nlohmann.me/api/basic_json/dump/ + string_t dump(const int indent = -1, + const char indent_char = ' ', + const bool ensure_ascii = false, + const error_handler_t error_handler = error_handler_t::strict) const + { + string_t result; + serializer s(detail::output_adapter(result), indent_char, error_handler); + + if (indent >= 0) + { + s.dump(*this, true, ensure_ascii, static_cast(indent)); + } + else + { + s.dump(*this, false, ensure_ascii, 0); + } + + return result; + } + + /// @brief return the type of the JSON value (explicit) + /// @sa https://json.nlohmann.me/api/basic_json/type/ + constexpr value_t type() const noexcept + { + return m_type; + } + + /// @brief return whether type is primitive + /// @sa https://json.nlohmann.me/api/basic_json/is_primitive/ + constexpr bool is_primitive() const noexcept + { + return is_null() || is_string() || is_boolean() || is_number() || is_binary(); + } + + /// @brief return whether type is structured + /// @sa https://json.nlohmann.me/api/basic_json/is_structured/ + constexpr bool is_structured() const noexcept + { + return is_array() || is_object(); + } + + /// @brief return whether value is null + /// @sa https://json.nlohmann.me/api/basic_json/is_null/ + constexpr bool is_null() const noexcept + { + return m_type == value_t::null; + } + + /// @brief return whether value is a boolean + /// @sa https://json.nlohmann.me/api/basic_json/is_boolean/ + constexpr bool is_boolean() const noexcept + { + return m_type == value_t::boolean; + } + + /// @brief return whether value is a number + /// @sa https://json.nlohmann.me/api/basic_json/is_number/ + constexpr bool is_number() const noexcept + { + return is_number_integer() || is_number_float(); + } + + /// @brief return whether value is an integer number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_integer/ + constexpr bool is_number_integer() const noexcept + { + return m_type == value_t::number_integer || m_type == value_t::number_unsigned; + } + + /// @brief return whether value is an unsigned integer number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_unsigned/ + constexpr bool is_number_unsigned() const noexcept + { + return m_type == value_t::number_unsigned; + } + + /// @brief return whether value is a floating-point number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_float/ + constexpr bool is_number_float() const noexcept + { + return m_type == value_t::number_float; + } + + /// @brief return whether value is an object + /// @sa https://json.nlohmann.me/api/basic_json/is_object/ + constexpr bool is_object() const noexcept + { + return m_type == value_t::object; + } + + /// @brief return whether value is an array + /// @sa https://json.nlohmann.me/api/basic_json/is_array/ + constexpr bool is_array() const noexcept + { + return m_type == value_t::array; + } + + /// @brief return whether value is a string + /// @sa https://json.nlohmann.me/api/basic_json/is_string/ + constexpr bool is_string() const noexcept + { + return m_type == value_t::string; + } + + /// @brief return whether value is a binary array + /// @sa https://json.nlohmann.me/api/basic_json/is_binary/ + constexpr bool is_binary() const noexcept + { + return m_type == value_t::binary; + } + + /// @brief return whether value is discarded + /// @sa https://json.nlohmann.me/api/basic_json/is_discarded/ + constexpr bool is_discarded() const noexcept + { + return m_type == value_t::discarded; + } + + /// @brief return the type of the JSON value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/operator_value_t/ + constexpr operator value_t() const noexcept + { + return m_type; + } + + /// @} + + private: + ////////////////// + // value access // + ////////////////// + + /// get a boolean (explicit) + boolean_t get_impl(boolean_t* /*unused*/) const + { + if (JSON_HEDLEY_LIKELY(is_boolean())) + { + return m_value.boolean; + } + + JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(type_name()), *this)); + } + + /// get a pointer to the value (object) + object_t* get_impl_ptr(object_t* /*unused*/) noexcept + { + return is_object() ? m_value.object : nullptr; + } + + /// get a pointer to the value (object) + constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept + { + return is_object() ? m_value.object : nullptr; + } + + /// get a pointer to the value (array) + array_t* get_impl_ptr(array_t* /*unused*/) noexcept + { + return is_array() ? m_value.array : nullptr; + } + + /// get a pointer to the value (array) + constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept + { + return is_array() ? m_value.array : nullptr; + } + + /// get a pointer to the value (string) + string_t* get_impl_ptr(string_t* /*unused*/) noexcept + { + return is_string() ? m_value.string : nullptr; + } + + /// get a pointer to the value (string) + constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept + { + return is_string() ? m_value.string : nullptr; + } + + /// get a pointer to the value (boolean) + boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept + { + return is_boolean() ? &m_value.boolean : nullptr; + } + + /// get a pointer to the value (boolean) + constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept + { + return is_boolean() ? &m_value.boolean : nullptr; + } + + /// get a pointer to the value (integer number) + number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept + { + return is_number_integer() ? &m_value.number_integer : nullptr; + } + + /// get a pointer to the value (integer number) + constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept + { + return is_number_integer() ? &m_value.number_integer : nullptr; + } + + /// get a pointer to the value (unsigned number) + number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept + { + return is_number_unsigned() ? &m_value.number_unsigned : nullptr; + } + + /// get a pointer to the value (unsigned number) + constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept + { + return is_number_unsigned() ? &m_value.number_unsigned : nullptr; + } + + /// get a pointer to the value (floating-point number) + number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept + { + return is_number_float() ? &m_value.number_float : nullptr; + } + + /// get a pointer to the value (floating-point number) + constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept + { + return is_number_float() ? &m_value.number_float : nullptr; + } + + /// get a pointer to the value (binary) + binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept + { + return is_binary() ? m_value.binary : nullptr; + } + + /// get a pointer to the value (binary) + constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept + { + return is_binary() ? m_value.binary : nullptr; + } + + /*! + @brief helper function to implement get_ref() + + This function helps to implement get_ref() without code duplication for + const and non-const overloads + + @tparam ThisType will be deduced as `basic_json` or `const basic_json` + + @throw type_error.303 if ReferenceType does not match underlying value + type of the current JSON + */ + template + static ReferenceType get_ref_impl(ThisType& obj) + { + // delegate the call to get_ptr<>() + auto* ptr = obj.template get_ptr::type>(); + + if (JSON_HEDLEY_LIKELY(ptr != nullptr)) + { + return *ptr; + } + + JSON_THROW(type_error::create(303, "incompatible ReferenceType for get_ref, actual type is " + std::string(obj.type_name()), obj)); + } + + public: + /// @name value access + /// Direct access to the stored value of a JSON value. + /// @{ + + /// @brief get a pointer value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/ + template::value, int>::type = 0> + auto get_ptr() noexcept -> decltype(std::declval().get_impl_ptr(std::declval())) + { + // delegate the call to get_impl_ptr<>() + return get_impl_ptr(static_cast(nullptr)); + } + + /// @brief get a pointer value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/ + template < typename PointerType, typename std::enable_if < + std::is_pointer::value&& + std::is_const::type>::value, int >::type = 0 > + constexpr auto get_ptr() const noexcept -> decltype(std::declval().get_impl_ptr(std::declval())) + { + // delegate the call to get_impl_ptr<>() const + return get_impl_ptr(static_cast(nullptr)); + } + + private: + /*! + @brief get a value (explicit) + + Explicit type conversion between the JSON value and a compatible value + which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). + The value is converted by calling the @ref json_serializer + `from_json()` method. + + The function is equivalent to executing + @code {.cpp} + ValueType ret; + JSONSerializer::from_json(*this, ret); + return ret; + @endcode + + This overloads is chosen if: + - @a ValueType is not @ref basic_json, + - @ref json_serializer has a `from_json()` method of the form + `void from_json(const basic_json&, ValueType&)`, and + - @ref json_serializer does not have a `from_json()` method of + the form `ValueType from_json(const basic_json&)` + + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @a ValueType + + @throw what @ref json_serializer `from_json()` method throws + + @liveexample{The example below shows several conversions from JSON values + to other types. There a few things to note: (1) Floating-point numbers can + be converted to integers\, (2) A JSON array can be converted to a standard + `std::vector`\, (3) A JSON object can be converted to C++ + associative containers such as `std::unordered_map`.,get__ValueType_const} + + @since version 2.1.0 + */ + template < typename ValueType, + detail::enable_if_t < + detail::is_default_constructible::value&& + detail::has_from_json::value, + int > = 0 > + ValueType get_impl(detail::priority_tag<0> /*unused*/) const noexcept(noexcept( + JSONSerializer::from_json(std::declval(), std::declval()))) + { + auto ret = ValueType(); + JSONSerializer::from_json(*this, ret); + return ret; + } + + /*! + @brief get a value (explicit); special case + + Explicit type conversion between the JSON value and a compatible value + which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). + The value is converted by calling the @ref json_serializer + `from_json()` method. + + The function is equivalent to executing + @code {.cpp} + return JSONSerializer::from_json(*this); + @endcode + + This overloads is chosen if: + - @a ValueType is not @ref basic_json and + - @ref json_serializer has a `from_json()` method of the form + `ValueType from_json(const basic_json&)` + + @note If @ref json_serializer has both overloads of + `from_json()`, this one is chosen. + + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @a ValueType + + @throw what @ref json_serializer `from_json()` method throws + + @since version 2.1.0 + */ + template < typename ValueType, + detail::enable_if_t < + detail::has_non_default_from_json::value, + int > = 0 > + ValueType get_impl(detail::priority_tag<1> /*unused*/) const noexcept(noexcept( + JSONSerializer::from_json(std::declval()))) + { + return JSONSerializer::from_json(*this); + } + + /*! + @brief get special-case overload + + This overloads converts the current @ref basic_json in a different + @ref basic_json type + + @tparam BasicJsonType == @ref basic_json + + @return a copy of *this, converted into @a BasicJsonType + + @complexity Depending on the implementation of the called `from_json()` + method. + + @since version 3.2.0 + */ + template < typename BasicJsonType, + detail::enable_if_t < + detail::is_basic_json::value, + int > = 0 > + BasicJsonType get_impl(detail::priority_tag<2> /*unused*/) const + { + return *this; + } + + /*! + @brief get special-case overload + + This overloads avoids a lot of template boilerplate, it can be seen as the + identity method + + @tparam BasicJsonType == @ref basic_json + + @return a copy of *this + + @complexity Constant. + + @since version 2.1.0 + */ + template::value, + int> = 0> + basic_json get_impl(detail::priority_tag<3> /*unused*/) const + { + return *this; + } + + /*! + @brief get a pointer value (explicit) + @copydoc get() + */ + template::value, + int> = 0> + constexpr auto get_impl(detail::priority_tag<4> /*unused*/) const noexcept + -> decltype(std::declval().template get_ptr()) + { + // delegate the call to get_ptr + return get_ptr(); + } + + public: + /*! + @brief get a (pointer) value (explicit) + + Performs explicit type conversion between the JSON value and a compatible value if required. + + - If the requested type is a pointer to the internally stored JSON value that pointer is returned. + No copies are made. + + - If the requested type is the current @ref basic_json, or a different @ref basic_json convertible + from the current @ref basic_json. + + - Otherwise the value is converted by calling the @ref json_serializer `from_json()` + method. + + @tparam ValueTypeCV the provided value type + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @tparam ValueType if necessary + + @throw what @ref json_serializer `from_json()` method throws if conversion is required + + @since version 2.1.0 + */ + template < typename ValueTypeCV, typename ValueType = detail::uncvref_t> +#if defined(JSON_HAS_CPP_14) + constexpr +#endif + auto get() const noexcept( + noexcept(std::declval().template get_impl(detail::priority_tag<4> {}))) + -> decltype(std::declval().template get_impl(detail::priority_tag<4> {})) + { + // we cannot static_assert on ValueTypeCV being non-const, because + // there is support for get(), which is why we + // still need the uncvref + static_assert(!std::is_reference::value, + "get() cannot be used with reference types, you might want to use get_ref()"); + return get_impl(detail::priority_tag<4> {}); + } + + /*! + @brief get a pointer value (explicit) + + Explicit pointer access to the internally stored JSON value. No copies are + made. + + @warning The pointer becomes invalid if the underlying JSON object + changes. + + @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref + object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, + @ref number_unsigned_t, or @ref number_float_t. + + @return pointer to the internally stored JSON value if the requested + pointer type @a PointerType fits to the JSON value; `nullptr` otherwise + + @complexity Constant. + + @liveexample{The example below shows how pointers to internal values of a + JSON value can be requested. Note that no type conversions are made and a + `nullptr` is returned if the value and the requested pointer type does not + match.,get__PointerType} + + @sa see @ref get_ptr() for explicit pointer-member access + + @since version 1.0.0 + */ + template::value, int>::type = 0> + auto get() noexcept -> decltype(std::declval().template get_ptr()) + { + // delegate the call to get_ptr + return get_ptr(); + } + + /// @brief get a value (explicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_to/ + template < typename ValueType, + detail::enable_if_t < + !detail::is_basic_json::value&& + detail::has_from_json::value, + int > = 0 > + ValueType & get_to(ValueType& v) const noexcept(noexcept( + JSONSerializer::from_json(std::declval(), v))) + { + JSONSerializer::from_json(*this, v); + return v; + } + + // specialization to allow calling get_to with a basic_json value + // see https://github.com/nlohmann/json/issues/2175 + template::value, + int> = 0> + ValueType & get_to(ValueType& v) const + { + v = *this; + return v; + } + + template < + typename T, std::size_t N, + typename Array = T (&)[N], // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + detail::enable_if_t < + detail::has_from_json::value, int > = 0 > + Array get_to(T (&v)[N]) const // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + noexcept(noexcept(JSONSerializer::from_json( + std::declval(), v))) + { + JSONSerializer::from_json(*this, v); + return v; + } + + /// @brief get a reference value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ref/ + template::value, int>::type = 0> + ReferenceType get_ref() + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } + + /// @brief get a reference value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ref/ + template < typename ReferenceType, typename std::enable_if < + std::is_reference::value&& + std::is_const::type>::value, int >::type = 0 > + ReferenceType get_ref() const + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } + + /*! + @brief get a value (implicit) + + Implicit type conversion between the JSON value and a compatible value. + The call is realized by calling @ref get() const. + + @tparam ValueType non-pointer type compatible to the JSON value, for + instance `int` for JSON integer numbers, `bool` for JSON booleans, or + `std::vector` types for JSON arrays. The character type of @ref string_t + as well as an initializer list of this type is excluded to avoid + ambiguities as these types implicitly convert to `std::string`. + + @return copy of the JSON value, converted to type @a ValueType + + @throw type_error.302 in case passed type @a ValueType is incompatible + to the JSON value type (e.g., the JSON value is of type boolean, but a + string is requested); see example below + + @complexity Linear in the size of the JSON value. + + @liveexample{The example below shows several conversions from JSON values + to other types. There a few things to note: (1) Floating-point numbers can + be converted to integers\, (2) A JSON array can be converted to a standard + `std::vector`\, (3) A JSON object can be converted to C++ + associative containers such as `std::unordered_map`.,operator__ValueType} + + @since version 1.0.0 + */ + template < typename ValueType, typename std::enable_if < + detail::conjunction < + detail::negation>, + detail::negation>>, + detail::negation>, + detail::negation>, + detail::negation>>, + +#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914)) + detail::negation>, +#endif + detail::is_detected_lazy + >::value, int >::type = 0 > + JSON_EXPLICIT operator ValueType() const + { + // delegate the call to get<>() const + return get(); + } + + /// @brief get a binary value + /// @sa https://json.nlohmann.me/api/basic_json/get_binary/ + binary_t& get_binary() + { + if (!is_binary()) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name()), *this)); + } + + return *get_ptr(); + } + + /// @brief get a binary value + /// @sa https://json.nlohmann.me/api/basic_json/get_binary/ + const binary_t& get_binary() const + { + if (!is_binary()) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name()), *this)); + } + + return *get_ptr(); + } + + /// @} + + + //////////////////// + // element access // + //////////////////// + + /// @name element access + /// Access to the JSON value. + /// @{ + + /// @brief access specified array element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(size_type idx) + { + // at only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + JSON_TRY + { + return set_parent(m_value.array->at(idx)); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified array element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(size_type idx) const + { + // at only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + JSON_TRY + { + return m_value.array->at(idx); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(const typename object_t::key_type& key) + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_TRY + { + return set_parent(m_value.object->at(key)); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(403, "key '" + key + "' not found", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(const typename object_t::key_type& key) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_TRY + { + return m_value.object->at(key); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(403, "key '" + key + "' not found", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified array element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](size_type idx) + { + // implicitly convert null value to an empty array + if (is_null()) + { + m_type = value_t::array; + m_value.array = create(); + assert_invariant(); + } + + // operator[] only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // fill up array with null values if given idx is outside range + if (idx >= m_value.array->size()) + { +#if JSON_DIAGNOSTICS + // remember array size & capacity before resizing + const auto old_size = m_value.array->size(); + const auto old_capacity = m_value.array->capacity(); +#endif + m_value.array->resize(idx + 1); + +#if JSON_DIAGNOSTICS + if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity)) + { + // capacity has changed: update all parents + set_parents(); + } + else + { + // set parent for values added above + set_parents(begin() + static_cast(old_size), static_cast(idx + 1 - old_size)); + } +#endif + assert_invariant(); + } + + return m_value.array->operator[](idx); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified array element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](size_type idx) const + { + // const operator[] only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + return m_value.array->operator[](idx); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](const typename object_t::key_type& key) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } + + // operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return set_parent(m_value.object->operator[](key)); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](const typename object_t::key_type& key) const + { + // const operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_ASSERT(m_value.object->find(key) != m_value.object->end()); + return m_value.object->find(key)->second; + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + template + JSON_HEDLEY_NON_NULL(2) + reference operator[](T* key) + { + // implicitly convert null to object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return set_parent(m_value.object->operator[](key)); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + template + JSON_HEDLEY_NON_NULL(2) + const_reference operator[](T* key) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_ASSERT(m_value.object->find(key) != m_value.object->end()); + return m_value.object->find(key)->second; + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// using std::is_convertible in a std::enable_if will fail when using explicit conversions + template < class ValueType, typename std::enable_if < + detail::is_getable::value + && !std::is_same::value, int >::type = 0 > + ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if key is found, return value and given default value otherwise + const auto it = find(key); + if (it != end()) + { + return it->template get(); + } + + return default_value; + } + + JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// overload for a default value of type const char* + string_t value(const typename object_t::key_type& key, const char* default_value) const + { + return value(key, string_t(default_value)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template::value, int>::type = 0> + ValueType value(const json_pointer& ptr, const ValueType& default_value) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if pointer resolves a value, return it or use default value + JSON_TRY + { + return ptr.get_checked(this).template get(); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + return default_value; + } + } + + JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// overload for a default value of type const char* + JSON_HEDLEY_NON_NULL(3) + string_t value(const json_pointer& ptr, const char* default_value) const + { + return value(ptr, string_t(default_value)); + } + + /// @brief access the first element + /// @sa https://json.nlohmann.me/api/basic_json/front/ + reference front() + { + return *begin(); + } + + /// @brief access the first element + /// @sa https://json.nlohmann.me/api/basic_json/front/ + const_reference front() const + { + return *cbegin(); + } + + /// @brief access the last element + /// @sa https://json.nlohmann.me/api/basic_json/back/ + reference back() + { + auto tmp = end(); + --tmp; + return *tmp; + } + + /// @brief access the last element + /// @sa https://json.nlohmann.me/api/basic_json/back/ + const_reference back() const + { + auto tmp = cend(); + --tmp; + return *tmp; + } + + /// @brief remove element given an iterator + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template < class IteratorType, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type + = 0 > + IteratorType erase(IteratorType pos) + { + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(this != pos.m_object)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + IteratorType result = end(); + + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + case value_t::binary: + { + if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin())) + { + JSON_THROW(invalid_iterator::create(205, "iterator out of range", *this)); + } + + if (is_string()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.string); + std::allocator_traits::deallocate(alloc, m_value.string, 1); + m_value.string = nullptr; + } + else if (is_binary()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.binary); + std::allocator_traits::deallocate(alloc, m_value.binary, 1); + m_value.binary = nullptr; + } + + m_type = value_t::null; + assert_invariant(); + break; + } + + case value_t::object: + { + result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator); + break; + } + + case value_t::array: + { + result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator); + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + return result; + } + + /// @brief remove elements given an iterator range + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template < class IteratorType, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type + = 0 > + IteratorType erase(IteratorType first, IteratorType last) + { + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object)) + { + JSON_THROW(invalid_iterator::create(203, "iterators do not fit current value", *this)); + } + + IteratorType result = end(); + + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + case value_t::binary: + { + if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin() + || !last.m_it.primitive_iterator.is_end())) + { + JSON_THROW(invalid_iterator::create(204, "iterators out of range", *this)); + } + + if (is_string()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.string); + std::allocator_traits::deallocate(alloc, m_value.string, 1); + m_value.string = nullptr; + } + else if (is_binary()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.binary); + std::allocator_traits::deallocate(alloc, m_value.binary, 1); + m_value.binary = nullptr; + } + + m_type = value_t::null; + assert_invariant(); + break; + } + + case value_t::object: + { + result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator, + last.m_it.object_iterator); + break; + } + + case value_t::array: + { + result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + return result; + } + + /// @brief remove element from a JSON object given a key + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + size_type erase(const typename object_t::key_type& key) + { + // this erase only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return m_value.object->erase(key); + } + + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + /// @brief remove element from a JSON array given an index + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + void erase(const size_type idx) + { + // this erase only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + if (JSON_HEDLEY_UNLIKELY(idx >= size())) + { + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + + m_value.array->erase(m_value.array->begin() + static_cast(idx)); + } + else + { + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + } + + /// @} + + + //////////// + // lookup // + //////////// + + /// @name lookup + /// @{ + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + template + iterator find(KeyT&& key) + { + auto result = end(); + + if (is_object()) + { + result.m_it.object_iterator = m_value.object->find(std::forward(key)); + } + + return result; + } + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + template + const_iterator find(KeyT&& key) const + { + auto result = cend(); + + if (is_object()) + { + result.m_it.object_iterator = m_value.object->find(std::forward(key)); + } + + return result; + } + + /// @brief returns the number of occurrences of a key in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/count/ + template + size_type count(KeyT&& key) const + { + // return 0 for all nonobject types + return is_object() ? m_value.object->count(std::forward(key)) : 0; + } + + /// @brief check the existence of an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + template < typename KeyT, typename std::enable_if < + !std::is_same::type, json_pointer>::value, int >::type = 0 > + bool contains(KeyT && key) const + { + return is_object() && m_value.object->find(std::forward(key)) != m_value.object->end(); + } + + /// @brief check the existence of an element in a JSON object given a JSON pointer + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + bool contains(const json_pointer& ptr) const + { + return ptr.contains(this); + } + + /// @} + + + /////////////// + // iterators // + /////////////// + + /// @name iterators + /// @{ + + /// @brief returns an iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/begin/ + iterator begin() noexcept + { + iterator result(this); + result.set_begin(); + return result; + } + + /// @brief returns an iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/begin/ + const_iterator begin() const noexcept + { + return cbegin(); + } + + /// @brief returns a const iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/cbegin/ + const_iterator cbegin() const noexcept + { + const_iterator result(this); + result.set_begin(); + return result; + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/end/ + iterator end() noexcept + { + iterator result(this); + result.set_end(); + return result; + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/end/ + const_iterator end() const noexcept + { + return cend(); + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/cend/ + const_iterator cend() const noexcept + { + const_iterator result(this); + result.set_end(); + return result; + } + + /// @brief returns an iterator to the reverse-beginning + /// @sa https://json.nlohmann.me/api/basic_json/rbegin/ + reverse_iterator rbegin() noexcept + { + return reverse_iterator(end()); + } + + /// @brief returns an iterator to the reverse-beginning + /// @sa https://json.nlohmann.me/api/basic_json/rbegin/ + const_reverse_iterator rbegin() const noexcept + { + return crbegin(); + } + + /// @brief returns an iterator to the reverse-end + /// @sa https://json.nlohmann.me/api/basic_json/rend/ + reverse_iterator rend() noexcept + { + return reverse_iterator(begin()); + } + + /// @brief returns an iterator to the reverse-end + /// @sa https://json.nlohmann.me/api/basic_json/rend/ + const_reverse_iterator rend() const noexcept + { + return crend(); + } + + /// @brief returns a const reverse iterator to the last element + /// @sa https://json.nlohmann.me/api/basic_json/crbegin/ + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(cend()); + } + + /// @brief returns a const reverse iterator to one before the first + /// @sa https://json.nlohmann.me/api/basic_json/crend/ + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(cbegin()); + } + + public: + /// @brief wrapper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + /// @deprecated This function is deprecated since 3.1.0 and will be removed in + /// version 4.0.0 of the library. Please use @ref items() instead; + /// that is, replace `json::iterator_wrapper(j)` with `j.items()`. + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) + static iteration_proxy iterator_wrapper(reference ref) noexcept + { + return ref.items(); + } + + /// @brief wrapper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + /// @deprecated This function is deprecated since 3.1.0 and will be removed in + /// version 4.0.0 of the library. Please use @ref items() instead; + /// that is, replace `json::iterator_wrapper(j)` with `j.items()`. + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) + static iteration_proxy iterator_wrapper(const_reference ref) noexcept + { + return ref.items(); + } + + /// @brief helper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + iteration_proxy items() noexcept + { + return iteration_proxy(*this); + } + + /// @brief helper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + iteration_proxy items() const noexcept + { + return iteration_proxy(*this); + } + + /// @} + + + ////////////// + // capacity // + ////////////// + + /// @name capacity + /// @{ + + /// @brief checks whether the container is empty. + /// @sa https://json.nlohmann.me/api/basic_json/empty/ + bool empty() const noexcept + { + switch (m_type) + { + case value_t::null: + { + // null values are empty + return true; + } + + case value_t::array: + { + // delegate call to array_t::empty() + return m_value.array->empty(); + } + + case value_t::object: + { + // delegate call to object_t::empty() + return m_value.object->empty(); + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types are nonempty + return false; + } + } + } + + /// @brief returns the number of elements + /// @sa https://json.nlohmann.me/api/basic_json/size/ + size_type size() const noexcept + { + switch (m_type) + { + case value_t::null: + { + // null values are empty + return 0; + } + + case value_t::array: + { + // delegate call to array_t::size() + return m_value.array->size(); + } + + case value_t::object: + { + // delegate call to object_t::size() + return m_value.object->size(); + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types have size 1 + return 1; + } + } + } + + /// @brief returns the maximum possible number of elements + /// @sa https://json.nlohmann.me/api/basic_json/max_size/ + size_type max_size() const noexcept + { + switch (m_type) + { + case value_t::array: + { + // delegate call to array_t::max_size() + return m_value.array->max_size(); + } + + case value_t::object: + { + // delegate call to object_t::max_size() + return m_value.object->max_size(); + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types have max_size() == size() + return size(); + } + } + } + + /// @} + + + /////////////// + // modifiers // + /////////////// + + /// @name modifiers + /// @{ + + /// @brief clears the contents + /// @sa https://json.nlohmann.me/api/basic_json/clear/ + void clear() noexcept + { + switch (m_type) + { + case value_t::number_integer: + { + m_value.number_integer = 0; + break; + } + + case value_t::number_unsigned: + { + m_value.number_unsigned = 0; + break; + } + + case value_t::number_float: + { + m_value.number_float = 0.0; + break; + } + + case value_t::boolean: + { + m_value.boolean = false; + break; + } + + case value_t::string: + { + m_value.string->clear(); + break; + } + + case value_t::binary: + { + m_value.binary->clear(); + break; + } + + case value_t::array: + { + m_value.array->clear(); + break; + } + + case value_t::object: + { + m_value.object->clear(); + break; + } + + case value_t::null: + case value_t::discarded: + default: + break; + } + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(basic_json&& val) + { + // push_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array (move semantics) + const auto old_capacity = m_value.array->capacity(); + m_value.array->push_back(std::move(val)); + set_parent(m_value.array->back(), old_capacity); + // if val is moved from, basic_json move constructor marks it null, so we do not call the destructor + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(basic_json&& val) + { + push_back(std::move(val)); + return *this; + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(const basic_json& val) + { + // push_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array + const auto old_capacity = m_value.array->capacity(); + m_value.array->push_back(val); + set_parent(m_value.array->back(), old_capacity); + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(const basic_json& val) + { + push_back(val); + return *this; + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(const typename object_t::value_type& val) + { + // push_back only works for null objects or objects + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // add element to object + auto res = m_value.object->insert(val); + set_parent(res.first->second); + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(const typename object_t::value_type& val) + { + push_back(val); + return *this; + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(initializer_list_t init) + { + if (is_object() && init.size() == 2 && (*init.begin())->is_string()) + { + basic_json&& key = init.begin()->moved_or_copied(); + push_back(typename object_t::value_type( + std::move(key.get_ref()), (init.begin() + 1)->moved_or_copied())); + } + else + { + push_back(basic_json(init)); + } + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(initializer_list_t init) + { + push_back(init); + return *this; + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/emplace_back/ + template + reference emplace_back(Args&& ... args) + { + // emplace_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(311, "cannot use emplace_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array (perfect forwarding) + const auto old_capacity = m_value.array->capacity(); + m_value.array->emplace_back(std::forward(args)...); + return set_parent(m_value.array->back(), old_capacity); + } + + /// @brief add an object to an object if key does not exist + /// @sa https://json.nlohmann.me/api/basic_json/emplace/ + template + std::pair emplace(Args&& ... args) + { + // emplace only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) + { + JSON_THROW(type_error::create(311, "cannot use emplace() with " + std::string(type_name()), *this)); + } + + // transform null object into an object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // add element to array (perfect forwarding) + auto res = m_value.object->emplace(std::forward(args)...); + set_parent(res.first->second); + + // create result iterator and set iterator to the result of emplace + auto it = begin(); + it.m_it.object_iterator = res.first; + + // return pair of iterator and boolean + return {it, res.second}; + } + + /// Helper for insertion of an iterator + /// @note: This uses std::distance to support GCC 4.8, + /// see https://github.com/nlohmann/json/pull/1257 + template + iterator insert_iterator(const_iterator pos, Args&& ... args) + { + iterator result(this); + JSON_ASSERT(m_value.array != nullptr); + + auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator); + m_value.array->insert(pos.m_it.array_iterator, std::forward(args)...); + result.m_it.array_iterator = m_value.array->begin() + insert_pos; + + // This could have been written as: + // result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val); + // but the return value of insert is missing in GCC 4.8, so it is written this way instead. + + set_parents(); + return result; + } + + /// @brief inserts element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, const basic_json& val) + { + // insert only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, val); + } + + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + /// @brief inserts element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, basic_json&& val) + { + return insert(pos, val); + } + + /// @brief inserts copies of element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, size_type cnt, const basic_json& val) + { + // insert only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, cnt, val); + } + + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + /// @brief inserts range of elements into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, const_iterator first, const_iterator last) + { + // insert only works for arrays + if (JSON_HEDLEY_UNLIKELY(!is_array())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + if (JSON_HEDLEY_UNLIKELY(first.m_object == this)) + { + JSON_THROW(invalid_iterator::create(211, "passed iterators may not belong to container", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator); + } + + /// @brief inserts elements from initializer list into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, initializer_list_t ilist) + { + // insert only works for arrays + if (JSON_HEDLEY_UNLIKELY(!is_array())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, ilist.begin(), ilist.end()); + } + + /// @brief inserts range of elements into object + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + void insert(const_iterator first, const_iterator last) + { + // insert only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + // passed iterators must belong to objects + if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) + { + JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects", *this)); + } + + m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator); + } + + /// @brief updates a JSON object from another object, overwriting existing keys + /// @sa https://json.nlohmann.me/api/basic_json/update/ + void update(const_reference j, bool merge_objects = false) + { + update(j.begin(), j.end(), merge_objects); + } + + /// @brief updates a JSON object from another object, overwriting existing keys + /// @sa https://json.nlohmann.me/api/basic_json/update/ + void update(const_iterator first, const_iterator last, bool merge_objects = false) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } + + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name()), *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + // passed iterators must belong to objects + if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) + { + JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(first.m_object->type_name()), *first.m_object)); + } + + for (auto it = first; it != last; ++it) + { + if (merge_objects && it.value().is_object()) + { + auto it2 = m_value.object->find(it.key()); + if (it2 != m_value.object->end()) + { + it2->second.update(it.value(), true); + continue; + } + } + m_value.object->operator[](it.key()) = it.value(); +#if JSON_DIAGNOSTICS + m_value.object->operator[](it.key()).m_parent = this; +#endif + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(reference other) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + std::swap(m_type, other.m_type); + std::swap(m_value, other.m_value); + + set_parents(); + other.set_parents(); + assert_invariant(); + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + friend void swap(reference left, reference right) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + left.swap(right); + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(array_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + std::swap(*(m_value.array), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(object_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + std::swap(*(m_value.object), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(string_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_string())) + { + std::swap(*(m_value.string), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(binary_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_binary())) + { + std::swap(*(m_value.binary), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(typename binary_t::container_type& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_binary())) + { + std::swap(*(m_value.binary), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @} + + public: + ////////////////////////////////////////// + // lexicographical comparison operators // + ////////////////////////////////////////// + + /// @name lexicographical comparison operators + /// @{ + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + friend bool operator==(const_reference lhs, const_reference rhs) noexcept + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + const auto lhs_type = lhs.type(); + const auto rhs_type = rhs.type(); + + if (lhs_type == rhs_type) + { + switch (lhs_type) + { + case value_t::array: + return *lhs.m_value.array == *rhs.m_value.array; + + case value_t::object: + return *lhs.m_value.object == *rhs.m_value.object; + + case value_t::null: + return true; + + case value_t::string: + return *lhs.m_value.string == *rhs.m_value.string; + + case value_t::boolean: + return lhs.m_value.boolean == rhs.m_value.boolean; + + case value_t::number_integer: + return lhs.m_value.number_integer == rhs.m_value.number_integer; + + case value_t::number_unsigned: + return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned; + + case value_t::number_float: + return lhs.m_value.number_float == rhs.m_value.number_float; + + case value_t::binary: + return *lhs.m_value.binary == *rhs.m_value.binary; + + case value_t::discarded: + default: + return false; + } + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_integer) == rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) + { + return lhs.m_value.number_float == static_cast(rhs.m_value.number_integer); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_float == static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) + { + return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_integer; + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_integer == static_cast(rhs.m_value.number_unsigned); + } + + return false; +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template::value, int>::type = 0> + friend bool operator==(const_reference lhs, ScalarType rhs) noexcept + { + return lhs == basic_json(rhs); + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template::value, int>::type = 0> + friend bool operator==(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) == rhs; + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + friend bool operator!=(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs == rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + template::value, int>::type = 0> + friend bool operator!=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs != basic_json(rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + template::value, int>::type = 0> + friend bool operator!=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) != rhs; + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + friend bool operator<(const_reference lhs, const_reference rhs) noexcept + { + const auto lhs_type = lhs.type(); + const auto rhs_type = rhs.type(); + + if (lhs_type == rhs_type) + { + switch (lhs_type) + { + case value_t::array: + // note parentheses are necessary, see + // https://github.com/nlohmann/json/issues/1530 + return (*lhs.m_value.array) < (*rhs.m_value.array); + + case value_t::object: + return (*lhs.m_value.object) < (*rhs.m_value.object); + + case value_t::null: + return false; + + case value_t::string: + return (*lhs.m_value.string) < (*rhs.m_value.string); + + case value_t::boolean: + return (lhs.m_value.boolean) < (rhs.m_value.boolean); + + case value_t::number_integer: + return (lhs.m_value.number_integer) < (rhs.m_value.number_integer); + + case value_t::number_unsigned: + return (lhs.m_value.number_unsigned) < (rhs.m_value.number_unsigned); + + case value_t::number_float: + return (lhs.m_value.number_float) < (rhs.m_value.number_float); + + case value_t::binary: + return (*lhs.m_value.binary) < (*rhs.m_value.binary); + + case value_t::discarded: + default: + return false; + } + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) + { + return lhs.m_value.number_float < static_cast(rhs.m_value.number_integer); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_float < static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_integer < static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) + { + return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; + } + + // We only reach this line if we cannot compare values. In that case, + // we compare types. Note we have to call the operator explicitly, + // because MSVC has problems otherwise. + return operator<(lhs_type, rhs_type); + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + template::value, int>::type = 0> + friend bool operator<(const_reference lhs, ScalarType rhs) noexcept + { + return lhs < basic_json(rhs); + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + template::value, int>::type = 0> + friend bool operator<(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) < rhs; + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + friend bool operator<=(const_reference lhs, const_reference rhs) noexcept + { + return !(rhs < lhs); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template::value, int>::type = 0> + friend bool operator<=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs <= basic_json(rhs); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template::value, int>::type = 0> + friend bool operator<=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) <= rhs; + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + friend bool operator>(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs <= rhs); + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + template::value, int>::type = 0> + friend bool operator>(const_reference lhs, ScalarType rhs) noexcept + { + return lhs > basic_json(rhs); + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + template::value, int>::type = 0> + friend bool operator>(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) > rhs; + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + friend bool operator>=(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs < rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template::value, int>::type = 0> + friend bool operator>=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs >= basic_json(rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template::value, int>::type = 0> + friend bool operator>=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) >= rhs; + } + + /// @} + + /////////////////// + // serialization // + /////////////////// + + /// @name serialization + /// @{ +#ifndef JSON_NO_IO + /// @brief serialize to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + friend std::ostream& operator<<(std::ostream& o, const basic_json& j) + { + // read width member and use it as indentation parameter if nonzero + const bool pretty_print = o.width() > 0; + const auto indentation = pretty_print ? o.width() : 0; + + // reset width to 0 for subsequent calls to this stream + o.width(0); + + // do the actual serialization + serializer s(detail::output_adapter(o), o.fill()); + s.dump(j, pretty_print, false, static_cast(indentation)); + return o; + } + + /// @brief serialize to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + /// @deprecated This function is deprecated since 3.0.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// operator<<(std::ostream&, const basic_json&) instead; that is, + /// replace calls like `j >> o;` with `o << j;`. + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&)) + friend std::ostream& operator>>(const basic_json& j, std::ostream& o) + { + return o << j; + } +#endif // JSON_NO_IO + /// @} + + + ///////////////////// + // deserialization // + ///////////////////// + + /// @name deserialization + /// @{ + + /// @brief deserialize from a compatible input + /// @sa https://json.nlohmann.me/api/basic_json/parse/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json parse(InputType&& i, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(detail::input_adapter(std::forward(i)), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + /// @brief deserialize from a pair of character iterators + /// @sa https://json.nlohmann.me/api/basic_json/parse/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json parse(IteratorType first, + IteratorType last, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len)) + static basic_json parse(detail::span_input_adapter&& i, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(i.get(), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + /// @brief check if the input is valid JSON + /// @sa https://json.nlohmann.me/api/basic_json/accept/ + template + static bool accept(InputType&& i, + const bool ignore_comments = false) + { + return parser(detail::input_adapter(std::forward(i)), nullptr, false, ignore_comments).accept(true); + } + + /// @brief check if the input is valid JSON + /// @sa https://json.nlohmann.me/api/basic_json/accept/ + template + static bool accept(IteratorType first, IteratorType last, + const bool ignore_comments = false) + { + return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments).accept(true); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len)) + static bool accept(detail::span_input_adapter&& i, + const bool ignore_comments = false) + { + return parser(i.get(), nullptr, false, ignore_comments).accept(true); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + template + JSON_HEDLEY_NON_NULL(2) + static bool sax_parse(InputType&& i, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = detail::input_adapter(std::forward(i)); + return format == input_format_t::json + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + template + JSON_HEDLEY_NON_NULL(3) + static bool sax_parse(IteratorType first, IteratorType last, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = detail::input_adapter(std::move(first), std::move(last)); + return format == input_format_t::json + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + /// @deprecated This function is deprecated since 3.8.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// sax_parse(ptr, ptr + len) instead. + template + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...)) + JSON_HEDLEY_NON_NULL(2) + static bool sax_parse(detail::span_input_adapter&& i, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = i.get(); + return format == input_format_t::json + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } +#ifndef JSON_NO_IO + /// @brief deserialize from stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/ + /// @deprecated This stream operator is deprecated since 3.0.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// operator>>(std::istream&, basic_json&) instead; that is, + /// replace calls like `j << i;` with `i >> j;`. + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&)) + friend std::istream& operator<<(basic_json& j, std::istream& i) + { + return operator>>(i, j); + } + + /// @brief deserialize from stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/ + friend std::istream& operator>>(std::istream& i, basic_json& j) + { + parser(detail::input_adapter(i)).parse(false, j); + return i; + } +#endif // JSON_NO_IO + /// @} + + /////////////////////////// + // convenience functions // + /////////////////////////// + + /// @brief return the type as string + /// @sa https://json.nlohmann.me/api/basic_json/type_name/ + JSON_HEDLEY_RETURNS_NON_NULL + const char* type_name() const noexcept + { + switch (m_type) + { + case value_t::null: + return "null"; + case value_t::object: + return "object"; + case value_t::array: + return "array"; + case value_t::string: + return "string"; + case value_t::boolean: + return "boolean"; + case value_t::binary: + return "binary"; + case value_t::discarded: + return "discarded"; + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + default: + return "number"; + } + } + + + JSON_PRIVATE_UNLESS_TESTED: + ////////////////////// + // member variables // + ////////////////////// + + /// the type of the current element + value_t m_type = value_t::null; + + /// the value of the current element + json_value m_value = {}; + +#if JSON_DIAGNOSTICS + /// a pointer to a parent value (for debugging purposes) + basic_json* m_parent = nullptr; +#endif + + ////////////////////////////////////////// + // binary serialization/deserialization // + ////////////////////////////////////////// + + /// @name binary serialization/deserialization support + /// @{ + + public: + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static std::vector to_cbor(const basic_json& j) + { + std::vector result; + to_cbor(j, result); + return result; + } + + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static void to_cbor(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_cbor(j); + } + + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static void to_cbor(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_cbor(j); + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static std::vector to_msgpack(const basic_json& j) + { + std::vector result; + to_msgpack(j, result); + return result; + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static void to_msgpack(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_msgpack(j); + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static void to_msgpack(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_msgpack(j); + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static std::vector to_ubjson(const basic_json& j, + const bool use_size = false, + const bool use_type = false) + { + std::vector result; + to_ubjson(j, result, use_size, use_type); + return result; + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static void to_ubjson(const basic_json& j, detail::output_adapter o, + const bool use_size = false, const bool use_type = false) + { + binary_writer(o).write_ubjson(j, use_size, use_type); + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static void to_ubjson(const basic_json& j, detail::output_adapter o, + const bool use_size = false, const bool use_type = false) + { + binary_writer(o).write_ubjson(j, use_size, use_type); + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static std::vector to_bson(const basic_json& j) + { + std::vector result; + to_bson(j, result); + return result; + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static void to_bson(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_bson(j); + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static void to_bson(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_bson(j); + } + + /// @brief create a JSON value from an input in CBOR format + /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_cbor(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in CBOR format + /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_cbor(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) + static basic_json from_cbor(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler); + } + + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) + static basic_json from_cbor(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in MessagePack format + /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_msgpack(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in MessagePack format + /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_msgpack(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) + static basic_json from_msgpack(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_msgpack(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) + static basic_json from_msgpack(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in UBJSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_ubjson(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in UBJSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_ubjson(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) + static basic_json from_ubjson(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_ubjson(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) + static basic_json from_ubjson(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_bson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bson(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_bson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bson(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) + static basic_json from_bson(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_bson(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) + static basic_json from_bson(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + /// @} + + ////////////////////////// + // JSON Pointer support // + ////////////////////////// + + /// @name JSON Pointer functions + /// @{ + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](const json_pointer& ptr) + { + return ptr.get_unchecked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get_unchecked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); + } + + /// @brief return flattened JSON value + /// @sa https://json.nlohmann.me/api/basic_json/flatten/ + basic_json flatten() const + { + basic_json result(value_t::object); + json_pointer::flatten("", *this, result); + return result; + } + + /// @brief unflatten a previously flattened JSON value + /// @sa https://json.nlohmann.me/api/basic_json/unflatten/ + basic_json unflatten() const + { + return json_pointer::unflatten(*this); + } + + /// @} + + ////////////////////////// + // JSON Patch functions // + ////////////////////////// + + /// @name JSON Patch functions + /// @{ + + /// @brief applies a JSON patch + /// @sa https://json.nlohmann.me/api/basic_json/patch/ + basic_json patch(const basic_json& json_patch) const + { + // make a working copy to apply the patch to + basic_json result = *this; + + // the valid JSON Patch operations + enum class patch_operations {add, remove, replace, move, copy, test, invalid}; + + const auto get_op = [](const std::string & op) + { + if (op == "add") + { + return patch_operations::add; + } + if (op == "remove") + { + return patch_operations::remove; + } + if (op == "replace") + { + return patch_operations::replace; + } + if (op == "move") + { + return patch_operations::move; + } + if (op == "copy") + { + return patch_operations::copy; + } + if (op == "test") + { + return patch_operations::test; + } + + return patch_operations::invalid; + }; + + // wrapper for "add" operation; add value at ptr + const auto operation_add = [&result](json_pointer & ptr, basic_json val) + { + // adding to the root of the target document means replacing it + if (ptr.empty()) + { + result = val; + return; + } + + // make sure the top element of the pointer exists + json_pointer top_pointer = ptr.top(); + if (top_pointer != ptr) + { + result.at(top_pointer); + } + + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.back(); + ptr.pop_back(); + basic_json& parent = result[ptr]; + + switch (parent.m_type) + { + case value_t::null: + case value_t::object: + { + // use operator[] to add value + parent[last_path] = val; + break; + } + + case value_t::array: + { + if (last_path == "-") + { + // special case: append to back + parent.push_back(val); + } + else + { + const auto idx = json_pointer::array_index(last_path); + if (JSON_HEDLEY_UNLIKELY(idx > parent.size())) + { + // avoid undefined behavior + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", parent)); + } + + // default case: insert add offset + parent.insert(parent.begin() + static_cast(idx), val); + } + break; + } + + // if there exists a parent it cannot be primitive + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + }; + + // wrapper for "remove" operation; remove value at ptr + const auto operation_remove = [this, &result](json_pointer & ptr) + { + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.back(); + ptr.pop_back(); + basic_json& parent = result.at(ptr); + + // remove child + if (parent.is_object()) + { + // perform range check + auto it = parent.find(last_path); + if (JSON_HEDLEY_LIKELY(it != parent.end())) + { + parent.erase(it); + } + else + { + JSON_THROW(out_of_range::create(403, "key '" + last_path + "' not found", *this)); + } + } + else if (parent.is_array()) + { + // note erase performs range check + parent.erase(json_pointer::array_index(last_path)); + } + }; + + // type check: top level value must be an array + if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array())) + { + JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", json_patch)); + } + + // iterate and apply the operations + for (const auto& val : json_patch) + { + // wrapper to get a value for an operation + const auto get_value = [&val](const std::string & op, + const std::string & member, + bool string_type) -> basic_json & + { + // find value + auto it = val.m_value.object->find(member); + + // context-sensitive error message + const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; + + // check if desired value is present + if (JSON_HEDLEY_UNLIKELY(it == val.m_value.object->end())) + { + // NOLINTNEXTLINE(performance-inefficient-string-concatenation) + JSON_THROW(parse_error::create(105, 0, error_msg + " must have member '" + member + "'", val)); + } + + // check if result is of type string + if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string())) + { + // NOLINTNEXTLINE(performance-inefficient-string-concatenation) + JSON_THROW(parse_error::create(105, 0, error_msg + " must have string member '" + member + "'", val)); + } + + // no error: return value + return it->second; + }; + + // type check: every element of the array must be an object + if (JSON_HEDLEY_UNLIKELY(!val.is_object())) + { + JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", val)); + } + + // collect mandatory members + const auto op = get_value("op", "op", true).template get(); + const auto path = get_value(op, "path", true).template get(); + json_pointer ptr(path); + + switch (get_op(op)) + { + case patch_operations::add: + { + operation_add(ptr, get_value("add", "value", false)); + break; + } + + case patch_operations::remove: + { + operation_remove(ptr); + break; + } + + case patch_operations::replace: + { + // the "path" location must exist - use at() + result.at(ptr) = get_value("replace", "value", false); + break; + } + + case patch_operations::move: + { + const auto from_path = get_value("move", "from", true).template get(); + json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The move operation is functionally identical to a + // "remove" operation on the "from" location, followed + // immediately by an "add" operation at the target + // location with the value that was just removed. + operation_remove(from_ptr); + operation_add(ptr, v); + break; + } + + case patch_operations::copy: + { + const auto from_path = get_value("copy", "from", true).template get(); + const json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The copy is functionally identical to an "add" + // operation at the target location using the value + // specified in the "from" member. + operation_add(ptr, v); + break; + } + + case patch_operations::test: + { + bool success = false; + JSON_TRY + { + // check if "value" matches the one at "path" + // the "path" location must exist - use at() + success = (result.at(ptr) == get_value("test", "value", false)); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + // ignore out of range errors: success remains false + } + + // throw an exception if test fails + if (JSON_HEDLEY_UNLIKELY(!success)) + { + JSON_THROW(other_error::create(501, "unsuccessful: " + val.dump(), val)); + } + + break; + } + + case patch_operations::invalid: + default: + { + // op must be "add", "remove", "replace", "move", "copy", or + // "test" + JSON_THROW(parse_error::create(105, 0, "operation value '" + op + "' is invalid", val)); + } + } + } + + return result; + } + + /// @brief creates a diff as a JSON patch + /// @sa https://json.nlohmann.me/api/basic_json/diff/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json diff(const basic_json& source, const basic_json& target, + const std::string& path = "") + { + // the patch + basic_json result(value_t::array); + + // if the values are the same, return empty patch + if (source == target) + { + return result; + } + + if (source.type() != target.type()) + { + // different types: replace value + result.push_back( + { + {"op", "replace"}, {"path", path}, {"value", target} + }); + return result; + } + + switch (source.type()) + { + case value_t::array: + { + // first pass: traverse common elements + std::size_t i = 0; + while (i < source.size() && i < target.size()) + { + // recursive call to compare array values at index i + auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + ++i; + } + + // We now reached the end of at least one array + // in a second pass, traverse the remaining elements + + // remove my remaining elements + const auto end_index = static_cast(result.size()); + while (i < source.size()) + { + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, object( + { + {"op", "remove"}, + {"path", path + "/" + std::to_string(i)} + })); + ++i; + } + + // add other remaining elements + while (i < target.size()) + { + result.push_back( + { + {"op", "add"}, + {"path", path + "/-"}, + {"value", target[i]} + }); + ++i; + } + + break; + } + + case value_t::object: + { + // first pass: traverse this object's elements + for (auto it = source.cbegin(); it != source.cend(); ++it) + { + // escape the key name to be used in a JSON patch + const auto path_key = path + "/" + detail::escape(it.key()); + + if (target.find(it.key()) != target.end()) + { + // recursive call to compare object values at key it + auto temp_diff = diff(it.value(), target[it.key()], path_key); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + } + else + { + // found a key that is not in o -> remove it + result.push_back(object( + { + {"op", "remove"}, {"path", path_key} + })); + } + } + + // second pass: traverse other object's elements + for (auto it = target.cbegin(); it != target.cend(); ++it) + { + if (source.find(it.key()) == source.end()) + { + // found a key that is not in this -> add it + const auto path_key = path + "/" + detail::escape(it.key()); + result.push_back( + { + {"op", "add"}, {"path", path_key}, + {"value", it.value()} + }); + } + } + + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // both primitive type: replace value + result.push_back( + { + {"op", "replace"}, {"path", path}, {"value", target} + }); + break; + } + } + + return result; + } + + /// @} + + //////////////////////////////// + // JSON Merge Patch functions // + //////////////////////////////// + + /// @name JSON Merge Patch functions + /// @{ + + /// @brief applies a JSON Merge Patch + /// @sa https://json.nlohmann.me/api/basic_json/merge_patch/ + void merge_patch(const basic_json& apply_patch) + { + if (apply_patch.is_object()) + { + if (!is_object()) + { + *this = object(); + } + for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it) + { + if (it.value().is_null()) + { + erase(it.key()); + } + else + { + operator[](it.key()).merge_patch(it.value()); + } + } + } + else + { + *this = apply_patch; + } + } + + /// @} +}; + +/// @brief user-defined to_string function for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/to_string/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j) +{ + return j.dump(); +} + +} // namespace nlohmann + +/////////////////////// +// nonmember support // +/////////////////////// + +namespace std // NOLINT(cert-dcl58-cpp) +{ + +/// @brief hash value for JSON objects +/// @sa https://json.nlohmann.me/api/basic_json/std_hash/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct hash +{ + std::size_t operator()(const nlohmann::NLOHMANN_BASIC_JSON_TPL& j) const + { + return nlohmann::detail::hash(j); + } +}; + +// specialization for std::less +template<> +struct less< ::nlohmann::detail::value_t> // do not remove the space after '<', see https://github.com/nlohmann/json/pull/679 +{ + /*! + @brief compare two value_t enum values + @since version 3.0.0 + */ + bool operator()(nlohmann::detail::value_t lhs, + nlohmann::detail::value_t rhs) const noexcept + { + return nlohmann::detail::operator<(lhs, rhs); + } +}; + +// C++20 prohibit function specialization in the std namespace. +#ifndef JSON_HAS_CPP_20 + +/// @brief exchanges the values of two JSON objects +/// @sa https://json.nlohmann.me/api/basic_json/std_swap/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name) + is_nothrow_move_constructible::value&& // NOLINT(misc-redundant-expression) + is_nothrow_move_assignable::value) +{ + j1.swap(j2); +} + +#endif + +} // namespace std + +/// @brief user-defined string literal for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/ +JSON_HEDLEY_NON_NULL(1) +inline nlohmann::json operator "" _json(const char* s, std::size_t n) +{ + return nlohmann::json::parse(s, s + n); +} + +/// @brief user-defined string literal for JSON pointer +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json_pointer/ +JSON_HEDLEY_NON_NULL(1) +inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) +{ + return nlohmann::json::json_pointer(std::string(s, n)); +} + +// #include + + +// restore clang diagnostic settings +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +// clean up +#undef JSON_ASSERT +#undef JSON_INTERNAL_CATCH +#undef JSON_CATCH +#undef JSON_THROW +#undef JSON_TRY +#undef JSON_PRIVATE_UNLESS_TESTED +#undef JSON_HAS_CPP_11 +#undef JSON_HAS_CPP_14 +#undef JSON_HAS_CPP_17 +#undef JSON_HAS_CPP_20 +#undef JSON_HAS_FILESYSTEM +#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM +#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION +#undef NLOHMANN_BASIC_JSON_TPL +#undef JSON_EXPLICIT +#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL + +// #include + + +#undef JSON_HEDLEY_ALWAYS_INLINE +#undef JSON_HEDLEY_ARM_VERSION +#undef JSON_HEDLEY_ARM_VERSION_CHECK +#undef JSON_HEDLEY_ARRAY_PARAM +#undef JSON_HEDLEY_ASSUME +#undef JSON_HEDLEY_BEGIN_C_DECLS +#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#undef JSON_HEDLEY_CLANG_HAS_FEATURE +#undef JSON_HEDLEY_CLANG_HAS_WARNING +#undef JSON_HEDLEY_COMPCERT_VERSION +#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#undef JSON_HEDLEY_CONCAT +#undef JSON_HEDLEY_CONCAT3 +#undef JSON_HEDLEY_CONCAT3_EX +#undef JSON_HEDLEY_CONCAT_EX +#undef JSON_HEDLEY_CONST +#undef JSON_HEDLEY_CONSTEXPR +#undef JSON_HEDLEY_CONST_CAST +#undef JSON_HEDLEY_CPP_CAST +#undef JSON_HEDLEY_CRAY_VERSION +#undef JSON_HEDLEY_CRAY_VERSION_CHECK +#undef JSON_HEDLEY_C_DECL +#undef JSON_HEDLEY_DEPRECATED +#undef JSON_HEDLEY_DEPRECATED_FOR +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#undef JSON_HEDLEY_DIAGNOSTIC_POP +#undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#undef JSON_HEDLEY_DMC_VERSION +#undef JSON_HEDLEY_DMC_VERSION_CHECK +#undef JSON_HEDLEY_EMPTY_BASES +#undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#undef JSON_HEDLEY_END_C_DECLS +#undef JSON_HEDLEY_FLAGS +#undef JSON_HEDLEY_FLAGS_CAST +#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_BUILTIN +#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_EXTENSION +#undef JSON_HEDLEY_GCC_HAS_FEATURE +#undef JSON_HEDLEY_GCC_HAS_WARNING +#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#undef JSON_HEDLEY_GCC_VERSION +#undef JSON_HEDLEY_GCC_VERSION_CHECK +#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#undef JSON_HEDLEY_GNUC_HAS_FEATURE +#undef JSON_HEDLEY_GNUC_HAS_WARNING +#undef JSON_HEDLEY_GNUC_VERSION +#undef JSON_HEDLEY_GNUC_VERSION_CHECK +#undef JSON_HEDLEY_HAS_ATTRIBUTE +#undef JSON_HEDLEY_HAS_BUILTIN +#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_HAS_EXTENSION +#undef JSON_HEDLEY_HAS_FEATURE +#undef JSON_HEDLEY_HAS_WARNING +#undef JSON_HEDLEY_IAR_VERSION +#undef JSON_HEDLEY_IAR_VERSION_CHECK +#undef JSON_HEDLEY_IBM_VERSION +#undef JSON_HEDLEY_IBM_VERSION_CHECK +#undef JSON_HEDLEY_IMPORT +#undef JSON_HEDLEY_INLINE +#undef JSON_HEDLEY_INTEL_CL_VERSION +#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#undef JSON_HEDLEY_INTEL_VERSION +#undef JSON_HEDLEY_INTEL_VERSION_CHECK +#undef JSON_HEDLEY_IS_CONSTANT +#undef JSON_HEDLEY_IS_CONSTEXPR_ +#undef JSON_HEDLEY_LIKELY +#undef JSON_HEDLEY_MALLOC +#undef JSON_HEDLEY_MCST_LCC_VERSION +#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#undef JSON_HEDLEY_MESSAGE +#undef JSON_HEDLEY_MSVC_VERSION +#undef JSON_HEDLEY_MSVC_VERSION_CHECK +#undef JSON_HEDLEY_NEVER_INLINE +#undef JSON_HEDLEY_NON_NULL +#undef JSON_HEDLEY_NO_ESCAPE +#undef JSON_HEDLEY_NO_RETURN +#undef JSON_HEDLEY_NO_THROW +#undef JSON_HEDLEY_NULL +#undef JSON_HEDLEY_PELLES_VERSION +#undef JSON_HEDLEY_PELLES_VERSION_CHECK +#undef JSON_HEDLEY_PGI_VERSION +#undef JSON_HEDLEY_PGI_VERSION_CHECK +#undef JSON_HEDLEY_PREDICT +#undef JSON_HEDLEY_PRINTF_FORMAT +#undef JSON_HEDLEY_PRIVATE +#undef JSON_HEDLEY_PUBLIC +#undef JSON_HEDLEY_PURE +#undef JSON_HEDLEY_REINTERPRET_CAST +#undef JSON_HEDLEY_REQUIRE +#undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#undef JSON_HEDLEY_REQUIRE_MSG +#undef JSON_HEDLEY_RESTRICT +#undef JSON_HEDLEY_RETURNS_NON_NULL +#undef JSON_HEDLEY_SENTINEL +#undef JSON_HEDLEY_STATIC_ASSERT +#undef JSON_HEDLEY_STATIC_CAST +#undef JSON_HEDLEY_STRINGIFY +#undef JSON_HEDLEY_STRINGIFY_EX +#undef JSON_HEDLEY_SUNPRO_VERSION +#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#undef JSON_HEDLEY_TINYC_VERSION +#undef JSON_HEDLEY_TINYC_VERSION_CHECK +#undef JSON_HEDLEY_TI_ARMCL_VERSION +#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL2000_VERSION +#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL430_VERSION +#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL6X_VERSION +#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL7X_VERSION +#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#undef JSON_HEDLEY_TI_CLPRU_VERSION +#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#undef JSON_HEDLEY_TI_VERSION +#undef JSON_HEDLEY_TI_VERSION_CHECK +#undef JSON_HEDLEY_UNAVAILABLE +#undef JSON_HEDLEY_UNLIKELY +#undef JSON_HEDLEY_UNPREDICTABLE +#undef JSON_HEDLEY_UNREACHABLE +#undef JSON_HEDLEY_UNREACHABLE_RETURN +#undef JSON_HEDLEY_VERSION +#undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#undef JSON_HEDLEY_VERSION_DECODE_MINOR +#undef JSON_HEDLEY_VERSION_DECODE_REVISION +#undef JSON_HEDLEY_VERSION_ENCODE +#undef JSON_HEDLEY_WARNING +#undef JSON_HEDLEY_WARN_UNUSED_RESULT +#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#undef JSON_HEDLEY_FALL_THROUGH + + + +#endif // INCLUDE_NLOHMANN_JSON_HPP_ \ No newline at end of file diff --git a/3rd_party/jsonrpcpp-1.1.1/.gitignore b/3rd_party/jsonrpcpp-1.1.1/.gitignore new file mode 100644 index 00000000..028ce9b5 --- /dev/null +++ b/3rd_party/jsonrpcpp-1.1.1/.gitignore @@ -0,0 +1,33 @@ +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +jsonrpctest +.vscode +build diff --git a/3rd_party/jsonrpcpp-1.1.1/.travis.yml b/3rd_party/jsonrpcpp-1.1.1/.travis.yml new file mode 100644 index 00000000..36b696ac --- /dev/null +++ b/3rd_party/jsonrpcpp-1.1.1/.travis.yml @@ -0,0 +1,29 @@ +language: cpp +dist: trusty +sudo: required +group: edge + +compiler: + - gcc +matrix: + include: + # build on ubuntu + - os: linux + compiler: gcc + env: + - MATRIX_EVAL="CC=gcc-4.9 && CXX=g++-4.9" + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-4.9 + # build on osx + - os: osx + osx_image: xcode9.1 +before_install: + - eval "${MATRIX_EVAL}" +script: + - mkdir build + - cd build + - cmake .. && make diff --git a/3rd_party/jsonrpcpp-1.1.1/CMakeLists.txt b/3rd_party/jsonrpcpp-1.1.1/CMakeLists.txt new file mode 100644 index 00000000..b01441a2 --- /dev/null +++ b/3rd_party/jsonrpcpp-1.1.1/CMakeLists.txt @@ -0,0 +1,65 @@ +cmake_minimum_required(VERSION 3.0.0) + +project(jsonrpcpp VERSION 1.1.1 LANGUAGES CXX) +set(PROJECT_DESCRIPTION "C++ JSON-RPC 2.0 library") +set(PROJECT_URL "https://github.com/badaix/jsonrpcpp") + +option(BUILD_SHARED_LIBS "Build jsonrpcpp as a shared library" ON) +option(BUILD_STATIC_LIBS "Build jsonrpcpp as a static library" ON) +option(BUILD_TESTS "Build tests (run tests with make test)" ON) + +if (NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS) + message(FATAL_ERROR "One or both of BUILD_SHARED_LIBS or BUILD_STATIC_LIBS" + "must be set to ON to build") +endif() + +if(NOT DEFINED CMAKE_INSTALL_LIBDIR) + SET(CMAKE_INSTALL_LIBDIR lib CACHE PATH "Output directory for libraries") +endif() + +if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR) + SET(CMAKE_INSTALL_INCLUDEDIR include CACHE + PATH "Output directory for header files") +endif() + +include_directories(lib) +set(JSONRPCPP_SOURCES lib/jsonrp.cpp) + +if (BUILD_SHARED_LIBS) + add_library(jsonrpcpp SHARED "${JSONRPCPP_SOURCES}") + target_compile_features(jsonrpcpp PUBLIC cxx_std_11) + if(WIN32) + install(TARGETS jsonrpcpp RUNTIME DESTINATION "${CMAKE_INSTALL_LIBDIR}") + else() + install(TARGETS jsonrpcpp LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() + +endif (BUILD_SHARED_LIBS) + +if (BUILD_STATIC_LIBS) + add_library(jsonrpcpp-static STATIC "${JSONRPCPP_SOURCES}") + set_target_properties(jsonrpcpp-static PROPERTIES OUTPUT_NAME jsonrpcpp) + target_compile_features(jsonrpcpp-static PUBLIC cxx_std_11) + install(TARGETS jsonrpcpp-static ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") +endif (BUILD_STATIC_LIBS) + +if (BUILD_TESTS) + if (NOT BUILD_STATIC_LIBS) + message(FATAL_ERROR "Tests can only be built against static libraries " + "(set BUILD_STATIC_LIBS=ON)") + endif (NOT BUILD_STATIC_LIBS) + add_executable(jsonrpctest jsonrpctest.cpp) + target_link_libraries(jsonrpctest jsonrpcpp-static) + target_compile_features(jsonrpctest PUBLIC cxx_std_11) +endif (BUILD_TESTS) + +install(FILES lib/jsonrp.hpp lib/json.hpp + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/jsonrpcpp") + +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/jsonrpcpp.pc.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/jsonrpcpp.pc" + @ONLY) + +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/jsonrpcpp.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") diff --git a/3rd_party/jsonrpcpp-1.1.1/LICENSE b/3rd_party/jsonrpcpp-1.1.1/LICENSE new file mode 100644 index 00000000..ce4771ad --- /dev/null +++ b/3rd_party/jsonrpcpp-1.1.1/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Johannes Pohl + +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. diff --git a/3rd_party/jsonrpcpp-1.1.1/Makefile b/3rd_party/jsonrpcpp-1.1.1/Makefile new file mode 100644 index 00000000..8c9fad0d --- /dev/null +++ b/3rd_party/jsonrpcpp-1.1.1/Makefile @@ -0,0 +1,19 @@ +BIN = jsonrpctest + +CXX = clang++ +STRIP = strip +CXXFLAGS = -std=c++0x -Wall -O3 -Ilib -isystem lib/externals + +OBJ = jsonrpctest.o lib/jsonrp.o + + +all: $(OBJ) + $(CXX) $(CXXFLAGS) -o $(BIN) $(OBJ) $(LDFLAGS) + $(STRIP) $(BIN) + +%.o: %.cpp + $(CXX) $(CXXFLAGS) -c $< -o $@ + +clean: + rm -rf $(BIN) $(OBJ) *~ + diff --git a/3rd_party/jsonrpcpp-1.1.1/README.md b/3rd_party/jsonrpcpp-1.1.1/README.md new file mode 100644 index 00000000..d67d66d7 --- /dev/null +++ b/3rd_party/jsonrpcpp-1.1.1/README.md @@ -0,0 +1,75 @@ +# jsonrpc++ + +C++ [JSON-RPC 2.0](http://www.jsonrpc.org/specification) library + +[![Build Status](https://travis-ci.org/badaix/jsonrpcpp.svg?branch=master)](https://travis-ci.org/badaix/jsonrpcpp) +[![Github Releases](https://img.shields.io/github/release/badaix/jsonrpcpp.svg)](https://github.com/badaix/jsonrpcpp/releases) + +When grown up, this will be a leightweight JSON-RPC 2.0 C++ library. + +### What it is +jsonrpc++ parses and constructs JSON RPC 2.0 objects, like +* [Request](http://www.jsonrpc.org/specification#request_object) + * [Notification](http://www.jsonrpc.org/specification#notification) + * [Parameter](http://www.jsonrpc.org/specification#parameter_structures) +* [Response](http://www.jsonrpc.org/specification#response_object) + * [Error](http://www.jsonrpc.org/specification#error_object) +* [Batch](http://www.jsonrpc.org/specification#batch) + + +#### Example: Parsing a request +````c++ +jsonrpcpp::entity_ptr entity = jsonrpcpp::Parser::parse(R"({"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3})"); +if (entity->is_request()) +{ + jsonrpcpp::request_ptr request = dynamic_pointer_cast(entity); + if (request->method == "subtract") + { + int result = request->params.get("minuend") - request->params.get("subtrahend"); + jsonrpcpp::Response response(*request, result); + cout << " Response: " << response.to_json().dump() << "\n"; + //will print: {"jsonrpc": "2.0", "result": 19, "id": 3} + } + else + throw jsonrpcpp::MethodNotFoundException(*request); +} +```` + +### What it not is +jsonrpc++ is completely transport agnostic, i.e. it doesn't care about transportation of the messages and there are no TCP client or server components shipped with this lib. + +As JSON backbone [JSON for Modern C++](https://nlohmann.github.io/json/) is used. + + +## Some code +````c++ +jsonrpcpp::entity_ptr entity = jsonrpcpp::Parser::parse(R"({"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3})"); +if (entity && entity->is_request()) +{ + jsonrpcpp::request_ptr request = dynamic_pointer_cast(entity); + cout << " Request: " << request->method << ", id: " << request->id << ", has params: " << !request->params.is_null() << "\n"; + if (request->method == "subtract") + { + int result; + if (request->params.is_array()) + result = request->params.get(0) - request->params.get(1); + else + result = request->params.get("minuend") - request->params.get("subtrahend"); + + jsonrpcpp::Response response(*request, result); + cout << " Response: " << response.to_json().dump() << "\n"; + } + else if (request->method == "sum") + { + int result = 0; + for (const auto& summand: request->params.param_array) + result += summand.get(); + jsonrpcpp::Response response(*request, result); + cout << " Response: " << response.to_json().dump() << "\n"; + } + else + { + throw jsonrpcpp::MethodNotFoundException(*request); + } +} + ```` diff --git a/3rd_party/jsonrpcpp-1.1.1/cmake/jsonrpcpp.pc.cmake b/3rd_party/jsonrpcpp-1.1.1/cmake/jsonrpcpp.pc.cmake new file mode 100644 index 00000000..32c10818 --- /dev/null +++ b/3rd_party/jsonrpcpp-1.1.1/cmake/jsonrpcpp.pc.cmake @@ -0,0 +1,12 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ +includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ + +Name: @PROJECT_NAME@ +Description: @PROJECT_DESCRIPTION@ +URL: @PROJECT_URL@ +Version: @PROJECT_VERSION@ + +Libs: -L${libdir} -ljsonrpcpp +Cflags: -I${includedir} diff --git a/3rd_party/jsonrpcpp-1.1.1/jsonrpctest.cpp b/3rd_party/jsonrpcpp-1.1.1/jsonrpctest.cpp new file mode 100644 index 00000000..f4855dc4 --- /dev/null +++ b/3rd_party/jsonrpcpp-1.1.1/jsonrpctest.cpp @@ -0,0 +1,244 @@ +/*** + This file is part of jsonrpc++ + Copyright (C) 2017 Johannes Pohl + + This software may be modified and distributed under the terms + of the MIT license. See the LICENSE file for details. +***/ + + +#include +#include "jsonrp.hpp" + +using namespace std; + + +jsonrpcpp::Parser parser; + + +jsonrpcpp::Response getRespone(jsonrpcpp::request_ptr request) +{ + //cout << " Request: " << request->method << ", id: " << request->id << ", has params: " << !request->params.is_null() << "\n"; + if (request->method == "subtract") + { + if (request->params) + { + int result; + if (request->params.is_array()) + result = request->params.get(0) - request->params.get(1); + else + result = request->params.get("minuend") - request->params.get("subtrahend"); + + return jsonrpcpp::Response(*request, result); + } + else + throw jsonrpcpp::InvalidParamsException(*request); + } + else if (request->method == "sum") + { + int result = 0; + for (const auto& summand: request->params.param_array) + result += summand.get(); + return jsonrpcpp::Response(*request, result); + } + else if (request->method == "get_data") + { + return jsonrpcpp::Response(*request, Json({"hello", 5})); + } + else + { + throw jsonrpcpp::MethodNotFoundException(*request); + } +} + + + +void test(const std::string& json_str) +{ + try + { + cout << "--> " << json_str << "\n"; + jsonrpcpp::entity_ptr entity = parser.parse(json_str); + if (entity) + { + //cout << " Json: " << entity->to_json().dump() << "\n"; + if (entity->is_response()) + { + cout << "<-- " << entity->to_json().dump() << "\n"; + } + if (entity->is_request()) + { + jsonrpcpp::Response response = getRespone(dynamic_pointer_cast(entity)); + cout << "<-- " << response.to_json().dump() << "\n"; + } + else if (entity->is_notification()) + { + jsonrpcpp::notification_ptr notification = dynamic_pointer_cast(entity); + cout << "Notification: " << notification->method << ", has params: " << !notification->params.is_null() << "\n"; + } + else if (entity->is_batch()) + { + jsonrpcpp::batch_ptr batch = dynamic_pointer_cast(entity); + jsonrpcpp::Batch responseBatch; + //cout << " Batch\n"; + for (const auto& batch_entity: batch->entities) + { + //cout << batch_entity->type_str() << ": \t" << batch_entity->to_json() << "\n"; + if (batch_entity->is_request()) + { + try + { + jsonrpcpp::Response response = getRespone(dynamic_pointer_cast(batch_entity)); + responseBatch.add(response); // + } + catch(const jsonrpcpp::RequestException& e) + { + responseBatch.add(e); // + } + } + else if (batch_entity->is_exception()) + { + responseBatch.add_ptr(batch_entity); + } + else if (batch_entity->is_error()) + { + jsonrpcpp::error_ptr error = dynamic_pointer_cast(batch_entity); + responseBatch.add(jsonrpcpp::RequestException(*error)); + } + } + if (!responseBatch.entities.empty()) + cout << "<-- " << responseBatch.to_json().dump() << "\n"; + } + } + } + catch(const jsonrpcpp::RequestException& e) + { + cout << "<-- " << e.to_json().dump() << "\n"; + //cout << " Response: " << jsonrpcpp::Response(e).to_json().dump() << "\n"; + //cerr << "RequestException: " << e.what() << "\n"; + } + catch(const jsonrpcpp::ParseErrorException& e) + { + cout << "<-- " << e.to_json().dump() << "\n"; + } + catch(const jsonrpcpp::RpcException& e) + { + cerr << "RpcException: " << e.what() << "\n"; + cout << "<-- " << jsonrpcpp::ParseErrorException(e.what()).to_json().dump() << "\n"; + } + catch(const std::exception& e) + { + cerr << "Exception: " << e.what() << "\n"; + } + cout << "\n"; +} + + +void test(const jsonrpcpp::Entity& entity) +{ + test(entity.to_json().dump()); +} + + +void update(const jsonrpcpp::Parameter& params) +{ + cout << "Notification callback: update, has params: " << !params.is_null() << "\n"; +} + +/* +void foobar(const jsonrpcpp::Notification& notification, const jsonrpcpp::Parameter& params) +{ + cout << "Notification callback: " << notification.method << ", has params: " << !notification.params.is_null() << "\n"; +} +*/ + +void foobar(const jsonrpcpp::Parameter& params) +{ + cout << "Notification callback: foobar, has params: " << !params.is_null() << "\n"; +} + + +jsonrpcpp::response_ptr sum(const jsonrpcpp::Id& id, const jsonrpcpp::Parameter& params) +{ + int result = 0; + for (const auto& summand: params.param_array) + result += summand.get(); + cout << "Request callback: sum, result: " << result << "\n"; + return make_shared(id, result); +} + + +//examples taken from: http://www.jsonrpc.org/specification#examples +int main(int argc, char* argv[]) +{ + parser.register_notification_callback("update", update); + parser.register_notification_callback("foobar", foobar); + parser.register_request_callback("sum", sum); + + cout << "rpc call with positional parameters:\n\n"; + test(R"({"jsonrpc": "2.0", "method": "sum", "params": [1, 2, 3, 4, 5], "id": 1})"); + test(jsonrpcpp::Request(1, "sum", Json({1, 2, 3, 4, 5}))); + + test(R"({"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1})"); + test(jsonrpcpp::Request(1, "subtract", Json({42, 23}))); + test(R"({"jsonrpc": "2.0", "method": "subtract", "params": [23, 42], "id": 2})"); + test(jsonrpcpp::Request(2, "subtract", Json({23, 42}))); + + cout << "\n\nrpc call with named parameters:\n\n"; + test(R"({"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3})"); + test(jsonrpcpp::Request(3, "subtract", Json({{"subtrahend", 23}, {"minuend", 42}}))); + test(R"({"jsonrpc": "2.0", "method": "subtract", "params": {"minuend": 42, "subtrahend": 23}, "id": 4})"); + test(jsonrpcpp::Request(4, "subtract", Json({{"minuend", 42}, {"subtrahend", 23}}))); + + cout << "\n\na Notification:\n\n"; + test(R"({"jsonrpc": "2.0", "method": "update", "params": [1,2,3,4,5]})"); + test(jsonrpcpp::Notification("update", Json({1, 2, 3, 4, 5}))); + test(R"({"jsonrpc": "2.0", "method": "foobar"})"); + test(jsonrpcpp::Notification("foobar")); + + cout << "\n\nrpc call of non-existent method:\n\n"; + test(R"({"jsonrpc": "2.0", "method": "foobar", "id": "1"})"); + test(jsonrpcpp::Request("1", "foobar")); + + cout << "\n\nrpc call with invalid JSON:\n\n"; + test(R"({"jsonrpc": "2.0", "method": "foobar, "params": "bar", "baz])"); + + cout << "\n\nrpc call with invalid Request object:\n\n"; + test(R"({"jsonrpc": "2.0", "method": 1, "params": "bar"})"); + + cout << "\n\nrpc call Batch, invalid JSON:\n\n"; + test(R"( [ + {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"}, + {"jsonrpc": "2.0", "method" + ])"); + + cout << "\n\nrpc call with an empty Array:\n\n"; + test(R"([])"); + + cout << "\n\nrpc call with an invalid Batch (but not empty):\n\n"; + test(R"([1])"); + + cout << "\n\nrpc call with invalid Batch:\n\n"; + test(R"([1,2,3])"); + + cout << "\n\nrpc call Batch:\n\n"; + test(R"( [ + {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, + {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"}, + {"foo": "boo"}, + {"jsonrpc": "2.0", "method": 1, "params": "bar"}, + {"jsonrpc": "2.0", "method": 1, "params": "bar", "id": 4}, + {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"}, + {"jsonrpc": "2.0", "method": "get_data", "id": "9"} + ])"); + + cout << "\n\nrpc call Batch (all notifications):\n\n"; + test(R"( [ + {"jsonrpc": "2.0", "method": "notify_sum", "params": [1,2,4]}, + {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]} + ])"); + +} + + diff --git a/3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.cpp b/3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.cpp new file mode 100644 index 00000000..29b6938c --- /dev/null +++ b/3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.cpp @@ -0,0 +1,1017 @@ +/*** + This file is part of jsonrpc++ + Copyright (C) 2017 Johannes Pohl + + This software may be modified and distributed under the terms + of the MIT license. See the LICENSE file for details. +***/ + +#include "jsonrp.hpp" + + +using namespace std; + +namespace jsonrpcpp +{ + + +/////////////////////////// Entity implementation ///////////////////////////// + +Entity::Entity(entity_t type) : entity(type) +{ +} + + +Entity::~Entity() +{ +} + + +bool Entity::is_exception() +{ + return (entity == entity_t::exception); +} + + +bool Entity::is_id() +{ + return (entity == entity_t::id); +} + + +bool Entity::is_error() +{ + return (entity == entity_t::error); +} + + +bool Entity::is_response() +{ + return (entity == entity_t::response); +} + + +bool Entity::is_request() +{ + return (entity == entity_t::request); +} + + +bool Entity::is_notification() +{ + return (entity == entity_t::notification); +} + + +bool Entity::is_batch() +{ + return (entity == entity_t::batch); +} + + +void Entity::parse(const char* json_str) +{ + // http://www.jsonrpc.org/specification + // code message meaning + // -32700 Parse error Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text. + // -32600 Invalid Request The JSON sent is not a valid Request object. + // -32601 Method not found The method does not exist / is not available. + // -32602 Invalid params Invalid method parameter(s). + // -32603 Internal error Internal JSON-RPC error. + // -32000 to -32099 Server error Reserved for implementation-defined server-errors. + try + { + parse_json(Json::parse(json_str)); + } + catch (const RpcException& e) + { + throw; + } + catch (const exception& e) + { + throw ParseErrorException(e.what()); + } +} + + +void Entity::parse(const std::string& json_str) +{ + parse(json_str.c_str()); +} + + +std::string Entity::type_str() const +{ + switch (entity) + { + case entity_t::unknown: + return "unknown"; + case entity_t::id: + return "id"; + case entity_t::exception: + return "exception"; + case entity_t::error: + return "error"; + case entity_t::response: + return "response"; + case entity_t::request: + return "request"; + case entity_t::notification: + return "notification"; + case entity_t::batch: + return "batch"; + default: + return "unknown"; + } +} + + + + + +/////////////////////////// NullableEntity implementation ///////////////////// + +NullableEntity::NullableEntity(entity_t type) : Entity(type), isNull(false) +{ +} + + +NullableEntity::NullableEntity(entity_t type, std::nullptr_t) : Entity(type), isNull(true) +{ +} + + +NullableEntity::~NullableEntity() +{ +}; + + + + + +/////////////////////////// Id implementation ///////////////////////////////// + +Id::Id() : Entity(entity_t::id), type(value_t::null), int_id(0), string_id("") +{ +} + + +Id::Id(int id) : Entity(entity_t::id), type(value_t::integer), int_id(id), string_id("") +{ +} + + +Id::Id(const char* id) : Entity(entity_t::id), type(value_t::string), int_id(0), string_id(id) +{ +} + + +Id::Id(const std::string& id) : Id(id.c_str()) +{ +} + + +Id::Id(const Json& json_id) : Entity(entity_t::id), type(value_t::null) +{ + parse_json(json_id); +} + + +void Id::parse_json(const Json& json) +{ + if (json.is_null()) + { + type = value_t::null; + } + else if (json.is_number_integer()) + { + int_id = json.get(); + type = value_t::integer; + } + else if (json.is_string()) + { + string_id = json.get(); + type = value_t::string; + } + else + throw std::invalid_argument("id must be integer, string or null"); +} + + +Json Id::to_json() const +{ + if (type == value_t::null) + return nullptr; + else if (type == value_t::string) + return string_id; + else if (type == value_t::integer) + return int_id; + + return nullptr; +} + + + + + +//////////////////////// Error implementation ///////////////////////////////// + +Parameter::Parameter(std::nullptr_t) : NullableEntity(entity_t::id, nullptr), type(value_t::null) +{ +} + + +Parameter::Parameter(const Json& json) : NullableEntity(entity_t::id), type(value_t::null) +{ + if (json != nullptr) + parse_json(json); +} + + +Parameter::Parameter(const std::string& key1, const Json& value1, + const std::string& key2, const Json& value2, + const std::string& key3, const Json& value3, + const std::string& key4, const Json& value4) : NullableEntity(entity_t::id), type(value_t::map) +{ + param_map[key1] = value1; + if (!key2.empty()) + param_map[key2] = value2; + if (!key3.empty()) + param_map[key3] = value3; + if (!key4.empty()) + param_map[key4] = value4; +} + + +void Parameter::parse_json(const Json& json) +{ + if (json.is_array()) + { + param_array = json.get>(); + param_map.clear(); + type = value_t::array; + } + else + { + param_map = json.get>(); + param_array.clear(); + type = value_t::map; + } +} + + +Json Parameter::to_json() const +{ + if (type == value_t::array) + return param_array; + else if (type == value_t::map) + return param_map; + else + return nullptr; +} + + +bool Parameter::is_array() const +{ + return type == value_t::array; +} + + +bool Parameter::is_map() const +{ + return type == value_t::map; +} + + +bool Parameter::is_null() const +{ + return isNull; +} + + +bool Parameter::has(const std::string& key) const +{ + if (type != value_t::map) + return false; + return (param_map.find(key) != param_map.end()); +} + + +Json Parameter::get(const std::string& key) const +{ + return param_map.at(key); +} + + +bool Parameter::has(size_t idx) const +{ + if (type != value_t::array) + return false; + return (param_array.size() > idx); +} + + +Json Parameter::get(size_t idx) const +{ + return param_array.at(idx); +} + + + + + +//////////////////////// Error implementation ///////////////////////////////// + +Error::Error(const Json& json) : Error("Internal error", -32603, nullptr) +{ + if (json != nullptr) + parse_json(json); +} + + +Error::Error(std::nullptr_t) : NullableEntity(entity_t::error, nullptr), code(0), message(""), data(nullptr) +{ +} + + +Error::Error(const std::string& message, int code, const Json& data) : NullableEntity(entity_t::error), code(code), message(message), data(data) +{ +} + + +void Error::parse_json(const Json& json) +{ + try + { + if (json.count("code") == 0) + throw RpcException("code is missing"); + code = json["code"]; + if (json.count("message") == 0) + throw RpcException("message is missing"); + message = json["message"]; + if (json.count("data")) + data = json["data"]; + else + data = nullptr; + } + catch (const RpcException& e) + { + throw; + } + catch (const exception& e) + { + throw RpcException(e.what()); + } +} + + +Json Error::to_json() const +{ + Json j = { + {"code", code}, + {"message", message}, + }; + + if (!data.is_null()) + j["data"] = data; + return j; +} + + + + + +////////////////////// Request implementation ///////////////////////////////// + +Request::Request(const Json& json) : Entity(entity_t::request), method(""), id() +{ + if (json != nullptr) + parse_json(json); +} + + +Request::Request(const Id& id, const std::string& method, const Parameter& params) : Entity(entity_t::request), method(method), params(params), id(id) +{ +} + + +void Request::parse_json(const Json& json) +{ + try + { + if (json.count("id") == 0) + throw InvalidRequestException("id is missing"); + + try + { + id = Id(json["id"]); + } + catch(const std::exception& e) + { + throw InvalidRequestException(e.what()); + } + + if (json.count("jsonrpc") == 0) + throw InvalidRequestException("jsonrpc is missing", id); + string jsonrpc = json["jsonrpc"].get(); + if (jsonrpc != "2.0") + throw InvalidRequestException("invalid jsonrpc value: " + jsonrpc, id); + + if (json.count("method") == 0) + throw InvalidRequestException("method is missing", id); + if (!json["method"].is_string()) + throw InvalidRequestException("method must be a string value", id); + method = json["method"]; + if (method.empty()) + throw InvalidRequestException("method must not be empty", id); + + if (json.count("params")) + params.parse_json(json["params"]); + else + params = nullptr; + } + catch (const RequestException& e) + { + throw; + } + catch (const exception& e) + { + throw InternalErrorException(e.what(), id); + } +} + + +Json Request::to_json() const +{ + Json json = { + {"jsonrpc", "2.0"}, + {"method", method}, + {"id", id.to_json()} + }; + + if (params) + json["params"] = params.to_json(); + + return json; +} + + + +RpcException::RpcException(const char* text) +{ + text_ = new char[std::strlen(text) + 1]; + std::strcpy(text_, text); +} + +RpcException::RpcException(const std::string& text) : RpcException(text.c_str()) +{ +} + +RpcException::RpcException(const RpcException& e) : RpcException(e.what()) +{ +} + +RpcException::~RpcException() throw() +{ + delete[] text_; +} + +const char* RpcException::what() const noexcept +{ + return text_; +} + + + + +ParseErrorException::ParseErrorException(const Error& error) : RpcException(error.message), Entity(entity_t::exception), error(error) +{ +} + +ParseErrorException::ParseErrorException(const ParseErrorException& e) : RpcException(e.what()), Entity(entity_t::exception), error(e.error) +{ +} + +ParseErrorException::ParseErrorException(const std::string& data) : ParseErrorException(Error("Parse error", -32700, data)) +{ +} + +Json ParseErrorException::to_json() const +{ + Json response = { + {"jsonrpc", "2.0"}, + {"error", error.to_json()}, + {"id", nullptr} + }; + + return response; +} + +void ParseErrorException::parse_json(const Json& json) +{ +} + + + + +RequestException::RequestException(const Error& error, const Id& requestId) : RpcException(error.message), Entity(entity_t::exception), error(error), id(requestId) +{ +} + +RequestException::RequestException(const RequestException& e) : RpcException(e.what()), Entity(entity_t::exception), error(e.error), id(e.id) +{ +} + +Json RequestException::to_json() const +{ + Json response = { + {"jsonrpc", "2.0"}, + {"error", error.to_json()}, + {"id", id.to_json()} + }; + + return response; +} + +void RequestException::parse_json(const Json& json) +{ +} + + + + + +InvalidRequestException::InvalidRequestException(const Id& requestId) : RequestException(Error("Invalid request", -32600), requestId) +{ +} + +InvalidRequestException::InvalidRequestException(const Request& request) : InvalidRequestException(request.id) +{ +} + +InvalidRequestException::InvalidRequestException(const char* data, const Id& requestId) : RequestException(Error("Invalid request", -32600, data), requestId) +{ +} + +InvalidRequestException::InvalidRequestException(const std::string& data, const Id& requestId) : InvalidRequestException(data.c_str(), requestId) +{ +} + + + +MethodNotFoundException::MethodNotFoundException(const Id& requestId) : RequestException(Error("Method not found", -32601), requestId) +{ +} + +MethodNotFoundException::MethodNotFoundException(const Request& request) : MethodNotFoundException(request.id) +{ +} + +MethodNotFoundException::MethodNotFoundException(const char* data, const Id& requestId) : RequestException(Error("Method not found", -32601, data), requestId) +{ +} + +MethodNotFoundException::MethodNotFoundException(const std::string& data, const Id& requestId) : MethodNotFoundException(data.c_str(), requestId) +{ +} + + + +InvalidParamsException::InvalidParamsException(const Id& requestId) : RequestException(Error("Invalid params", -32602), requestId) +{ +} + +InvalidParamsException::InvalidParamsException(const Request& request) : InvalidParamsException(request.id) +{ +} + +InvalidParamsException::InvalidParamsException(const char* data, const Id& requestId) : RequestException(Error("Invalid params", -32602, data), requestId) +{ +} + +InvalidParamsException::InvalidParamsException(const std::string& data, const Id& requestId) : InvalidParamsException(data.c_str(), requestId) +{ +} + + + +InternalErrorException::InternalErrorException(const Id& requestId) : RequestException(Error("Internal error", -32603), requestId) +{ +} + +InternalErrorException::InternalErrorException(const Request& request) : InternalErrorException(request.id) +{ +} + +InternalErrorException::InternalErrorException(const char* data, const Id& requestId) : RequestException(Error("Internal error", -32603, data), requestId) +{ +} + +InternalErrorException::InternalErrorException(const std::string& data, const Id& requestId) : InternalErrorException(data.c_str(), requestId) +{ +} + + + +///////////////////// Response implementation ///////////////////////////////// + +Response::Response(const Json& json) : Entity(entity_t::response) +{ + if (json != nullptr) + parse_json(json); +} + + +Response::Response(const Id& id, const Json& result) : Entity(entity_t::response), id(id), result(result), error(nullptr) +{ +} + + +Response::Response(const Id& id, const Error& error) : Entity(entity_t::response), id(id), result(), error(error) +{ +} + + +Response::Response(const Request& request, const Json& result) : Response(request.id, result) +{ +} + + +Response::Response(const Request& request, const Error& error) : Response(request.id, error) +{ +} + + +Response::Response(const RequestException& exception) : Response(exception.id, exception.error) +{ +} + + +void Response::parse_json(const Json& json) +{ + try + { + error = nullptr; + result = nullptr; + if (json.count("jsonrpc") == 0) + throw RpcException("jsonrpc is missing"); + string jsonrpc = json["jsonrpc"].get(); + if (jsonrpc != "2.0") + throw RpcException("invalid jsonrpc value: " + jsonrpc); + if (json.count("id") == 0) + throw RpcException("id is missing"); + id = Id(json["id"]); + if (json.count("result")) + result = json["result"]; + else if (json.count("error")) + error.parse_json(json["error"]); + else + throw RpcException("response must contain result or error"); + } + catch (const RpcException& e) + { + throw; + } + catch (const exception& e) + { + throw RpcException(e.what()); + } +} + + +Json Response::to_json() const +{ + Json j = { + {"jsonrpc", "2.0"}, + {"id", id.to_json()}, + }; + + if (error) + j["error"] = error.to_json(); + else + j["result"] = result; + + return j; +} + + + + + +///////////////// Notification implementation ///////////////////////////////// + +Notification::Notification(const Json& json) : Entity(entity_t::notification) +{ + if (json != nullptr) + parse_json(json); +} + + +Notification::Notification(const char* method, const Parameter& params) : Entity(entity_t::notification), method(method), params(params) +{ +} + + +Notification::Notification(const std::string& method, const Parameter& params) : Notification(method.c_str(), params) +{ +} + + +void Notification::parse_json(const Json& json) +{ + try + { + if (json.count("jsonrpc") == 0) + throw RpcException("jsonrpc is missing"); + string jsonrpc = json["jsonrpc"].get(); + if (jsonrpc != "2.0") + throw RpcException("invalid jsonrpc value: " + jsonrpc); + + if (json.count("method") == 0) + throw RpcException("method is missing"); + if (!json["method"].is_string()) + throw RpcException("method must be a string value"); + method = json["method"]; + if (method.empty()) + throw RpcException("method must not be empty"); + + if (json.count("params")) + params.parse_json(json["params"]); + else + params = nullptr; + } + catch (const RpcException& e) + { + throw; + } + catch (const exception& e) + { + throw RpcException(e.what()); + } +} + + +Json Notification::to_json() const +{ + Json json = { + {"jsonrpc", "2.0"}, + {"method", method}, + }; + + if (params) + json["params"] = params.to_json(); + + return json; +} + + + + + +//////////////////////// Batch implementation ///////////////////////////////// + +Batch::Batch(const Json& json) : Entity(entity_t::batch) +{ + if (json != nullptr) + parse_json(json); +} + + +void Batch::parse_json(const Json& json) +{ +// cout << "Batch::parse: " << json.dump() << "\n"; + entities.clear(); + for (auto it = json.begin(); it != json.end(); ++it) + { +// cout << "x: " << it->dump() << "\n"; + entity_ptr entity(nullptr); + try + { + entity = Parser::do_parse_json(*it); + if (!entity) + entity = make_shared("Invalid Request", -32600); + } + catch(const RequestException& e) + { + entity = make_shared(e); + } + catch(const std::exception& e) + { + entity = make_shared(e.what(), -32600); + } + entities.push_back(entity); + } + if (entities.empty()) + throw InvalidRequestException(); +} + + +Json Batch::to_json() const +{ + Json result; + for (const auto& j: entities) + result.push_back(j->to_json()); + return result; +} + + +/*void Batch::add(const entity_ptr entity) +{ + entities.push_back(entity); +} +*/ + + + + +//////////////////////// Parser implementation //////////////////////////////// + +Parser::Parser() +{ + +} + + +Parser::~Parser() +{ + +} + + +void Parser::register_notification_callback(const std::string& notification, notification_callback callback) +{ + if (callback) + notification_callbacks_[notification] = callback; +} + + +void Parser::register_request_callback(const std::string& request, request_callback callback) +{ + if (callback) + request_callbacks_[request] = callback; +} + + +entity_ptr Parser::parse(const std::string& json_str) +{ + //std::cout << "parse: " << json_str << "\n"; + entity_ptr entity = do_parse(json_str); + if (entity && entity->is_notification()) + { + notification_ptr notification = dynamic_pointer_cast(entity); + if (notification_callbacks_.find(notification->method) != notification_callbacks_.end()) + { + notification_callback callback = notification_callbacks_[notification->method]; + if (callback) + callback(notification->params); + } + } + else if (entity && entity->is_request()) + { + request_ptr request = dynamic_pointer_cast(entity); + if (request_callbacks_.find(request->method) != request_callbacks_.end()) + { + request_callback callback = request_callbacks_[request->method]; + if (callback) + { + jsonrpcpp::response_ptr response = callback(request->id, request->params); + if (response) + return response; + } + } + } + return entity; +} + + +entity_ptr Parser::parse_json(const Json& json) +{ + return do_parse_json(json); +} + + +entity_ptr Parser::do_parse(const std::string& json_str) +{ + try + { + return do_parse_json(Json::parse(json_str)); + } + catch (const RpcException& e) + { + throw; + } + catch (const exception& e) + { + throw ParseErrorException(e.what()); + } + + return nullptr; +} + + +entity_ptr Parser::do_parse_json(const Json& json) +{ + try + { + if (is_request(json)) + return make_shared(json); + else if (is_notification(json)) + return make_shared(json); + else if (is_response(json)) + return make_shared(json); + else if (is_batch(json)) + return make_shared(json); + } + catch (const RpcException& e) + { + throw; + } + catch (const exception& e) + { + throw RpcException(e.what()); + } + + return nullptr; +} + + +bool Parser::is_request(const std::string& json_str) +{ + try + { + return is_request(Json::parse(json_str)); + } + catch (const exception& e) + { + return false; + } +} + + +bool Parser::is_request(const Json& json) +{ + return (json.count("method") && json.count("id")); +} + + +bool Parser::is_notification(const std::string& json_str) +{ + try + { + return is_notification(Json::parse(json_str)); + } + catch (const exception& e) + { + return false; + } +} + + +bool Parser:: is_notification(const Json& json) +{ + return (json.count("method") && (json.count("id") == 0)); +} + + +bool Parser::is_response(const std::string& json_str) +{ + try + { + return is_response(Json::parse(json_str)); + } + catch (const exception& e) + { + return false; + } +} + + +bool Parser::is_response(const Json& json) +{ + return (json.count("result") && json.count("id")); +} + + +bool Parser::is_batch(const std::string& json_str) +{ + try + { + return is_batch(Json::parse(json_str)); + } + catch (const exception& e) + { + return false; + } +} + + +bool Parser::is_batch(const Json& json) +{ + return (json.is_array()); +} + + + +} + + diff --git a/3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.hpp b/3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.hpp new file mode 100644 index 00000000..cdda1d3c --- /dev/null +++ b/3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.hpp @@ -0,0 +1,461 @@ +/*** + __ ____ __ __ _ ____ ____ ___ _ _ + _( )/ ___) / \ ( ( \( _ \( _ \ / __)( ) ( ) + / \) \\___ \( O )/ / ) / ) __/( (__(_ _)(_ _) + \____/(____/ \__/ \_)__)(__\_)(__) \___)(_) (_) + version 1.1.1 + https://github.com/badaix/jsonrpcpp + + This file is part of jsonrpc++ + Copyright (C) 2017 Johannes Pohl + + This software may be modified and distributed under the terms + of the MIT license. See the LICENSE file for details. +***/ + +/// http://patorjk.com/software/taag/#p=display&f=Graceful&t=JSONRPC%2B%2B + +#ifndef JSON_RPC_H +#define JSON_RPC_H + +#include +#include +#include +#include +#include "json.hpp" + + +using Json = nlohmann::json; + +namespace jsonrpcpp +{ + + +class Entity; +class Request; +class Notification; +class Parameter; +class Response; +class Error; +class Batch; + + +typedef std::shared_ptr entity_ptr; +typedef std::shared_ptr request_ptr; +typedef std::shared_ptr notification_ptr; +typedef std::shared_ptr parameter_ptr; +typedef std::shared_ptr response_ptr; +typedef std::shared_ptr error_ptr; +typedef std::shared_ptr batch_ptr; + + + +class Entity +{ +public: + enum class entity_t : uint8_t + { + unknown, + exception, + id, + error, + response, + request, + notification, + batch + }; + + Entity(entity_t type); + virtual ~Entity(); + + bool is_exception(); + bool is_id(); + bool is_error(); + bool is_response(); + bool is_request(); + bool is_notification(); + bool is_batch(); + + virtual std::string type_str() const; + + virtual Json to_json() const = 0; + virtual void parse_json(const Json& json) = 0; + + virtual void parse(const std::string& json_str); + virtual void parse(const char* json_str); + +protected: + entity_t entity; +}; + + + + + +class NullableEntity : public Entity +{ +public: + NullableEntity(entity_t type); + NullableEntity(entity_t type, std::nullptr_t); + virtual ~NullableEntity(); +#ifdef _MSC_VER + virtual operator bool() const +#else + virtual explicit operator bool() const +#endif + { + return !isNull; + } + +protected: + bool isNull; +}; + + + + + +class Id : public Entity +{ +public: + enum class value_t : uint8_t + { + null, + string, + integer + }; + + Id(); + Id(int id); + Id(const char* id); + Id(const std::string& id); + Id(const Json& json_id); + + virtual Json to_json() const; + virtual void parse_json(const Json& json); + + friend std::ostream& operator<< (std::ostream &out, const Id &id) + { + out << id.to_json(); + return out; + } + + value_t type; + int int_id; + std::string string_id; +}; + + + + + +class Parameter : public NullableEntity +{ +public: + enum class value_t : uint8_t + { + null, + array, + map + }; + + Parameter(std::nullptr_t); + Parameter(const Json& json = nullptr); + Parameter(const std::string& key1, const Json& value1, + const std::string& key2 = "", const Json& value2 = nullptr, + const std::string& key3 = "", const Json& value3 = nullptr, + const std::string& key4 = "", const Json& value4 = nullptr); + + virtual Json to_json() const; + virtual void parse_json(const Json& json); + + bool is_array() const; + bool is_map() const; + bool is_null() const; + + Json get(const std::string& key) const; + Json get(size_t idx) const; + bool has(const std::string& key) const; + bool has(size_t idx) const; + + template + T get(const std::string& key) const + { + return get(key).get(); + } + + template + T get(size_t idx) const + { + return get(idx).get(); + } + + template + T get(const std::string& key, const T& default_value) const + { + if (!has(key)) + return default_value; + else + return get(key); + } + + template + T get(size_t idx, const T& default_value) const + { + if (!has(idx)) + return default_value; + else + return get(idx); + } + + value_t type; + std::vector param_array; + std::map param_map; +}; + + + + + +class Error : public NullableEntity +{ +public: + Error(const Json& json = nullptr); + Error(std::nullptr_t); + Error(const std::string& message, int code, const Json& data = nullptr); + + virtual Json to_json() const; + virtual void parse_json(const Json& json); + + int code; + std::string message; + Json data; +}; + + + +/// JSON-RPC 2.0 request +/** + * Simple jsonrpc 2.0 parser with getters + * Currently no named parameters are supported, but only array parameters + */ +class Request : public Entity +{ +public: + Request(const Json& json = nullptr); + Request(const Id& id, const std::string& method, const Parameter& params = nullptr); + + virtual Json to_json() const; + virtual void parse_json(const Json& json); + + std::string method; + Parameter params; + Id id; +}; + + + + + +class RpcException : public std::exception +{ + char* text_; +public: + RpcException(const char* text); + RpcException(const std::string& text); + RpcException(const RpcException& e); + + virtual ~RpcException() throw(); + virtual const char* what() const noexcept; +}; + + + + + +class ParseErrorException : public RpcException, public Entity +{ +public: + Error error; + + ParseErrorException(const Error& error); + ParseErrorException(const ParseErrorException& e); + ParseErrorException(const std::string& data); + virtual Json to_json() const; + +protected: + virtual void parse_json(const Json& json); +}; + + + +// -32600 Invalid Request The JSON sent is not a valid Request object. +// -32601 Method not found The method does not exist / is not available. +// -32602 Invalid params Invalid method parameter(s). +// -32603 Internal error Internal JSON-RPC error. + +class RequestException : public RpcException, public Entity +{ +public: + Error error; + Id id; + + RequestException(const Error& error, const Id& requestId = Id()); + RequestException(const RequestException& e); + virtual Json to_json() const; + +protected: + virtual void parse_json(const Json& json); +}; + + + +class InvalidRequestException : public RequestException +{ +public: + InvalidRequestException(const Id& requestId = Id()); + InvalidRequestException(const Request& request); + InvalidRequestException(const char* data, const Id& requestId = Id()); + InvalidRequestException(const std::string& data, const Id& requestId = Id()); +}; + + + +class MethodNotFoundException : public RequestException +{ +public: + MethodNotFoundException(const Id& requestId = Id()); + MethodNotFoundException(const Request& request); + MethodNotFoundException(const char* data, const Id& requestId = Id()); + MethodNotFoundException(const std::string& data, const Id& requestId = Id()); +}; + + + +class InvalidParamsException : public RequestException +{ +public: + InvalidParamsException(const Id& requestId = Id()); + InvalidParamsException(const Request& request); + InvalidParamsException(const char* data, const Id& requestId = Id()); + InvalidParamsException(const std::string& data, const Id& requestId = Id()); +}; + + + +class InternalErrorException : public RequestException +{ +public: + InternalErrorException(const Id& requestId = Id()); + InternalErrorException(const Request& request); + InternalErrorException(const char* data, const Id& requestId = Id()); + InternalErrorException(const std::string& data, const Id& requestId = Id()); +}; + + + + + +class Response : public Entity +{ +public: + Id id; + Json result; + Error error; + + Response(const Json& json = nullptr); + Response(const Id& id, const Json& result); + Response(const Id& id, const Error& error); + Response(const Request& request, const Json& result); + Response(const Request& request, const Error& error); + Response(const RequestException& exception); + + virtual Json to_json() const; + virtual void parse_json(const Json& json); +}; + + + + + +class Notification : public Entity +{ +public: + std::string method; + Parameter params; + Notification(const Json& json = nullptr); + Notification(const char* method, const Parameter& params = nullptr); + Notification(const std::string& method, const Parameter& params); + + virtual Json to_json() const; + virtual void parse_json(const Json& json); +}; + + + + +typedef std::function notification_callback; +typedef std::function request_callback; + + +class Parser +{ +public: + Parser(); + virtual ~Parser(); + + entity_ptr parse(const std::string& json_str); + entity_ptr parse_json(const Json& json); + + void register_notification_callback(const std::string& notification, notification_callback callback); + void register_request_callback(const std::string& request, request_callback callback); + + static entity_ptr do_parse(const std::string& json_str); + static entity_ptr do_parse_json(const Json& json); + static bool is_request(const std::string& json_str); + static bool is_request(const Json& json); + static bool is_notification(const std::string& json_str); + static bool is_notification(const Json& json); + static bool is_response(const std::string& json_str); + static bool is_response(const Json& json); + static bool is_batch(const std::string& json_str); + static bool is_batch(const Json& json); + +private: + std::map notification_callbacks_; + std::map request_callbacks_; +}; + + + + + +class Batch : public Entity +{ +public: + std::vector entities; + + Batch(const Json& json = nullptr); + + virtual Json to_json() const; + virtual void parse_json(const Json& json); + + template + void add(const T& entity) + { + entities.push_back(std::make_shared(entity)); + } + + void add_ptr(const entity_ptr& entity) + { + entities.push_back(entity); + } +}; + + + +} //namespace jsonrpc + + + +#endif diff --git a/3rd_party/libhttpserver-0.18.2/.github/ISSUE_TEMPLATE/bug_report.md b/3rd_party/libhttpserver-0.18.2/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..c121c157 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,56 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG] Title" +labels: bug +assignees: etr + +--- + + + +### Prerequisites + +* [ ] Put an X between the brackets on this line if you have checked that your issue isn't already filed: https://github.com/search?l=&q=repo%3Aetr%2Flibhttpserver&type=Issues + +### Description + +[Description of the issue] + +### Steps to Reproduce + +1. [First Step] +2. [Second Step] +3. [and so on...] + +**Expected behavior:** [What you expect to happen] + +**Actual behavior:** [What actually happens] + +**Reproduces how often:** [What percentage of the time does it reproduce?] + +### Versions + +* OS version (if on linux, the output of "uname -a") +* libhttpserver version (please specify whether compiled or packaged) +* libmicrohttpd version (please specify whether compiled or packaged) + +If you have problems during build: +* Compiler version +* autotools version + +### Additional Information + +Any additional information, configuration (especially build configuration flags if you compiled the libraries) or data that might be necessary to reproduce the issue. + +If you have problems during build, please attach your config.log and the full scope of your error from make. + +If you have problems at execution, please: +* attach the stacktrace in case of crash (a coredump would be even better). +* provide a main that reproduces the error. diff --git a/3rd_party/libhttpserver-0.18.2/.github/ISSUE_TEMPLATE/feature_request.md b/3rd_party/libhttpserver-0.18.2/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..a9833cf0 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,23 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: feature-request +assignees: etr + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe why the feature or enhancement you are proposing fits the library.** +A clear and concise explanation of the reason it fits into the library's mission. + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/bug_fix.md b/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/bug_fix.md new file mode 100644 index 00000000..edcbbff7 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/bug_fix.md @@ -0,0 +1,59 @@ +### Requirements for Contributing a Bug Fix + +* Fill out the template below. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. +* The pull request must only fix an existing bug. To contribute other changes, you must use a different template. You can see all templates at https://github.com/etr/libhttpserver/tree/master/.github/PULL_REQUEST_TEMPLATE. +* The pull request must update the test suite to demonstrate the changed functionality. +* After you create the pull request, all status checks must be pass before a maintainer reviews your contribution. For more details, please see https://github.com/etr/libhttpserver/tree/master/CONTRIBUTING.md#pull-requests. + +### Identify the Bug + + + +### Description of the Change + + + +### Alternate Designs + + + +### Possible Drawbacks + + + +### Verification Process + + + +### Release Notes + + diff --git a/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/documentation.md b/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/documentation.md new file mode 100644 index 00000000..2fc5a29e --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/documentation.md @@ -0,0 +1,30 @@ +### Requirements for Contributing Documentation + +* Fill out the template below. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. +* The pull request must only contribute documentation (for example, markdown files or API docs). To contribute other changes, you must use a different template. You can see all templates at https://github.com/etr/libhttpserver/tree/master/.github/PULL_REQUEST_TEMPLATE. + +### Description of the Change + + + +### Release Notes + + diff --git a/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/feature_change.md b/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/feature_change.md new file mode 100644 index 00000000..826d72cc --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/feature_change.md @@ -0,0 +1,62 @@ +### Requirements for Adding, Changing, or Removing a Feature + +* Fill out the template below. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. +* The pull request must contribute a change that has been endorsed by the maintainer team. See details in the template below. +* The pull request must update the test suite to exercise the updated functionality. +* After you create the pull request, all status checks must be pass before a maintainer reviews your contribution. For more details, please see https://github.com/etr/libhttpserver/tree/master/CONTRIBUTING.md#pull-requests. + +### Issue or RFC Endorsed by Maintainers + + + +### Description of the Change + + + +### Alternate Designs + + + +### Possible Drawbacks + + + +### Verification Process + + + +### Release Notes + + diff --git a/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/performance_improvement.md b/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/performance_improvement.md new file mode 100644 index 00000000..82ea175f --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/.github/PULL_REQUEST_TEMPLATE/performance_improvement.md @@ -0,0 +1,55 @@ +### Requirements for Contributing a Performance Improvement + +* Fill out the template below. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. +* The pull request must only affect performance of existing functionality. To contribute other changes, you must use a different template. You can see all templates at https://github.com/etr/libhttpserver/tree/master/.github/PULL_REQUEST_TEMPLATE. +* After you create the pull request, all status checks must be pass before a maintainer reviews your contribution. For more details, please see https://github.com/etr/libhttpserver/tree/master/CONTRIBUTING.md#pull-requests. + +### Description of the Change + + + +### Quantitative Performance Benefits + + + +### Possible Drawbacks + + + +### Verification Process + + + +### Applicable Issues + + + +### Release Notes + + diff --git a/3rd_party/libhttpserver-0.18.2/.github/workflows/codeql-analysis.yml b/3rd_party/libhttpserver-0.18.2/.github/workflows/codeql-analysis.yml new file mode 100644 index 00000000..fb1041db --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/.github/workflows/codeql-analysis.yml @@ -0,0 +1,73 @@ +name: "CodeQL" + +on: + push: + branches: [master] + pull_request: + # The branches below must be a subset of the branches above + branches: [master] + schedule: + - cron: '0 4 * * 4' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + # Override automatic language detection by changing the below list + # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] + language: ['cpp'] + # Learn more... + # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 + + # If this run was triggered by a pull request event, then checkout + # the head of the pull request instead of the merge commit. + - run: git checkout HEAD^2 + if: ${{ github.event_name == 'pull_request' }} + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + #- name: Autobuild + # uses: github/codeql-action/autobuild@v1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + - name: Install libmicrohttpd dependency + run: | + curl https://s3.amazonaws.com/libhttpserver/libmicrohttpd_releases/libmicrohttpd-0.9.59.tar.gz -o libmicrohttpd-0.9.59.tar.gz ; + tar -xzf libmicrohttpd-0.9.59.tar.gz ; + cd libmicrohttpd-0.9.59 ; + ./configure --disable-examples ; + make ; + sudo make install ; + + - name: Manual steps to build the library + run: | + ./bootstrap ; + ./configure --enable-same-directory-build; + make ; + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/3rd_party/libhttpserver-0.18.2/.gitignore b/3rd_party/libhttpserver-0.18.2/.gitignore new file mode 100644 index 00000000..72c98a64 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/.gitignore @@ -0,0 +1,59 @@ +*.sw* +*.*~ +*.in +*.php +*.pm +*.py +*_wrap.* +*.gcov +*.gcno +*.gcda +*.o +*.lo +*.la +.idea +libhttpserver.iml +build/* +aclocal.m4 +autom4te.cache/ +config.guess +config.sub +configure +depcomp +install-sh +ltmain.sh +m4/libtool.m4 +m4/ltoptions.m4 +m4/ltsugar.m4 +m4/ltversion.m4 +m4/lt~obsolete.m4 +missing +src/core +src/http_request_builder.cpp +src/httpserver/core +src/httpserver/http_request_builder.hpp +src/.deps/ +src/.libs/ +test/Test +test/core +test/err +test/test.txt +Makefile +src/Makefile +stamp-h1 +test-driver +test/.deps/ +test/Makefile +compile +config.h +config.log +config.status +debian/changelog +debian/control +debian/copyright +debian/libhttpserver-dev.install +debian/libhttpserver.install +debian/rules +redhat/libhttpserver.SPEC +libhttpserver.pc +libtool diff --git a/3rd_party/libhttpserver-0.18.2/.gitmodules b/3rd_party/libhttpserver-0.18.2/.gitmodules new file mode 100644 index 00000000..e69de29b diff --git a/3rd_party/libhttpserver-0.18.2/.travis.yml b/3rd_party/libhttpserver-0.18.2/.travis.yml new file mode 100644 index 00000000..5aa66c2e --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/.travis.yml @@ -0,0 +1,358 @@ +language: cpp +os: + - linux + - osx +compiler: + - gcc + - clang +env: + - DEBUG="debug" COVERAGE="coverage" + - DEBUG="nodebug" COVERAGE="nocoverage" + - LINKING="static" +before_install: + - eval "${MATRIX_EVAL}" + # Installing iwyu manually because clang and iwyu paths won't match on Ubuntu otherwise. + - if [ "$IWYU" = "iwyu" ]; then + CLANG_VERSION=`clang --version | grep version | cut -f3 -d' ' | cut -f1 -d'-'` ; + CLANG_PKG_VERSION=`echo $CLANG_VERSION | cut -f1,2 -d'.'` + CLANG_PREFIX_PATH="/usr/local/clang-${CLANG_VERSION}/lib/clang/${CLANG_VERSION}" ; + CLANG_BIN_PATH="/usr/local/clang-${CLANG_VERSION}/bin" ; + git clone https://github.com/include-what-you-use/include-what-you-use.git ; + cd include-what-you-use ; + echo "$CLANG_PKG_VERSION" | grep '\.[0-9]$' ; + if [ $? -eq 0 ]; then + git checkout clang_${CLANG_PKG_VERSION} ; + else + git checkout clang_${CLANG_PKG_VERSION}.0 ; + fi; + cd .. ; + mkdir build_iwyu ; + cd build_iwyu ; + cmake -G "Unix Makefiles" -DCMAKE_PREFIX_PATH=$CLANG_PREFIX_PATH -DCMAKE_C_COMPILER=$CLANG_BIN_PATH/clang -DCMAKE_CXX_COMPILER=$CLANG_BIN_PATH/clang++ ../include-what-you-use ; + make ; + sudo make install ; + cd .. ; + fi + - export LDFLAGS="$LDFLAGS -L/usr/local/lib -L/usr/lib" + - export PATH=$PATH:/usr/local/lib + - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib + - export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/usr/local/lib + - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get install info install-info; fi + - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo pip install codecov; fi + - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo pip install gcovr; fi + - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get install cppcheck; fi + - if [ "$TRAVIS_OS_NAME" = "osx" ]; then export CFLAGS='-mtune=generic'; fi + - if [ "$TRAVIS_OS_NAME" = "osx" ]; then export IPV6_TESTS_ENABLED="true"; fi + - curl https://s3.amazonaws.com/libhttpserver/libmicrohttpd_releases/libmicrohttpd-0.9.59.tar.gz -o libmicrohttpd-0.9.59.tar.gz + - tar -xzf libmicrohttpd-0.9.59.tar.gz + - cd libmicrohttpd-0.9.59 + - ./configure --disable-examples + - make + - sudo make install + - cd .. + - if [ "$BUILD_TYPE" = "asan" ]; then export CFLAGS='-fsanitize=address'; export CXXLAGS='-fsanitize=address'; export LDFLAGS='-fsanitize=address'; fi + - if [ "$BUILD_TYPE" = "msan" ]; then export CFLAGS='-fsanitize=memory'; export CXXLAGS='-fsanitize=memory'; export LDFLAGS='-fsanitize=memory'; fi + - if [ "$BUILD_TYPE" = "lsan" ]; then export CFLAGS='-fsanitize=leak'; export CXXLAGS='-fsanitize=leak'; export LDFLAGS='-fsanitize=leak'; fi + - if [ "$BUILD_TYPE" = "tsan" ]; then export CFLAGS='-fsanitize=thread'; export CXXLAGS='-fsanitize=thread'; export LDFLAGS='-fsanitize=thread'; fi + - if [ "$BUILD_TYPE" = "ubsan" ]; then export export CFLAGS='-fsanitize=undefined'; export CXXLAGS='-fsanitize=undefined'; export LDFLAGS='-fsanitize=undefined'; fi +install: + - ./bootstrap + - mkdir build + - cd build + - | + if [ "$LINKING" = "static" ]; then + ../configure --enable-static --disable-fastopen; + elif [ "$DEBUG" = "debug" ] && [ "$COVERAGE" = "coverage" ]; then + ../configure --enable-debug --enable-coverage --disable-shared --disable-fastopen; + elif [ "$DEBUG" = "debug" ]; then + ../configure --enable-debug --disable-shared --disable-fastopen; + elif [ "$VALGRIND" = "valgrind" ]; then + ../configure --enable-debug --disable-fastopen --disable-valgrind-helgrind --disable-valgrind-drd --disable-valgrind-sgcheck; + elif [ "$IWYU" = "iwyu" ]; then + ../configure --disable-examples; + else + ../configure --disable-fastopen; + fi + # Make or run iwyu. If running iwyu, check for the result code to be 2 (IWYU always returns an error code, if it is 2, no corrections are necessary). + - | + if [ "$IWYU" = "iwyu" ]; then + make -k CXX='/usr/local/bin/include-what-you-use -Xiwyu --mapping_file=${top_builddir}/../custom_iwyu.imp' CXXFLAGS="-isystem ${CLANG_PREFIX_PATH}/include -std=c++11 -DHTTPSERVER_COMPILATION -D_REENTRANT $CXXFLAGS" ; + if [ $? -ne 2 ]; then + return 1; + fi + else + make; + fi +script: + - if [ "$IWYU" != "iwyu" ]; then make check; cat test/test-suite.log; fi + - if [ "$VALGRIND" = "valgrind" ]; then make check-valgrind; fi; + - if [ "$VALGRIND" = "valgrind" ]; then cat test/test-suite-memcheck.log; fi; + - if [ "$TRAVIS_OS_NAME" = "linux" ]; then cd ../src/; cppcheck --error-exitcode=1 .; cd ../build; fi + - | + if [ "$PERFORMANCE" = "select" ]; then + cd examples + ./benchmark_select 8080 $(nproc) & + sleep 5 && ab -n 10000000 -c 100 localhost:8080/plaintext + fi + - | + if [ "$PERFORMANCE" = "nodelay" ]; then + cd examples + ./benchmark_nodelay 8080 $(nproc) & + sleep 5 && ab -n 10000000 -c 100 localhost:8080/plaintext + fi + - | + if [ "$PERFORMANCE" = "threads" ]; then + cd examples + ./benchmark_threads 8080 & + sleep 5 && ab -n 10000000 -c 100 localhost:8080/plaintext + fi +after_success: + - if [ "$DEBUG" = "debug" ] && [ "$COVERAGE" = "coverage" ] && [ "$TRAVIS_OS_NAME" = "linux" ]; then bash <(curl -s https://codecov.io/bash); fi +matrix: + exclude: + - compiler: clang + env: DEBUG="debug" COVERAGE="coverage" + include: + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.8 + packages: + - clang-3.8 + env: MATRIX_EVAL="BUILD_TYPE=asan && CC=clang-3.8 && CXX=clang++-3.8 && DEBUG=debug && COVERAGE=nocoverage" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.8 + packages: + - clang-3.8 + env: MATRIX_EVAL="BUILD_TYPE=msan && CC=clang-3.8 && CXX=clang++-3.8 && DEBUG=debug && COVERAGE=nocoverage" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.8 + packages: + - clang-3.8 + env: MATRIX_EVAL="BUILD_TYPE=lsan && CC=clang-3.8 && CXX=clang++-3.8 && DEBUG=debug && COVERAGE=nocoverage" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.8 + packages: + - clang-3.8 + env: MATRIX_EVAL="BUILD_TYPE=tsan && CC=clang-3.8 && CXX=clang++-3.8 && DEBUG=debug && COVERAGE=nocoverage" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.8 + packages: + - clang-3.8 + env: MATRIX_EVAL="BUILD_TYPE=ubsan && CC=clang-3.8 && CXX=clang++-3.8 && DEBUG=debug && COVERAGE=nocoverage" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-5 + env: + - MATRIX_EVAL="CC=gcc-5 && CXX=g++-5" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-6 + env: + - MATRIX_EVAL="CC=gcc-6 && CXX=g++-6" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-7 + env: + - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-8 + env: + - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-9 + env: + - MATRIX_EVAL="CC=gcc-9 && CXX=g++-9" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-7 + - valgrind + - valgrind-dbg + env: + - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7 && VALGRIND=valgrind" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-7 + - apache2-utils + env: + - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7 && PERFORMANCE=select" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-7 + - apache2-utils + env: + - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7 && PERFORMANCE=nodelay" + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-7 + - apache2-utils + env: + - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7 && PERFORMANCE=threads" + # works on Precise and Trusty + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.6 + packages: + - clang-3.6 + env: + - MATRIX_EVAL="CC=clang-3.6 && CXX=clang++-3.6" + # works on Precise and Trusty + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.7 + packages: + - clang-3.7 + env: + - MATRIX_EVAL="CC=clang-3.7 && CXX=clang++-3.7" + # works on Precise and Trusty + - os: linux + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.8 + packages: + - clang-3.8 + env: + - MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8" + # works on Trusty + - os: linux + addons: + apt: + sources: + - llvm-toolchain-trusty-3.9 + packages: + - clang-3.9 + env: + - MATRIX_EVAL="CC=clang-3.9 && CXX=clang++-3.9" + # works on Trusty + - os: linux + addons: + apt: + packages: + - clang-4.0 + env: + - MATRIX_EVAL="CC=clang-4.0 && CXX=clang++-4.0" + # works on Trusty + - os: linux + addons: + apt: + packages: + - clang-5.0 + env: + - MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0" + - os: linux + addons: + apt: + packages: + - clang-6.0 + env: + - MATRIX_EVAL="CC=clang-6.0 && CXX=clang++-6.0" + - os: linux + addons: + apt: + sources: + - llvm-toolchain-xenial-7 + - ubuntu-toolchain-r-test + packages: + - clang-7 + env: + - MATRIX_EVAL="CC=clang-7 && CXX=clang++-7" + - os: linux + addons: + apt: + sources: + - llvm-toolchain-xenial-8 + - ubuntu-toolchain-r-test + packages: + - clang-8 + env: + - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" + - os: linux + addons: + apt: + sources: + - llvm-toolchain-xenial-9 + - ubuntu-toolchain-r-test + - sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main' + key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key' + packages: + - clang-9 + env: + - MATRIX_EVAL="CC=clang-9 && CXX=clang++-9" + - os: linux + compiler: clang + addons: + apt: + sources: + - llvm-toolchain-xenial-7 + - ubuntu-toolchain-r-test + packages: + - iwyu + - cmake + - llvm-dev + - libclang-dev + env: + - MATRIX_EVAL="IWYU=iwyu" diff --git a/3rd_party/libhttpserver-0.18.2/AUTHORS b/3rd_party/libhttpserver-0.18.2/AUTHORS new file mode 100644 index 00000000..8f314bd1 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/AUTHORS @@ -0,0 +1,44 @@ +- Primary developer: +Sebastiano Merlino (maintainer) + +- Code contributions also came from: +Dario Mazza +Andrea Nicotra +Jeff Waller +Craig Minihan +Guo Xiao +Philipp Claßen +Vitaut Bajaryn +Felipe Zipitría +Steven 'Steve' Kendall +G. Mercat +Thomas Schätzlein + +- Support for building on MinGW/Cygwin systems +Shane Peelar +Dean M. Sands, III + +- Support for building on MaxOsX +Jan Klimke + +- Example of SSL usage and operator<< on http_request and http_response +Chris Love + +- Added proper error handling to tcp socket creation and binding +Marcel Pursche + +- Fixed error management and regex handling +Julian Picht + +- Fix string termination when loading files in memory +martamoreton (Github: https://github.com/martamoreton) + +- Memory leaks +rdiazmartin + +- Cleanup of multiple parts of the code +bcsgh (Github: https://github.com/bcsgh) + +- Management of large uploads +Walter Landry +Jagat diff --git a/3rd_party/libhttpserver-0.18.2/CODE_OF_CONDUCT.md b/3rd_party/libhttpserver-0.18.2/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..565a76c1 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at merlino.sebastiano@gmail.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/3rd_party/libhttpserver-0.18.2/CONTRIBUTING.md b/3rd_party/libhttpserver-0.18.2/CONTRIBUTING.md new file mode 100644 index 00000000..ee018af3 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/CONTRIBUTING.md @@ -0,0 +1,229 @@ +# Contributing to libhttpserver + +:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: + +The following is a set of guidelines for contributing to libhttpserver. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. + +#### Table Of Contents + +[Code of Conduct](#code-of-conduct) + +[I don't want to read this whole thing, I just have a question!!!](#i-dont-want-to-read-this-whole-thing-i-just-have-a-question) + +[How Can I Contribute?](#how-can-i-contribute) + * [Reporting Bugs](#reporting-bugs) + * [Suggesting Enhancements](#suggesting-enhancements) + * [Your First Code Contribution](#your-first-code-contribution) + * [Pull Requests](#pull-requests) + +[Styleguides](#styleguides) + * [Git Commit Messages](#git-commit-messages) + * [Documentation Styleguide](#documentation-styleguide) + +[Additional Notes](#additional-notes) + * [Issue and Pull Request Labels](#issue-and-pull-request-labels) + +## Code of Conduct + +This project and everyone participating in it is governed by the [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [merlino.sebastiano@gmail.com](mailto:merlino.sebastiano@gmail.com). + +## I don't want to read this whole thing I just have a question!!! + +> **Note:** Please don't file an issue to ask a question. You'll get faster results by using the resources below. + +We have an official community board where the community chimes in with helpful advice if you have questions. + +* [libhttpserver on Gitter](https://gitter.im/libhttpserver/community) + +## How Can I Contribute? + +### Reporting Bugs + +This section guides you through submitting a bug report for libhttpserver. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:. + +Before creating bug reports, please check [this list](#before-submitting-a-bug-report) as you might find out that you don't need to create one. When you are creating a bug report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](https://github.com/etr/libhttpserver/blob/master/.github/ISSUE_TEMPLATE/bug_report.md), the information it asks for helps us resolve issues faster. + +> **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. + +#### Before Submitting A Bug Report + +* **Try to debug the problem** You might be able to find the cause of the problem and fix things yourself. Most importantly, check if you can reproduce the problem in the latest version of libhttpserver (head on github). +* **Perform a [cursory search](https://github.com/search?l=&q=repo%3Aetr%2Flibhttpserver&type=Issues)** to see if the problem has already been reported. If it has **and the issue is still open**, add a comment to the existing issue instead of opening a new one. + +#### How Do I Submit A (Good) Bug Report? + +Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). After you followed the steps above, create an issue and provide the following information by filling in [the template](https://github.com/etr/libhttpserver/blob/master/.github/ISSUE_TEMPLATE/bug_report.md). + +Explain the problem and include additional details to help maintainers reproduce the problem: + +* **Use a clear and descriptive title** for the issue to identify the problem. +* **Describe the exact steps which reproduce the problem** in as many details as possible. When listing steps, **don't just say what you did, but explain how you did it**. +* **Provide specific examples to demonstrate the steps**. Include links to files or GitHub projects, or copy/pasteable snippets, which you use in those examples. If you're providing snippets in the issue, use [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines). +* **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior. +* **Explain which behavior you expected instead and why.** +* **If you're reporting a crash**, include a crash report with a stack trace from the operating system. Include these in the issue in a [code block](https://help.github.com/articles/markdown-basics/#multiple-lines), a [file attachment](https://help.github.com/articles/file-attachments-on-issues-and-pull-requests/), or put it in a [gist](https://gist.github.com/) and provide link to that gist. +* **Consider attaching a simple snipped reproducing the problem. ** +* **If the problem is related to performance or memory**, include a CPU profile capture with your report. + +Provide more context by answering these questions: + +* **Did the problem start happening recently** (e.g. after updating to a new version of libhttpserver) or was this always a problem? +* If the problem started happening recently, **can you reproduce the problem in an older version of libhttpserver?** What's the most recent version in which the problem doesn't happen? You can download older versions of libhttpserver from [the releases page](https://github.com/etr/libhttpserver/releases). +* **Can you reliably reproduce the issue?** If not, provide details about how often the problem happens and under which conditions it normally happens. + +Include details about your configuration and environment: + +* **Which version of libhttpserver are you using?** +* **What's the name and version of the OS you're using (e.g. "uname -a" on linux) **? +* **What's the version of libmicrohttpd that you have installed? ** +* **Have you installed the libraries (both libhttpserver and libmicrohttpd) manually or through package manager? ** +* **Which options did you use when compiling? ** +* **What compiler version and version of autotools did you use? ** + +### Feature Requests and Enhancements + +This section guides you through submitting an enhancement suggestion for libhttpserver, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion and find related suggestions. + +Before creating enhancement suggestions, please check [this list](#before-submitting-an-enhancement-suggestion) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion). Fill in [the template](https://github.com/etr/libhttpserver/blob/master/.github/ISSUE_TEMPLATE/feature_request.md). + +#### Before Submitting An Enhancement Suggestion or a Feature Request + +* **Perform a [cursory search](https://github.com/search?l=&q=repo%3Aetr%2Flibhttpserver&type=Issues)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. + +#### How Do I Submit A (Good) Feature Request / Enhancement Suggestion? + +Enhancement suggestions are tracked as [GitHub issues](https://guides.github.com/features/issues/). Create an issue on that repository and provide the following information: + +* **Use a clear and descriptive title** for the issue to identify the suggestion. +* **Provide a step-by-step description of the suggested enhancement** in as many details as possible. +* **Provide a specific example to demonstrate the new feature**. +* **Describe the current behavior** and **explain which behavior you expected instead** and why. +* **Describe which alternatives you have considered**. +* **Explain why this enhancement would be useful** to most users and **why it fits the mission of the library**. + +### Your First Code Contribution + +Unsure where to begin contributing to libhttpserver? You can start by looking through these `beginner` and `help-wanted` issues: + +* [Beginner issues][beginner] - issues which should only require a few lines of code, and a test or two. +* [Help wanted issues][help-wanted] - issues which should be a bit more involved than `beginner` issues. + +Both issue lists are sorted by total number of comments. While not perfect, number of comments is a reasonable proxy for impact a given change will have. + +### Pull Requests + +The process described here has several goals: + +- Maintain libhttpserver's quality +- Fix problems that are important to users +- Engage the community in working toward the best possible solution +- Enable a sustainable system for maintainers to review contributions + +Please follow these steps to have your contribution considered by the maintainers: + +1. Follow all instructions in [the template](https://github.com/etr/libhttpserver/blob/master/PULL_REQUEST_TEMPLATE.md) +2. Follow the [styleguides](#styleguides) +3. After you submit your pull request, verify that all [status checks](https://help.github.com/articles/about-status-checks/) are passing
What if the status checks are failing?If a status check is failing, and you believe that the failure is unrelated to your change, please leave a comment on the pull request explaining why you believe the failure is unrelated. A maintainer will re-run the status check for you. If we conclude that the failure was a false positive, then we will open an issue to track that problem with our status check suite.
+ +While the prerequisites above must be satisfied prior to having your pull request reviewed, the reviewer(s) may ask you to complete additional design work, tests, or other changes before your pull request can be ultimately accepted. + +## Styleguides + +### Git Commit Messages + +* Limit the first line to 80 characters or less. +* Add a concise description of what your change does. +* Reference issues and pull requests liberally after the first line. + +### Documentation Styleguide + +* Use [Markdown](https://daringfireball.net/projects/markdown). + +## Additional Notes + +### Issue and Pull Request Labels + +This section lists the labels we use to help us track and manage issues and pull requests. + +[GitHub search](https://help.github.com/articles/searching-issues/) makes it easy to use labels for finding groups of issues or pull requests you're interested in. We encourage you to read about [other search filters](https://help.github.com/articles/searching-issues/) which will help you write more focused queries. + +The labels are loosely grouped by their purpose, but it's not required that every issue have a label from every group or that an issue can't have more than one label from the same group. + +Please open an issue on `etr/libhttpserver` if you have suggestions for new labels. + +#### Type of Issue and Issue State + +| Label name | `etr/libhttpserver` :mag_right: | Description | +| --- | --- | --- | +| `feature-request` | [search][search-libhttpserver-repo-label-feature-request] | Feature requests or enhancements. | +| `bug` | [search][search-libhttpserver-repo-label-bug] | Confirmed bugs or reports that are very likely to be bugs. | +| `question` | [search][search-libhttpserver-repo-label-question] | Questions more than bug reports or feature requests (e.g. how do I do X). | +| `feedback` | [search][search-libhttpserver-repo-label-feedback] | General feedback more than bug reports or feature requests. | +| `help-wanted` | [search][search-libhttpserver-repo-label-help-wanted] | The maintainer would appreciate help from the community in resolving these issues. | +| `beginner` | [search][search-libhttpserver-repo-label-beginner] | Less complex issues which would be good first issues to work on for users who want to contribute to libhttpserver. | +| `more-information-needed` | [search][search-libhttpserver-repo-label-more-information-needed] | More information needs to be collected about these problems or feature requests (e.g. steps to reproduce). | +| `needs-reproduction` | [search][search-libhttpserver-repo-label-needs-reproduction] | Likely bugs, but haven't been reliably reproduced. | +| `blocked` | [search][search-libhttpserver-repo-label-blocked] | Issues blocked on other issues. | +| `duplicate` | [search][search-libhttpserver-repo-label-duplicate] | Issues which are duplicates of other issues, i.e. they have been reported before. | +| `wontfix` | [search][search-libhttpserver-repo-label-wontfix] | The maintainers have decided not to fix these issues for now, either because they're working as intended or for some other reason. | +| `invalid` | [search][search-libhttpserver-repo-label-invalid] | Issues which aren't valid (e.g. user errors). | + +#### Topic Categories + +| Label name | `etr/libhttpserver` :mag_right: | Description | +| --- | --- | --- | +| `windows` | [search][search-libhttpserver-repo-label-windows] | Related to Windows. | +| `linux` | [search][search-libhttpserver-repo-label-linux] | Related to Linux. | +| `mac` | [search][search-libhttpserver-repo-label-mac] | Related to macOS. | +| `travis` | [search][search-libhttpserver-repo-label-travis] | Related to travis and CI in general. | +| `tests` | [search][search-libhttpserver-repo-label-tests] | Related to tests (add tests, fix tests, etc...). | +| `documentation` | [search][search-libhttpserver-repo-label-documentation] | Related to any type of documentation. | +| `performance` | [search][search-libhttpserver-repo-label-performance] | Related to performance. | +| `security` | [search][search-libhttpserver-repo-label-security] | Related to security. | +| `api` | [search][search-libhttpserver-repo-label-api] | Related to libhttpserver's public APIs. | +| `git` | [search][search-libhttpserver-repo-label-git] | Related to Git functionality (e.g. problems with gitignore files or with showing the correct file status). | + +#### Pull Request Labels + +| Label name | `etr/libhttpserver` :mag_right: | Description | +| --- | --- | --- | +| `work-in-progress` | [search][search-libhttpserver-repo-label-work-in-progress] | Pull requests which are still being worked on, more changes will follow. | +| `needs-review` | [search][search-libhttpserver-repo-label-needs-review] | Pull requests which need code review, and approval from maintainers. | +| `under-review` | [search][search-libhttpserver-repo-label-under-review] | Pull requests being reviewed by maintainers. | +| `requires-changes` | [search][search-libhttpserver-repo-label-requires-changes] | Pull requests which need to be updated based on review comments and then reviewed again. | +| `needs-testing` | [search][search-libhttpserver-repo-label-needs-testing] | Pull requests which need manual testing. | + +[search-libhttpserver-repo-label-feature-request]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Afeature-request +[search-libhttpserver-repo-label-bug]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Abug +[search-libhttpserver-repo-label-question]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Aquestion +[search-libhttpserver-repo-label-feedback]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Afeedback +[search-libhttpserver-repo-label-help-wanted]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Ahelp-wanted +[search-libhttpserver-repo-label-beginner]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Abeginner +[search-libhttpserver-repo-label-more-information-needed]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Amore-information-needed +[search-libhttpserver-repo-label-needs-reproduction]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Aneeds-reproduction +[search-libhttpserver-repo-label-triage-help-needed]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Atriage-help-needed +[search-libhttpserver-repo-label-windows]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Awindows +[search-libhttpserver-repo-label-linux]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Alinux +[search-libhttpserver-repo-label-mac]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Amac +[search-libhttpserver-repo-label-travis]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Atravis +[search-libhttpserver-repo-label-tests]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Atests +[search-libhttpserver-repo-label-documentation]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Adocumentation +[search-libhttpserver-repo-label-performance]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Aperformance +[search-libhttpserver-repo-label-security]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Asecurity +[search-libhttpserver-repo-label-api]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Aapi +[search-libhttpserver-repo-label-git]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Agit +[search-libhttpserver-repo-label-blocked]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Ablocked +[search-libhttpserver-repo-label-duplicate]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Aduplicate +[search-libhttpserver-repo-label-wontfix]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Awontfix +[search-libhttpserver-repo-label-invalid]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Ainvalid +[search-libhttpserver-repo-label-build-error]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Abuild-error +[search-libhttpserver-repo-label-installer]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Ainstaller +[search-libhttpserver-repo-label-deprecation-help]: https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Aetr%23Flibhttpserver+label%3Adeprecation-help +[search-libhttpserver-repo-label-work-in-progress]: https://github.com/search?q=is%3Aopen+is%3Apr+repo%3Aetr%23Flibhttpserver+label%3Awork-in-progress +[search-libhttpserver-repo-label-needs-review]: https://github.com/search?q=is%3Aopen+is%3Apr+repo%3Aetr%23Flibhttpserver+label%3Aneeds-review +[search-libhttpserver-repo-label-under-review]: https://github.com/search?q=is%3Aopen+is%3Apr+repo%3Aetr%23Flibhttpserver+label%3Aunder-review +[search-libhttpserver-repo-label-requires-changes]: https://github.com/search?q=is%3Aopen+is%3Apr+repo%3Aetr%23Flibhttpserver+label%3Arequires-changes +[search-libhttpserver-repo-label-needs-testing]: https://github.com/search?q=is%3Aopen+is%3Apr+repo%3Aetr%23Flibhttpserver+label%3Aneeds-testing + +[beginner]:https://github.com/search?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+label%3Abeginner+label%3Ahelp-wanted+user%3Aetr+sort%3Acomments-desc +[help-wanted]:https://github.com/search?q=is%3Aopen+is%3Aissue+label%3Ahelp-wanted+user%3Aetr+sort%3Acomments-desc+-label%3Abeginner diff --git a/3rd_party/libhttpserver-0.18.2/COPYING.LESSER b/3rd_party/libhttpserver-0.18.2/COPYING.LESSER new file mode 100644 index 00000000..5ab7695a --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/COPYING.LESSER @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/3rd_party/libhttpserver-0.18.2/ChangeLog b/3rd_party/libhttpserver-0.18.2/ChangeLog new file mode 100644 index 00000000..72bbe973 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/ChangeLog @@ -0,0 +1,290 @@ +Sat Jun 6 10:21:05 2020 -0800 + Prevent use of regex in http_endpoint outside of registration which could + allow DOS attacks. + +Sat May 16 07:20:00 2020 -0800 + General performance improvements (reduced use of regex, lazy-building of + post-processor) + General code cleanup + General fixes to the documentation + Fixed support on FreeBSD (added missing headers) + Fixed support for Cygwin + Removed depedency on C regex - now using C++11 regex + +Sat Aug 10 18:34:07 2019 -0800 + Added support for TCP-NODELAY + Changed set_path on http_request to have lazy behavior + +Tue Aug 06 22:22:14 2019 -0800 + Added support for body parsing in DELETE requests. + Added support for PATCH method + +Sat Jan 27 21:59:11 2019 -0800 + libhttpserver now includes set of examples to demonstrate the main capabilities of the library + "examples" are now optionally disabled. + Adds valgrind memcheck to the build system on travis + Travis now tests performance with apache benchmark + Reduced the CPU time spent in normalizing URLs (thus saving ~15% on average per request). + All classes now implement move constructor and move assignment operator + The library now avoids collecting connection properties (headers, arguments, footers, cookies, etc...) unless explicitly asked by the client code. + +Sat Jan 12 00:51:00 2019 -0800 + Removed the support for integrated COMET logic. + Removed the support for caching logic. + Added integ tests. + Changed http_resource interface to use shared_ptr. + Improved interface of the http_response object. + Deprecated http_response_builder object. + +Thu Dec 26 10:00:30 2018 -0800 + Fixed IPV6 parsing logic. + Added tests to support IP parsing, URL parsing and utilities + +Thu Nov 22 20:58:00 2018 -0800 + Solved problem with the server not being able to start on mac os + +Sun Nov 04 19:28:00 2018 -0800 + Moved http_endpoint as a sub-class of webserver. This avoids usage of friends. + +Wed Feb 26 21:31:00 2017 +0000 + Fixed problem with segfault when copying http_response object + +Wed Feb 12 13:14:01 2017 +0000 + Updated to libmicrohttpd 0.9.52 + +Wed Jul 13 02:23:11 2016 +0100 + Fixed problems with large payloads + Fixed memory leak in http_response_ptr + +Tue Dec 29 18:56:31 2015 +0100 + Removed support for event supplier (badly defined, complicated and almost useless) + Eliminated custom selection logic (simplified overall code in webserver.cpp) + Changed comet to use a lock-free implementation + +Sun Dec 27 19:39:01 2015 +0100 + Removed POLL start configuration (THREAD now defaults to POLL or EPOLL on Linux) + Use TCP_FASTOPEN on linux >= 3.6 + +Sat Dec 26 15:08:22 2015 +0100 + Changed http_resource to use classic C++ polymorphism using virtual instead of CRTP + +Fri Jul 17 21:38:54 2015 +0000 + Removed build dependency on pkg-config + +Wed Apr 15 01:40:11 2015 +0000 + Support build on MacOsX + Improved support for CI on travis + Solved bug on event_supplier registering + Solved bug on standardize_url to avoid removing root + Change cycle_callback_ptr so that buffer can be modified + Moved to version 0.9.0 + +Sun Jul 23 02:46:20 2014 +0100 + Support for building on MinGW/Cygwin systems + min libmicrohttpd version moved to 0.9.37 + Moved to version 0.8.0 + +Sat Mar 23 15:22:40 2014 +0100 + Continue the cleanup reducing webserver.cpp responsibilities + Deep work on documentation + Moved to version 0.7.2 + +Sat Jan 25 16:31:03 2014 +0100 + Cleaned-up webserver.cpp code to extract secondary classes + Enforced immutability of webserver class + Enabled library to compile on g++ 4.1.2 + +Wed Oct 31 17:59:40 2012 +0100 + Added parameter in http_response to specify if it needs to be deleted by + WS - Sebastiano Merlino + +Wed Oct 31 14:23:57 2012 +0100 + Changed dependency download method - Sebastiano Merlino + +Wed Oct 31 14:13:49 2012 +0100 + Added dependency to travis - Sebastiano Merlino + +Wed Oct 31 14:07:30 2012 +0100 + Changed travis build path - Sebastiano Merlino + +Wed Oct 31 14:02:59 2012 +0100 + Added travis conf to repo - Sebastiano Merlino + +Tue Oct 30 16:13:10 2012 +0100 + Changed the buggy debian changelog - Sebastiano Merlino + +Tue Oct 30 16:06:26 2012 +0100 + Changed version to v0.5.4 - Sebastiano Merlino + +Tue Oct 30 15:59:45 2012 +0100 + Adjusted debian build rules - Sebastiano Merlino + +Tue Oct 30 12:52:04 2012 +0100 + Changed version to 0.5.3 + Added grow method to http_request - Sebastiano Merlino + +Tue Oct 23 12:46:48 2012 +0200 + Changed version from 0.5.1 to 0.5.2 - Sebastiano Merlino + +Tue Oct 23 12:46:07 2012 +0200 + Changed default log behaviour to print nothing + Added getters and setters for dynamic components of WS - Sebastiano Merlino + +Mon Oct 22 12:13:11 2012 +0200 + Modified version number and changelog in order to prepare tag - Sebastiano Merlino + +Fri Oct 19 17:11:21 2012 +0200 + Added response constructor with byte - Sebastiano Merlino + +Mon Oct 15 11:16:22 2012 +0200 + Removed unuseful dependency from libuuid - Sebastiano Merlino + +Fri Oct 12 15:42:21 2012 +0200 + Solved a bug that made impossible to parse post data - Sebastiano Merlino + +Wed Oct 10 17:19:25 2012 +0200 + Moved to version 0.5.1 - Sebastiano Merlino + +Wed Oct 10 17:16:26 2012 +0200 + Added querystring to request attributes - Sebastiano Merlino + +Fri Oct 5 18:00:38 2012 +0200 + Merge branch 'master' of https://github.com/etr/libhttpserver + Conflicts: + src/webserver.cpp - Sebastiano Merlino + +Fri Oct 5 17:55:42 2012 +0200 + Added -D_REENTRANT to configuration. + Aligned debian changelog. + Added comet capabilities to the server. - Sebastiano Merlino + +Tue Sep 25 00:50:45 2012 +0200 + Solved a bug with print in debug mode - Sebastiano Merlino + +Mon Sep 24 15:29:28 2012 +0200 + Modified webserver in order to accept comet calls + Added ignored patters in gitignore - Sebastiano Merlino + +Sun Sep 23 19:10:28 2012 +0200 + Partially solved undefined symbol in wrappers - Sebastiano Merlino + +Sun Sep 23 19:09:54 2012 +0200 + Avoided the usage of the sole option MHD_USE_POLL - Sebastiano Merlino + +Thu Sep 20 08:47:24 2012 +0200 + Added forgotten modded_request.hpp file - Sebastiano Merlino + +Thu Sep 20 08:46:33 2012 +0200 + Added .gitignore file - Sebastiano Merlino + +Sat Sep 15 13:02:52 2012 +0200 + Moved http_endpoint to details namespace - Sebastiano Merlino + +Sat Sep 15 02:39:47 2012 -0700 + Merge pull request #35 from etr/cflags_for_swig_in_pcfile + add -I${includedir}/httpserver to CFLAGS - Sebastiano Merlino + +Tue Aug 28 16:33:45 2012 +0200 + add -I${includedir}/httpserver to CFLAGS + This make swig file generation easier because HTTPSERVER_CFLAGS can be + directly used in swig file generation. + This fix affect only clients that use swing on their code. - Dario Mazza + +Sun Aug 26 19:03:44 2012 +0200 + Changed version. + Aligned version and dependencies in pc and debian files + Updated debian changelog. - Sebastiano Merlino + +Sun Aug 26 18:55:05 2012 +0200 + Changed visibility of http_endpoint methods to avoid them to be called + by external applications. + Avoided explicit usage of MHD constants in classes interface. + Changed http_resource interface in order to avoid copy-constructor calls + and improve performances. + Changed answer_to_connection method in order to avoid multiple checking + on methods and thus improve performances. + Added a way to register personalized error pages. - Sebastiano Merlino + +Wed Aug 8 17:33:39 2012 +0200 + Removed code repetition in handle_request method - Sebastiano Merlino + +Wed Aug 8 12:31:44 2012 +0200 + Added capability to compile with gcov + Changed infinite loop in ws to use wait conditions + Removed a bug from GET-like method handling - Sebastiano Merlino + +Sun Aug 5 18:26:25 2012 +0200 + Modified in order to parse qs in POST/PUT cases - Sebastiano Merlino + +Fri Aug 3 23:36:14 2012 +0200 + Avoid inclusion of internal headers - Sebastiano Merlino + +Thu Aug 2 00:43:02 2012 +0200 + Changed in order to find libmicrohttpd in system - Sebastiano Merlino + +Thu Jul 26 14:08:47 2012 +0200 + Solved some performance and style issues - Sebastiano Merlino + +Wed Jul 25 18:42:48 2012 +0200 + Merge branch 'master' of github.com:etr/libhttpserver - Sebastiano Merlino + +Wed Jul 25 18:41:45 2012 +0200 + Added some comments to http_endpoint and http_request - Sebastiano Merlino + +Wed Jul 25 08:58:04 2012 -0700 + Merge pull request #29 from etr/libtool_version_number + using m4 to define major,minor and revision number in configure.ac - Sebastiano Merlino + +Wed Jul 25 17:50:05 2012 +0200 + using m4 to define major,minor and revision number in configure.ac and send version number to libtool and AC_INIT - Dario Mazza + +Wed Jul 25 17:10:49 2012 +0200 + Changed in order to solve some problems with deb package and rpm package - Sebastiano Merlino + +Tue Jul 24 16:55:51 2012 -0700 + Merge pull request #28 from etr/debpkg_patch_deps + added parameter used to ignore dependecies during debpkg creation - Sebastiano Merlino + +Wed Jul 25 01:51:52 2012 +0200 + added parameter used to ignore dependecies during debpkg creation - Dario Mazza + +Wed Jul 25 00:42:25 2012 +0200 + Adjusted errors in debian rules - Sebastiano Merlino + +Tue Jul 24 16:37:07 2012 +0200 + Modified rpm build in order to compile it + Lowered required version of libmicrohttpd to 0.9.7 - Sebastiano Merlino + +Tue Jul 24 13:28:38 2012 +0200 + Changed also build default directory for debs - Sebastiano Merlino + +Tue Jul 24 13:22:59 2012 +0200 + Changed rules.in in order to avoid relative paths in deb compile - Sebastiano Merlino + +Mon Jul 23 15:42:33 2012 +0200 + Solved a logical error in http_resource route + Added some debug prints - Sebastiano Merlino + +Sun Jul 22 00:24:04 2012 +0200 + Changed in order to add optional optimizations on ws - Sebastiano Merlino + +Sat Jul 21 17:46:03 2012 +0200 + Changed in order to enhance deb packages generation + Added rpm packages generation - Sebastiano Merlino + +Sat Jul 21 00:43:39 2012 +0200 + adjusted error in changelog - Sebastiano Merlino + +Sat Jul 21 00:41:43 2012 +0200 + Changed in order to include debian package creation to makefile - Sebastiano Merlino + +Fri Jul 20 12:11:30 2012 -0700 + Merge pull request #26 from etr/debpackage + project debianized - Sebastiano Merlino + +Fri Jul 20 21:03:43 2012 +0200 + Merge branch 'master' of github.com:etr/libhttpserver - Sebastiano Merlino + +Fri Jul 20 21:03:24 2012 +0200 + Changed version - Sebastiano Merlino + diff --git a/3rd_party/libhttpserver-0.18.2/INSTALL b/3rd_party/libhttpserver-0.18.2/INSTALL new file mode 100644 index 00000000..97a25409 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/INSTALL @@ -0,0 +1,367 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008, 2009 Free Software Foundation, Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `make -f Makefile.cvs` to create configure file. + + 2. `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 3. Type `make' to compile the package. + + 4. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 5. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 6. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 7. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 8. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 9. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/3rd_party/libhttpserver-0.18.2/LICENSE b/3rd_party/libhttpserver-0.18.2/LICENSE new file mode 100644 index 00000000..5ab7695a --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/3rd_party/libhttpserver-0.18.2/Makefile.am b/3rd_party/libhttpserver-0.18.2/Makefile.am new file mode 100644 index 00000000..a46882fd --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/Makefile.am @@ -0,0 +1,61 @@ +# +# This file is part of libhttpserver +# Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# not a GNU package. You can remove this line, if +# have all needed files, that a GNU package needs + +LIBTOOL_DEPS = @LIBTOOL_DEPS@ + +AUTOMAKE_OPTIONS = foreign 1.4 +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = src +DIST_SUBDIRS = src + +if !COND_CROSS_COMPILE +SUBDIRS += test +DIST_SUBDIRS += test + +if BUILD_EXAMPLES +SUBDIRS += examples +DIST_SUBDIRS += examples +endif + +endif + +EXTRA_DIST = libhttpserver.pc.in $(DX_CONFIG) + +MOSTLYCLEANFILES = $(DX_CLEANFILES) *.gcda *.gcno *.gcov +DISTCLEANFILES = DIST_REVISION + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libhttpserver.pc + +cmakemoduledir = $(datadir)/cmake/Modules +cmakemodule_DATA = cmakemodule/FindLibHttpServer.cmake + +include $(top_srcdir)/aminclude.am + +# Update libtool, if needed. +libtool: $(LIBTOOL_DEPS) + $(SHELL) ./config.status --recheck + +dist-hook: + date >DIST_REVISION + git branch -vv >>DIST_REVISION + cp DIST_REVISION $(distdir)/ diff --git a/3rd_party/libhttpserver-0.18.2/Makefile.cvs b/3rd_party/libhttpserver-0.18.2/Makefile.cvs new file mode 100644 index 00000000..e655e6d8 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/Makefile.cvs @@ -0,0 +1,27 @@ +# +# This file is part of libhttpserver +# Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +default: all + +all: + aclocal -I m4 + autoheader + libtoolize --automake + automake --add-missing + autoconf + diff --git a/3rd_party/libhttpserver-0.18.2/NEWS b/3rd_party/libhttpserver-0.18.2/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/3rd_party/libhttpserver-0.18.2/PULL_REQUEST_TEMPLATE.md b/3rd_party/libhttpserver-0.18.2/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..a4d74934 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,10 @@ +Hello there! Welcome. Please follow the steps below to tell us about your contribution. + +1. Copy the correct template for your contribution + - Are you fixing a bug? Copy the template from https://raw.githubusercontent.com/etr/libhttpserver/master/.github/PULL_REQUEST_TEMPLATE/bug_fix.md + - Are you improving performance? Copy the template https://raw.githubusercontent.com/etr/libhttpserver/master/.github/PULL_REQUEST_TEMPLATE/performance_improvement.md + - Are you updating documentation? Copy the template from https://raw.githubusercontent.com/etr/libhttpserver/master/.github/PULL_REQUEST_TEMPLATE/documentation.md + - Are you changing functionality? Copy the template from https://raw.githubusercontent.com/etr/libhttpserver/master/.github/PULL_REQUEST_TEMPLATE/feature_change.md +2. Replace this text with the contents of the template +3. Fill in all sections of the template +4. Click "Create pull request" diff --git a/3rd_party/libhttpserver-0.18.2/README.CentOS-7 b/3rd_party/libhttpserver-0.18.2/README.CentOS-7 new file mode 100644 index 00000000..1dfaaa70 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/README.CentOS-7 @@ -0,0 +1,7 @@ +## Cent OS 7 / RHEL 7 + +CentOS 7 has a lower version of gcc (4.8.7) that is barely C++11 capable and this library +needs a better compiler. We recommend at least gcc 5+ + +We recommend installing devtoolset-8 +https://www.softwarecollections.org/en/scls/rhscl/devtoolset-8/ diff --git a/3rd_party/libhttpserver-0.18.2/README.FreeBSD b/3rd_party/libhttpserver-0.18.2/README.FreeBSD new file mode 100644 index 00000000..853c5589 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/README.FreeBSD @@ -0,0 +1,9 @@ +## Building on FreeBSD (Tested on 12.0) + +# Due to the differences in the directory structures on BSD systems some minor tweaks need to occur +# Also, FreeBSD and AIX "make" command is not compatible with gmake, like Linux and Mingw are + +export MAKE=gmake +bootstrap +configure CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib +gmake diff --git a/3rd_party/libhttpserver-0.18.2/README.md b/3rd_party/libhttpserver-0.18.2/README.md new file mode 100644 index 00000000..f3bdf4c1 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/README.md @@ -0,0 +1,1945 @@ + + +# The libhttpserver reference manual + +[![Build Status](https://api.travis-ci.com/etr/libhttpserver.svg?branch=master)](https://travis-ci.com/etr/libhttpserver) +[![Build status](https://ci.appveyor.com/api/projects/status/ktoy6ewkrf0q1hw6/branch/master?svg=true)](https://ci.appveyor.com/project/etr/libhttpserver/branch/master) +[![codecov](https://codecov.io/gh/etr/libhttpserver/branch/master/graph/badge.svg)](https://codecov.io/gh/etr/libhttpserver) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/5fa4bdc3815b4c10977f3badefedecd6)](https://www.codacy.com/app/etr/libhttpserver?utm_source=github.com&utm_medium=referral&utm_content=etr/libhttpserver&utm_campaign=Badge_Grade) +[![Gitter chat](https://badges.gitter.im/etr/libhttpserver.png)](https://gitter.im/libhttpserver/community) + +[![ko-fi](https://www.ko-fi.com/img/donate_sm.png)](https://ko-fi.com/F1F5HY8B) + +## Tl;dr +libhttpserver is a C++ library for building high performance RESTful web servers. +libhttpserver is built upon [libmicrohttpd](https://www.gnu.org/software/libmicrohttpd/) to provide a simple API for developers to create HTTP services in C++. + +**Features:** +- HTTP 1.1 compatible request parser +- RESTful oriented interface +- Flexible handler API +- Cross-platform compatible +- Implementation is HTTP 1.1 compliant +- Multiple threading models +- Support for IPv6 +- Support for SHOUTcast +- Support for incremental processing of POST data (optional) +- Support for basic and digest authentication (optional) +- Support for TLS (requires libgnutls, optional) + +## Table of Contents +* [Introduction](#introduction) +* [Requirements](#requirements) +* [Building](#building) +* [Getting Started](#getting-started) +* [Structures and classes type definition](#structures-and-classes-type-definition) +* [Create and work with a webserver](#create-and-work-with-a-webserver) +* [The resource object](#the-resource-object) +* [Registering resources](#registering-resources) +* [Parsing requests](#parsing-requests) +* [Building responses to requests](#building-responses-to-requests) +* [IP Blacklisting and Whitelisting](#ip-blacklisting-and-whitelisting) +* [Authentication](#authentication) +* [HTTP Utils](#http-utils) +* [Other Examples](#other-examples) + +#### Community +* [Code of Conduct (on a separate page)](https://github.com/etr/libhttpserver/blob/master/CODE_OF_CONDUCT.md) +* [Contributing (on a separate page)](https://github.com/etr/libhttpserver/blob/master/CONTRIBUTING.md) + +#### Appendices +* [Copying statement](#copying) +* [GNU-LGPL](#GNU-lesser-general-public-license): The GNU Lesser General Public License says how you can copy and share almost all of libhttpserver. +* [GNU-FDL](#GNU-free-documentation-license): The GNU Free Documentation License says how you can copy and share the documentation of libhttpserver. + +## Introduction +libhttpserver is meant to constitute an easy system to build HTTP servers with REST fashion. +libhttpserver is based on [libmicrohttpd](https://www.gnu.org/software/libmicrohttpd/) and, like this, it is a daemon library (parts of this documentation are, in fact, matching those of the wrapped library). +The mission of this library is to support all possible HTTP features directly and with a simple semantic allowing then the user to concentrate only on his application and not on HTTP request handling details. + +The library is supposed to work transparently for the client Implementing the business logic and using the library itself to realize an interface. +If the user wants it must be able to change every behavior of the library itself through the registration of callbacks. + +libhttpserver is able to decode certain body format a and automatically format them in object oriented fashion. This is true for query arguments and for *POST* and *PUT* requests bodies if *application/x-www-form-urlencoded* or *multipart/form-data* header are passed. + +All functions are guaranteed to be completely reentrant and thread-safe (unless differently specified). +Additionally, clients can specify resource limits on the overall number of connections, number of connections per IP address and memory used per connection to avoid resource exhaustion. + +[Back to TOC](#table-of-contents) + +## Requirements +libhttpserver can be used without any dependencies aside from libmicrohttpd. + +The minimum versions required are: +* g++ >= 5.5.0 or clang-3.6 +* libmicrohttpd >= 0.9.52 +* [Optionally]: for TLS (HTTPS) support, you'll need [libgnutls](http://www.gnutls.org/). +* [Optionally]: to compile the code-reference, you'll need [doxygen](http://www.doxygen.nl/). + +Additionally, for MinGW on windows you will need: +* libwinpthread (For MinGW-w64, if you use thread model posix then you have this) + +For versions before 0.18.0, on MinGW, you will need: +* libgnurx >= 2.5.1 + +Furthermore, the testcases use [libcurl](http://curl.haxx.se/libcurl/) but you don't need it to compile the library. + +Please refer to the readme file for your particular distribution if there is one for important notes. + +[Back to TOC](#table-of-contents) + +## Building +libhttpserver uses the standard system where the usual build process involves running +> ./bootstrap +> mkdir build +> cd build +> \.\./configure +> make +> make install # (optionally to install on the system) + +[Back to TOC](#table-of-contents) + +### Optional parameters to configure script +A complete list of parameters can be obtained running 'configure --help'. +Here are listed the libhttpserver specific options (the canonical configure options are also supported). + +* _\-\-enable-same-directory-build:_ enable to compile in the same directory. This is heavily discouraged. (def=no) +* _\-\-enable-debug:_ enable debug data generation. (def=no) +* _\-\-disable-doxygen-doc:_ don't generate any doxygen documentation. Doxygen is automatically invoked if present on the system. Automatically disabled otherwise. +* _\-\-enable-fastopen:_ enable use of TCP_FASTOPEN (def=yes) +* _\-\-enable-poll[=ARG]:_ enable poll support. Internal behavior of the `INTERNAL_SELECT` (yes, no, auto) [auto] +* _\-\-enable-epoll[=ARG]:_ enable epoll support. Internal behavior of the `INTERNAL_SELECT` (yes, no, auto) [auto] +* _\-\-enable-static:_ enable use static linking (def=yes) + +[Back to TOC](#table-of-contents) + +## Getting Started +The most basic example of creating a server and handling a requests for the path `/hello`: + + #include + + using namespace httpserver; + + class hello_world_resource : public http_resource { + public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you could run the following command from a terminal: + + curl -XGET -v http://localhost:8080/hello + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/minimal_hello_world.cpp). + +[Back to TOC](#table-of-contents) + +## Structures and classes type definition +* _webserver:_ Represents the daemon listening on a socket for HTTP traffic. + * _create_webserver:_ Builder class to support the creation of a webserver. +* _http_resource:_ Represents the resource associated with a specific http endpoint. +* _http_request:_ Represents the request received by the resource that process it. +* _http_response:_ Represents the response sent by the server once the resource finished its work. + * _string_response:_ A simple string response. + * _file_response:_ A response getting content from a fail. + * _basic_auth_fail_response:_ A failure in basic authentication. + * _digest_auth_fail_response:_ A failure in digest authentication. + * _deferred_response:_ A response getting content from a callback. + +[Back to TOC](#table-of-contents) + +## Create and work with a webserver +As you can see from the example above, creating a webserver with standard configuration is quite simple: + + webserver ws = create_webserver(8080); + +The `create_webserver` class is a supporting _builder_ class that eases the building of a webserver through chained syntax. + +### Basic Startup Options + +In this section we will explore other basic options that you can use when configuring your server. More advanced options (custom callbacks, https support, etc...) will be discussed separately. + +* _.port(**int** port):_ The port at which the server will listen. This can also be passed to the consturctor of `create_webserver`. E.g. `create_webserver(8080)`. +* _.max_connections(**int** max_conns):_ Maximum number of concurrent connections to accept. The default is `FD_SETSIZE - 4` (the maximum number of file descriptors supported by `select` minus four for `stdin`, `stdout`, `stderr` and the server socket). In other words, the default is as large as possible. Note that if you set a low connection limit, you can easily get into trouble with browsers doing request pipelining. +For example, if your connection limit is “1”, a browser may open a first connection to access your “index.html” file, keep it open but use a second connection to retrieve CSS files, images and the like. In fact, modern browsers are typically by default configured for up to 15 parallel connections to a single server. If this happens, the library will refuse to even accept the second connection until the first connection is closed — which does not happen until timeout. As a result, the browser will fail to render the page and seem to hang. If you expect your server to operate close to the connection limit, you should first consider using a lower timeout value and also possibly add a “Connection: close” header to your response to ensure that request pipelining is not used and connections are closed immediately after the request has completed. +* _.content_size_limit(**size_t** size_limit):_ Sets the maximum size of the content that a client can send over in a single block. The default is `-1 = unlimited`. +* _.connection_timeout(**int** timeout):_ Determines after how many seconds of inactivity a connection should be timed out automatically. The default timeout is `180 seconds`. +* _.memory_limit(**int** memory_limit):_ Maximum memory size per connection (followed by a `size_t`). The default is 32 kB (32*1024 bytes). Values above 128k are unlikely to result in much benefit, as half of the memory will be typically used for IO, and TCP buffers are unlikely to support window sizes above 64k on most systems. +* _.per_IP_connection_limit(**int** connection_limit):_ Limit on the number of (concurrent) connections made to the server from the same IP address. Can be used to prevent one IP from taking over all of the allowed connections. If the same IP tries to establish more than the specified number of connections, they will be immediately rejected. The default is `0`, which means no limit on the number of connections from the same IP address. +* _.bind_socket(**int** socket_fd):_ Listen socket to use. Pass a listen socket for the daemon to use (systemd-style). If this option is used, the daemon will not open its own listen socket(s). The argument passed must be of type "int" and refer to an existing socket that has been bound to a port and is listening. +* _.max_thread_stack_size(**int** stack_size):_ Maximum stack size for threads created by the library. Not specifying this option or using a value of zero means using the system default (which is likely to differ based on your platform). Default is `0 (system default)`. +* _.use_ipv6() and .no_ipv6():_ Enable or disable the IPv6 protocol support (by default, libhttpserver will just support IPv4). If you specify this and the local platform does not support it, starting up the server will throw an exception. `off` by default. +* _.use_dual_stack() and .no_dual_stack():_ Enable or disable the support for both IPv6 and IPv4 protocols at the same time (by default, libhttpserver will just support IPv4). If you specify this and the local platform does not support it, starting up the server will throw an exception. Note that this will mean that IPv4 addresses are returned in the IPv6-mapped format (the ’structsockaddrin6’ format will be used for IPv4 and IPv6). `off` by default. +* _.pedantic() and .no_pedantic():_ Enables pedantic checks about the protocol (as opposed to as tolerant as possible). Specifically, at the moment, this flag causes the library to reject HTTP 1.1 connections without a `Host` header. This is required by the standard, but of course in violation of the “be as liberal as possible in what you accept” norm. It is recommended to turn this **off** if you are testing clients against the library, and **on** in production. `off` by default. +* _.debug() and .no_debug():_ Enables debug messages from the library. `off` by default. +* _.regex_checking() and .no_regex_checking():_ Enables pattern matching for endpoints. Read more [here](#registering-resources). `on` by default. +* _.post_process() and .no_post_process():_ Enables/Disables the library to automatically parse the body of the http request as arguments if in querystring format. Read more [here](#parsing-requests). `on` by default. +* _.deferred()_ and _.no_deferred():_ Enables/Disables the ability for the server to suspend and resume connections. Simply put, it enables/disables the ability to use `deferred_response`. Read more [here](#building-responses-to-requests). `on` by default. +* _.single_resource() and .no_single_resource:_ Sets or unsets the server in single resource mode. This limits all endpoints to be served from a single resource. The resultant is that the webserver will process the request matching to the endpoint skipping any complex semantic. Because of this, the option is incompatible with `regex_checking` and requires the resource to be registered against an empty endpoint or the root endpoint (`"/"`). The resource will also have to be registered as family. (For more information on resource registration, read more [here](#registering-resources)). `off` by default. + +### Threading Models +* _.start_method(**const http::http_utils::start_method_T&** start_method):_ libhttpserver can operate with two different threading models that can be selected through this method. Default value is `INTERNAL_SELECT`. + * `http::http_utils::INTERNAL_SELECT`: In this mode, libhttpserver uses only a single thread to handle listening on the port and processing of requests. This mode is preferable if spawning a thread for each connection would be costly. If the HTTP server is able to quickly produce responses without much computational overhead for each connection, this mode can be a great choice. Note that libhttpserver will still start a single thread for itself -- this way, the main program can continue with its operations after calling the start method. Naturally, if the HTTP server needs to interact with shared state in the main application, synchronization will be required. If such synchronization in code providing a response results in blocking, all HTTP server operations on all connections will stall. This mode is a bad choice if response data cannot always be provided instantly. The reason is that the code generating responses should not block (since that would block all other connections) and on the other hand, if response data is not available immediately, libhttpserver will start to busy wait on it. If you need to scale along the number of concurrent connection and scale on multiple thread you can specify a value for `max_threads` (see below) thus enabling a thread pool - this is different from `THREAD_PER_CONNECTION` below where a new thread is spawned for each connection. + * `http::http_utils::THREAD_PER_CONNECTION`: In this mode, libhttpserver starts one thread to listen on the port for new connections and then spawns a new thread to handle each connection. This mode is great if the HTTP server has hardly any state that is shared between connections (no synchronization issues!) and may need to perform blocking operations (such as extensive IO or running of code) to handle an individual connection. +* _.max_threads(**int** max_threads):_ A thread pool can be combined with the `INTERNAL_SELECT` mode to benefit implementations that require scalability. As said before, by default this mode only uses a single thread. When combined with the thread pool option, it is possible to handle multiple connections with multiple threads. Any value greater than one for this option will activate the use of the thread pool. In contrast to the `THREAD_PER_CONNECTION` mode (where each thread handles one and only one connection), threads in the pool can handle a large number of concurrent connections. Using `INTERNAL_SELECT` in combination with a thread pool is typically the most scalable (but also hardest to debug) mode of operation for libhttpserver. Default value is `1`. This option is incompatible with `THREAD_PER_CONNECTION`. + +### Custom defaulted error messages +libhttpserver allows to override internal error retrieving functions to provide custom messages to the HTTP client. There are only 3 cases in which implementing logic (an http_resource) cannot be invoked: (1) a not found resource, where the library is not being able to match the URL requested by the client to any implementing http_resource object; (2) a not allowed method, when the HTTP client is requesting a method explicitly marked as not allowed (more info [here](#allowing-and-disallowing-methods-on-a-resource)) by the implementation; (3) an exception being thrown. +In all these 3 cases libhttpserver would provide a standard HTTP response to the client with the correct error code; respectively a `404`, a `405` and a `500`. The library allows its user to specify custom callbacks that will be called to replace the default behavior. +* _.not_found_resource(**const shared_ptr(*render_ptr)(const http_request&)** resource):_ Specifies a function to handle a request when no matching registered endpoint exist for the URL requested by the client. +* _.method_not_allowed_resource(**const shared_ptr(*render_ptr)(const http_request&)** resource):_ Specifies a function to handle a request that is asking for a method marked as not allowed on the matching http_resource. +* _.internal_error_resource(**const shared_ptr(*render_ptr)(const http_request&)** resource):_ Specifies a function to handle a request that is causing an uncaught exception during its execution. **REMEMBER:** is this callback is causing an exception itself, the standard default response from libhttpserver will be reported to the HTTP client. + +#### Example of custom errors: + #include + + using namespace httpserver; + + const std::shared_ptr not_found_custom(const http_request& req) { + return std::shared_ptr(new string_response("Not found custom", 404, "text/plain")); + } + + const std::shared_ptr not_allowed_custom(const http_request& req) { + return std::shared_ptr(new string_response("Not allowed custom", 405, "text/plain")); + } + + class hello_world_resource : public http_resource { + public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080) + .not_found_resource(not_found_custom) + .method_not_allowed_resource(not_allowed_custom); + + hello_world_resource hwr; + hwr.disallow_all(); + hwr.set_allowing("GET", true); + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following command from a terminal: + + curl -XGET -v http://localhost:8080/hello + +If you try to run either of the two following commands, you'll see your custom errors: +* `curl -XGET -v http://localhost:8080/morning`: will return your custom `not found` error. +* `curl -XPOST -v http://localhost:8080/hello`: will return your custom `not allowed` error. + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/custom_error.cpp). + +### Custom logging callbacks +* _.log_access(**void(*log_access_ptr)(const std::string&)** functor):_ Specifies a function used to log accesses (requests) to the server. +* _.log_error(**void(*log_error_ptr)(const std::string&)** functor):_ Specifies a function used to log errors generating from the server. + +#### Example of custom logging callback + #include + #include + + using namespace httpserver; + + void custom_access_log(const std::string& url) { + std::cout << "ACCESSING: " << url << std::endl; + } + + class hello_world_resource : public http_resource { + public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080) + .log_access(custom_access_log); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following command from a terminal: + + curl -XGET -v http://localhost:8080/hello + +You'll notice how, on the terminal runing your server, the logs will now be printed in output for each request received. + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/custom_access_log.cpp). + +### TLS/HTTPS +* _.use_ssl() and .no_ssl():_ Determines whether to run in HTTPS-mode or not. If you set this as on and libhttpserver was compiled without SSL support, the library will throw an exception at start of the server. `off` by default. +* _.cred_type(**const http::http_utils::cred_type_T&** cred_type):_ Daemon credentials type. Either certificate or anonymous. Acceptable values are: + * `NONE`: No credentials. + * `CERTIFICATE`: Certificate credential. + * `ANON`: Anonymous credential. + * `SRP`: SRP credential. + * `PSK`: PSK credential. + * `IA`: IA credential. +* _.https_mem_key(**const std::string&** filename):_ String representing the path to a file containing the private key to be used by the HTTPS daemon. This must be used in conjunction with `https_mem_cert`. +* _.https_mem_cert(**const std::string&** filename):_ String representing the path to a file containing the certificate to be used by the HTTPS daemon. This must be used in conjunction with `https_mem_key`. +* _.https_mem_trust(**const std::string&** filename):_ String representing the path to a file containing the CA certificate to be used by the HTTPS daemon to authenticate and trust clients certificates. The presence of this option activates the request of certificate to the client. The request to the client is marked optional, and it is the responsibility of the server to check the presence of the certificate if needed. Note that most browsers will only present a client certificate only if they have one matching the specified CA, not sending any certificate otherwise. +* _.https_priorities(**const std::string&** priority_string):_ SSL/TLS protocol version and ciphers. Must be followed by a string specifying the SSL/TLS protocol versions and ciphers that are acceptable for the application. The string is passed unchanged to gnutls_priority_init. If this option is not specified, `"NORMAL"` is used. + +#### Minimal example using HTTPS + #include + + using namespace httpserver; + + class hello_world_resource : public http_resource { + public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080) + .use_ssl() + .https_mem_key("key.pem") + .https_mem_cert("cert.pem"); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following command from a terminal: + + curl -XGET -v -k 'https://localhost:8080/hello' + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/minimal_https.cpp). + +### IP Blacklisting/Whitelisting +libhttpserver supports IP blacklisting and whitelisting as an internal feature. This section explains the startup options related with IP blacklisting/whitelisting. See the [specific section](#ip-blacklisting-and-whitelisting) to read more about the topic. +* _.ban_system() and .no_ban_system:_ Can be used to enable/disable the ban system. `on` by default. +* _.default_policy(**const http::http_utils::policy_T&** default_policy):_ Specifies what should be the default behavior when receiving a request. Possible values are `ACCEPT` and `REJECT`. Default is `ACCEPT`. + +### Authentication Parameters +* _.basic_auth() and .no_basic_auth:_ Can be used to enable/disable parsing of the basic authorization header sent by the client. `on` by default. +* _.digest_auth() and .no_digest_auth:_ Can be used to enable/disable parsing of the digested authentication data sent by the client. `on` by default. +* _.nonce_nc_size(**int** nonce_size):_ Size of an array of nonce and nonce counter map. This option represents the size (number of elements) of a map of a nonce and a nonce-counter. If this option is not specified, a default value of 4 will be used (which might be too small for servers handling many requests). +You should calculate the value of NC_SIZE based on the number of connections per second multiplied by your expected session duration plus a factor of about two for hash table collisions. For example, if you expect 100 digest-authenticated connections per second and the average user to stay on your site for 5 minutes, then you likely need a value of about 60000. On the other hand, if you can only expect only 10 digest-authenticated connections per second, tolerate browsers getting a fresh nonce for each request and expect a HTTP request latency of 250 ms, then a value of about 5 should be fine. +* _.digest_auth_random(**const std::string&** nonce_seed):_ Digest Authentication nonce’s seed. For security, you SHOULD provide a fresh random nonce when actually using Digest Authentication with libhttpserver in production. + +### Examples of chaining syntax to create a webserver + + webserver ws = create_webserver(8080) + .no_ssl() + .no_ipv6() + .no_debug() + .no_pedantic() + .no_basic_auth() + .no_digest_auth() + .no_comet() + .no_regex_checking() + .no_ban_system() + .no_post_process(); +## + webserver ws = create_webserver(8080) + .use_ssl() + .https_mem_key("key.pem") + .https_mem_cert("cert.pem"); + +### Starting and stopping a webserver +Once a webserver is created, you can manage its execution through the following methods on the `webserver` class: +* _**void** webserver::start(**bool** blocking):_ Allows to start a server. If the `blocking` flag is passed as `true`, it will block the execution of the current thread until a call to stop on the same webserver object is performed. +* _**void** webserver::stop():_ Allows to stop a server. It immediately stops it. +* _**bool** webserver::is_running():_ Checks if a server is running +* _**void** webserver::sweet_kill():_ Allows to stop a server. It doesn't guarantee an immediate halt to allow for thread termination and connection closure. + +[Back to TOC](#table-of-contents) + +## The Resource Object +The `http_resource` class represents a logical collection of HTTP methods that will be associated to a URL when registered on the webserver. The class is **designed for extension** and it is where most of your code should ideally live. When the webserver matches a request against a resource (see: [resource registration](#registering-resources)), the method correspondent to the one in the request (GET, POST, etc..) (see below) is called on the resource. + +Given this, the `http_resource` class contains the following extensible methods (also called `handlers` or `render methods`): +* _**const std::shared_ptr** http_resource::render_GET(**const http_request&** req):_ Invoked on an HTTP GET request. +* _**const std::shared_ptr** http_resource::render_POST(**const http_request&** req):_ Invoked on an HTTP POST request. +* _**const std::shared_ptr** http_resource::render_PUT(**const http_request&** req):_ Invoked on an HTTP PUT request. +* _**const std::shared_ptr** http_resource::render_HEAD(**const http_request&** req):_ Invoked on an HTTP HEAD request. +* _**const std::shared_ptr** http_resource::render_DELETE(**const http_request&** req):_ Invoked on an HTTP DELETE request. +* _**const std::shared_ptr** http_resource::render_TRACE(**const http_request&** req):_ Invoked on an HTTP TRACE request. +* _**const std::shared_ptr** http_resource::render_OPTIONS(**const http_request&** req):_ Invoked on an HTTP OPTIONS request. +* _**const std::shared_ptr** http_resource::render_CONNECT(**const http_request&** req):_ Invoked on an HTTP CONNECT request. +* _**const std::shared_ptr** http_resource::render(**const http_request&** req):_ Invoked as a backup method if the matching method is not implemented. It can be used whenever you want all the invocations on a URL to activate the same behavior regardless of the HTTP method requested. The default implementation of the `render` method returns an empty response with a `404`. + +#### Example of implementation of render methods + #include + + using namespace httpserver; + + class hello_world_resource : public http_resource { + public: + const std::shared_ptr render_GET(const http_request&) { + return std::shared_ptr(new string_response("GET: Hello, World!")); + } + + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("OTHER: Hello, World!")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following commands from a terminal: + * `curl -XGET -v http://localhost:8080/hello`: will return `GET: Hello, World!`. + * `curl -XPOST -v http://localhost:8080/hello`: will return `OTHER: Hello, World!`. You can try requesting other methods beside `POST` to verify how the same message will be returned. + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/handlers.cpp). + +### Allowing and disallowing methods on a resource +By default, all methods an a resource are allowed, meaning that an HTTP request with that method will be invoked. It is possible to mark methods as `not allowed` on a resource. When a method not allowed is requested on a resource, the default `method_not_allowed` method is invoked - the default can be overriden as explain in the section [Custom defaulted error messages](custom-defaulted-error-messages). +The base `http_resource` class has a set of methods that can be used to allow and disallow HTTP methods. +* _**void** http_resource::set_allowing(**const std::string&** method, **bool** allowed):_ Used to allow or disallow a method. The `method` parameter is a string representing an HTTP method (GET, POST, PUT, etc...). +* _**void** http_resource::allow_all():_ Marks all HTTP methods as allowed. +* _**void** http_resource::disallow_all():_ Marks all HTTP methods as not allowed. + +#### Example of methods allowed/disallowed + #include + + using namespace httpserver; + + class hello_world_resource : public http_resource { + public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + hwr.disallow_all(); + hwr.set_allowing("GET", true); + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following command from a terminal: + + curl -XGET -v http://localhost:8080/hello + +If you try to run the following command, you'll see a `method_not_allowed` error: +* `curl -XPOST -v http://localhost:8080/hello`. + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/allowing_disallowing_methods.cpp). + +[Back to TOC](#table-of-contents) + +## Registering resources +Once you have created your resource and extended its methods, you'll have to register the resource on the webserver. Registering a resource will associate it with an endpoint and allows the webserver to route it. +The `webserver` class offers a method to register a resource: +* _**bool** register_resource(**const std::string&** endpoint, **http_resource*** resource, **bool** family = `false`):_ Registers the `resource` to an `endpoint`. The endpoint is a string representing the path on your webserver from where you want your resource to be served from (e.g. `"/path/to/resource"`). The optional `family` parameter allows to register a resource as a "family" resource that will match any path nested into the one specified. For example, if family is set to `true` and endpoint is set to `"/path"`, the webserver will route to the resource not only the requests against `"/path"` but also everything in its nested path `"/path/on/the/previous/one"`. + +### Specifying endpoints +There are essentially four ways to specify an endpoint string: +* **A simple path (e.g. `"/path/to/resource"`).** In this case, the webserver will try to match exactly the value of the endpoint. +* **A regular exception.** In this case, the webserver will try to match the URL of the request with the regex passed. For example, if passing `"/path/as/decimal/[0-9]+`, requests on URLs like `"/path/as/decimal/5"` or `"/path/as/decimal/42"` will be matched; instead, URLs like `"/path/as/decimal/three"` will not. +* **A parametrized path. (e.g. `"/path/to/resource/with/{arg1}/{arg2}/in/url"`)**. In this case, the webserver will match the argument with any value passed. In addition to this, the arguments will be passed to the resource as part of the arguments (readable from the `http_request::get_arg` method - see [here](#parsing-requests)). For example, if passing `"/path/to/resource/with/{arg1}/{arg2}/in/url"` will match any request on URL with any value in place of `{arg1}` and `{arg2}`. +* **A parametrized path with custom parameters.** This is the same of a normal parametrized path, but allows to specify a regular expression for the argument (e.g. `"/path/to/resource/with/{arg1|[0-9]+}/{arg2|[a-z]+}/in/url"`. In this case, the webserver will match the arguments with any value passed that satisfies the regex. In addition to this, as above, the arguments will be passed to the resource as part of the arguments (readable from the `http_request::get_arg` method - see [here](#parsing-requests)). For example, if passing `"/path/to/resource/with/{arg1|[0-9]+}/{arg2|[a-z]+}/in/url"` will match requests on URLs like `"/path/to/resource/with/10/AA/in/url"` but not like `""/path/to/resource/with/BB/10/in/url""` +* Any of the above marked as `family`. Will match any request on URLs having path that is prefixed by the path passed. For example, if family is set to `true` and endpoint is set to `"/path"`, the webserver will route to the resource not only the requests against `"/path"` but also everything in its nested path `"/path/on/the/previous/one"`. + + #include + + using namespace httpserver; + + class hello_world_resource : public http_resource { + public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } + }; + + class handling_multiple_resource : public http_resource { + public: + const std::shared_ptr render(const http_request& req) { + return std::shared_ptr(new string_response("Your URL: " + req.get_path())); + } + }; + + class url_args_resource : public http_resource { + public: + const std::shared_ptr render(const http_request& req) { + return std::shared_ptr(new string_response("ARGS: " + req.get_arg("arg1") + " and " + req.get_arg("arg2"))); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + + handling_multiple_resource hmr; + ws.register_resource("/family", &hmr, true); + ws.register_resource("/with_regex_[0-9]+", &hmr); + + url_args_resource uar; + ws.register_resource("/url/with/{arg1}/and/{arg2}", &uar); + ws.register_resource("/url/with/parametric/args/{arg1|[0-9]+}/and/{arg2|[A-Z]+}", &uar); + + ws.start(true); + + return 0; + } + +To test the above example, you can run the following commands from a terminal: + +* `curl -XGET -v http://localhost:8080/hello`: will return the `Hello, World!` message. +* `curl -XGET -v http://localhost:8080/family`: will return the `Your URL: /family` message. +* `curl -XGET -v http://localhost:8080/family/with/suffix`: will return the `Your URL: /family/with/suffix` message. +* `curl -XGET -v http://localhost:8080/with_regex_10`: will return the `Your URL: /with_regex_10` message. +* `curl -XGET -v http://localhost:8080/url/with/AA/and/BB`: will return the `ARGS: AA and BB` message. You can change `AA` and `BB` with any value and observe how the URL is still matched and parameters are read. +* `curl -XGET -v http://localhost:8080/url/with/parametric/args/10/and/AA`: will return the `ARGS: 10 and AA` message. You can change `10` and `AA` with any value matching the regexes and observe how the URL is still matched and parameters are read. + +Conversely, you can observe how these URL will not be matched (al the following will give you a `not found` message): +* `curl -XGET -v http://localhost:8080/with_regex_A` +* `curl -XGET -v http://localhost:8080/url/with/parametric/args/AA/and/BB` + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/url_registration.cpp). + +[Back to TOC](#table-of-contents) + +## Parsing requests +As seen in the documentation of [http_resource](#the-resource-object), every extensible method takes in input a `http_request` object. The webserver takes the responsibility to extract the data from the HTTP request on the network and does all the heavy lifting to build the instance of `http_request`. + +The `http_request` class has a set of methods you will have access to when implementing your handlers: +* _**const std::string&** get_path() **const**:_ Returns the path as requested from the HTTP client. +* _**const std::vector\&** get_path_pieces() **const**:_ Returns the components of the path requested by the HTTP client (each piece of the path split by `'/'`. +* _**const std::string&** get_path_piece(int index) **const**:_ Returns one piece of the path requested by the HTTP client. The piece is selected through the `index` parameter (0-indexed). +* _**const std::string&** get_method() **const**:_ Returns the method requested by the HTTP client. +* _**const std::string** get_header(**const std::string&** key) **const**:_ Returns the header with name equal to `key` if present in the HTTP request. Returns an `empty string` otherwise. +* _**const std::string** get_cookie(**const std::string&** key) **const**:_ Returns the cookie with name equal to `key` if present in the HTTP request. Returns an `empty string` otherwise. +* _**const std::string** get_footer(**const std::string&** key) **const**:_ Returns the footer with name equal to `key` if present in the HTTP request (only for http 1.1 chunked encodings). Returns an `empty string` otherwise. +* _**const std::string** get_arg(**const std::string&** key) **const**:_ Returns the argument with name equal to `key` if present in the HTTP request. Arguments can be (1) querystring parameters, (2) path argument (in case of parametric endpoint, (3) parameters parsed from the HTTP request body if the body is in `application/x-www-form-urlencoded` or `multipart/form-data` formats and the postprocessor is enabled in the webserver (enabled by default). +* _**const std::map** get_headers() **const**:_ Returns a map containing all the headers present in the HTTP request. +* _**const std::map** get_cookies() **const**:_ Returns a map containing all the cookies present in the HTTP request. +* _**const std::map** get_footers() **const**:_ Returns a map containing all the footers present in the HTTP request (only for http 1.1 chunked encodings). +* _**const std::map** get_args() **const**:_ Returns all the arguments present in the HTTP request. Arguments can be (1) querystring parameters, (2) path argument (in case of parametric endpoint, (3) parameters parsed from the HTTP request body if the body is in `application/x-www-form-urlencoded` or `multipart/form-data` formats and the postprocessor is enabled in the webserver (enabled by default). +* _**const std::string&** get_content() **const**:_ Returns the body of the HTTP request. +* _**bool** content_too_large() **const**:_ Returns `true` if the body length of the HTTP request sent by the client is longer than the max allowed on the server. +* _**const std::string** get_querystring() **const**:_ Returns the `querystring` of the HTTP request. +* _**const std::string&** get_version() **const**:_ Returns the HTTP version of the client request. +* _**const std::string** get_requestor() **const**:_ Returns the IP from which the client is sending the request. +* _**unsigned short** get_requestor_port() **const**:_ Returns the port from which the client is sending the request. +* _**const std::string** get_user() **const**:_ Returns the `user` as self-identified through basic authentication. The content of the user header will be parsed only if basic authentication is enabled on the server (enabled by default). +* _**const std::string** get_pass() **const**:_ Returns the `password` as self-identified through basic authentication. The content of the password header will be parsed only if basic authentication is enabled on the server (enabled by default). +* _**const std::string** get_digested_user() **const**:_ Returns the `digested user` as self-identified through digest authentication. The content of the user header will be parsed only if digest authentication is enabled on the server (enabled by default). +* _**bool** check_digest_auth(**const std::string&** realm, **const std::string&** password, **int** nonce_timeout, **bool&** reload_nonce) **const**:_ Allows to check the validity of the authentication token sent through digest authentication (if the provided values in the WWW-Authenticate header are valid and sound according to RFC2716). Takes in input the `realm` of validity of the authentication, the `password` as known to the server to compare against, the `nonce_timeout` to indicate how long the nonce is valid and `reload_nonce` a boolean that will be set by the method to indicate a nonce being reloaded. The method returns `true` if the authentication is valid, `false` otherwise. + +#### Example of handler reading arguments from a request + #include + + using namespace httpserver; + + class hello_world_resource : public http_resource { + public: + const std::shared_ptr render(const http_request& req) { + return std::shared_ptr(new string_response("Hello: " + req.get_arg("name"))); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following command from a terminal: + + curl -XGET -v "http://localhost:8080/hello?name=John" + +You will receive the message `Hello: John` in reply. Given that the body post processing is enabled, you can also run `curl -d "name=John" -X POST http://localhost:8080/hello` to obtain the same result. + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/hello_with_get_arg.cpp). + +[Back to TOC](#table-of-contents) + +## Building responses to requests +As seen in the documentation of [http_resource](#the-resource-object), every extensible method returns in output a `http_response` object. The webserver takes the responsibility to convert the `http_response` object you create into a response on the network. + +There are 5 types of response that you can create - we will describe them here through their constructors: +* _string_response(**const std::string&** content, **int** response_code = `200`, **const std::string&** content_type = `"text/plain"`):_ The most basic type of response. It uses the `content` string passed in construction as body of the HTTP response. The other two optional parameters are the `response_code` and the `content_type`. You can find constant definition for the various response codes within the [http_utils](https://github.com/etr/libhttpserver/blob/master/src/httpserver/http_utils.hpp) library file. +* _file_response(**const std::string&** filename, **int** response_code = `200`, **const std::string&** content_type = `"text/plain"`):_ Uses the `filename` passed in construction as pointer to a file on disk. The body of the HTTP response will be set using the content of the file. The other two optional parameters are the `response_code` and the `content_type`. You can find constant definition for the various response codes within the [http_utils](https://github.com/etr/libhttpserver/blob/master/src/httpserver/http_utils.hpp) library file. +* _basic_auth_fail_response(**const std::string&** content, **const std::string&** realm = `""`, **int** response_code = `200`, **const std::string&** content_type = `"text/plain"`):_ A response in return to a failure during basic authentication. It allows to specify a `content` string as a message to send back to the client. The `realm` parameter should contain your realm of authentication (if any). The other two optional parameters are the `response_code` and the `content_type`. You can find constant definition for the various response codes within the [http_utils](https://github.com/etr/libhttpserver/blob/master/src/httpserver/http_utils.hpp) library file. +* _digest_auth_fail_response(**const std::string&** content, **const std::string&** realm = `""`, **const std::string&** opaque = `""`, **bool** reload_nonce = `false`, **int** response_code = `200`, **const std::string&** content_type = `"text/plain"`):_ A response in return to a failure during digest authentication. It allows to specify a `content` string as a message to send back to the client. The `realm` parameter should contain your realm of authentication (if any). The `opaque` represents a value that gets passed to the client and expected to be passed again to the server as-is. This value can be a hexadecimal or base64 string. The `reload_nonce` parameter tells the server to reload the nonce (you should use the value returned by the `check_digest_auth` method on the `http_request`. The other two optional parameters are the `response_code` and the `content_type`. You can find constant definition for the various response codes within the [http_utils](https://github.com/etr/libhttpserver/blob/master/src/httpserver/http_utils.hpp) library file. +* _deferred_response(**ssize_t(*cycle_callback_ptr)(shared_ptr<T>, char*, size_t)** cycle_callback, **const std::string&** content = `""`, **int** response_code = `200`, **const std::string&** content_type = `"text/plain"`):_ A response that obtains additional content from a callback executed in a deferred way. It leaves the client in pending state (returning a `100 CONTINUE` message) and suspends the connection. Besides the callback, optionally, you can provide a `content` parameter that sets the initial message sent immediately to the client. The other two optional parameters are the `response_code` and the `content_type`. You can find constant definition for the various response codes within the [http_utils](https://github.com/etr/libhttpserver/blob/master/src/httpserver/http_utils.hpp) library file. To use `deferred_response` you need to have the `deferred` option active on your webserver (enabled by default). + * The `cycle_callback_ptr` has this shape: + _**ssize_t** cycle_callback(**shared_ptr<T> closure_data, char*** buf, **size_t** max_size)_. + You are supposed to implement a function in this shape and provide it to the `deferred_repsonse` method. The webserver will provide a `char*` to the function. It is responsibility of the function to allocate it and fill its content. The method is supposed to respect the `max_size` parameter passed in input. The function must return a `ssize_t` value representing the actual size you filled the `buf` with. Any value different from `-1` will keep the resume the connection, deliver the content and suspend it again (with a `100 CONTINUE`). If the method returns `-1`, the webserver will complete the communication with the client and close the connection. You can also pass a `shared_ptr` pointing to a data object of your choice (this will be templetized with a class of your choice). The server will guarantee that this object is passed at each invocation of the method allowing the client code to use it as a memory buffer during computation. + +### Setting additional properties of the response +The `http_response` class offers an additional set of methods to "decorate" your responses. This set of methods is: +* _**void** with_header(**const std::string&** key, **const std::string&** value):_ Sets an HTTP header with name set to `key` and value set to `value`. +* _**void** with_footer(**const std::string&** key, **const std::string&** value):_ Sets an HTTP footer with name set to `key` and value set to `value`. +* _**void** with_cookie(**const std::string&** key, **const std::string&** value):_ Sets an HTTP cookie with name set to `key` and value set to `value` (only for http 1.1 chunked encodings). +* _**void** shoutCAST():_ Mark the response as a `shoutCAST` one. + +### Example of response setting headers + #include + + using namespace httpserver; + + class hello_world_resource : public http_resource { + public: + const std::shared_ptr render(const http_request&) { + std::shared_ptr response = std::shared_ptr(new string_response("Hello, World!")); + response->with_header("MyHeader", "MyValue"); + return response; + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you could run the following command from a terminal: + + curl -XGET -v "http://localhost:8080/hello" + +You will receive the message custom header in reply. + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/setting_headers.cpp). + +[Back to TOC](#table-of-contents) + +## IP Blacklisting and Whitelisting +libhttpserver provides natively a system to blacklist and whitelist IP addresses. To enable/disable the system, it is possible to use the `ban_system` and `no_ban_system` methods on the `create_webserver` class. In the same way, you can specify what you want to be your "default behavior" (allow by default or disallow by default) by using the `default_policy` method (see [here](#create-and-work-with-a-webserver)). + +The system supports both IPV4 and IPV6 and manages them transparently. The only requirement is for ipv6 to be enabled on your server - you'll have to enable this by using the `use_ipv6` method on `create_webserver`. + +You can explicitly ban or allow an IP address using the following methods on the `webserver` class: +* _**void** ban_ip(**const std::string&** ip):_ Adds one IP (or a range of IPs) to the list of the banned ones. Takes in input a `string` that contains the IP (or range of IPs) to ban. To use when the `default_policy` is `ACCEPT`. +* _**void** allow_ip(**const std::string&** ip):_ Adds one IP (or a range of IPs) to the list of the allowed ones. Takes in input a `string` that contains the IP (or range of IPs) to allow. To use when the `default_policy` is `REJECT`. +* _**void** unban_ip(**const std::string&** ip):_ Removes one IP (or a range of IPs) from the list of the banned ones. Takes in input a `string` that contains the IP (or range of IPs) to remove from the list. To use when the `default_policy` is `REJECT`. +* _**void** disallow_ip(**const std::string&** ip):_ Removes one IP (or a range of IPs) from the list of the allowed ones. Takes in input a `string` that contains the IP (or range of IPs) to remove from the list. To use when the `default_policy` is `REJECT`. + +### IP String Format +The IP string format can represent both IPV4 and IPV6. Addresses will be normalized by the webserver to operate in the same sapce. Any valid IPV4 or IPV6 textual representation works. +It is also possible to specify ranges of IPs. To do so, omit the octect you want to express as a range and specify a `'*'` in its place. +Examples of valid IPs include: +* `"192.168.5.5"`: standard IPV4 +* `"192.168.*.*"`: range of IPV4 addresses. In the example, everything between `192.168.0.0` and `192.168.255.255`. +* `"2001:db8:8714:3a90::12"`: standard IPV6 - clustered empty ranges are fully supported. +* `"2001:db8:8714:3a90:*:*"`: range of IPV6 addresses. +* `"::ffff:192.0.2.128"`: IPV4 IPs nested into IPV6. +* `"::192.0.2.128"`: IPV4 IPs nested into IPV6 (without `'ffff'` prefix) +* `"::ffff:192.0.*.*"`: ranges of IPV4 IPs nested into IPV6. + +#### Example of IP Whitelisting/Blacklisting + #include + + using namespace httpserver; + + class hello_world_resource : public http_resource { + public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080) + .default_policy(http::http_utils::REJECT); + + ws.allow_ip("127.0.0.1"); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you could run the following command from a terminal: + + curl -XGET -v "http://localhost:8080/hello" + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/minimal_ip_ban.cpp). + +[Back to TOC](#table-of-contents) + +## Authentication +libhttpserver support three types of client authentication. + +Basic authentication uses a simple authentication method based on BASE64 algorithm. Username and password are exchanged in clear between the client and the server, so this method must only be used for non-sensitive content or when the session is protected with https. When using basic authentication libhttpserver will have access to the clear password, possibly allowing to create a chained authentication toward an external authentication server. You can enable/disable support for Basic authentication through the `basic_auth` and `no_basic_auth` methods of the `create_webserver` class. + +Digest authentication uses a one-way authentication method based on MD5 hash algorithm. Only the hash will transit over the network, hence protecting the user password. The nonce will prevent replay attacks. This method is appropriate for general use, especially when https is not used to encrypt the session. You can enable/disable support for Digest authentication through the `digest_auth` and `no_digest_auth` methods of the `create_webserver` class. + +Client certificate authentication uses a X.509 certificate from the client. This is the strongest authentication mechanism but it requires the use of HTTPS. Client certificate authentication can be used simultaneously with Basic or Digest Authentication in order to provide a two levels authentication (like for instance separate machine and user authentication). You can enable/disable support for Certificate authentication through the `use_ssl` and `no_ssl` methods of the `create_webserver` class. + +### Using Basic Authentication + #include + + using namespace httpserver; + + class user_pass_resource : public httpserver::http_resource { + public: + const std::shared_ptr render_GET(const http_request& req) { + if (req.get_user() != "myuser" || req.get_pass() != "mypass") { + return std::shared_ptr(new basic_auth_fail_response("FAIL", "test@example.com")); + } + return std::shared_ptr(new string_response(req.get_user() + " " + req.get_pass(), 200, "text/plain")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + user_pass_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following command from a terminal: + + curl -XGET -v -u myuser:mypass "http://localhost:8080/hello" + +You will receive back the user and password you passed in input. Try to pass the wrong credentials to see the failure. + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/basic_authentication.cpp). + +### Using Digest Authentication + #include + + #define MY_OPAQUE "11733b200778ce33060f31c9af70a870ba96ddd4" + + using namespace httpserver; + + class digest_resource : public httpserver::http_resource { + public: + const std::shared_ptr render_GET(const http_request& req) { + if (req.get_digested_user() == "") { + return std::shared_ptr(new digest_auth_fail_response("FAIL", "test@example.com", MY_OPAQUE, true)); + } + else { + bool reload_nonce = false; + if(!req.check_digest_auth("test@example.com", "mypass", 300, reload_nonce)) { + return std::shared_ptr(new digest_auth_fail_response("FAIL", "test@example.com", MY_OPAQUE, reload_nonce)); + } + } + return std::shared_ptr(new string_response("SUCCESS", 200, "text/plain")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + digest_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following command from a terminal: + + curl -XGET -v --digest --user myuser:mypass localhost:8080/hello + +You will receive a `SUCCESS` in response (observe the response message from the server in detail and you'll see the full interaction). Try to pass the wrong credentials or send a request without `digest` active to see the failure. + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/digest_authentication.cpp). + +[Back to TOC](#table-of-contents) + +## HTTP Utils +libhttpserver provides a set of constants to help you develop your HTTP server. It would be redudant to list them here; so, please, consult the list directly [here](https://github.com/etr/libhttpserver/blob/master/src/httpserver/http_utils.hpp). + +[Back to TOC](#table-of-contents) + +## Other Examples + +#### Example of returning a response from a file + #include + + using namespace httpserver; + + class file_response_resource : public http_resource { + public: + const std::shared_ptr render_GET(const http_request& req) { + return std::shared_ptr(new file_response("test_content", 200, "text/plain")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + file_response_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following command from a terminal: + + curl -XGET -v localhost:8080/hello + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/minimal_file_response.cpp). + +#### Example of a deferred response through callback + #include + + using namespace httpserver; + + static int counter = 0; + + ssize_t test_callback (std::shared_ptr closure_data, char* buf, size_t max) { + if (counter == 2) { + return -1; + } + else { + memset(buf, 0, max); + strcat(buf, " test "); + counter++; + return std::string(buf).size(); + } + } + + class deferred_resource : public http_resource { + public: + const std::shared_ptr render_GET(const http_request& req) { + return std::shared_ptr >(new deferred_response(test_callback, nullptr, "cycle callback response")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + deferred_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following command from a terminal: + + curl -XGET -v localhost:8080/hello + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/minimal_deferred.cpp). + +#### Example of a deferred response through callback (passing additional data along) + #include + #include + + using namespace httpserver; + + std::atomic counter; + + ssize_t test_callback (std::shared_ptr > closure_data, char* buf, size_t max) { + int reqid; + if (closure_data == nullptr) { + reqid = -1; + } else { + reqid = *closure_data; + } + + // only first 5 connections can be established + if (reqid >= 5) { + return -1; + } else { + // respond corresponding request IDs to the clients + std::string str = ""; + str += std::to_string(reqid) + " "; + memset(buf, 0, max); + std::copy(str.begin(), str.end(), buf); + + // keep sending reqid + sleep(1); + + return (ssize_t)max; + } + } + + class deferred_resource : public http_resource { + public: + const std::shared_ptr render_GET(const http_request& req) { + std::shared_ptr > closure_data(new std::atomic(counter++)); + return std::shared_ptr > >(new deferred_response >(test_callback, closure_data, "cycle callback response")); + } + }; + + int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + deferred_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; + } + +To test the above example, you can run the following command from a terminal: + + curl -XGET -v localhost:8080/hello + +You can also check this example on [github](https://github.com/etr/libhttpserver/blob/master/examples/deferred_with_accumulator.cpp). + +[Back to TOC](#table-of-contents) + +## Copying +This manual is for libhttpserver, C++ library for creating an embedded Rest HTTP server (and more). + +> Permission is granted to copy, distribute and/or modify this document +> under the terms of the GNU Free Documentation License, Version 1.3 +> or any later version published by the Free Software Foundation; +> with no Invariant Sections, no Front-Cover Texts, and no Back-Cover +> Texts. A copy of the license is included in the section entitled GNU +> Free Documentation License. + +[Back to TOC](#table-of-contents) + +## GNU Lesser General Public License +Version 2.1, February 1999 + +Copyright © 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +_This is the first released version of the Lesser GPL. It also counts +as the successor of the GNU Library Public License, version 2, hence +the version number 2.1._ + +### Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + +To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + +Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + +When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + +We call this license the “Lesser” General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + +For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + +Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +“work based on the library” and a “work that uses the library”. The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +### TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +**0.** This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called “this License”). +Each licensee is addressed as “you”. + +A “library” means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + +The “Library”, below, refers to any such software library or work +which has been distributed under these terms. A “work based on the +Library” means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term “modification”.) + +“Source code” for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + +**1.** You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + +You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + +**2.** You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +* **a)** The modified work must itself be a software library. +* **b)** You must cause the files modified to carry prominent notices +stating that you changed the files and the date of any change. +* **c)** You must cause the whole of the work to be licensed at no +charge to all third parties under the terms of this License. +* **d)** If a facility in the modified Library refers to a function or a +table of data to be supplied by an application program that uses +the facility, other than as an argument passed when the facility +is invoked, then you must make a good faith effort to ensure that, +in the event an application does not supply such function or +table, the facility still operates, and performs whatever part of +its purpose remains meaningful. +(For example, a function in a library to compute square roots has +a purpose that is entirely well-defined independent of the +application. Therefore, Subsection 2d requires that any +application-supplied function or table used by this function must +be optional: if the application does not supply it, the square +root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +**3.** You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + +Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + +**4.** You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + +**5.** A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a “work that uses the Library”. Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + +However, linking a “work that uses the Library” with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a “work that uses the +library”. The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + +When a “work that uses the Library” uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + +**6.** As an exception to the Sections above, you may also combine or +link a “work that uses the Library” with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + +* **a)** Accompany the work with the complete corresponding +machine-readable source code for the Library including whatever +changes were used in the work (which must be distributed under +Sections 1 and 2 above); and, if the work is an executable linked +with the Library, with the complete machine-readable “work that +uses the Library”, as object code and/or source code, so that the +user can modify the Library and then relink to produce a modified +executable containing the modified Library. (It is understood +that the user who changes the contents of definitions files in the +Library will not necessarily be able to recompile the application +to use the modified definitions.) +* **b)** Use a suitable shared library mechanism for linking with the +Library. A suitable mechanism is one that (1) uses at run time a +copy of the library already present on the user's computer system, +rather than copying library functions into the executable, and (2) +will operate properly with a modified version of the library, if +the user installs one, as long as the modified version is +interface-compatible with the version that the work was made with. +* **c)** Accompany the work with a written offer, valid for at +least three years, to give the same user the materials +specified in Subsection 6a, above, for a charge no more +than the cost of performing this distribution. +* **d)** If distribution of the work is made by offering access to copy +from a designated place, offer equivalent access to copy the above +specified materials from the same place. +* **e)** Verify that the user has already received a copy of these +materials or that you have already sent this user a copy. + +For an executable, the required form of the “work that uses the +Library” must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + +It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + +**7.** You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + +* **a)** Accompany the combined library with a copy of the same work +based on the Library, uncombined with any other library +facilities. This must be distributed under the terms of the +Sections above. +* **b)** Give prominent notice with the combined library of the fact +that part of it is a work based on the Library, and explaining +where to find the accompanying uncombined form of the same work. + +**8.** You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + +**9.** You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + +**10.** Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + +**11.** If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +**12.** If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + +**13.** The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +“any later version”, you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + +**14.** If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +### NO WARRANTY + +**15.** BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY “AS IS” WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +**16.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + +To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +“copyright” line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a “copyright disclaimer” for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + +[Back to TOC](#table-of-contents) + +## GNU Free Documentation License + +Version 1.3, 3 November 2008 + +Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. <> + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +### 0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document “free” in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of “copyleft”, which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +### 1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The “Document”, below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as “you”. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A “Modified Version” of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A “Secondary Section” is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The “Invariant Sections” are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The “Cover Texts” are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A “Transparent” copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not “Transparent” is called “Opaque”. + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The “Title Page” means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, “Title Page” means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The “publisher” means any person or entity that distributes copies of +the Document to the public. + +A section “Entitled XYZ” means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as “Acknowledgements”, +“Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” +of such a section when you modify the Document means that it remains a +section “Entitled XYZ” according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +### 2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no +other conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +### 3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to +give them a chance to provide you with an updated version of the +Document. + + +### 4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +* **A.** Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. +* **B.** List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. +* **C.** State on the Title page the name of the publisher of the +Modified Version, as the publisher. +* **D.** Preserve all the copyright notices of the Document. +* **E.** Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. +* **F.** Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. +* **G.** Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. +* **H.** Include an unaltered copy of this License. +* **I.** Preserve the section Entitled “History”, Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled “History” in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. +* **J.** Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the “History” section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. +* **K.** For any section Entitled “Acknowledgements” or “Dedications”, +Preserve the Title of the section, and preserve in the section all +the substance and tone of each of the contributor acknowledgements +and/or dedications given therein. +* **L.** Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. +* **M.** Delete any section Entitled “Endorsements”. Such a section +may not be included in the Modified Version. +* **N.** Do not retitle any existing section to be Entitled “Endorsements” +or to conflict in title with any Invariant Section. +* **O.** Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled “Endorsements”, provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +### 5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled “History” +in the various original documents, forming one section Entitled +“History”; likewise combine any sections Entitled “Acknowledgements”, +and any sections Entitled “Dedications”. You must delete all sections +Entitled “Endorsements”. + + +### 6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other +documents released under this License, and replace the individual +copies of this License in the various documents with a single copy +that is included in the collection, provided that you follow the rules +of this License for verbatim copying of each of the documents in all +other respects. + +You may extract a single document from such a collection, and +distribute it individually under this License, provided you insert a +copy of this License into the extracted document, and follow this +License in all other respects regarding verbatim copying of that +document. + + +### 7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an “aggregate” if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +### 8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled “Acknowledgements”, +“Dedications”, or “History”, the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +### 9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + + +### 10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions of the +GNU Free Documentation License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. See +<>. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License “or any later version” applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +### 11. RELICENSING + +“Massive Multiauthor Collaboration Site” (or “MMC Site”) means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +“Massive Multiauthor Collaboration” (or “MMC”) contained in the site +means any set of copyrightable works thus published on the MMC site. + +“CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +“Incorporate” means to publish or republish a Document, in whole or in +part, as part of another Document. + +An MMC is “eligible for relicensing” if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole or +in part into the MMC, (1) had no cover texts or invariant sections, and +(2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + + +## ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled “GNU + Free Documentation License”. + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the `with...Texts.` line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +[Back to TOC](#table-of-contents) + +## Thanks + +This library has been originally developed under the zencoders flags and this community has always supported me all along this work so I am happy to put the logo on this readme. + + When you see this tree, know that you've came across ZenCoders + + with open('ZenCoders. + `num` in numbers synchronized + datetime d glob. sys.argv[2] . + def myclass `..` @@oscla org. . class { + displ hooks( public static void ma functor: + $myclass->method( impport sys, os.pipe ` @param name` + fcl if(system(cmd) myc. /de ` $card( array("a" srand + format lists: ++: conc ++ "my an WHERE for( == myi + `sys: myvalue(myvalue) sys.t Console.W try{ rais using + connec SELECT * FROM table mycnf acco desc and or selector::clas at + openldap string sys. print "zenc der " { 'a': `ls -l` > appe &firs + import Tkinter paste( $obh &a or it myval bro roll: :: [] require a + case `` super. +y expr say " %rooms 1 --account fb- yy + proc meth Animate => send(D, open) putd EndIf 10 whi myc` cont + and main (--) import loop $$ or end onload UNION WITH tab timer 150 *2 + end. begin True GtkLabel *label doto partition te let auto i<- (i + d ); + .mushup ``/. ^/zenc/ myclass->her flv op <> element >> 71 or + QFileDi : and .. with myc toA channel::bo myc isEmpty a not bodt; + class T public pol str mycalc d pt &&a *i fc add ^ac + ::ZenCoders::core::namespac boost::function st f = std: ;; int assert + cout << endl public genera #include "b ost ::ac myna const cast mys + ac size_t return ran int (*getNextValue)(void) ff double sa_family_t famil + pu a do puts(" ac int main(int argc, char* "%5d struct nam + cs float for typedef enum puts getchar() + if( else #define fp FILE* f char* s + i++ strcat( %s int + 31] total+= do + }do while(1) sle + getc strcpy( a for + prin scanf(%d, & get + int void myfunc(int pa retu + BEQ BNEQZ R1 10 ANDI R1 R2 SYS + XOR SYSCALL 5 SLTIU MFLO 15 SW JAL + BNE BLTZAL R1 1 LUI 001 NOOP MULTU SLLV + MOV R1 ADD R1 R2 JUMP 10 1001 BEQ R1 R2 1 ANDI + 1101 1010001100 111 001 01 1010 101100 1001 100 + 110110 100 0 01 101 01100 100 100 1000100011 + 11101001001 00 11 100 11 10100010 + 000101001001 10 1001 101000101 + 010010010010110101001010 + +For further information: +visit our website https://zencoders.github.io + +**Author:** Sebastiano Merlino + +[Back to TOC](#table-of-contents) diff --git a/3rd_party/libhttpserver-0.18.2/acinclude.m4 b/3rd_party/libhttpserver-0.18.2/acinclude.m4 new file mode 100644 index 00000000..d9a951c0 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/acinclude.m4 @@ -0,0 +1,321 @@ +# This file is part of Autoconf. -*- Autoconf -*- + +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Autoconf macro files. + +########## CHANGELOG ################## +# 2009-01-14 Martin Mann +# * DX_ARG_ABLE : new variable 'DX_FLAG_DX_CURRENT_FEATURE' +# * DX_CLEAR_DEPEND : use of explicit variable 'DX_FLAG_DX_CURRENT_FEATURE' +# in AC_SUBST instead of 'DX_FLAG[]DX_CURRENT_FEATURE' which is rejected by +# newer autotools + +# Generate automatic documentation using Doxygen. Works in concert with the +# aminclude.m4 file and a compatible doxygen configuration file. Defines the +# following public macros: +# +# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature. +# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics, +# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI' +# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF', +# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment +# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide' +# paper size. +# +# By default, HTML, PDF and PS documentation is generated as this seems to be +# the most popular and portable combination. MAN pages created by Doxygen are +# usually problematic, though by picking an appropriate subset and doing some +# massaging they might be better than nothing. CHM and RTF are specific for MS +# (note that you can't generate both HTML and CHM at the same time). The XML is +# rather useless unless you apply specialized post-processing to it. +# +# The macro mainly controls the default state of the feature. The use can +# override the default by specifying --enable or --disable. The macros ensure +# that contradictory flags are not given (e.g., --enable-doxygen-html and +# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.) +# Finally, each feature will be automatically disabled (with a warning) if the +# required programs are missing. +# +# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with +# the following parameters: a one-word name for the project for use as a +# filename base etc., an optional configuration file name (the default is +# 'Doxyfile', the same as Doxygen's default), and an optional output directory +# name (the default is 'doxygen-doc'). + +## ----------## +## Defaults. ## +## ----------## + +DX_ENV="" +AC_DEFUN([DX_FEATURE_doc], ON) +AC_DEFUN([DX_FEATURE_dot], ON) +AC_DEFUN([DX_FEATURE_man], OFF) +AC_DEFUN([DX_FEATURE_html], ON) +AC_DEFUN([DX_FEATURE_chm], OFF) +AC_DEFUN([DX_FEATURE_chi], OFF) +AC_DEFUN([DX_FEATURE_rtf], OFF) +AC_DEFUN([DX_FEATURE_xml], OFF) +AC_DEFUN([DX_FEATURE_pdf], ON) +AC_DEFUN([DX_FEATURE_ps], ON) + +## --------------- ## +## Private macros. ## +## --------------- ## + +# DX_ENV_APPEND(VARIABLE, VALUE) +# ------------------------------ +# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen. +AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])]) + +# DX_DIRNAME_EXPR +# --------------- +# Expand into a shell expression prints the directory part of a path. +AC_DEFUN([DX_DIRNAME_EXPR], + [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']]) + +# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF) +# ------------------------------------- +# Expands according to the M4 (static) status of the feature. +AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])]) + +# DX_REQUIRE_PROG(VARIABLE, PROGRAM) +# ---------------------------------- +# Require the specified program to be found for the DX_CURRENT_FEATURE to work. +AC_DEFUN([DX_REQUIRE_PROG], [ +AC_PATH_TOOL([$1], [$2]) +if test "$DX_FLAG_DX_CURRENT_FEATURE$$1" = 1; then + AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION]) + AC_SUBST([DX_FLAG_DX_CURRENT_FEATURE], 0) +fi +]) + +# DX_TEST_FEATURE(FEATURE) +# ------------------------ +# Expand to a shell expression testing whether the feature is active. +AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1]) + +# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE) +# ------------------------------------------------- +# Verify that a required features has the right state before trying to turn on +# the DX_CURRENT_FEATURE. +AC_DEFUN([DX_CHECK_DEPEND], [ +test "$DX_FLAG_$1" = "$2" \ +|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1, + requires, contradicts) doxygen-DX_CURRENT_FEATURE]) +]) + +# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE) +# ---------------------------------------------------------- +# Turn off the DX_CURRENT_FEATURE if the required feature is off. +AC_DEFUN([DX_CLEAR_DEPEND], [ +test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_DX_CURRENT_FEATURE], 0) +]) + + +# DX_FEATURE_ARG(FEATURE, DESCRIPTION, +# CHECK_DEPEND, CLEAR_DEPEND, +# REQUIRE, DO-IF-ON, DO-IF-OFF) +# -------------------------------------------- +# Parse the command-line option controlling a feature. CHECK_DEPEND is called +# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND), +# otherwise CLEAR_DEPEND is called to turn off the default state if a required +# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional +# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and +# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature. +AC_DEFUN([DX_ARG_ABLE], [ + AC_DEFUN([DX_CURRENT_FEATURE], [$1]) + AC_DEFUN([DX_FLAG_DX_CURRENT_FEATURE], [DX_FLAG_$1]) + AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2]) + AC_ARG_ENABLE(doxygen-$1, + [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1], + [--enable-doxygen-$1]), + DX_IF_FEATURE([$1], [don't $2], [$2]))], + [ +case "$enableval" in +#( +y|Y|yes|Yes|YES) + AC_SUBST([DX_FLAG_$1], 1) + $3 +;; #( +n|N|no|No|NO) + AC_SUBST([DX_FLAG_$1], 0) +;; #( +*) + AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1]) +;; +esac +], [ +AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)]) +$4 +]) +if DX_TEST_FEATURE([$1]); then + $5 + : +fi +if DX_TEST_FEATURE([$1]); then + AM_CONDITIONAL(DX_COND_$1, :) + $6 + : +else + AM_CONDITIONAL(DX_COND_$1, false) + $7 + : +fi +]) + +## -------------- ## +## Public macros. ## +## -------------- ## + +# DX_XXX_FEATURE(DEFAULT_STATE) +# ----------------------------- +AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])]) +AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])]) +AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])]) +AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])]) +AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])]) +AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])]) +AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])]) +AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])]) + +# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR]) +# --------------------------------------------------------- +# PROJECT also serves as the base name for the documentation files. +# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc". +AC_DEFUN([DX_INIT_DOXYGEN], [ + +# Files: +AC_SUBST([DX_PROJECT], [$1]) +AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])]) +AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])]) + +# Environment variables used inside doxygen.cfg: +DX_ENV_APPEND(SRCDIR, $srcdir) +DX_ENV_APPEND(PROJECT, $DX_PROJECT) +DX_ENV_APPEND(DOCDIR, $DX_DOCDIR) +DX_ENV_APPEND(VERSION, $PACKAGE_VERSION) + +# Doxygen itself: +DX_ARG_ABLE(doc, [generate any doxygen documentation], + [], + [], + [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen) + DX_REQUIRE_PROG([DX_PERL], perl)], + [DX_ENV_APPEND(PERL_PATH, $DX_PERL)]) + +# Dot for graphics: +DX_ARG_ABLE(dot, [generate graphics for doxygen documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_DOT], dot)], + [DX_ENV_APPEND(HAVE_DOT, YES) + DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])], + [DX_ENV_APPEND(HAVE_DOT, NO)]) + +# Man pages generation: +DX_ARG_ABLE(man, [generate doxygen manual pages], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_MAN, YES)], + [DX_ENV_APPEND(GENERATE_MAN, NO)]) + +# RTF file generation: +DX_ARG_ABLE(rtf, [generate doxygen RTF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_RTF, YES)], + [DX_ENV_APPEND(GENERATE_RTF, NO)]) + +# XML file generation: +DX_ARG_ABLE(xml, [generate doxygen XML documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [], + [DX_ENV_APPEND(GENERATE_XML, YES)], + [DX_ENV_APPEND(GENERATE_XML, NO)]) + +# (Compressed) HTML help generation: +DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_HHC], hhc)], + [DX_ENV_APPEND(HHC_PATH, $DX_HHC) + DX_ENV_APPEND(GENERATE_HTML, YES) + DX_ENV_APPEND(GENERATE_HTMLHELP, YES)], + [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)]) + +# Seperate CHI file generation. +DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file], + [DX_CHECK_DEPEND(chm, 1)], + [DX_CLEAR_DEPEND(chm, 1)], + [], + [DX_ENV_APPEND(GENERATE_CHI, YES)], + [DX_ENV_APPEND(GENERATE_CHI, NO)]) + +# Plain HTML pages generation: +DX_ARG_ABLE(html, [generate doxygen plain HTML documentation], + [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)], + [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)], + [], + [DX_ENV_APPEND(GENERATE_HTML, YES)], + [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)]) + +# PostScript file generation: +DX_ARG_ABLE(ps, [generate doxygen PostScript documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_LATEX], latex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_DVIPS], dvips) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# PDF file generation: +DX_ARG_ABLE(pdf, [generate doxygen PDF documentation], + [DX_CHECK_DEPEND(doc, 1)], + [DX_CLEAR_DEPEND(doc, 1)], + [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex) + DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex) + DX_REQUIRE_PROG([DX_EGREP], egrep)]) + +# LaTeX generation for PS and/or PDF: +if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then + AM_CONDITIONAL(DX_COND_latex, :) + DX_ENV_APPEND(GENERATE_LATEX, YES) +else + AM_CONDITIONAL(DX_COND_latex, false) + DX_ENV_APPEND(GENERATE_LATEX, NO) +fi + +# Paper size for PS and/or PDF: +AC_ARG_VAR(DOXYGEN_PAPER_SIZE, + [a4wide (default), a4, letter, legal or executive]) +case "$DOXYGEN_PAPER_SIZE" in +#( +"") + AC_SUBST(DOXYGEN_PAPER_SIZE, "") +;; #( +a4wide|a4|letter|legal|executive) + DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE) +;; #( +*) + AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE']) +;; +esac + +#For debugging: +#echo DX_FLAG_doc=$DX_FLAG_doc +#echo DX_FLAG_dot=$DX_FLAG_dot +#echo DX_FLAG_man=$DX_FLAG_man +#echo DX_FLAG_html=$DX_FLAG_html +#echo DX_FLAG_chm=$DX_FLAG_chm +#echo DX_FLAG_chi=$DX_FLAG_chi +#echo DX_FLAG_rtf=$DX_FLAG_rtf +#echo DX_FLAG_xml=$DX_FLAG_xml +#echo DX_FLAG_pdf=$DX_FLAG_pdf +#echo DX_FLAG_ps=$DX_FLAG_ps +#echo DX_ENV=$DX_ENV +]) diff --git a/3rd_party/libhttpserver-0.18.2/aminclude.am b/3rd_party/libhttpserver-0.18.2/aminclude.am new file mode 100644 index 00000000..420049ec --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/aminclude.am @@ -0,0 +1,186 @@ +# Copyright (C) 2004 Oren Ben-Kiki +# This file is distributed under the same terms as the Automake macro files. + +# Generate automatic documentation using Doxygen. Goals and variables values +# are controlled by the various DX_COND_??? conditionals set by autoconf. +# +# The provided goals are: +# doxygen-doc: Generate all doxygen documentation. +# doxygen-run: Run doxygen, which will generate some of the documentation +# (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post +# processing required for the rest of it (PS, PDF, and some MAN). +# doxygen-man: Rename some doxygen generated man pages. +# doxygen-ps: Generate doxygen PostScript documentation. +# doxygen-pdf: Generate doxygen PDF documentation. +# +# Note that by default these are not integrated into the automake goals. If +# doxygen is used to generate man pages, you can achieve this integration by +# setting man3_MANS to the list of man pages generated and then adding the +# dependency: +# +# $(man3_MANS): doxygen-doc +# +# This will cause make to run doxygen and generate all the documentation. +# +# The following variable is intended for use in Makefile.am: +# +# DX_CLEANFILES = everything to clean. +# +# This is usually added to MOSTLYCLEANFILES. + +## --------------------------------- ## +## Format-independent Doxygen rules. ## +## --------------------------------- ## + +if DX_COND_doc + +## ------------------------------- ## +## Rules specific for HTML output. ## +## ------------------------------- ## + +if DX_COND_html + +DX_CLEAN_HTML = @DX_DOCDIR@/html + +endif DX_COND_html + +## ------------------------------ ## +## Rules specific for CHM output. ## +## ------------------------------ ## + +if DX_COND_chm + +DX_CLEAN_CHM = @DX_DOCDIR@/chm + +if DX_COND_chi + +DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi + +endif DX_COND_chi + +endif DX_COND_chm + +## ------------------------------ ## +## Rules specific for MAN output. ## +## ------------------------------ ## + +if DX_COND_man + +DX_CLEAN_MAN = @DX_DOCDIR@/man + +endif DX_COND_man + +## ------------------------------ ## +## Rules specific for RTF output. ## +## ------------------------------ ## + +if DX_COND_rtf + +DX_CLEAN_RTF = @DX_DOCDIR@/rtf + +endif DX_COND_rtf + +## ------------------------------ ## +## Rules specific for XML output. ## +## ------------------------------ ## + +if DX_COND_xml + +DX_CLEAN_XML = @DX_DOCDIR@/xml + +endif DX_COND_xml + +## ----------------------------- ## +## Rules specific for PS output. ## +## ----------------------------- ## + +if DX_COND_ps + +DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps + +DX_PS_GOAL = doxygen-ps + +doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps + +@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_LATEX) refman.tex; \ + $(MAKEINDEX_PATH) refman.idx; \ + $(DX_LATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_LATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi + +endif DX_COND_ps + +## ------------------------------ ## +## Rules specific for PDF output. ## +## ------------------------------ ## + +if DX_COND_pdf + +DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf + +DX_PDF_GOAL = doxygen-pdf + +doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf + +@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag + cd @DX_DOCDIR@/latex; \ + rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ + $(DX_PDFLATEX) refman.tex; \ + $(DX_MAKEINDEX) refman.idx; \ + $(DX_PDFLATEX) refman.tex; \ + countdown=5; \ + while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \ + refman.log > /dev/null 2>&1 \ + && test $$countdown -gt 0; do \ + $(DX_PDFLATEX) refman.tex; \ + countdown=`expr $$countdown - 1`; \ + done; \ + mv refman.pdf ../@PACKAGE@.pdf + +endif DX_COND_pdf + +## ------------------------------------------------- ## +## Rules specific for LaTeX (shared for PS and PDF). ## +## ------------------------------------------------- ## + +if DX_COND_latex + +DX_CLEAN_LATEX = @DX_DOCDIR@/latex + +endif DX_COND_latex + +.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) + +.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag + +doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL) + +@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS) + rm -rf @DX_DOCDIR@ + $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG) + +DX_CLEANFILES = \ + @DX_DOCDIR@/@PACKAGE@.tag \ + -r \ + $(DX_CLEAN_HTML) \ + $(DX_CLEAN_CHM) \ + $(DX_CLEAN_CHI) \ + $(DX_CLEAN_MAN) \ + $(DX_CLEAN_RTF) \ + $(DX_CLEAN_XML) \ + $(DX_CLEAN_PS) \ + $(DX_CLEAN_PDF) \ + $(DX_CLEAN_LATEX) + +endif DX_COND_doc diff --git a/3rd_party/libhttpserver-0.18.2/appveyor.yml b/3rd_party/libhttpserver-0.18.2/appveyor.yml new file mode 100644 index 00000000..c86df7e5 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/appveyor.yml @@ -0,0 +1,24 @@ +platform: x64 + +environment: + matrix: + - compiler: msys2 + MINGW_CHOST: x86_64-w64-mingw32 + MSYS2_ARCH: x86_64 +init: + - 'echo Building libhttpserver %version% for Windows' + - 'echo System architecture: %PLATFORM%' + - 'echo Repo build branch is: %APPVEYOR_REPO_BRANCH%' + - 'echo Build folder is: %APPVEYOR_BUILD_FOLDER%' + - 'echo Repo build commit is: %APPVEYOR_REPO_COMMIT%' + - 'echo Cygwin root is: %CYG_ROOT%' +install: + - 'if "%compiler%"=="msys2" C:\msys64\msys2_shell.cmd -defterm -no-start -msys2 -c "pacman --noconfirm --force -S --needed mingw-w64-$MSYS2_ARCH-{libtool,make,pkg-config,libsystre,doxygen,gnutls,graphviz,curl}"' + - 'if "%compiler%"=="msys2" C:\msys64\msys2_shell.cmd -defterm -no-start -mingw64 -full-path -here -c "cd $APPVEYOR_BUILD_FOLDER && curl https://s3.amazonaws.com/libhttpserver/libmicrohttpd_releases/libmicrohttpd-0.9.59.tar.gz -o libmicrohttpd-0.9.59.tar.gz"' + - 'if "%compiler%"=="msys2" C:\msys64\msys2_shell.cmd -defterm -no-start -mingw64 -full-path -here -c "cd $APPVEYOR_BUILD_FOLDER && tar -xzf libmicrohttpd-0.9.59.tar.gz"' + - 'if "%compiler%"=="msys2" C:\msys64\msys2_shell.cmd -defterm -no-start -mingw64 -full-path -here -c "cd $APPVEYOR_BUILD_FOLDER/libmicrohttpd-0.9.59 && ./configure --disable-examples --enable-poll=no --prefix /C/msys64 && make && make install"' + - 'if "%compiler%"=="msys2" C:\msys64\msys2_shell.cmd -defterm -no-start -mingw64 -full-path -here -c "cd $APPVEYOR_BUILD_FOLDER && ./bootstrap"' + - 'if "%compiler%"=="msys2" C:\msys64\msys2_shell.cmd -defterm -no-start -mingw64 -full-path -here -c "cd $APPVEYOR_BUILD_FOLDER && mkdir build && cd build && MANIFEST_TOOL=no; ../configure --disable-fastopen --prefix /C/msys64 CXXFLAGS=-I/C/msys64/include LDFLAGS=-L/C/msys64/lib; make"' +build_script: + - 'if "%compiler%"=="msys2" C:\msys64\msys2_shell.cmd -defterm -no-start -mingw64 -full-path -here -c "cd $APPVEYOR_BUILD_FOLDER/build && make check"' + - 'if "%compiler%"=="msys2" C:\msys64\msys2_shell.cmd -defterm -no-start -mingw64 -full-path -here -c "cd $APPVEYOR_BUILD_FOLDER/build && cat test/test-suite.log"' diff --git a/3rd_party/libhttpserver-0.18.2/bootstrap b/3rd_party/libhttpserver-0.18.2/bootstrap new file mode 100644 index 00000000..bc1ad731 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/bootstrap @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# +# This file is part of libhttpserver +# Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +aclocal -I m4 +autoheader +if [[ "$OSTYPE" == "darwin"* ]]; then + glibtoolize --automake +else + libtoolize --automake +fi +automake --add-missing +autoconf + +# Optionally do the build as well. +if [ "$1" = "-build" -o "$1" = "--build" ] ; then + shift + ./configure "$@" + make + make check +fi diff --git a/3rd_party/libhttpserver-0.18.2/ci-report-coverage b/3rd_party/libhttpserver-0.18.2/ci-report-coverage new file mode 100644 index 00000000..d8f72e16 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/ci-report-coverage @@ -0,0 +1,19 @@ +#!/bin/bash + +find ../ -name *.gcda + +echo "Copying files to the correct locations for correct gcov analysis" +cp -R ../src/* ./src/ +cp -R ../src/details/* ./src/details/ +cp -R ../src/httpserver/* ./src/httpserver/ +cp -R ../test/* ./test/ +cp -R ../test/integ/* ./test/integ/ +cp -R ../test/unit/* ./test/unit/ + +echo "Sending json report" +for filename in `find . | egrep '\.cpp'`; +do + gcov -n -o . $filename > /dev/null; +done + +codecov diff --git a/3rd_party/libhttpserver-0.18.2/cmakemodule/FindLibHttpServer.cmake b/3rd_party/libhttpserver-0.18.2/cmakemodule/FindLibHttpServer.cmake new file mode 100644 index 00000000..8617c252 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/cmakemodule/FindLibHttpServer.cmake @@ -0,0 +1,31 @@ +# - Find LibHttpServer + +if(LIBHTTPSERVER_INCLUDE_DIRS AND LIBHTTPSERVER_LIBRARIES) + set(LIBHTTPSERVER_FOUND TRUE) + +else(LIBHTTPSERVER_INCLUDE_DIRS AND LIBHTTPSERVER_LIBRARIES) + find_path(LIBHTTPSERVER_INCLUDE_DIRS httpserverpp + /usr/include + /usr/include/httpserver + /usr/local/include/ + /usr/local/include/httpserver + ) + + find_library(LIBHTTPSERVER_LIBRARIES NAMES httpserver + PATHS + /usr/lib + /usr/local/lib + /opt/local/lib + ) + + if(LIBHTTPSERVER_INCLUDE_DIRS AND LIBHTTPSERVER_LIBRARIES) + set(LIBHTTPSERVER_FOUND TRUE) + message(STATUS "Found libhttpserver: ${LIBHTTPSERVER_INCLUDE_DIRS}, ${LIBHTTPSERVER_LIBRARIES}") + else(LIBHTTPSERVER_INCLUDE_DIRS AND LIBHTTPSERVER_LIBRARIES) + set(LIBHTTPSERVER_FOUND FALSE) + message(STATUS "libhttpserver not found.") + endif(LIBHTTPSERVER_INCLUDE_DIRS AND LIBHTTPSERVER_LIBRARIES) + + mark_as_advanced(LIBHTTPSERVER_INCLUDE_DIRS LIBHTTPSERVER_LIBRARIES) + +endif(LIBHTTPSERVER_INCLUDE_DIRS AND LIBHTTPSERVER_LIBRARIES) diff --git a/3rd_party/libhttpserver-0.18.2/configure.ac b/3rd_party/libhttpserver-0.18.2/configure.ac new file mode 100644 index 00000000..8fc0e314 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/configure.ac @@ -0,0 +1,378 @@ +# +# This file is part of libhttpserver +# Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.57) +m4_define([libhttpserver_MAJOR_VERSION],[0])dnl +m4_define([libhttpserver_MINOR_VERSION],[18])dnl +m4_define([libhttpserver_REVISION],[1])dnl +m4_define([libhttpserver_PKG_VERSION],[libhttpserver_MAJOR_VERSION.libhttpserver_MINOR_VERSION.libhttpserver_REVISION])dnl +m4_define([libhttpserver_LDF_VERSION],[libhttpserver_MAJOR_VERSION:libhttpserver_MINOR_VERSION:libhttpserver_REVISION])dnl +AC_INIT([libhttpserver], libhttpserver_PKG_VERSION, [electrictwister2000@gmail.com]) +AM_INIT_AUTOMAKE([subdir-objects]) +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_MACRO_DIR([m4]) +AC_CANONICAL_HOST + +AX_VALGRIND_DFLT +AX_VALGRIND_CHECK + +OLD_CXXFLAGS=$CXXFLAGS +LT_INIT +AC_PROG_CC +AC_PROG_CXX() +AC_PROG_LN_S +CXXFLAGS=$OLD_CXXFLAGS +AC_LANG([C++]) +AC_SYS_LARGEFILE + +native_srcdir=$srcdir + +AC_MSG_CHECKING([whether it is possible to compile in the same directory]) +AC_ARG_ENABLE([same-directory-build], + [AS_HELP_STRING([--enable-same-directory-build], + [enable to compile in the same directory. This is heavily discouraged. (def=no)])], + [samedirectory="$enableval"], + [samedirectory=no]) +AC_MSG_RESULT([$samedirectory]) + +if test x"$samedirectory" = x"no"; then + if test "`cd $srcdir; /bin/pwd`" = "`/bin/pwd`"; then + AC_MSG_ERROR("you must configure in a separate build directory") + fi +fi + +is_windows=yes; +NETWORK_LIBS="" +case "$host" in + *-mingw*) + NETWORK_HEADER="winsock2.h" + ADDITIONAL_LIBS="-lpthread -no-undefined" + NETWORK_LIBS="-lws2_32" + native_srcdir=$(cd $srcdir; pwd -W) + ;; + *-cygwin*) + NETWORK_HEADER="arpa/inet.h" + ADDITIONAL_LIBS="-lpthread -no-undefined" + ;; + *) + NETWORK_HEADER="arpa/inet.h" + ADDITIONAL_LIBS="" + is_windows=no + ;; +esac + +# Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADER([stdint.h],[],[AC_MSG_ERROR("stdint.h not found")]) +AC_CHECK_HEADER([inttypes.h],[],[AC_MSG_ERROR("inttypes.h not found")]) +AC_CHECK_HEADER([errno.h],[],[AC_MSG_ERROR("errno.h not found")]) +AC_CHECK_HEADER([unistd.h],[],[AC_MSG_ERROR("unistd.h not found")]) +AC_CHECK_HEADER([ctype.h],[],[AC_MSG_ERROR("cctype not found")]) +AC_CHECK_HEADER([sys/stat.h],[],[AC_MSG_ERROR("sys/stat.h not found")]) +AC_CHECK_HEADER([sys/types.h],[],[AC_MSG_ERROR("sys/types.h not found")]) +AC_CHECK_HEADER([$NETWORK_HEADER],[],[AC_MSG_ERROR("$NETWORK_HEADER not found")]) +AC_CHECK_HEADER([signal.h],[],[AC_MSG_ERROR("signal.h not found")]) + +AC_CHECK_HEADER([gnutls/gnutls.h],[have_gnutls="yes"],[AC_MSG_WARN("gnutls/gnutls.h not found. TLS will be disabled"); have_gnutls="no"]) + +# Checks for libmicrohttpd +if test x"$host" = x"$build"; then + AC_CHECK_HEADER([microhttpd.h], + AC_CHECK_LIB([microhttpd], [MHD_get_fdset2], + [AC_MSG_CHECKING([for libmicrohttpd >= 0.9.52]) + AC_COMPILE_IFELSE( + [AC_LANG_SOURCE([ + #include + #if (MHD_VERSION < 0x00095102) + #error needs at least version 0.9.52 + #endif + int main () { return 0; } + ])], + [], + [AC_MSG_ERROR("libmicrohttpd is too old - install libmicrohttpd >= 0.9.52")] + ) + ], + [AC_MSG_ERROR(["libmicrohttpd not found"])] + ), + [AC_MSG_ERROR(["microhttpd.h not found"])] + ) + + CXXFLAGS="-std=c++11 -DHTTPSERVER_COMPILATION -D_REENTRANT $LIBMICROHTTPD_CFLAGS $CXXFLAGS" + LDFLAGS="$LIBMICROHTTPD_LIBS $NETWORK_LIBS $ADDITIONAL_LIBS $LDFLAGS" + + cond_cross_compile="no" +else + AC_CHECK_HEADER([microhttpd.h], + AC_CHECK_LIB([microhttpd], [MHD_get_fdset2], + [], + [AC_MSG_ERROR(["libmicrohttpd not found"])] + ), + [AC_MSG_ERROR(["microhttpd.h not found"])] + ) + + CXXFLAGS="-std=c++11 -DHTTPSERVER_COMPILATION -D_REENTRANT $CXXFLAGS" + LDFLAGS="$NETWORK_LIBS $ADDITIONAL_LIBS $LDFLAGS" + + cond_cross_compile="yes" +fi + +AM_CONDITIONAL([COND_CROSS_COMPILE],[test x"$cond_cross_compile" = x"yes"]) +AC_SUBST(COND_CROSS_COMPILE) + +AC_MSG_CHECKING([whether to build with TCP_FASTOPEN support]) +AC_ARG_ENABLE([fastopen], + [AS_HELP_STRING([--enable-fastopen], + [enable use of TCP_FASTOPEN (def=yes)])], + [fastopen="$enableval"], + [fastopen=yes]) +AC_MSG_RESULT([$fastopen]) + +is_fastopen_supported=no; +if test x"$fastopen" = x"yes"; then + if test x"$is_windows" = x"no"; then + if test `uname -r |cut -d. -f1` -ge 3; then + if test `uname -r |cut -d. -f2` -ge 7; then + CXXFLAGS="-DUSE_FASTOPEN $CXXFLAGS"; + is_fastopen_supported=yes; + fi + fi + fi +fi + +AC_ARG_ENABLE([[poll]], + [AS_HELP_STRING([[--enable-poll[=ARG]]], [enable poll support (yes, no, auto) [auto]])], + [enable_poll=${enableval}], + [enable_poll='auto'] + ) + +if test "$enable_poll" != "no"; then + if test "$os_is_native_w32" != "yes"; then + AC_CHECK_HEADERS([poll.h], + [ + AC_CHECK_FUNCS([poll], [have_poll='yes'], [have_poll='no']) + ], [], [AC_INCLUDES_DEFAULT]) + else + AC_MSG_CHECKING([for WSAPoll()]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#include + ]], [[ +WSAPOLLFD fda[2]; +WSAPoll(fda, 2, 0);]])], + [ + have_poll='yes' + AC_DEFINE([HAVE_POLL],[1]) + ], [have_poll='no']) + AC_MSG_RESULT([$have_poll]) + fi + if test "$enable_poll" = "yes" && test "$have_poll" != "yes"; then + AC_MSG_ERROR([[Support for poll was explicitly requested but cannot be enabled on this platform.]]) + fi + enable_poll="$have_poll" +fi + +if test x"$enable_poll" = x"yes"; then + AM_CXXFLAGS="$AM_CXXFLAGS -DENABLE_POLL" + AM_CFLAGS="$AM_CXXFLAGS -DENABLE_POLL" +fi + +AC_ARG_ENABLE([[epoll]], + [AS_HELP_STRING([[--enable-epoll[=ARG]]], [enable epoll support (yes, no, auto) [auto]])], + [enable_epoll=${enableval}], + [enable_epoll='auto'] + ) + +if test "$enable_epoll" != "no"; then + AX_HAVE_EPOLL + if test "${ax_cv_have_epoll}" = "yes"; then + AC_DEFINE([[EPOLL_SUPPORT]],[[1]],[Define to 1 to enable epoll support]) + enable_epoll='yes' + else + if test "$enable_epoll" = "yes"; then + AC_MSG_ERROR([[Support for epoll was explicitly requested but cannot be enabled on this platform.]]) + fi + enable_epoll='no' + fi +fi + +AM_CONDITIONAL([MHD_HAVE_EPOLL], [[test "x$enable_epoll" = xyes]]) + +if test "x$enable_epoll" = "xyes"; then + AC_CACHE_CHECK([for epoll_create1()], [mhd_cv_have_epoll_create1], [ + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ +#include + ]], [[ +int fd; +fd = epoll_create1(EPOLL_CLOEXEC);]])], + [mhd_cv_have_epoll_create1=yes], + [mhd_cv_have_epoll_create1=no])]) + AS_IF([test "x$mhd_cv_have_epoll_create1" = "xyes"],[ + AC_DEFINE([[HAVE_EPOLL_CREATE1]], [[1]], [Define if you have epoll_create1 function.])]) +fi + +if test x"$enable_epoll" = x"yes"; then + AM_CXXFLAGS="$AM_CXXFLAGS -DENABLE_EPOLL" + AM_CFLAGS="$AM_CXXFLAGS -DENABLE_EPOLL" +fi + +AC_MSG_CHECKING([whether to link statically]) +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static], + [enable use static linking (def=yes)])], + [static="$enableval"], + [static=yes]) +AC_MSG_RESULT([$static]) + +if test x"$static" = x"$yes"; then + LDFLAGS="-static $LDFLAGS"; +fi + +m4_pattern_allow([AC_TYPE_SIZE_T]) +m4_pattern_allow([AC_TYPE_UINT16_T]) +m4_pattern_allow([AC_TYPE_UINT32_T]) +m4_pattern_allow([AC_TYPE_UINT64_T]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_TYPE_SIZE_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T + +LHT_LIBDEPS="-lmicrohttpd" + +AC_MSG_CHECKING([whether to build with debug information]) +AC_ARG_ENABLE([debug], + [AS_HELP_STRING([--enable-debug], + [enable debug data generation (def=no)])], + [debugit="$enableval"], + [debugit=no]) +AC_MSG_RESULT([$debugit]) + +AM_LDFLAGS="-lstdc++" + +if test x"$debugit" = x"yes"; then + AC_DEFINE([DEBUG],[],[Debug Mode]) + AM_CXXFLAGS="$AM_CXXFLAGS -DDEBUG -g -Wall -Wno-uninitialized -O0" + AM_CFLAGS="$AM_CXXFLAGS -DDEBUG -g -Wall -Wno-uninitialized -O0" +else + AC_DEFINE([NDEBUG],[],[No-debug Mode]) + AM_CXXFLAGS="$AM_CXXFLAGS -O3" + AM_CFLAGS="$AM_CXXFLAGS -O3" +fi + +case $host_os in + darwin* ) + AM_CXXFLAGS="$AM_CXXFLAGS -DDARWIN" + AM_CFLAGS="$AM_CFLAGS -DDARWIN" + ;; + freebsd* ) + AM_LDFLAGS="" + ;; +esac + +AC_MSG_CHECKING([whether to build with coverage information]) +AC_ARG_ENABLE([coverage], + [AS_HELP_STRING([--enable-coverage], + [enable coverage data generation (def=no)])], + [coverit="$enableval"], + [coverit=no]) +AC_MSG_RESULT([$coverit]) + +if test x"$coverit" = x"yes"; then + case $host_os in + darwin* ) + echo "Coverage not supported on OSX" + cond_gcov="no" + ;; + *) + AC_CHECK_PROG(GCOV, gcov, gcov) + cond_gcov="yes" + ;; + esac +fi + +AC_ARG_ENABLE([[examples]], + [AS_HELP_STRING([[--disable-examples]], [do not build any examples])], , + [enable_examples=yes]) +test "x$enable_examples" = "xno" || enable_examples=yes +AM_CONDITIONAL([BUILD_EXAMPLES], [test "x$enable_examples" = "xyes"]) + +AM_CONDITIONAL([COND_GCOV],[test x"$cond_gcov" = x"yes"]) +AC_SUBST(COND_GCOV) + +if test x"have_gnutls" = x"yes"; then + AM_CXXFLAGS="$AM_CXXFLAGS -DHAVE_GNUTLS" + AM_CFLAGS="$AM_CXXFLAGS -DHAVE_GNUTLS" +fi + +DX_HTML_FEATURE(ON) +DX_CHM_FEATURE(OFF) +DX_CHI_FEATURE(OFF) +DX_MAN_FEATURE(ON) +DX_RTF_FEATURE(OFF) +DX_XML_FEATURE(OFF) +DX_PDF_FEATURE(OFF) +DX_PS_FEATURE(OFF) +DX_INIT_DOXYGEN([$PACKAGE_NAME],[doxyconfig.in]) + +LDFLAGS="$LDFLAGS -version-number libhttpserver_LDF_VERSION" + +AC_SUBST(LHT_LIBDEPS) +AC_SUBST(AM_CXXFLAGS) +AC_SUBST(AM_CFLAGS) +AC_SUBST(AM_LDFLAGS) +AC_SUBST(CPPFLAGS) +AC_SUBST(LIBS) +AC_SUBST(LDFLAGS) +AC_SUBST(EXT_LIB_PATH) +AC_SUBST(EXT_LIBS) + +AC_CONFIG_FILES([test/test_content:test/test_content]) +AC_CONFIG_FILES([test/cert.pem:test/cert.pem]) +AC_CONFIG_FILES([test/key.pem:test/key.pem]) +AC_CONFIG_FILES([test/test_root_ca.pem:test/test_root_ca.pem]) +AC_CONFIG_FILES([test/libhttpserver.supp:test/libhttpserver.supp]) +AC_CONFIG_FILES([examples/cert.pem:examples/cert.pem]) +AC_CONFIG_FILES([examples/key.pem:examples/key.pem]) +AC_CONFIG_FILES([examples/test_content:examples/test_content]) + +AC_OUTPUT( + libhttpserver.pc + Makefile + doc/Makefile + src/Makefile + test/Makefile + examples/Makefile +) + +AC_MSG_NOTICE([Configuration Summary: + Operating System: ${host_os} + Target directory: ${prefix} + License : LGPL only + Debug : ${debugit} + TLS Enabled : ${have_gnutls} + TCP_FASTOPEN : ${is_fastopen_supported} + poll support : ${enable_poll=no} + epoll support : ${enable_epoll=no} + Static : ${static} + Build examples : ${enable_examples} +]) diff --git a/3rd_party/libhttpserver-0.18.2/custom_iwyu.imp b/3rd_party/libhttpserver-0.18.2/custom_iwyu.imp new file mode 100644 index 00000000..e814a310 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/custom_iwyu.imp @@ -0,0 +1,17 @@ +[ + { include: ["\"microhttpd.h\"", "private", "", "public"] }, + { include: ["", "private", "", "public"] }, + + { symbol: ["std::exception", "private", "", "public"]}, + { symbol: ["std::shared_ptr", "private", "", "public"]}, + { symbol: ["std::uint16_t", "private", "", "public"]}, + { symbol: ["std::uint64_t", "private", "", "public"]}, + { symbol: ["std::istringstream", "private", "", "public"]}, + { symbol: ["std::stringstream", "private", "", "public"]}, + { symbol: ["std::ifstream", "private", "", "public"]}, + + { symbol: ["uint16_t", "private", "", "public"]}, + { symbol: ["uint64_t", "private", "", "public"]}, + + { symbol: ["MHD_Connection", "private", "", "public"]}, +] diff --git a/3rd_party/libhttpserver-0.18.2/doc/Makefile.am b/3rd_party/libhttpserver-0.18.2/doc/Makefile.am new file mode 100644 index 00000000..3598b431 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/doc/Makefile.am @@ -0,0 +1,20 @@ +# +# This file is part of libhttpserver +# Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +man_MANS = libhttpserver.3 +EXTRA_DIST = $(man_MANS) diff --git a/3rd_party/libhttpserver-0.18.2/doc/libhttpserver.3 b/3rd_party/libhttpserver-0.18.2/doc/libhttpserver.3 new file mode 100644 index 00000000..edcea3a9 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/doc/libhttpserver.3 @@ -0,0 +1,59 @@ +.\" Copyright (c) 2014, Sebastiano Merlino +.\" +.\" %%%LICENSE_START(VERBATIM) +.\" Permission is granted to make and distribute verbatim copies of this +.\" manual provided the copyright notice and this permission notice are +.\" preserved on all copies. +.\" +.\" Permission is granted to copy and distribute modified versions of +.\" this manual under the conditions for verbatim copying, provided that +.\" the entire resulting derived work is distributed under the terms of +.\" a permission notice identical to this one. +.\" +.\" Since the Linux kernel and libraries are constantly changing, this +.\" manual page may be incorrect or out-of-date. The author(s) assume. +.\" no responsibility for errors or omissions, or for damages resulting. +.\" from the use of the information contained herein. The author(s) may. +.\" not have taken the same level of care in the production of this. +.\" manual, which is licensed free of charge, as they might when working. +.\" professionally. +.\" +.\" Formatted or processed versions of this manual, if unaccompanied by +.\" the source, must acknowledge the copyright and authors of this work. +.\" %%%LICENSE_END + +.TH LIBHTTPSERVER "3" "02 Mar 2013 "libhttpserver" +.SH "NAME" +libhttpserver \- C++ library for creating an embedded Rest HTTP server (and more) +.SH "SYNOPSIS" + + \fB#include + +.SH "DESCRIPTION" +.P +libhttpserver is an api made with the intent to allow to easily realize Rest based webservers. +.P +The details of the API are described in a detailed documentation and in doxygen generated code reference. +.P +.SH "SEE ALSO" +\fBcurl\fP(1), \fBlibcurl\fP(3), \fBlibmicrohttpd\fP(3) + +.SH "LEGAL NOTICE" +libhttpserver is released under the LGPL Version 2.1 or higher. For details on the license please read the appendix in the manual. + +.SH "FILES" +.TP +httpserver.hpp +libhttpserver include file +.TP +libhttpserver.so +libhttpserver library + +.SH "REPORTING BUGS" +Report bugs by using github issue tracker . + +.SH "AUTHORS" +GNU libhttpserver is designed and realized by Sebastiano Merlino . + +.SH "AVAILABILITY" +You can obtain the latest version from https://github.com/etr/libhttpserver . diff --git a/3rd_party/libhttpserver-0.18.2/examples/Makefile.am b/3rd_party/libhttpserver-0.18.2/examples/Makefile.am new file mode 100644 index 00000000..318a7a8d --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/Makefile.am @@ -0,0 +1,43 @@ +# +# This file is part of libhttpserver +# Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +LDADD = $(top_builddir)/src/libhttpserver.la +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/httpserver/ +METASOURCES = AUTO +noinst_PROGRAMS = hello_world service minimal_hello_world custom_error allowing_disallowing_methods handlers hello_with_get_arg setting_headers custom_access_log basic_authentication digest_authentication minimal_https minimal_file_response minimal_deferred url_registration minimal_ip_ban benchmark_select benchmark_threads benchmark_nodelay deferred_with_accumulator + +hello_world_SOURCES = hello_world.cpp +service_SOURCES = service.cpp +minimal_hello_world_SOURCES = minimal_hello_world.cpp +custom_error_SOURCES = custom_error.cpp +allowing_disallowing_methods_SOURCES = allowing_disallowing_methods.cpp +handlers_SOURCES = handlers.cpp +hello_with_get_arg_SOURCES = hello_with_get_arg.cpp +setting_headers_SOURCES = setting_headers.cpp +custom_access_log_SOURCES = custom_access_log.cpp +basic_authentication_SOURCES = basic_authentication.cpp +digest_authentication_SOURCES = digest_authentication.cpp +minimal_https_SOURCES = minimal_https.cpp +minimal_file_response_SOURCES = minimal_file_response.cpp +minimal_deferred_SOURCES = minimal_deferred.cpp +deferred_with_accumulator_SOURCES = deferred_with_accumulator.cpp +url_registration_SOURCES = url_registration.cpp +minimal_ip_ban_SOURCES = minimal_ip_ban.cpp +benchmark_select_SOURCES = benchmark_select.cpp +benchmark_threads_SOURCES = benchmark_threads.cpp +benchmark_nodelay_SOURCES = benchmark_nodelay.cpp diff --git a/3rd_party/libhttpserver-0.18.2/examples/README.md b/3rd_party/libhttpserver-0.18.2/examples/README.md new file mode 100644 index 00000000..d2faca33 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/README.md @@ -0,0 +1,58 @@ +Example Programs +================ + +hello_world.cpp - a very simple example of using libhttpserver to + create a Rest server capable of receiving and processing + HTTP requests. The server will be listening on port + 8080. + + +service.cpp - an example using more of the libhttpserver API. + This creates a Rest server capable of running with + HTTP or HTTPS (provided that libhttpserver and + libmicrohttpd have been compiled with SSL support. + + The server can be configured via command line + arguments: + + -p - port number to listen on (default 8080) + -s - enable HTTPS + -k - server key filename (default "key.pem") + -c - server certificate filename (default "cert.pem") + +Creating Certificates +===================== +Self-signed certificates can be created using OpenSSL using the +following steps: + + $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 + $ openssl rsa -passin pass:x -in server.pass.key -out server.key + $ openssl req -new -key server.key -out server.csr + $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt + +On the last step when prompted for a challenge password it can be left +empty. + +Thanks to https://devcenter.heroku.com/articles/ssl-certificate-self +for these instructions. + +Keystore configuration +====================== +If using a local client such as RestClient +(https://github.com/wiztools/rest-client) for testing the Rest server +then a keystore needs to be established. These commands should be +bundled with your Java installation. + +$ keytool -noprompt -import -keystore /path/to/restclient.store -alias +restclient -file /path/to/server.crt + +The keys in the store can be listed as follows: + +$ keytool -list -v -keystore /path/to/restclient.store + +The client can then be configured to use this keystore. Thanks to +http://rubensgomes.blogspot.com/2012/01/how-to-set-up-restclient-for-ssl.html +for instructions on configuring RestClient. + + + diff --git a/3rd_party/libhttpserver-0.18.2/examples/allowing_disallowing_methods.cpp b/3rd_party/libhttpserver-0.18.2/examples/allowing_disallowing_methods.cpp new file mode 100644 index 00000000..69295af4 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/allowing_disallowing_methods.cpp @@ -0,0 +1,42 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +class hello_world_resource : public http_resource { +public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + hwr.disallow_all(); + hwr.set_allowing("GET", true); + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/basic_authentication.cpp b/3rd_party/libhttpserver-0.18.2/examples/basic_authentication.cpp new file mode 100644 index 00000000..84de823e --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/basic_authentication.cpp @@ -0,0 +1,46 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +class user_pass_resource : public httpserver::http_resource +{ + public: + const std::shared_ptr render_GET(const http_request& req) + { + if (req.get_user() != "myuser" || req.get_pass() != "mypass") + { + return std::shared_ptr(new basic_auth_fail_response("FAIL", "test@example.com")); + } + return std::shared_ptr(new string_response(req.get_user() + " " + req.get_pass(), 200, "text/plain")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + user_pass_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/benchmark_nodelay.cpp b/3rd_party/libhttpserver-0.18.2/examples/benchmark_nodelay.cpp new file mode 100644 index 00000000..418f9f1c --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/benchmark_nodelay.cpp @@ -0,0 +1,42 @@ +#include +#include + +#include + +#define PATH "/plaintext" +#define BODY "Hello, World!" + +using namespace httpserver; + +class hello_world_resource : public http_resource { + public: + hello_world_resource(const std::shared_ptr& resp): + resp(resp) + { + } + + const std::shared_ptr render(const http_request&) { + return resp; + } + + private: + std::shared_ptr resp; +}; + +int main(int argc, char** argv) +{ + webserver ws = create_webserver(atoi(argv[1])) + .start_method(http::http_utils::INTERNAL_SELECT) + .tcp_nodelay() + .max_threads(atoi(argv[2])); + + std::shared_ptr hello = std::shared_ptr(new string_response(BODY, 200)); + hello->with_header("Server", "libhttpserver"); + + hello_world_resource hwr(hello); + ws.register_resource(PATH, &hwr, false); + + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/benchmark_select.cpp b/3rd_party/libhttpserver-0.18.2/examples/benchmark_select.cpp new file mode 100644 index 00000000..62a18140 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/benchmark_select.cpp @@ -0,0 +1,41 @@ +#include +#include + +#include + +#define PATH "/plaintext" +#define BODY "Hello, World!" + +using namespace httpserver; + +class hello_world_resource : public http_resource { + public: + hello_world_resource(const std::shared_ptr& resp): + resp(resp) + { + } + + const std::shared_ptr render(const http_request&) { + return resp; + } + + private: + std::shared_ptr resp; +}; + +int main(int argc, char** argv) +{ + webserver ws = create_webserver(atoi(argv[1])) + .start_method(http::http_utils::INTERNAL_SELECT) + .max_threads(atoi(argv[2])); + + std::shared_ptr hello = std::shared_ptr(new string_response(BODY, 200)); + hello->with_header("Server", "libhttpserver"); + + hello_world_resource hwr(hello); + ws.register_resource(PATH, &hwr, false); + + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/benchmark_threads.cpp b/3rd_party/libhttpserver-0.18.2/examples/benchmark_threads.cpp new file mode 100644 index 00000000..827b1c35 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/benchmark_threads.cpp @@ -0,0 +1,40 @@ +#include +#include + +#include + +#define PATH "/plaintext" +#define BODY "Hello, World!" + +using namespace httpserver; + +class hello_world_resource : public http_resource { + public: + hello_world_resource(const std::shared_ptr& resp): + resp(resp) + { + } + + const std::shared_ptr render(const http_request&) { + return resp; + } + + private: + std::shared_ptr resp; +}; + +int main(int argc, char** argv) +{ + webserver ws = create_webserver(atoi(argv[1])) + .start_method(http::http_utils::THREAD_PER_CONNECTION); + + std::shared_ptr hello = std::shared_ptr(new string_response(BODY, 200)); + hello->with_header("Server", "libhttpserver"); + + hello_world_resource hwr(hello); + ws.register_resource(PATH, &hwr, false); + + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/cert.pem b/3rd_party/libhttpserver-0.18.2/examples/cert.pem new file mode 100644 index 00000000..2c766dff --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/cert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICpjCCAZCgAwIBAgIESEPtjjALBgkqhkiG9w0BAQUwADAeFw0wODA2MDIxMjU0 +MzhaFw0wOTA2MDIxMjU0NDZaMAAwggEfMAsGCSqGSIb3DQEBAQOCAQ4AMIIBCQKC +AQC03TyUvK5HmUAirRp067taIEO4bibh5nqolUoUdo/LeblMQV+qnrv/RNAMTx5X +fNLZ45/kbM9geF8qY0vsPyQvP4jumzK0LOJYuIwmHaUm9vbXnYieILiwCuTgjaud +3VkZDoQ9fteIo+6we9UTpVqZpxpbLulBMh/VsvX0cPJ1VFC7rT59o9hAUlFf9jX/ +GmKdYI79MtgVx0OPBjmmSD6kicBBfmfgkO7bIGwlRtsIyMznxbHu6VuoX/eVxrTv +rmCwgEXLWRZ6ru8MQl5YfqeGXXRVwMeXU961KefbuvmEPccgCxm8FZ1C1cnDHFXh +siSgAzMBjC/b6KVhNQ4KnUdZAgMBAAGjLzAtMAwGA1UdEwEB/wQCMAAwHQYDVR0O +BBYEFJcUvpjvE5fF/yzUshkWDpdYiQh/MAsGCSqGSIb3DQEBBQOCAQEARP7eKSB2 +RNd6XjEjK0SrxtoTnxS3nw9sfcS7/qD1+XHdObtDFqGNSjGYFB3Gpx8fpQhCXdoN +8QUs3/5ZVa5yjZMQewWBgz8kNbnbH40F2y81MHITxxCe1Y+qqHWwVaYLsiOTqj2/ +0S3QjEJ9tvklmg7JX09HC4m5QRYfWBeQLD1u8ZjA1Sf1xJriomFVyRLI2VPO2bNe +JDMXWuP+8kMC7gEvUnJ7A92Y2yrhu3QI3bjPk8uSpHea19Q77tul1UVBJ5g+zpH3 +OsF5p0MyaVf09GTzcLds5nE/osTdXGUyHJapWReVmPm3Zn6gqYlnzD99z+DPIgIV +RhZvQx74NQnS6g== +-----END CERTIFICATE----- diff --git a/3rd_party/libhttpserver-0.18.2/examples/custom_access_log.cpp b/3rd_party/libhttpserver-0.18.2/examples/custom_access_log.cpp new file mode 100644 index 00000000..afbc1774 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/custom_access_log.cpp @@ -0,0 +1,47 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +#include + +using namespace httpserver; + +void custom_access_log(const std::string& url) { + std::cout << "ACCESSING: " << url << std::endl; +} + +class hello_world_resource : public http_resource { +public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080) + .log_access(custom_access_log); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/custom_error.cpp b/3rd_party/libhttpserver-0.18.2/examples/custom_error.cpp new file mode 100644 index 00000000..034f334c --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/custom_error.cpp @@ -0,0 +1,54 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +const std::shared_ptr not_found_custom(const http_request& req) +{ + return std::shared_ptr(new string_response("Not found custom", 404, "text/plain")); +} + +const std::shared_ptr not_allowed_custom(const http_request& req) +{ + return std::shared_ptr(new string_response("Not allowed custom", 405, "text/plain")); +} + +class hello_world_resource : public http_resource { +public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080) + .not_found_resource(not_found_custom) + .method_not_allowed_resource(not_allowed_custom); + + hello_world_resource hwr; + hwr.disallow_all(); + hwr.set_allowing("GET", true); + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/deferred_with_accumulator.cpp b/3rd_party/libhttpserver-0.18.2/examples/deferred_with_accumulator.cpp new file mode 100644 index 00000000..06578415 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/deferred_with_accumulator.cpp @@ -0,0 +1,74 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include +#include +#include + +#include + +using namespace httpserver; + +std::atomic counter; + +ssize_t test_callback (std::shared_ptr > closure_data, char* buf, size_t max) { + int reqid; + if (closure_data == nullptr) { + reqid = -1; + } else { + reqid = *closure_data; + } + + // only first 5 connections can be established + if (reqid >= 5) { + return -1; + } else { + // respond corresponding request IDs to the clients + std::string str = ""; + str += std::to_string(reqid) + " "; + memset(buf, 0, max); + std::copy(str.begin(), str.end(), buf); + + // keep sending reqid + // sleep(1); ==> adapted for C++11 on non-*Nix systems + std::this_thread::sleep_for(std::chrono::seconds(1)); + + return (ssize_t)max; + } +} + +class deferred_resource : public http_resource { + public: + const std::shared_ptr render_GET(const http_request& req) { + std::shared_ptr > closure_data(new std::atomic(counter++)); + return std::shared_ptr > >(new deferred_response >(test_callback, closure_data, "cycle callback response")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + deferred_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} + diff --git a/3rd_party/libhttpserver-0.18.2/examples/digest_authentication.cpp b/3rd_party/libhttpserver-0.18.2/examples/digest_authentication.cpp new file mode 100644 index 00000000..55f119a0 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/digest_authentication.cpp @@ -0,0 +1,51 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +#define MY_OPAQUE "11733b200778ce33060f31c9af70a870ba96ddd4" + +using namespace httpserver; + +class digest_resource : public httpserver::http_resource { +public: + const std::shared_ptr render_GET(const http_request& req) { + if (req.get_digested_user() == "") { + return std::shared_ptr(new digest_auth_fail_response("FAIL", "test@example.com", MY_OPAQUE, true)); + } + else { + bool reload_nonce = false; + if(!req.check_digest_auth("test@example.com", "mypass", 300, reload_nonce)) { + return std::shared_ptr(new digest_auth_fail_response("FAIL", "test@example.com", MY_OPAQUE, reload_nonce)); + } + } + return std::shared_ptr(new string_response("SUCCESS", 200, "text/plain")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + digest_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/handlers.cpp b/3rd_party/libhttpserver-0.18.2/examples/handlers.cpp new file mode 100644 index 00000000..4ddad426 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/handlers.cpp @@ -0,0 +1,45 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +class hello_world_resource : public http_resource { +public: + const std::shared_ptr render_GET(const http_request&) { + return std::shared_ptr(new string_response("GET: Hello, World!")); + } + + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("OTHER: Hello, World!")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} + diff --git a/3rd_party/libhttpserver-0.18.2/examples/hello_with_get_arg.cpp b/3rd_party/libhttpserver-0.18.2/examples/hello_with_get_arg.cpp new file mode 100644 index 00000000..07ae90c1 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/hello_with_get_arg.cpp @@ -0,0 +1,40 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +class hello_world_resource : public http_resource { +public: + const std::shared_ptr render(const http_request& req) { + return std::shared_ptr(new string_response("Hello: " + req.get_arg("name"))); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/hello_world.cpp b/3rd_party/libhttpserver-0.18.2/examples/hello_world.cpp new file mode 100644 index 00000000..6f8b4aad --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/hello_world.cpp @@ -0,0 +1,67 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +#include + +using namespace httpserver; + +class hello_world_resource : public http_resource { + public: + const std::shared_ptr render(const http_request&); + void set_some_data(const std::string &s) {data = s;} + std::string data; +}; + +//using the render method you are able to catch each type of request you receive +const std::shared_ptr hello_world_resource::render(const http_request& req) +{ + //it is possible to store data inside the resource object that can be altered + //through the requests + std::cout << "Data was: " << data << std::endl; + std::string datapar = req.get_arg("data"); + set_some_data(datapar == "" ? "no data passed!!!" : datapar); + std::cout << "Now data is:" << data << std::endl; + + //it is possible to send a response initializing an http_string_response + //that reads the content to send in response from a string. + return std::shared_ptr(new string_response("Hello World!!!", 200)); +} + +int main() +{ + //it is possible to create a webserver passing a great number of parameters. + //In this case we are just passing the port and the number of thread running. + webserver ws = create_webserver(8080).start_method(http::http_utils::INTERNAL_SELECT).max_threads(5); + + hello_world_resource hwr; + //this way we are registering the hello_world_resource to answer for the endpoint + //"/hello". The requested method is called (if the request is a GET we call the render_GET + //method. In case that the specific render method is not implemented, the generic "render" + //method is called. + ws.register_resource("/hello", &hwr, true); + + //This way we are putting the created webserver in listen. We pass true in order to have + //a blocking call; if we want the call to be non-blocking we can just pass false to the + //method. + ws.start(true); + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/key.pem b/3rd_party/libhttpserver-0.18.2/examples/key.pem new file mode 100644 index 00000000..a5848eed --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAtN08lLyuR5lAIq0adOu7WiBDuG4m4eZ6qJVKFHaPy3m5TEFf +qp67/0TQDE8eV3zS2eOf5GzPYHhfKmNL7D8kLz+I7psytCziWLiMJh2lJvb2152I +niC4sArk4I2rnd1ZGQ6EPX7XiKPusHvVE6VamacaWy7pQTIf1bL19HDydVRQu60+ +faPYQFJRX/Y1/xpinWCO/TLYFcdDjwY5pkg+pInAQX5n4JDu2yBsJUbbCMjM58Wx +7ulbqF/3lca0765gsIBFy1kWeq7vDEJeWH6nhl10VcDHl1PetSnn27r5hD3HIAsZ +vBWdQtXJwxxV4bIkoAMzAYwv2+ilYTUOCp1HWQIDAQABAoIBAArOQv3R7gmqDspj +lDaTFOz0C4e70QfjGMX0sWnakYnDGn6DU19iv3GnX1S072ejtgc9kcJ4e8VUO79R +EmqpdRR7k8dJr3RTUCyjzf/C+qiCzcmhCFYGN3KRHA6MeEnkvRuBogX4i5EG1k5l +/5t+YBTZBnqXKWlzQLKoUAiMLPg0eRWh+6q7H4N7kdWWBmTpako7TEqpIwuEnPGx +u3EPuTR+LN6lF55WBePbCHccUHUQaXuav18NuDkcJmCiMArK9SKb+h0RqLD6oMI/ +dKD6n8cZXeMBkK+C8U/K0sN2hFHACsu30b9XfdnljgP9v+BP8GhnB0nCB6tNBCPo +32srOwECgYEAxWh3iBT4lWqL6bZavVbnhmvtif4nHv2t2/hOs/CAq8iLAw0oWGZc ++JEZTUDMvFRlulr0kcaWra+4fN3OmJnjeuFXZq52lfMgXBIKBmoSaZpIh2aDY1Rd +RbEse7nQl9hTEPmYspiXLGtnAXW7HuWqVfFFP3ya8rUS3t4d07Hig8ECgYEA6ou6 +OHiBRTbtDqLIv8NghARc/AqwNWgEc9PelCPe5bdCOLBEyFjqKiT2MttnSSUc2Zob +XhYkHC6zN1Mlq30N0e3Q61YK9LxMdU1vsluXxNq2rfK1Scb1oOlOOtlbV3zA3VRF +hV3t1nOA9tFmUrwZi0CUMWJE/zbPAyhwWotKyZkCgYEAh0kFicPdbABdrCglXVae +SnfSjVwYkVuGd5Ze0WADvjYsVkYBHTvhgRNnRJMg+/vWz3Sf4Ps4rgUbqK8Vc20b +AU5G6H6tlCvPRGm0ZxrwTWDHTcuKRVs+pJE8C/qWoklE/AAhjluWVoGwUMbPGuiH +6Gf1bgHF6oj/Sq7rv/VLZ8ECgYBeq7ml05YyLuJutuwa4yzQ/MXfghzv4aVyb0F3 +QCdXR6o2IYgR6jnSewrZKlA9aPqFJrwHNR6sNXlnSmt5Fcf/RWO/qgJQGLUv3+rG +7kuLTNDR05azSdiZc7J89ID3Bkb+z2YkV+6JUiPq/Ei1+nDBEXb/m+/HqALU/nyj +P3gXeQKBgBusb8Rbd+KgxSA0hwY6aoRTPRt8LNvXdsB9vRcKKHUFQvxUWiUSS+L9 +/Qu1sJbrUquKOHqksV5wCnWnAKyJNJlhHuBToqQTgKXjuNmVdYSe631saiI7PHyC +eRJ6DxULPxABytJrYCRrNqmXi5TCiqR2mtfalEMOPxz8rUU8dYyx +-----END RSA PRIVATE KEY----- diff --git a/3rd_party/libhttpserver-0.18.2/examples/minimal_deferred.cpp b/3rd_party/libhttpserver-0.18.2/examples/minimal_deferred.cpp new file mode 100644 index 00000000..a7a3e51d --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/minimal_deferred.cpp @@ -0,0 +1,55 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +static int counter = 0; + +ssize_t test_callback (std::shared_ptr closure_data, char* buf, size_t max) { + if (counter == 2) { + return -1; + } + else { + memset(buf, 0, max); + strcat(buf, " test "); + counter++; + return std::string(buf).size(); + } +} + +class deferred_resource : public http_resource { + public: + const std::shared_ptr render_GET(const http_request& req) { + return std::shared_ptr >(new deferred_response(test_callback, nullptr, "cycle callback response")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + deferred_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} + diff --git a/3rd_party/libhttpserver-0.18.2/examples/minimal_file_response.cpp b/3rd_party/libhttpserver-0.18.2/examples/minimal_file_response.cpp new file mode 100644 index 00000000..b82d2929 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/minimal_file_response.cpp @@ -0,0 +1,42 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +class file_response_resource : public http_resource +{ + public: + const std::shared_ptr render_GET(const http_request& req) + { + return std::shared_ptr(new file_response("test_content", 200, "text/plain")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + file_response_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/minimal_hello_world.cpp b/3rd_party/libhttpserver-0.18.2/examples/minimal_hello_world.cpp new file mode 100644 index 00000000..76489a0e --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/minimal_hello_world.cpp @@ -0,0 +1,40 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +class hello_world_resource : public http_resource { +public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/minimal_https.cpp b/3rd_party/libhttpserver-0.18.2/examples/minimal_https.cpp new file mode 100644 index 00000000..def0452a --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/minimal_https.cpp @@ -0,0 +1,43 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +class hello_world_resource : public http_resource { +public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080) + .use_ssl() + .https_mem_key("key.pem") + .https_mem_cert("cert.pem"); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/minimal_ip_ban.cpp b/3rd_party/libhttpserver-0.18.2/examples/minimal_ip_ban.cpp new file mode 100644 index 00000000..ea0923e7 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/minimal_ip_ban.cpp @@ -0,0 +1,43 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +class hello_world_resource : public http_resource { +public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080) + .default_policy(http::http_utils::REJECT); + + ws.allow_ip("127.0.0.1"); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/service.cpp b/3rd_party/libhttpserver-0.18.2/examples/service.cpp new file mode 100644 index 00000000..e20c9a11 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/service.cpp @@ -0,0 +1,242 @@ +/* + This file is part of libhttpserver + Copyright (C) 2014 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +#include +#include + +#include + +using namespace httpserver; + +bool verbose=false; + +class service_resource: public http_resource { +public: + service_resource(); + + ~service_resource(); + + const std::shared_ptr render_GET(const http_request &req); + const std::shared_ptr render_PUT(const http_request &req); + const std::shared_ptr render_POST(const http_request &req); + const std::shared_ptr render(const http_request &req); + const std::shared_ptr render_HEAD(const http_request &req); + const std::shared_ptr render_OPTIONS(const http_request &req); + const std::shared_ptr render_CONNECT(const http_request &req); + const std::shared_ptr render_DELETE(const http_request &req); + +private: + + +}; + +service_resource::service_resource() +{} + +service_resource::~service_resource() +{} + +const std::shared_ptr +service_resource::render_GET(const http_request &req) +{ + std::cout << "service_resource::render_GET()" << std::endl; + + if (verbose) std::cout << req; + string_response* res = new string_response("GET response", 200); + + if (verbose) std::cout << *res; + + return std::shared_ptr(res); +} + + +const std::shared_ptr +service_resource::render_PUT(const http_request &req) +{ + std::cout << "service_resource::render_PUT()" << std::endl; + + if (verbose) std::cout << req; + + string_response* res = new string_response("PUT response", 200); + + if (verbose) std::cout << *res; + + return std::shared_ptr(res); +} + + +const std::shared_ptr +service_resource::render_POST(const http_request &req) +{ + std::cout << "service_resource::render_POST()" << std::endl; + + if (verbose) std::cout << req; + + string_response* res = new string_response("POST response", 200); + + if (verbose) std::cout << *res; + + return std::shared_ptr(res); +} + +const std::shared_ptr +service_resource::render(const http_request &req) +{ + std::cout << "service_resource::render()" << std::endl; + + if (verbose) std::cout << req; + + string_response* res = new string_response("generic response", 200); + + if (verbose) std::cout << *res; + + return std::shared_ptr(res); +} + + +const std::shared_ptr +service_resource::render_HEAD(const http_request &req) +{ + std::cout << "service_resource::render_HEAD()" << std::endl; + + if (verbose) std::cout << req; + + string_response* res = new string_response("HEAD response", 200); + + if (verbose) std::cout << *res; + + return std::shared_ptr(res); +} + +const std::shared_ptr +service_resource::render_OPTIONS(const http_request &req) +{ + std::cout << "service_resource::render_OPTIONS()" << std::endl; + + if (verbose) std::cout << req; + + string_response* res = new string_response("OPTIONS response", 200); + + if (verbose) std::cout << *res; + + return std::shared_ptr(res); +} + +const std::shared_ptr +service_resource::render_CONNECT(const http_request &req) +{ + std::cout << "service_resource::render_CONNECT()" << std::endl; + + if (verbose) std::cout << req; + + string_response* res = new string_response("CONNECT response", 200); + + if (verbose) std::cout << *res; + + return std::shared_ptr(res); +} + +const std::shared_ptr +service_resource::render_DELETE(const http_request &req) +{ + std::cout << "service_resource::render_DELETE()" << std::endl; + + if (verbose) std::cout << req; + + string_response* res = new string_response("DELETE response", 200); + + if (verbose) std::cout << *res; + + return std::shared_ptr(res); +} + +void usage() +{ + std::cout << "Usage:" << std::endl + << "service [-p ][-s [-k ][-c ]][-v]" << std::endl; +} + +int main(int argc, char **argv) +{ + uint16_t port=8080; + int c; + const char *key="key.pem"; + const char *cert="cert.pem"; + bool secure=false; + + while ((c = getopt(argc,argv,"p:k:c:sv?")) != EOF) { + switch (c) { + case 'p': + port=strtoul(optarg,NULL,10); + break; + case 'k': + key = optarg; + break; + case 'c': + cert=optarg; + break; + case 's': + secure=true; + break; + case 'v': + verbose=true; + break; + default: + usage(); + exit(1); + break; + } + } + + std::cout << "Using port " << port << std::endl; + if (secure) { + std::cout << "Key: " << key << " Certificate: " << cert + << std::endl; + } + + // + // Use builder to define webserver configuration options + // + create_webserver cw = create_webserver(port).max_threads(5); + + if (secure) { + cw.use_ssl().https_mem_key(key).https_mem_cert(cert); + } + + // + // Create webserver using the configured options + // + webserver ws = cw; + + // + // Create and register service resource available at /service + // + service_resource res; + ws.register_resource("/service",&res,true); + + // + // Start and block the webserver + // + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/setting_headers.cpp b/3rd_party/libhttpserver-0.18.2/examples/setting_headers.cpp new file mode 100644 index 00000000..0fb73c79 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/setting_headers.cpp @@ -0,0 +1,42 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +class hello_world_resource : public http_resource { +public: + const std::shared_ptr render(const http_request&) { + std::shared_ptr response = std::shared_ptr(new string_response("Hello, World!")); + response->with_header("MyHeader", "MyValue"); + return response; + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/examples/test_content b/3rd_party/libhttpserver-0.18.2/examples/test_content new file mode 100644 index 00000000..5f643138 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/test_content @@ -0,0 +1 @@ +test content of file diff --git a/3rd_party/libhttpserver-0.18.2/examples/url_registration.cpp b/3rd_party/libhttpserver-0.18.2/examples/url_registration.cpp new file mode 100644 index 00000000..0f8da6ad --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/examples/url_registration.cpp @@ -0,0 +1,63 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011, 2012, 2013, 2014, 2015 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include + +using namespace httpserver; + +class hello_world_resource : public http_resource { +public: + const std::shared_ptr render(const http_request&) { + return std::shared_ptr(new string_response("Hello, World!")); + } +}; + +class handling_multiple_resource : public http_resource { +public: + const std::shared_ptr render(const http_request& req) { + return std::shared_ptr(new string_response("Your URL: " + req.get_path())); + } +}; + +class url_args_resource : public http_resource { +public: + const std::shared_ptr render(const http_request& req) { + return std::shared_ptr(new string_response("ARGS: " + req.get_arg("arg1") + " and " + req.get_arg("arg2"))); + } +}; + +int main(int argc, char** argv) { + webserver ws = create_webserver(8080); + + hello_world_resource hwr; + ws.register_resource("/hello", &hwr); + + handling_multiple_resource hmr; + ws.register_resource("/family", &hmr, true); + ws.register_resource("/with_regex_[0-9]+", &hmr); + + url_args_resource uar; + ws.register_resource("/url/with/{arg1}/and/{arg2}", &uar); + ws.register_resource("/url/with/parametric/args/{arg1|[0-9]+}/and/{arg2|[A-Z]+}", &uar); + + ws.start(true); + + return 0; +} diff --git a/3rd_party/libhttpserver-0.18.2/m4/ax_have_epoll.m4 b/3rd_party/libhttpserver-0.18.2/m4/ax_have_epoll.m4 new file mode 100644 index 00000000..9d9bc873 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/m4/ax_have_epoll.m4 @@ -0,0 +1,104 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_have_epoll.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_HAVE_EPOLL([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# AX_HAVE_EPOLL_PWAIT([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# DESCRIPTION +# +# This macro determines whether the system supports the epoll I/O event +# interface. A neat usage example would be: +# +# AX_HAVE_EPOLL( +# [AX_CONFIG_FEATURE_ENABLE(epoll)], +# [AX_CONFIG_FEATURE_DISABLE(epoll)]) +# AX_CONFIG_FEATURE( +# [epoll], [This platform supports epoll(7)], +# [HAVE_EPOLL], [This platform supports epoll(7).]) +# +# The epoll interface was added to the Linux kernel in version 2.5.45, and +# the macro verifies that a kernel newer than this is installed. This +# check is somewhat unreliable if doesn't match the +# running kernel, but it is necessary regardless, because glibc comes with +# stubs for the epoll_create(), epoll_wait(), etc. that allow programs to +# compile and link even if the kernel is too old; the problem would then +# be detected only at runtime. +# +# Linux kernel version 2.6.19 adds the epoll_pwait() call in addition to +# epoll_wait(). The availability of that function can be tested with the +# second macro. Generally speaking, it is safe to assume that +# AX_HAVE_EPOLL would succeed if AX_HAVE_EPOLL_PWAIT has, but not the +# other way round. +# +# LICENSE +# +# Copyright (c) 2008 Peter Simons +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 11 + +AC_DEFUN([AX_HAVE_EPOLL], [dnl + ax_have_epoll_cppflags="${CPPFLAGS}" + AC_CHECK_HEADER([linux/version.h], [CPPFLAGS="${CPPFLAGS} -DHAVE_LINUX_VERSION_H"]) + AC_MSG_CHECKING([for Linux epoll(7) interface]) + AC_CACHE_VAL([ax_cv_have_epoll], [dnl + AC_LINK_IFELSE([dnl + AC_LANG_PROGRAM([dnl +#include +#ifdef HAVE_LINUX_VERSION_H +# include +# if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,45) +# error linux kernel version is too old to have epoll +# endif +#endif +], [dnl +int fd, rc; +struct epoll_event ev; +fd = epoll_create(128); +rc = epoll_wait(fd, &ev, 1, 0);])], + [ax_cv_have_epoll=yes], + [ax_cv_have_epoll=no])]) + CPPFLAGS="${ax_have_epoll_cppflags}" + AS_IF([test "${ax_cv_have_epoll}" = "yes"], + [AC_MSG_RESULT([yes]) +$1],[AC_MSG_RESULT([no]) +$2]) +])dnl + +AC_DEFUN([AX_HAVE_EPOLL_PWAIT], [dnl + ax_have_epoll_cppflags="${CPPFLAGS}" + AC_CHECK_HEADER([linux/version.h], + [CPPFLAGS="${CPPFLAGS} -DHAVE_LINUX_VERSION_H"]) + AC_MSG_CHECKING([for Linux epoll(7) interface with signals extension]) + AC_CACHE_VAL([ax_cv_have_epoll_pwait], [dnl + AC_LINK_IFELSE([dnl + AC_LANG_PROGRAM([dnl +#ifdef HAVE_LINUX_VERSION_H +# include +# if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +# error linux kernel version is too old to have epoll_pwait +# endif +#endif +#include +#include +], [dnl +int fd, rc; +struct epoll_event ev; +fd = epoll_create(128); +rc = epoll_wait(fd, &ev, 1, 0); +rc = epoll_pwait(fd, &ev, 1, 0, (sigset_t const *)(0));])], + [ax_cv_have_epoll_pwait=yes], + [ax_cv_have_epoll_pwait=no])]) + CPPFLAGS="${ax_have_epoll_cppflags}" + AS_IF([test "${ax_cv_have_epoll_pwait}" = "yes"], + [AC_MSG_RESULT([yes]) +$1],[AC_MSG_RESULT([no]) +$2]) +])dnl diff --git a/3rd_party/libhttpserver-0.18.2/m4/ax_valgrind_check.m4 b/3rd_party/libhttpserver-0.18.2/m4/ax_valgrind_check.m4 new file mode 100644 index 00000000..70337981 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/m4/ax_valgrind_check.m4 @@ -0,0 +1,239 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_valgrind_check.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_VALGRIND_DFLT(memcheck|helgrind|drd|sgcheck, on|off) +# AX_VALGRIND_CHECK() +# +# DESCRIPTION +# +# AX_VALGRIND_CHECK checks whether Valgrind is present and, if so, allows +# running `make check` under a variety of Valgrind tools to check for +# memory and threading errors. +# +# Defines VALGRIND_CHECK_RULES which should be substituted in your +# Makefile; and $enable_valgrind which can be used in subsequent configure +# output. VALGRIND_ENABLED is defined and substituted, and corresponds to +# the value of the --enable-valgrind option, which defaults to being +# enabled if Valgrind is installed and disabled otherwise. Individual +# Valgrind tools can be disabled via --disable-valgrind-, the +# default is configurable via the AX_VALGRIND_DFLT command or is to use +# all commands not disabled via AX_VALGRIND_DFLT. All AX_VALGRIND_DFLT +# calls must be made before the call to AX_VALGRIND_CHECK. +# +# If unit tests are written using a shell script and automake's +# LOG_COMPILER system, the $(VALGRIND) variable can be used within the +# shell scripts to enable Valgrind, as described here: +# +# https://www.gnu.org/software/gnulib/manual/html_node/Running-self_002dtests-under-valgrind.html +# +# Usage example: +# +# configure.ac: +# +# AX_VALGRIND_DFLT([sgcheck], [off]) +# AX_VALGRIND_CHECK +# +# in each Makefile.am with tests: +# +# @VALGRIND_CHECK_RULES@ +# VALGRIND_SUPPRESSIONS_FILES = my-project.supp +# EXTRA_DIST = my-project.supp +# +# This results in a "check-valgrind" rule being added. Running `make +# check-valgrind` in that directory will recursively run the module's test +# suite (`make check`) once for each of the available Valgrind tools (out +# of memcheck, helgrind and drd) while the sgcheck will be skipped unless +# enabled again on the commandline with --enable-valgrind-sgcheck. The +# results for each check will be output to test-suite-$toolname.log. The +# target will succeed if there are zero errors and fail otherwise. +# +# Alternatively, a "check-valgrind-$TOOL" rule will be added, for $TOOL in +# memcheck, helgrind, drd and sgcheck. These are useful because often only +# some of those tools can be ran cleanly on a codebase. +# +# The macro supports running with and without libtool. +# +# LICENSE +# +# Copyright (c) 2014, 2015, 2016 Philip Withnall +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 17 + +dnl Configured tools +m4_define([valgrind_tool_list], [[memcheck], [helgrind], [drd], [sgcheck]]) +m4_set_add_all([valgrind_exp_tool_set], [sgcheck]) +m4_foreach([vgtool], [valgrind_tool_list], + [m4_define([en_dflt_valgrind_]vgtool, [on])]) + +AC_DEFUN([AX_VALGRIND_DFLT],[ + m4_define([en_dflt_valgrind_$1], [$2]) +])dnl + +AM_EXTRA_RECURSIVE_TARGETS([check-valgrind]) +m4_foreach([vgtool], [valgrind_tool_list], + [AM_EXTRA_RECURSIVE_TARGETS([check-valgrind-]vgtool)]) + +AC_DEFUN([AX_VALGRIND_CHECK],[ + dnl Check for --enable-valgrind + AC_ARG_ENABLE([valgrind], + [AS_HELP_STRING([--enable-valgrind], [Whether to enable Valgrind on the unit tests])], + [enable_valgrind=$enableval],[enable_valgrind=]) + + AS_IF([test "$enable_valgrind" != "no"],[ + # Check for Valgrind. + AC_CHECK_PROG([VALGRIND],[valgrind],[valgrind]) + AS_IF([test "$VALGRIND" = ""],[ + AS_IF([test "$enable_valgrind" = "yes"],[ + AC_MSG_ERROR([Could not find valgrind; either install it or reconfigure with --disable-valgrind]) + ],[ + enable_valgrind=no + ]) + ],[ + enable_valgrind=yes + ]) + ]) + + AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"]) + AC_SUBST([VALGRIND_ENABLED],[$enable_valgrind]) + + # Check for Valgrind tools we care about. + [valgrind_enabled_tools=] + m4_foreach([vgtool],[valgrind_tool_list],[ + AC_ARG_ENABLE([valgrind-]vgtool, + m4_if(m4_defn([en_dflt_valgrind_]vgtool),[off],dnl +[AS_HELP_STRING([--enable-valgrind-]vgtool, [Whether to use ]vgtool[ during the Valgrind tests])],dnl +[AS_HELP_STRING([--disable-valgrind-]vgtool, [Whether to skip ]vgtool[ during the Valgrind tests])]), + [enable_valgrind_]vgtool[=$enableval], + [enable_valgrind_]vgtool[=]) + AS_IF([test "$enable_valgrind" = "no"],[ + enable_valgrind_]vgtool[=no], + [test "$enable_valgrind_]vgtool[" ]dnl +m4_if(m4_defn([en_dflt_valgrind_]vgtool), [off], [= "yes"], [!= "no"]),[ + AC_CACHE_CHECK([for Valgrind tool ]vgtool, + [ax_cv_valgrind_tool_]vgtool,[ + ax_cv_valgrind_tool_]vgtool[=no + m4_set_contains([valgrind_exp_tool_set],vgtool, + [m4_define([vgtoolx],[exp-]vgtool)], + [m4_define([vgtoolx],vgtool)]) + AS_IF([`$VALGRIND --tool=]vgtoolx[ --help >/dev/null 2>&1`],[ + ax_cv_valgrind_tool_]vgtool[=yes + ]) + ]) + AS_IF([test "$ax_cv_valgrind_tool_]vgtool[" = "no"],[ + AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[ + AC_MSG_ERROR([Valgrind does not support ]vgtool[; reconfigure with --disable-valgrind-]vgtool) + ],[ + enable_valgrind_]vgtool[=no + ]) + ],[ + enable_valgrind_]vgtool[=yes + ]) + ]) + AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[ + valgrind_enabled_tools="$valgrind_enabled_tools ]m4_bpatsubst(vgtool,[^exp-])[" + ]) + AC_SUBST([ENABLE_VALGRIND_]vgtool,[$enable_valgrind_]vgtool) + ]) + AC_SUBST([valgrind_tools],["]m4_join([ ], valgrind_tool_list)["]) + AC_SUBST([valgrind_enabled_tools],[$valgrind_enabled_tools]) + +[VALGRIND_CHECK_RULES=' +# Valgrind check +# +# Optional: +# - VALGRIND_SUPPRESSIONS_FILES: Space-separated list of Valgrind suppressions +# files to load. (Default: empty) +# - VALGRIND_FLAGS: General flags to pass to all Valgrind tools. +# (Default: --num-callers=30) +# - VALGRIND_$toolname_FLAGS: Flags to pass to Valgrind $toolname (one of: +# memcheck, helgrind, drd, sgcheck). (Default: various) + +# Optional variables +VALGRIND_SUPPRESSIONS ?= $(addprefix --suppressions=,$(VALGRIND_SUPPRESSIONS_FILES)) +VALGRIND_FLAGS ?= --num-callers=30 +VALGRIND_memcheck_FLAGS ?= --leak-check=full --show-reachable=no +VALGRIND_helgrind_FLAGS ?= --history-level=approx +VALGRIND_drd_FLAGS ?= +VALGRIND_sgcheck_FLAGS ?= + +# Internal use +valgrind_log_files = $(addprefix test-suite-,$(addsuffix .log,$(valgrind_tools))) + +valgrind_memcheck_flags = --tool=memcheck $(VALGRIND_memcheck_FLAGS) +valgrind_helgrind_flags = --tool=helgrind $(VALGRIND_helgrind_FLAGS) +valgrind_drd_flags = --tool=drd $(VALGRIND_drd_FLAGS) +valgrind_sgcheck_flags = --tool=exp-sgcheck $(VALGRIND_sgcheck_FLAGS) + +valgrind_quiet = $(valgrind_quiet_$(V)) +valgrind_quiet_ = $(valgrind_quiet_$(AM_DEFAULT_VERBOSITY)) +valgrind_quiet_0 = --quiet +valgrind_v_use = $(valgrind_v_use_$(V)) +valgrind_v_use_ = $(valgrind_v_use_$(AM_DEFAULT_VERBOSITY)) +valgrind_v_use_0 = @echo " USE " $(patsubst check-valgrind-%-am,%,$''@):; + +# Support running with and without libtool. +ifneq ($(LIBTOOL),) +valgrind_lt = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=execute +else +valgrind_lt = +endif + +# Use recursive makes in order to ignore errors during check +check-valgrind-am: +ifeq ($(VALGRIND_ENABLED),yes) + $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k \ + $(foreach tool, $(valgrind_enabled_tools), check-valgrind-$(tool)) +else + @echo "Need to reconfigure with --enable-valgrind" +endif + +# Valgrind running +VALGRIND_TESTS_ENVIRONMENT = \ + $(TESTS_ENVIRONMENT) \ + env VALGRIND=$(VALGRIND) \ + G_SLICE=always-malloc,debug-blocks \ + G_DEBUG=fatal-warnings,fatal-criticals,gc-friendly + +VALGRIND_LOG_COMPILER = \ + $(valgrind_lt) \ + $(VALGRIND) $(VALGRIND_SUPPRESSIONS) --error-exitcode=1 $(VALGRIND_FLAGS) + +define valgrind_tool_rule +check-valgrind-$(1)-am: +ifeq ($$(VALGRIND_ENABLED)-$$(ENABLE_VALGRIND_$(1)),yes-yes) +ifneq ($$(TESTS),) + $$(valgrind_v_use)$$(MAKE) check-TESTS \ + TESTS_ENVIRONMENT="$$(VALGRIND_TESTS_ENVIRONMENT)" \ + LOG_COMPILER="$$(VALGRIND_LOG_COMPILER)" \ + LOG_FLAGS="$$(valgrind_$(1)_flags)" \ + TEST_SUITE_LOG=test-suite-$(1).log +endif +else ifeq ($$(VALGRIND_ENABLED),yes) + @echo "Need to reconfigure with --enable-valgrind-$(1)" +else + @echo "Need to reconfigure with --enable-valgrind" +endif +endef + +$(foreach tool,$(valgrind_tools),$(eval $(call valgrind_tool_rule,$(tool)))) + +A''M_DISTCHECK_CONFIGURE_FLAGS ?= +A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-valgrind + +MOSTLYCLEANFILES ?= +MOSTLYCLEANFILES += $(valgrind_log_files) + +.PHONY: check-valgrind $(add-prefix check-valgrind-,$(valgrind_tools)) +'] + + AC_SUBST([VALGRIND_CHECK_RULES]) + m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([VALGRIND_CHECK_RULES])]) +]) diff --git a/3rd_party/libhttpserver-0.18.2/m4/python.m4 b/3rd_party/libhttpserver-0.18.2/m4/python.m4 new file mode 100644 index 00000000..229fd554 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/m4/python.m4 @@ -0,0 +1,168 @@ +## ------------------------ -*- Autoconf -*- +## Python file handling +## From Andrew Dalke +## Updated by James Henstridge +## ------------------------ +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# --------------------------------------------------------------------------- +# Adds support for distributing Python modules and packages. To +# install modules, copy them to $(pythondir), using the python_PYTHON +# automake variable. To install a package with the same name as the +# automake package, install to $(pkgpythondir), or use the +# pkgpython_PYTHON automake variable. +# +# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as +# locations to install python extension modules (shared libraries). +# Another macro is required to find the appropriate flags to compile +# extension modules. +# +# If your package is configured with a different prefix to python, +# users will have to add the install directory to the PYTHONPATH +# environment variable, or create a .pth file (see the python +# documentation for details). +# +# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will +# cause an error if the version of python installed on the system +# doesn't meet the requirement. MINIMUM-VERSION should consist of +# numbers and dots only. +AC_DEFUN([AM_PATH_PYTHON], + [ + dnl Find a Python interpreter. Python versions prior to 1.5 are not + dnl supported because the default installation locations changed from + dnl $prefix/lib/site-python in 1.4 to $prefix/lib/python1.5/site-packages + dnl in 1.5. + m4_define_default([_AM_PYTHON_INTERPRETER_LIST], + [python python2 python2.5 python2.4 python2.3 python2.2 dnl +python2.1 python2.0 python1.6 python1.5]) + + m4_if([$1],[],[ + dnl No version check is needed. + # Find any Python interpreter. + if test -z "$PYTHON"; then + AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) + fi + am_display_PYTHON=python + ], [ + dnl A version check is needed. + if test -n "$PYTHON"; then + # If the user set $PYTHON, use it and don't search something else. + AC_MSG_CHECKING([whether $PYTHON version >= $1]) + AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], + [AC_MSG_RESULT(yes)], + [AC_MSG_ERROR(too old)]) + am_display_PYTHON=$PYTHON + else + # Otherwise, try each interpreter until we find one that satisfies + # VERSION. + AC_CACHE_CHECK([for a Python interpreter with version >= $1], + [am_cv_pathless_PYTHON],[ + for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do + test "$am_cv_pathless_PYTHON" = none && break + AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) + done]) + # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. + if test "$am_cv_pathless_PYTHON" = none; then + PYTHON=: + else + AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) + fi + am_display_PYTHON=$am_cv_pathless_PYTHON + fi + ]) + + if test "$PYTHON" = :; then + dnl Run any user-specified action, or abort. + m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) + else + + dnl Query Python for its version number. Getting [:3] seems to be + dnl the best way to do this; it's what "site.py" does in the standard + dnl library. + + AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], + [am_cv_python_version=`$PYTHON -c "import sys; print sys.version[[:3]]"`]) + AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) + + dnl Use the values of $prefix and $exec_prefix for the corresponding + dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made + dnl distinct variables so they can be overridden if need be. However, + dnl general consensus is that you shouldn't need this ability. + + AC_SUBST([PYTHON_PREFIX], ['${prefix}']) + AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) + + dnl At times (like when building shared libraries) you may want + dnl to know which OS platform Python thinks this is. + + AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], + [am_cv_python_platform=`$PYTHON -c "import sys; print sys.platform"`]) + AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) + + + dnl Set up 4 directories: + + dnl pythondir -- where to install python scripts. This is the + dnl site-packages directory, not the python standard library + dnl directory like in previous automake betas. This behavior + dnl is more consistent with lispdir.m4 for example. + dnl Query distutils for this directory. distutils does not exist in + dnl Python 1.5, so we fall back to the hardcoded directory if it + dnl doesn't work. + AC_CACHE_CHECK([for $am_display_PYTHON script directory], + [am_cv_python_pythondir], + [am_cv_python_pythondir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(0,0,prefix='$PYTHON_PREFIX')" 2>/dev/null || + echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`]) + AC_SUBST([pythondir], [$am_cv_python_pythondir]) + + dnl pkgpythondir -- $PACKAGE directory under pythondir. Was + dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is + dnl more consistent with the rest of automake. + + AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) + + dnl pyexecdir -- directory for installing python extension modules + dnl (shared libraries) + dnl Query distutils for this directory. distutils does not exist in + dnl Python 1.5, so we fall back to the hardcoded directory if it + dnl doesn't work. + AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], + [am_cv_python_pyexecdir], + [am_cv_python_pyexecdir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(1,0,prefix='$PYTHON_EXEC_PREFIX')" 2>/dev/null || + echo "${PYTHON_EXEC_PREFIX}/lib/python${PYTHON_VERSION}/site-packages"`]) + AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) + + dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) + + AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) + + dnl Run any user-specified action. + $2 + fi + +]) + + +# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +# --------------------------------------------------------------------------- +# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. +# Run ACTION-IF-FALSE otherwise. +# This test uses sys.hexversion instead of the string equivalent (first +# word of sys.version), in order to cope with versions such as 2.2c1. +# hexversion has been introduced in Python 1.5.2; it's probably not +# worth to support older versions (1.5.1 was released on October 31, 1998). +AC_DEFUN([AM_PYTHON_CHECK_VERSION], + [prog="import sys, string +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +minver = map(int, string.split('$2', '.')) + [[0, 0, 0]] +minverhex = 0 +for i in xrange(0, 4): minverhex = (minverhex << 8) + minver[[i]] +sys.exit(sys.hexversion < minverhex)" + AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) diff --git a/3rd_party/libhttpserver-0.18.2/src/Makefile.am b/3rd_party/libhttpserver-0.18.2/src/Makefile.am new file mode 100644 index 00000000..5e549bbc --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/Makefile.am @@ -0,0 +1,46 @@ +# +# This file is part of libhttpserver +# Copyright (C) 2011-2019 Sebastiano Merlino +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +AM_CPPFLAGS = -I../ -I$(srcdir)/httpserver/ +METASOURCES = AUTO +lib_LTLIBRARIES = libhttpserver.la +libhttpserver_la_SOURCES = string_utilities.cpp webserver.cpp http_utils.cpp http_request.cpp http_response.cpp string_response.cpp basic_auth_fail_response.cpp digest_auth_fail_response.cpp deferred_response.cpp file_response.cpp http_resource.cpp details/http_endpoint.cpp +noinst_HEADERS = httpserver/string_utilities.hpp httpserver/details/modded_request.hpp gettext.h +nobase_include_HEADERS = httpserver.hpp httpserver/create_webserver.hpp httpserver/webserver.hpp httpserver/http_utils.hpp httpserver/details/http_endpoint.hpp httpserver/http_request.hpp httpserver/http_response.hpp httpserver/http_resource.hpp httpserver/string_response.hpp httpserver/basic_auth_fail_response.hpp httpserver/digest_auth_fail_response.hpp httpserver/deferred_response.hpp httpserver/file_response.hpp + +AM_CXXFLAGS += -fPIC -Wall + +if COND_GCOV +AM_CFLAGS += -O0 --coverage --no-inline +AM_CXXFLAGS += -O0 --coverage --no-inline +AM_LDFLAGS += -O0 --coverage -lgcov --no-inline +endif + +if !COND_CROSS_COMPILE +libhttpserver_la_LIBADD = -lmicrohttpd +endif + +libhttpserver_la_CFLAGS = $(AM_CFLAGS) +libhttpserver_la_CXXFLAGS = $(AM_CXXFLAGS) +libhttpserver_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined + +install-data-hook: + (mkdir -p $(DESTDIR)$(includedir) && cd $(DESTDIR)$(includedir) && $(LN_S) -f httpserver.hpp httpserverpp) + +uninstall-hook: + (cd $(DESTDIR)$(includedir) && rm -f httpserverpp) diff --git a/3rd_party/libhttpserver-0.18.2/src/basic_auth_fail_response.cpp b/3rd_party/libhttpserver-0.18.2/src/basic_auth_fail_response.cpp new file mode 100644 index 00000000..49d9f5a9 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/basic_auth_fail_response.cpp @@ -0,0 +1,41 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/basic_auth_fail_response.hpp" +#include + +struct MHD_Connection; +struct MHD_Response; + +using namespace std; + +namespace httpserver +{ + +int basic_auth_fail_response::enqueue_response(MHD_Connection* connection, MHD_Response* response) +{ + return MHD_queue_basic_auth_fail_response( + connection, + realm.c_str(), + response + ); +} + +} diff --git a/3rd_party/libhttpserver-0.18.2/src/deferred_response.cpp b/3rd_party/libhttpserver-0.18.2/src/deferred_response.cpp new file mode 100644 index 00000000..f3d44527 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/deferred_response.cpp @@ -0,0 +1,41 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/deferred_response.hpp" +#include + +struct MHD_Response; + +using namespace std; + +namespace httpserver +{ + +namespace details +{ + +MHD_Response* get_raw_response_helper(void* cls, ssize_t (*cb)(void*, uint64_t, char*, size_t)) +{ + return MHD_create_response_from_callback(MHD_SIZE_UNKNOWN, 1024, cb, cls, NULL); +} + +} + +} diff --git a/3rd_party/libhttpserver-0.18.2/src/details/http_endpoint.cpp b/3rd_party/libhttpserver-0.18.2/src/details/http_endpoint.cpp new file mode 100644 index 00000000..584fb507 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/details/http_endpoint.cpp @@ -0,0 +1,194 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "httpserver/details/http_endpoint.hpp" +#include "httpserver/http_utils.hpp" + +using namespace std; + +namespace httpserver +{ + +namespace details +{ + +using namespace http; + +http_endpoint::~http_endpoint() +{ +} + +http_endpoint::http_endpoint +( + const string& url, + bool family, + bool registration, + bool use_regex +): + family_url(family), + reg_compiled(false) +{ + if (use_regex && !registration) + { + throw std::invalid_argument("Cannot use regex if not during registration"); + } + + url_normalized = use_regex ? "^/" : "/"; + vector parts; + +#ifdef CASE_INSENSITIVE + string_utilities::to_lower_copy(url, url_complete); +#else + url_complete = url; +#endif + + if (url_complete[url_complete.size() - 1] == '/') + { + url_complete = url_complete.substr(0, url_complete.size() - 1); + } + + if (url_complete[0] != '/') + { + url_complete = "/" + url_complete; + } + + parts = http_utils::tokenize_url(url); + string buffered; + bool first = true; + + for (unsigned int i = 0; i < parts.size(); i++) + { + if(!registration) + { + url_normalized += (first ? "" : "/") + parts[i]; + first = false; + + url_pieces.push_back(parts[i]); + + continue; + } + + if((parts[i] != "") && (parts[i][0] != '{')) + { + if(first) + { + url_normalized = (parts[i][0] == '^' ? "" : url_normalized) + parts[i]; + first = false; + } + else + { + url_normalized += "/" + parts[i]; + } + url_pieces.push_back(parts[i]); + + continue; + } + + if((parts[i].size() < 3) || (parts[i][0] != '{') || (parts[i][parts[i].size() - 1] != '}')) + throw std::invalid_argument("Bad URL format"); + + std::string::size_type bar = parts[i].find_first_of('|'); + url_pars.push_back(parts[i].substr(1, bar != string::npos ? bar - 1 : parts[i].size() - 2)); + url_normalized += (first ? "" : "/") + (bar != string::npos ? parts[i].substr(bar + 1, parts[i].size() - bar - 2) : "([^\\/]+)"); + + first = false; + + chunk_positions.push_back(i); + + url_pieces.push_back(parts[i]); + } + + if(use_regex) + { + url_normalized += "$"; + try + { + re_url_normalized = std::regex(url_normalized, std::regex::extended | std::regex::icase | std::regex::nosubs); + } + catch (std::regex_error& e) + { + throw std::invalid_argument("Not a valid regex in URL: " + url_normalized); + } + reg_compiled = true; + } +} + +http_endpoint::http_endpoint(const http_endpoint& h): + url_complete(h.url_complete), + url_normalized(h.url_normalized), + url_pars(h.url_pars), + url_pieces(h.url_pieces), + chunk_positions(h.chunk_positions), + re_url_normalized(h.re_url_normalized), + family_url(h.family_url), + reg_compiled(h.reg_compiled) +{ +} + +http_endpoint& http_endpoint::operator =(const http_endpoint& h) +{ + url_complete = h.url_complete; + url_normalized = h.url_normalized; + family_url = h.family_url; + reg_compiled = h.reg_compiled; + re_url_normalized = h.re_url_normalized; + url_pars = h.url_pars; + url_pieces = h.url_pieces; + chunk_positions = h.chunk_positions; + return *this; +} + +bool http_endpoint::operator <(const http_endpoint& b) const +{ + COMPARATOR(url_normalized, b.url_normalized, std::toupper); +} + +bool http_endpoint::match(const http_endpoint& url) const +{ + if (!reg_compiled) throw std::invalid_argument("Cannot run match. Regex suppressed."); + + if(!family_url || url.url_pieces.size() < url_pieces.size()) + { + return regex_match(url.url_complete, re_url_normalized); + } + + string nn = "/"; + bool first = true; + for(unsigned int i = 0; i < url_pieces.size(); i++) + { + nn += (first ? "" : "/") + url.url_pieces[i]; + first = false; + } + return regex_match(nn, re_url_normalized); +} + +}; + +}; diff --git a/3rd_party/libhttpserver-0.18.2/src/digest_auth_fail_response.cpp b/3rd_party/libhttpserver-0.18.2/src/digest_auth_fail_response.cpp new file mode 100644 index 00000000..ca95526d --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/digest_auth_fail_response.cpp @@ -0,0 +1,43 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/digest_auth_fail_response.hpp" +#include + +struct MHD_Connection; +struct MHD_Response; + +using namespace std; + +namespace httpserver +{ + +int digest_auth_fail_response::enqueue_response(MHD_Connection* connection, MHD_Response* response) +{ + return MHD_queue_auth_fail_response( + connection, + realm.c_str(), + opaque.c_str(), + response, + reload_nonce ? MHD_YES : MHD_NO + ); +} + +} diff --git a/3rd_party/libhttpserver-0.18.2/src/file_response.cpp b/3rd_party/libhttpserver-0.18.2/src/file_response.cpp new file mode 100644 index 00000000..66d13a1c --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/file_response.cpp @@ -0,0 +1,52 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/file_response.hpp" +#include +#include +#include +#include + +struct MHD_Response; + +using namespace std; + +namespace httpserver +{ + +MHD_Response* file_response::get_raw_response() +{ + int fd = open(filename.c_str(), O_RDONLY); + size_t size = lseek(fd, 0, SEEK_END); + if(size) + { + return MHD_create_response_from_fd(size, fd); + } + else + { + return MHD_create_response_from_buffer( + 0, + (void*) "", + MHD_RESPMEM_PERSISTENT + ); + } +} + +} diff --git a/3rd_party/libhttpserver-0.18.2/src/gettext.h b/3rd_party/libhttpserver-0.18.2/src/gettext.h new file mode 100644 index 00000000..4fb025be --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/gettext.h @@ -0,0 +1,111 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2012 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by + the gettext() and ngettext() macros. This is an alternative to calling + textdomain(), and is useful for libraries. */ +# ifdef DEFAULT_TEXT_DOMAIN +# undef gettext +# define gettext(Msgid) \ + dgettext (DEFAULT_TEXT_DOMAIN, Msgid) +# undef ngettext +# define ngettext(Msgid1, Msgid2, N) \ + dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) +# endif + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + , which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include +# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H +# include +# endif +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# undef gettext +# define gettext(Msgid) ((const char *) (Msgid)) +# undef dgettext +# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) +# undef dcgettext +# define dcgettext(Domainname, Msgid, Category) \ + ((void) (Category), dgettext (Domainname, Msgid)) +# undef ngettext +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 \ + ? ((void) (Msgid2), (const char *) (Msgid1)) \ + : ((void) (Msgid1), (const char *) (Msgid2))) +# undef dngettext +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) +# undef dcngettext +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N)) +# undef textdomain +# define textdomain(Domainname) ((const char *) (Domainname)) +# undef bindtextdomain +# define bindtextdomain(Domainname, Dirname) \ + ((void) (Domainname), (const char *) (Dirname)) +# undef bind_textdomain_codeset +# define bind_textdomain_codeset(Domainname, Codeset) \ + ((void) (Domainname), (const char *) (Codeset)) + +#endif + +/* Prefer gnulib's setlocale override over libintl's setlocale override. */ +#ifdef GNULIB_defined_setlocale +# undef setlocale +# define setlocale rpl_setlocale +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +#endif /* _LIBGETTEXT_H */ diff --git a/3rd_party/libhttpserver-0.18.2/src/http_request.cpp b/3rd_party/libhttpserver-0.18.2/src/http_request.cpp new file mode 100644 index 00000000..dd41e680 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/http_request.cpp @@ -0,0 +1,316 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +*/ + +#include "httpserver/http_request.hpp" +#include +#include +#include +#include "httpserver/http_utils.hpp" +#include "httpserver/string_utilities.hpp" + +using namespace std; + +namespace httpserver +{ + +const std::string http_request::EMPTY = ""; + +struct arguments_accumulator +{ + unescaper_ptr unescaper; + std::map* arguments; +}; + +void http_request::set_method(const std::string& method) +{ + this->method = string_utilities::to_upper_copy(method); +} + +bool http_request::check_digest_auth( + const std::string& realm, + const std::string& password, + int nonce_timeout, + bool& reload_nonce +) const +{ + std::string digested_user = get_digested_user(); + + int val = MHD_digest_auth_check( + underlying_connection, + realm.c_str(), + digested_user.c_str(), + password.c_str(), + nonce_timeout + ); + + if(val == MHD_INVALID_NONCE) + { + reload_nonce = true; + return false; + } + else if(val == MHD_NO) + { + reload_nonce = false; + return false; + } + reload_nonce = false; + return true; +} + +const std::string http_request::get_connection_value(const std::string& key, enum MHD_ValueKind kind) const +{ + const char* header_c = MHD_lookup_connection_value( + underlying_connection, + kind, + key.c_str() + ); + + if (header_c == NULL) return EMPTY; + + return header_c; +} + +MHD_Result http_request::build_request_header( + void *cls, + enum MHD_ValueKind kind, + const char *key, + const char *value +) +{ + std::map* dhr = static_cast*>(cls); + (*dhr)[key] = value; + return MHD_YES; +} + +const std::map http_request::get_headerlike_values(enum MHD_ValueKind kind) const +{ + std::map headers; + + MHD_get_connection_values( + underlying_connection, + kind, + &build_request_header, + (void*) &headers + ); + + return headers; +} + +const std::string http_request::get_header(const std::string& key) const +{ + return get_connection_value(key, MHD_HEADER_KIND); +} + +const std::map http_request::get_headers() const +{ + return get_headerlike_values(MHD_HEADER_KIND); +} + +const std::string http_request::get_footer(const std::string& key) const +{ + return get_connection_value(key, MHD_FOOTER_KIND); +} + +const std::map http_request::get_footers() const +{ + return get_headerlike_values(MHD_FOOTER_KIND); +} + +const std::string http_request::get_cookie(const std::string& key) const +{ + return get_connection_value(key, MHD_COOKIE_KIND); +} + +const std::map http_request::get_cookies() const +{ + return get_headerlike_values(MHD_COOKIE_KIND); +} + +const std::string http_request::get_arg(const std::string& key) const +{ + std::map::const_iterator it = args.find(key); + + if(it != args.end()) + { + return it->second; + } + + return get_connection_value(key, MHD_GET_ARGUMENT_KIND); +} + +const std::map http_request::get_args() const +{ + std::map arguments; + arguments.insert(args.begin(), args.end()); + + arguments_accumulator aa; + aa.unescaper = unescaper; + aa.arguments = &arguments; + + MHD_get_connection_values( + underlying_connection, + MHD_GET_ARGUMENT_KIND, + &build_request_args, + (void*) &aa + ); + + return arguments; +} + +const std::string http_request::get_querystring() const +{ + std::string querystring = ""; + + MHD_get_connection_values( + underlying_connection, + MHD_GET_ARGUMENT_KIND, + &build_request_querystring, + (void*) &querystring + ); + + return querystring; +} + +MHD_Result http_request::build_request_args( + void *cls, + enum MHD_ValueKind kind, + const char *key, + const char *arg_value +) +{ + arguments_accumulator* aa = static_cast(cls); + std::string value = ((arg_value == NULL) ? "" : arg_value); + + http::base_unescaper(value, aa->unescaper); + (*aa->arguments)[key] = value; + return MHD_YES; +} + +MHD_Result http_request::build_request_querystring( + void *cls, + enum MHD_ValueKind kind, + const char *key, + const char *arg_value +) +{ + std::string* querystring = static_cast(cls); + std::string value = ((arg_value == NULL) ? "" : arg_value); + { + std::vector buf(std::string(key).size() + value.size() + 3); + if(*querystring == "") + { + snprintf(&buf[0], buf.size(), "?%s=%s", key, value.c_str()); + *querystring = &buf[0]; + } + else + { + snprintf(&buf[0], buf.size(), "&%s=%s", key, value.c_str()); + *querystring += string(&buf[0]); + } + } + + return MHD_YES; +} + +const std::string http_request::get_user() const +{ + char* username = 0x0; + char* password = 0x0; + + username = MHD_basic_auth_get_username_password(underlying_connection, &password); + if (password != 0x0) free(password); + + std::string user; + if (username != 0x0) user = username; + + free(username); + + return user; +} + +const std::string http_request::get_pass() const +{ + char* username = 0x0; + char* password = 0x0; + + username = MHD_basic_auth_get_username_password(underlying_connection, &password); + if (username != 0x0) free(username); + + std::string pass; + if (password != 0x0) pass = password; + + free(password); + + return pass; +} + +const std::string http_request::get_digested_user() const +{ + char* digested_user_c = 0x0; + digested_user_c = MHD_digest_auth_get_username(underlying_connection); + + std::string digested_user = EMPTY; + if (digested_user_c != 0x0) + { + digested_user = digested_user_c; + free(digested_user_c); + } + + return digested_user; +} + +const std::string http_request::get_requestor() const +{ + const MHD_ConnectionInfo * conninfo = MHD_get_connection_info( + underlying_connection, + MHD_CONNECTION_INFO_CLIENT_ADDRESS + ); + + return http::get_ip_str(conninfo->client_addr); +} + +unsigned short http_request::get_requestor_port() const +{ + const MHD_ConnectionInfo * conninfo = MHD_get_connection_info( + underlying_connection, + MHD_CONNECTION_INFO_CLIENT_ADDRESS + ); + + return http::get_port(conninfo->client_addr); +} + +std::ostream &operator<< (std::ostream &os, const http_request &r) +{ + os << r.get_method() << " Request [user:\"" << r.get_user() << "\" pass:\"" << r.get_pass() << "\"] path:\"" + << r.get_path() << "\"" << std::endl; + + http::dump_header_map(os,"Headers",r.get_headers()); + http::dump_header_map(os,"Footers",r.get_footers()); + http::dump_header_map(os,"Cookies",r.get_cookies()); + http::dump_arg_map(os,"Query Args",r.get_args()); + + os << " Version [ " << r.get_version() << " ] Requestor [ " << r.get_requestor() + << " ] Port [ " << r.get_requestor_port() << " ]" << std::endl; + + return os; +} + +} diff --git a/3rd_party/libhttpserver-0.18.2/src/http_resource.cpp b/3rd_party/libhttpserver-0.18.2/src/http_resource.cpp new file mode 100644 index 00000000..46bdb0de --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/http_resource.cpp @@ -0,0 +1,55 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#include "httpserver/http_resource.hpp" +#include +#include "httpserver/string_response.hpp" + +namespace httpserver { class http_response; } + +using namespace std; + +namespace httpserver +{ +//RESOURCE +void resource_init(map& allowed_methods) +{ + allowed_methods[MHD_HTTP_METHOD_GET] = true; + allowed_methods[MHD_HTTP_METHOD_POST] = true; + allowed_methods[MHD_HTTP_METHOD_PUT] = true; + allowed_methods[MHD_HTTP_METHOD_HEAD] = true; + allowed_methods[MHD_HTTP_METHOD_DELETE] = true; + allowed_methods[MHD_HTTP_METHOD_TRACE] = true; + allowed_methods[MHD_HTTP_METHOD_CONNECT] = true; + allowed_methods[MHD_HTTP_METHOD_OPTIONS] = true; + allowed_methods[MHD_HTTP_METHOD_PATCH] = true; +} + +namespace details +{ + +shared_ptr empty_render(const http_request& r) +{ + return shared_ptr(new string_response()); +} + +}; + +}; diff --git a/3rd_party/libhttpserver-0.18.2/src/http_response.cpp b/3rd_party/libhttpserver-0.18.2/src/http_response.cpp new file mode 100644 index 00000000..2d261e3d --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/http_response.cpp @@ -0,0 +1,83 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/http_response.hpp" +#include +#include +#include +#include "httpserver/http_utils.hpp" + +using namespace std; + +namespace httpserver +{ + +MHD_Response* http_response::get_raw_response() +{ + return MHD_create_response_from_buffer(0, (void*) "", MHD_RESPMEM_PERSISTENT); +} + +void http_response::decorate_response(MHD_Response* response) +{ + map::iterator it; + + for (it=headers.begin() ; it != headers.end(); ++it) + MHD_add_response_header( + response, + (*it).first.c_str(), + (*it).second.c_str() + ); + + for (it=footers.begin() ; it != footers.end(); ++it) + MHD_add_response_footer(response, + (*it).first.c_str(), + (*it).second.c_str() + ); + + for (it=cookies.begin(); it != cookies.end(); ++it) + MHD_add_response_header( + response, + "Set-Cookie", + ((*it).first + "=" + (*it).second).c_str() + ); +} + +int http_response::enqueue_response(MHD_Connection* connection, MHD_Response* response) +{ + return MHD_queue_response(connection, response_code, response); +} + +void http_response::shoutCAST() +{ + response_code |= http::http_utils::shoutcast_response; +} + +std::ostream &operator<< (std::ostream &os, const http_response &r) +{ + os << "Response [response_code:" << r.response_code << "]" << std::endl; + + http::dump_header_map(os,"Headers",r.headers); + http::dump_header_map(os,"Footers",r.footers); + http::dump_header_map(os,"Cookies",r.cookies); + + return os; +} + +} diff --git a/3rd_party/libhttpserver-0.18.2/src/http_utils.cpp b/3rd_party/libhttpserver-0.18.2/src/http_utils.cpp new file mode 100644 index 00000000..caefabc5 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/http_utils.cpp @@ -0,0 +1,627 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/http_utils.hpp" + +#if defined(_WIN32) && ! defined(__CYGWIN__) +#include +#include +#else // WIN32 check +#include +#include +#include +#include +#include +#endif // WIN32 check + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "httpserver/string_utilities.hpp" + +#pragma GCC diagnostic ignored "-Warray-bounds" +#define CHECK_BIT(var,pos) ((var) & (1<<(pos))) +#define SET_BIT(var,pos) ((var) |= 1 << (pos)) +#define CLEAR_BIT(var,pos) ((var) &= ~(1<<(pos))) + +#if defined (__CYGWIN__) + +#if ! defined (NI_MAXHOST) +#define NI_MAXHOST 1025 +#endif // NI_MAXHOST + +#ifndef __u_char_defined +typedef unsigned char u_char; +#define __u_char_defined +#endif // __u_char_defined + +#endif // CYGWIN + +using namespace std; + +namespace httpserver { +namespace http { + +/* See also: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html */ + +const int http_utils::http_continue = MHD_HTTP_CONTINUE; +const int http_utils::http_switching_protocol = MHD_HTTP_SWITCHING_PROTOCOLS; +const int http_utils::http_processing = MHD_HTTP_PROCESSING; + +const int http_utils::http_ok = MHD_HTTP_OK; +const int http_utils::http_created = MHD_HTTP_CREATED; +const int http_utils::http_accepted = MHD_HTTP_ACCEPTED; +const int http_utils::http_non_authoritative_information = + MHD_HTTP_NON_AUTHORITATIVE_INFORMATION; +const int http_utils::http_no_content = MHD_HTTP_NO_CONTENT; +const int http_utils::http_reset_content = MHD_HTTP_RESET_CONTENT; +const int http_utils::http_partial_content = MHD_HTTP_PARTIAL_CONTENT; +const int http_utils::http_multi_status = MHD_HTTP_MULTI_STATUS; + +const int http_utils::http_multiple_choices = MHD_HTTP_MULTIPLE_CHOICES; +const int http_utils::http_moved_permanently = MHD_HTTP_MOVED_PERMANENTLY; +const int http_utils::http_found = MHD_HTTP_FOUND; +const int http_utils::http_see_other = MHD_HTTP_SEE_OTHER; +const int http_utils::http_not_modified = MHD_HTTP_NOT_MODIFIED; +const int http_utils::http_use_proxy = MHD_HTTP_USE_PROXY; +const int http_utils::http_switch_proxy = MHD_HTTP_SWITCH_PROXY; +const int http_utils::http_temporary_redirect = MHD_HTTP_TEMPORARY_REDIRECT; + +const int http_utils::http_bad_request = MHD_HTTP_BAD_REQUEST; +const int http_utils::http_unauthorized = MHD_HTTP_UNAUTHORIZED; +const int http_utils::http_payment_required = MHD_HTTP_PAYMENT_REQUIRED; +const int http_utils::http_forbidden = MHD_HTTP_FORBIDDEN; +const int http_utils::http_not_found = MHD_HTTP_NOT_FOUND; +const int http_utils::http_method_not_allowed = MHD_HTTP_METHOD_NOT_ALLOWED; +const int http_utils::http_method_not_acceptable = MHD_HTTP_NOT_ACCEPTABLE; +const int http_utils::http_proxy_authentication_required = + MHD_HTTP_PROXY_AUTHENTICATION_REQUIRED; +const int http_utils::http_request_timeout = MHD_HTTP_REQUEST_TIMEOUT; +const int http_utils::http_conflict = MHD_HTTP_CONFLICT; +const int http_utils::http_gone = MHD_HTTP_GONE; +const int http_utils::http_length_required = MHD_HTTP_LENGTH_REQUIRED; +const int http_utils::http_precondition_failed = MHD_HTTP_PRECONDITION_FAILED; +const int http_utils::http_request_entity_too_large = + MHD_HTTP_PAYLOAD_TOO_LARGE; +const int http_utils::http_request_uri_too_long = MHD_HTTP_URI_TOO_LONG; +const int http_utils::http_unsupported_media_type = + MHD_HTTP_UNSUPPORTED_MEDIA_TYPE; +const int http_utils::http_requested_range_not_satisfiable = + MHD_HTTP_RANGE_NOT_SATISFIABLE; +const int http_utils::http_expectation_failed = MHD_HTTP_EXPECTATION_FAILED; +const int http_utils::http_unprocessable_entity = MHD_HTTP_UNPROCESSABLE_ENTITY; +const int http_utils::http_locked = MHD_HTTP_LOCKED; +const int http_utils::http_failed_dependency = MHD_HTTP_FAILED_DEPENDENCY; +const int http_utils::http_unordered_collection = MHD_HTTP_UNORDERED_COLLECTION; +const int http_utils::http_upgrade_required = MHD_HTTP_UPGRADE_REQUIRED; +const int http_utils::http_retry_with = MHD_HTTP_RETRY_WITH; + +const int http_utils::http_internal_server_error = + MHD_HTTP_INTERNAL_SERVER_ERROR; +const int http_utils::http_not_implemented = MHD_HTTP_NOT_IMPLEMENTED; +const int http_utils::http_bad_gateway = MHD_HTTP_BAD_GATEWAY; +const int http_utils::http_service_unavailable = MHD_HTTP_SERVICE_UNAVAILABLE; +const int http_utils::http_gateway_timeout = MHD_HTTP_GATEWAY_TIMEOUT; +const int http_utils::http_version_not_supported = + MHD_HTTP_HTTP_VERSION_NOT_SUPPORTED; +const int http_utils::http_variant_also_negotiated = + MHD_HTTP_VARIANT_ALSO_NEGOTIATES; +const int http_utils::http_insufficient_storage = MHD_HTTP_INSUFFICIENT_STORAGE; +const int http_utils::http_bandwidth_limit_exceeded = + MHD_HTTP_BANDWIDTH_LIMIT_EXCEEDED; +const int http_utils::http_not_extended = MHD_HTTP_NOT_EXTENDED; + +const int http_utils::shoutcast_response = MHD_ICY_FLAG; + +const std::string http_utils::http_header_accept = MHD_HTTP_HEADER_ACCEPT; +const std::string http_utils::http_header_accept_charset = + MHD_HTTP_HEADER_ACCEPT_CHARSET; +const std::string http_utils::http_header_accept_encoding = + MHD_HTTP_HEADER_ACCEPT_ENCODING; +const std::string http_utils::http_header_accept_language = + MHD_HTTP_HEADER_ACCEPT_LANGUAGE; +const std::string http_utils::http_header_accept_ranges = + MHD_HTTP_HEADER_ACCEPT_RANGES; +const std::string http_utils::http_header_age = MHD_HTTP_HEADER_AGE; +const std::string http_utils::http_header_allow = MHD_HTTP_HEADER_ALLOW; +const std::string http_utils::http_header_authorization = + MHD_HTTP_HEADER_AUTHORIZATION; +const std::string http_utils::http_header_cache_control = + MHD_HTTP_HEADER_CACHE_CONTROL; +const std::string http_utils::http_header_connection = + MHD_HTTP_HEADER_CONNECTION; +const std::string http_utils::http_header_content_encoding = + MHD_HTTP_HEADER_CONTENT_ENCODING; +const std::string http_utils::http_header_content_language = + MHD_HTTP_HEADER_CONTENT_LANGUAGE; +const std::string http_utils::http_header_content_length = + MHD_HTTP_HEADER_CONTENT_LENGTH; +const std::string http_utils::http_header_content_location = + MHD_HTTP_HEADER_CONTENT_LOCATION; +const std::string http_utils::http_header_content_md5 = + MHD_HTTP_HEADER_CONTENT_MD5; +const std::string http_utils::http_header_content_range = + MHD_HTTP_HEADER_CONTENT_RANGE; +const std::string http_utils::http_header_content_type = + MHD_HTTP_HEADER_CONTENT_TYPE; +const std::string http_utils::http_header_date = MHD_HTTP_HEADER_DATE; +const std::string http_utils::http_header_etag = MHD_HTTP_HEADER_ETAG; +const std::string http_utils::http_header_expect = MHD_HTTP_HEADER_EXPECT; +const std::string http_utils::http_header_expires = MHD_HTTP_HEADER_EXPIRES; +const std::string http_utils::http_header_from = MHD_HTTP_HEADER_FROM; +const std::string http_utils::http_header_host = MHD_HTTP_HEADER_HOST; +const std::string http_utils::http_header_if_match = MHD_HTTP_HEADER_IF_MATCH; +const std::string http_utils::http_header_if_modified_since = + MHD_HTTP_HEADER_IF_MODIFIED_SINCE; +const std::string http_utils::http_header_if_none_match = + MHD_HTTP_HEADER_IF_NONE_MATCH; +const std::string http_utils::http_header_if_range = MHD_HTTP_HEADER_IF_RANGE; +const std::string http_utils::http_header_if_unmodified_since = + MHD_HTTP_HEADER_IF_UNMODIFIED_SINCE; +const std::string http_utils::http_header_last_modified = + MHD_HTTP_HEADER_LAST_MODIFIED; +const std::string http_utils::http_header_location = MHD_HTTP_HEADER_LOCATION; +const std::string http_utils::http_header_max_forwards = + MHD_HTTP_HEADER_MAX_FORWARDS; +const std::string http_utils::http_header_pragma = MHD_HTTP_HEADER_PRAGMA; +const std::string http_utils::http_header_proxy_authenticate = + MHD_HTTP_HEADER_PROXY_AUTHENTICATE; +const std::string http_utils::http_header_proxy_authentication = + MHD_HTTP_HEADER_PROXY_AUTHORIZATION; +const std::string http_utils::http_header_range = MHD_HTTP_HEADER_RANGE; +const std::string http_utils::http_header_referer = MHD_HTTP_HEADER_REFERER; +const std::string http_utils::http_header_retry_after = + MHD_HTTP_HEADER_RETRY_AFTER; +const std::string http_utils::http_header_server = MHD_HTTP_HEADER_SERVER; +const std::string http_utils::http_header_te = MHD_HTTP_HEADER_TE; +const std::string http_utils::http_header_trailer = MHD_HTTP_HEADER_TRAILER; +const std::string http_utils::http_header_transfer_encoding = + MHD_HTTP_HEADER_TRANSFER_ENCODING; +const std::string http_utils::http_header_upgrade = MHD_HTTP_HEADER_UPGRADE; +const std::string http_utils::http_header_user_agent = + MHD_HTTP_HEADER_USER_AGENT; +const std::string http_utils::http_header_vary = MHD_HTTP_HEADER_VARY; +const std::string http_utils::http_header_via = MHD_HTTP_HEADER_VIA; +const std::string http_utils::http_header_warning = MHD_HTTP_HEADER_WARNING; +const std::string http_utils::http_header_www_authenticate = + MHD_HTTP_HEADER_WWW_AUTHENTICATE; + +const std::string http_utils::http_version_1_0 = MHD_HTTP_VERSION_1_0; +const std::string http_utils::http_version_1_1 = MHD_HTTP_VERSION_1_1; + +const std::string http_utils::http_method_connect = MHD_HTTP_METHOD_CONNECT; +const std::string http_utils::http_method_delete = MHD_HTTP_METHOD_DELETE; +const std::string http_utils::http_method_get = MHD_HTTP_METHOD_GET; +const std::string http_utils::http_method_head = MHD_HTTP_METHOD_HEAD; +const std::string http_utils::http_method_options = MHD_HTTP_METHOD_OPTIONS; +const std::string http_utils::http_method_post = MHD_HTTP_METHOD_POST; +const std::string http_utils::http_method_put = MHD_HTTP_METHOD_PUT; +const std::string http_utils::http_method_trace = MHD_HTTP_METHOD_TRACE; +const std::string http_utils::http_method_patch = MHD_HTTP_METHOD_PATCH; + +const std::string http_utils::http_post_encoding_form_urlencoded = + MHD_HTTP_POST_ENCODING_FORM_URLENCODED; +const std::string http_utils::http_post_encoding_multipart_formdata = + MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA; + +const std::string http_utils::text_plain = "text/plain"; + +std::vector http_utils::tokenize_url( + const std::string& str, + const char separator +) +{ + return string_utilities::string_split(str, separator); +} + +std::string http_utils::standardize_url(const std::string& url) +{ + std::string n_url = url; + + std::string::iterator new_end = std::unique(n_url.begin(), n_url.end(), [](char a, char b) { return (a == b) && (a == '/'); }); + n_url.erase(new_end, n_url.end()); + + std::string::size_type n_url_length = n_url.length(); + + std::string result; + + if (n_url_length > 1 && n_url[n_url_length - 1] == '/') + { + result = n_url.substr(0, n_url_length - 1); + } + else + { + result = n_url; + } + + return result; +} + +std::string get_ip_str(const struct sockaddr *sa, socklen_t maxlen) +{ + if (!sa) throw std::invalid_argument("socket pointer is null"); + + char to_ret[NI_MAXHOST]; + if (AF_INET6 == sa->sa_family) + { + inet_ntop(AF_INET6, &(((sockaddr_in6*) sa)->sin6_addr), to_ret, INET6_ADDRSTRLEN); + return to_ret; + } + else if (AF_INET == sa->sa_family) + { + inet_ntop(AF_INET, &(((sockaddr_in*) sa)->sin_addr), to_ret, INET_ADDRSTRLEN); + return to_ret; + } + else + { + throw std::invalid_argument("IP family must be either AF_INET or AF_INET6"); + } +} + +unsigned short get_port(const struct sockaddr* sa) +{ + if (!sa) throw std::invalid_argument("socket pointer is null"); + + if (sa->sa_family == AF_INET) + { + return ((struct sockaddr_in*) sa)->sin_port; + } + else if (sa->sa_family == AF_INET6) + { + return ((struct sockaddr_in6*) sa)->sin6_port; + } + else + { + throw std::invalid_argument("IP family must be either AF_INET or AF_INET6"); + } +} + +size_t http_unescape(std::string& val) +{ + if (val.empty()) return 0; + + int rpos = 0; + int wpos = 0; + + unsigned int num; + + while ('\0' != val[rpos]) + { + switch (val[rpos]) + { + case '+': + val[wpos] = ' '; + wpos++; + rpos++; + break; + case '%': + if ( (1 == sscanf (val.substr(rpos + 1).c_str(), "%2x", &num)) || + (1 == sscanf (val.substr(rpos + 1).c_str(), "%2X", &num)) + ) + { + val[wpos] = (unsigned char) num; + wpos++; + rpos += 3; + break; + } + /* intentional fall through! */ + default: + val[wpos] = val[rpos]; + wpos++; + rpos++; + } + } + val[wpos] = '\0'; /* add 0-terminator */ + val.resize(wpos); + return wpos; /* = strlen(val) */ +} + +ip_representation::ip_representation(const struct sockaddr* ip) +{ + std::fill(pieces, pieces + 16, 0); + if(ip->sa_family == AF_INET) + { + ip_version = http_utils::IPV4; + for(int i=0;i<4;i++) + { + pieces[12+i]=((u_char*)&(((struct sockaddr_in *)ip)->sin_addr))[i]; + } + } + else + { + ip_version = http_utils::IPV6; + for (int i = 0; i < 16; i++) + { + pieces[i] = ((u_char*)&(((struct sockaddr_in6 *)ip)->sin6_addr))[i]; + } + } + mask = DEFAULT_MASK_VALUE; +} + +ip_representation::ip_representation(const std::string& ip) +{ + std::vector parts; + mask = DEFAULT_MASK_VALUE; + std::fill(pieces, pieces + 16, 0); + if(ip.find(':') != std::string::npos) //IPV6 + { + ip_version = http_utils::IPV6; + parts = string_utilities::string_split(ip, ':', false); + if (parts.size() > 8) + { + throw std::invalid_argument("IP is badly formatted. Max 8 parts in IPV6."); + } + + unsigned int omitted = 8 - (parts.size() - 1); + if (omitted != 0) + { + int empty_count = 0; + for (unsigned int i = 0; i < parts.size(); i++) + { + if (parts[i].size() == 0) empty_count++; + } + + if (empty_count > 1) + { + if (parts[parts.size() - 1].find(".") != std::string::npos) omitted -= 1; + + if (empty_count == 2 && parts[0] == "" && parts[1] == "") + { + omitted += 1; + parts = std::vector(parts.begin() + 1, parts.end()); + } + else + { + throw std::invalid_argument("IP is badly formatted. Cannot have more than one omitted segment in IPV6."); + } + } + } + + int y = 0; + for (unsigned int i = 0; i < parts.size(); i++) + { + if (parts[i] != "*") + { + if (parts[i].size() == 0) + { + for (unsigned int omitted_idx = 0; omitted_idx < omitted; omitted_idx++) + { + pieces[y] = 0; + pieces[y+1] = 0; + y += 2; + } + + continue; + } + + if (parts[i].size() < 4) + { + stringstream ss; + ss << setfill('0') << setw(4) << parts[i]; + parts[i] = ss.str(); + } + + if (parts[i].size() == 4) + { + pieces[y] = strtol((parts[i].substr(0,2)).c_str(),NULL,16); + pieces[y+1] = strtol( + (parts[i].substr(2,2)).c_str(), + NULL, + 16 + ); + + y += 2; + } + else + { + if(parts[i].find('.') != std::string::npos) + { + if(y != 12) + { + throw std::invalid_argument("IP is badly formatted. Missing parts before nested IPV4."); + } + + if (i != parts.size() - 1) + { + throw std::invalid_argument("IP is badly formatted. Nested IPV4 should be at the end"); + } + + vector subparts = string_utilities::string_split(parts[i], '.'); + if(subparts.size() == 4) + { + for (unsigned int k = 0; k < 10; k++) + { + if (pieces[k] != 0) throw std::invalid_argument("IP is badly formatted. Nested IPV4 can be preceded only by 0 (and, optionally, two 255 octects)"); + } + + if ((pieces[10] != 0 && pieces[10] != 255) || (pieces[11] != 0 && pieces[11] != 255)) + { + throw std::invalid_argument("IP is badly formatted. Nested IPV4 can be preceded only by 0 (and, optionally, two 255 octects)"); + } + + for(unsigned int ii = 0; ii < subparts.size(); ii++) + { + if(subparts[ii] != "*") + { + pieces[y+ii] = strtol( + subparts[ii].c_str(), + NULL, + 10 + ); + if (pieces[y+ii] > 255) throw std::invalid_argument("IP is badly formatted. 255 is max value for ip part."); + } + else + { + CLEAR_BIT(mask, y+ii); + } + } + } + else + { + throw std::invalid_argument("IP is badly formatted. Nested IPV4 can have max 4 parts."); + } + } + else + { + throw std::invalid_argument("IP is badly formatted. IPV6 parts can have max 4 characters (or nest an IPV4)"); + } + } + } + else + { + CLEAR_BIT(mask, y); + CLEAR_BIT(mask, y+1); + y+=2; + } + } + } + else //IPV4 + { + ip_version = http_utils::IPV4; + parts = string_utilities::string_split(ip, '.'); + if(parts.size() == 4) + { + for(unsigned int i = 0; i < parts.size(); i++) + { + if(parts[i] != "*") + { + pieces[12+i] = strtol(parts[i].c_str(), NULL, 10); + if (pieces[12+i] > 255) throw std::invalid_argument("IP is badly formatted. 255 is max value for ip part."); + } + else + { + CLEAR_BIT(mask, 12+i); + } + } + } + else + { + throw std::invalid_argument("IP is badly formatted. Max 4 parts in IPV4."); + } + } +} + +bool ip_representation::operator <(const ip_representation& b) const +{ + long this_score = 0; + long b_score = 0; + for (int i = 0; i < 16; i++) + { + if (i == 10 || i == 11) continue; + + if (CHECK_BIT(mask, i) && CHECK_BIT(b.mask, i)) + { + this_score += (16 - i) * pieces[i]; + b_score += (16 - i) * b.pieces[i]; + } + } + + if (this_score == b_score && + ((pieces[10] == 0x00 || pieces[10] == 0xFF) && (b.pieces[10] == 0x00 || b.pieces[10] == 0xFF)) && + ((pieces[11] == 0x00 || pieces[11] == 0xFF) && (b.pieces[11] == 0x00 || b.pieces[11] == 0xFF)) + ) + { + return false; + } + + for (int i = 10; i < 12; i++) + { + if (CHECK_BIT(mask, i) && CHECK_BIT(b.mask, i)) + { + this_score += (16 - i) * pieces[i]; + b_score += (16 - i) * b.pieces[i]; + } + } + + return this_score < b_score; +} + +const std::string load_file (const std::string& filename) +{ + ifstream fp(filename.c_str(), ios::in | ios::binary | ios::ate); + if(fp.is_open()) + { + std::string content; + + fp.seekg(0, fp.end); + content.reserve(fp.tellg()); + fp.seekg(0, fp.beg); + + content.assign((std::istreambuf_iterator(fp)), std::istreambuf_iterator()); + return content; + } + else + { + throw std::invalid_argument("Unable to open file"); + } +} + +void dump_header_map(std::ostream &os, const std::string &prefix, + const std::map &map) +{ + std::map::const_iterator it = map.begin(); + std::map::const_iterator end = map.end(); + + if (map.size()) { + os << " " << prefix << " ["; + for (; it != end; ++it) { + os << (*it).first << ":\"" << (*it).second << "\" "; + } + os << "]" << std::endl; + } +} + +void dump_arg_map(std::ostream &os, const std::string &prefix, + const std::map &map) +{ + std::map::const_iterator it = map.begin(); + std::map::const_iterator end = map.end(); + + if (map.size()) { + os << " " << prefix << " ["; + for (; it != end; ++it) { + os << (*it).first << ":\"" << (*it).second << "\" "; + } + os << "]" << std::endl; + } +} + +size_t base_unescaper(std::string& s, unescaper_ptr unescaper) +{ + if(s[0] == 0) return 0; + + if(unescaper != 0x0) + { + unescaper(s); + return s.size(); + } + + return http_unescape(s); +} + +}; +}; diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver.hpp new file mode 100644 index 00000000..772554af --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver.hpp @@ -0,0 +1,37 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#ifndef _HTTPSERVER_HPP_ +#define _HTTPSERVER_HPP_ + +#define _HTTPSERVER_HPP_INSIDE_ + +#include "httpserver/basic_auth_fail_response.hpp" +#include "httpserver/deferred_response.hpp" +#include "httpserver/digest_auth_fail_response.hpp" +#include "httpserver/file_response.hpp" +#include "httpserver/http_request.hpp" +#include "httpserver/http_resource.hpp" +#include "httpserver/http_response.hpp" +#include "httpserver/http_utils.hpp" +#include "httpserver/string_response.hpp" +#include "httpserver/webserver.hpp" + +#endif diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/basic_auth_fail_response.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/basic_auth_fail_response.hpp new file mode 100644 index 00000000..a28fa3d9 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/basic_auth_fail_response.hpp @@ -0,0 +1,68 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _BASIC_AUTH_FAIL_RESPONSE_HPP_ +#define _BASIC_AUTH_FAIL_RESPONSE_HPP_ + +#include +#include "http_utils.hpp" +#include "httpserver/string_response.hpp" + +struct MHD_Connection; +struct MHD_Response; + +namespace httpserver +{ + +class basic_auth_fail_response : public string_response +{ + public: + basic_auth_fail_response() = default; + + explicit basic_auth_fail_response( + const std::string& content, + const std::string& realm = "", + int response_code = http::http_utils::http_ok, + const std::string& content_type = http::http_utils::text_plain + ): + string_response(content, response_code, content_type), + realm(realm) + { + } + + basic_auth_fail_response(const basic_auth_fail_response& other) = default; + basic_auth_fail_response(basic_auth_fail_response&& other) noexcept = default; + basic_auth_fail_response& operator=(const basic_auth_fail_response& b) = default; + basic_auth_fail_response& operator=(basic_auth_fail_response&& b) = default; + + ~basic_auth_fail_response() = default; + + int enqueue_response(MHD_Connection* connection, MHD_Response* response); + + private: + std::string realm = ""; +}; + +} +#endif // _BASIC_AUTH_FAIL_RESPONSE_HPP_ diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/create_webserver.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/create_webserver.hpp new file mode 100644 index 00000000..39cb3ecb --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/create_webserver.hpp @@ -0,0 +1,306 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _CREATE_WEBSERVER_HPP_ +#define _CREATE_WEBSERVER_HPP_ + +#include + +#include "httpserver/http_response.hpp" +#include "httpserver/http_utils.hpp" + +#define DEFAULT_WS_TIMEOUT 180 +#define DEFAULT_WS_PORT 9898 + +namespace httpserver { + +class webserver; +class http_request; + +typedef const std::shared_ptr(*render_ptr)(const http_request&); +typedef bool(*validator_ptr)(const std::string&); +typedef void(*log_access_ptr)(const std::string&); +typedef void(*log_error_ptr)(const std::string&); + +class create_webserver +{ + public: + create_webserver() = default; + create_webserver(const create_webserver& b) = default; + create_webserver(create_webserver&& b) noexcept = default; + create_webserver& operator=(const create_webserver& b) = default; + create_webserver& operator=(create_webserver&& b) = default; + + explicit create_webserver(uint16_t port): + _port(port) + { + } + + create_webserver& port(uint16_t port) { _port = port; return *this; } + create_webserver& start_method( + const http::http_utils::start_method_T& start_method + ) + { + _start_method = start_method; return *this; + } + create_webserver& max_threads(int max_threads) + { + _max_threads = max_threads; return *this; + } + create_webserver& max_connections(int max_connections) + { + _max_connections = max_connections; return *this; + } + create_webserver& memory_limit(int memory_limit) + { + _memory_limit = memory_limit; return *this; + } + create_webserver& content_size_limit(size_t content_size_limit) + { + _content_size_limit = content_size_limit; return *this; + } + create_webserver& connection_timeout(int connection_timeout) + { + _connection_timeout = connection_timeout; return *this; + } + create_webserver& per_IP_connection_limit(int per_IP_connection_limit) + { + _per_IP_connection_limit = per_IP_connection_limit; return *this; + } + create_webserver& log_access(log_access_ptr log_access) + { + _log_access = log_access; return *this; + } + create_webserver& log_error(log_error_ptr log_error) + { + _log_error = log_error; return *this; + } + create_webserver& validator(validator_ptr validator) + { + _validator = validator; return *this; + } + create_webserver& unescaper(unescaper_ptr unescaper) + { + _unescaper = unescaper; return *this; + } + create_webserver& bind_address(const struct sockaddr* bind_address) + { + _bind_address = bind_address; return *this; + } + create_webserver& bind_socket(int bind_socket) + { + _bind_socket = bind_socket; return *this; + } + create_webserver& max_thread_stack_size(int max_thread_stack_size) + { + _max_thread_stack_size = max_thread_stack_size; return *this; + } + create_webserver& use_ssl() { _use_ssl = true; return *this; } + create_webserver& no_ssl() { _use_ssl = false; return *this; } + create_webserver& use_ipv6() { _use_ipv6 = true; return *this; } + create_webserver& no_ipv6() { _use_ipv6 = false; return *this; } + create_webserver& use_dual_stack() { _use_dual_stack = true; return *this; } + create_webserver& no_dual_stack() { _use_dual_stack = false; return *this; } + create_webserver& debug() { _debug = true; return *this; } + create_webserver& no_debug() { _debug = false; return *this; } + create_webserver& pedantic() { _pedantic = true; return *this; } + create_webserver& no_pedantic() { _pedantic = false; return *this; } + create_webserver& https_mem_key(const std::string& https_mem_key) + { + _https_mem_key = http::load_file(https_mem_key); + return *this; + } + create_webserver& https_mem_cert(const std::string& https_mem_cert) + { + _https_mem_cert = http::load_file(https_mem_cert); + return *this; + } + create_webserver& https_mem_trust(const std::string& https_mem_trust) + { + _https_mem_trust = http::load_file(https_mem_trust); + return *this; + } + create_webserver& raw_https_mem_key(const std::string& https_mem_key) + { + _https_mem_key = https_mem_key; return *this; + } + create_webserver& raw_https_mem_cert(const std::string& https_mem_cert) + { + _https_mem_cert = https_mem_cert; return *this; + } + create_webserver& raw_https_mem_trust( + const std::string& https_mem_trust + ) + { + _https_mem_trust = https_mem_trust; return *this; + } + create_webserver& https_priorities(const std::string& https_priorities) + { + _https_priorities = https_priorities; return *this; + } + create_webserver& cred_type(const http::http_utils::cred_type_T& cred_type) + { + _cred_type = cred_type; return *this; + } + create_webserver& digest_auth_random( + const std::string& digest_auth_random + ) + { + _digest_auth_random = digest_auth_random; return *this; + } + create_webserver& nonce_nc_size(int nonce_nc_size) + { + _nonce_nc_size = nonce_nc_size; return *this; + } + create_webserver& default_policy( + const http::http_utils::policy_T& default_policy + ) + { + _default_policy = default_policy; return *this; + } + create_webserver& basic_auth() + { + _basic_auth_enabled = true; return *this; + } + create_webserver& no_basic_auth() + { + _basic_auth_enabled = false; return *this; + } + create_webserver& digest_auth() + { + _digest_auth_enabled = true; return *this; + } + create_webserver& no_digest_auth() + { + _digest_auth_enabled = false; return *this; + } + create_webserver& deferred() + { + _deferred_enabled = true; return *this; + } + create_webserver& no_deferred() + { + _deferred_enabled = false; return *this; + } + create_webserver& regex_checking() + { + _regex_checking = true; return *this; + } + create_webserver& no_regex_checking() + { + _regex_checking = false; return *this; + } + create_webserver& ban_system() + { + _ban_system_enabled = true; return *this; + } + create_webserver& no_ban_system() + { + _ban_system_enabled = false; return *this; + } + create_webserver& post_process() + { + _post_process_enabled = true; return *this; + } + create_webserver& no_post_process() + { + _post_process_enabled = false; return *this; + } + create_webserver& single_resource() + { + _single_resource = true; return *this; + } + create_webserver& no_single_resource() + { + _single_resource = false; return *this; + } + create_webserver& tcp_nodelay() + { + _tcp_nodelay = true; return *this; + } + create_webserver& not_found_resource(render_ptr not_found_resource) + { + _not_found_resource = not_found_resource; return *this; + } + create_webserver& method_not_allowed_resource( + render_ptr method_not_allowed_resource + ) + { + _method_not_allowed_resource = method_not_allowed_resource; + return *this; + } + create_webserver& internal_error_resource( + render_ptr internal_error_resource + ) + { + _internal_error_resource = internal_error_resource; return *this; + } + + private: + uint16_t _port = DEFAULT_WS_PORT; + http::http_utils::start_method_T _start_method = http::http_utils::INTERNAL_SELECT; + int _max_threads = 0; + int _max_connections = 0; + int _memory_limit = 0; + size_t _content_size_limit = static_cast(-1); + int _connection_timeout = DEFAULT_WS_TIMEOUT; + int _per_IP_connection_limit = 0; + log_access_ptr _log_access = 0x0; + log_error_ptr _log_error = 0x0; + validator_ptr _validator = 0x0; + unescaper_ptr _unescaper = 0x0; + const struct sockaddr* _bind_address = 0x0; + int _bind_socket = 0; + int _max_thread_stack_size = 0; + bool _use_ssl = false; + bool _use_ipv6 = false; + bool _use_dual_stack = false; + bool _debug = false; + bool _pedantic = false; + std::string _https_mem_key = ""; + std::string _https_mem_cert = ""; + std::string _https_mem_trust = ""; + std::string _https_priorities = ""; + http::http_utils::cred_type_T _cred_type = http::http_utils::NONE; + std::string _digest_auth_random = ""; + int _nonce_nc_size = 0; + http::http_utils::policy_T _default_policy = http::http_utils::ACCEPT; + bool _basic_auth_enabled = true; + bool _digest_auth_enabled = true; + bool _regex_checking = true; + bool _ban_system_enabled = true; + bool _post_process_enabled = true; + bool _deferred_enabled = false; + bool _single_resource = false; + bool _tcp_nodelay = false; + render_ptr _not_found_resource = 0x0; + render_ptr _method_not_allowed_resource = 0x0; + render_ptr _internal_error_resource = 0x0; + + friend class webserver; +}; + +} //httpserver + +#endif //_CREATE_WEBSERVER_HPP_ diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/deferred_response.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/deferred_response.hpp new file mode 100644 index 00000000..9e4601e2 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/deferred_response.hpp @@ -0,0 +1,87 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _DEFERRED_RESPONSE_HPP_ +#define _DEFERRED_RESPONSE_HPP_ + +#include +#include +#include +#include +#include +#include "http_utils.hpp" +#include "httpserver/string_response.hpp" + +struct MHD_Response; + +namespace httpserver +{ + +namespace details +{ + MHD_Response* get_raw_response_helper(void* cls, ssize_t (*cb)(void*, uint64_t, char*, size_t)); +} + +template +class deferred_response : public string_response +{ + public: + explicit deferred_response( + ssize_t(*cycle_callback)(std::shared_ptr, char*, size_t), + std::shared_ptr closure_data, + const std::string& content = "", + int response_code = http::http_utils::http_ok, + const std::string& content_type = http::http_utils::text_plain + ): + string_response(content, response_code, content_type), + cycle_callback(cycle_callback), + closure_data(closure_data) + { + } + + deferred_response(const deferred_response& other) = default; + deferred_response(deferred_response&& other) noexcept = default; + deferred_response& operator=(const deferred_response& b) = default; + deferred_response& operator=(deferred_response&& b) = default; + + ~deferred_response() = default; + + MHD_Response* get_raw_response() + { + return details::get_raw_response_helper((void*) this, &cb); + } + + private: + ssize_t (*cycle_callback)(std::shared_ptr, char*, size_t); + std::shared_ptr closure_data; + + static ssize_t cb(void* cls, uint64_t, char* buf, size_t max) + { + deferred_response* dfr = static_cast*>(cls); + return dfr->cycle_callback(dfr->closure_data, buf, max); + } +}; + +} +#endif // _DEFERRED_RESPONSE_HPP_ diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/details/http_endpoint.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/details/http_endpoint.hpp new file mode 100644 index 00000000..37fd0d8c --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/details/http_endpoint.hpp @@ -0,0 +1,206 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _HTTP_ENDPOINT_HPP_ +#define _HTTP_ENDPOINT_HPP_ + +#include +#include +#include +#include +#include + +namespace httpserver +{ + +namespace details +{ + +class http_resource; + +/** + * Class representing an Http Endpoint. It is an abstraction used by the APIs. +**/ +class http_endpoint +{ + public: + /** + * Copy constructor. It is useful expecially to copy regex_t structure that contains dinamically allocated data. + * @param h The http_endpoint to copy + **/ + http_endpoint(const http_endpoint& h); + + /** + * Class Destructor + **/ + ~http_endpoint(); //if inlined it causes problems during ruby wrapper compiling + + /** + * Operator overload for "less than operator". It is used to order endpoints in maps. + * @param b The http_endpoint to compare to + * @return boolean indicating if this is less than b. + **/ + bool operator <(const http_endpoint& b) const; + + /** + * Operator overload for "assignment operator". It is used to copy endpoints to existing objects. + * Is is functional expecially to copy regex_t structure that contains dinamically allocated data. + * @param h The http_endpoint to copy + * @return a reference to the http_endpoint obtained + **/ + http_endpoint& operator =(const http_endpoint& h); + + /** + * Method indicating if this endpoint 'matches' with the one passed. A passed endpoint matches a registered endpoint if + * the regex represented by the registered endpoint matches the passed one. + * @param url The endpoint to match + * @return true if the passed endpoint matches this. + **/ + bool match(const http_endpoint& url) const; + + /** + * Method used to get the complete endpoint url + * @return a string representing the url + **/ + const std::string& get_url_complete() const + { + return url_complete; + } + + const std::string& get_url_normalized() const + { + return url_normalized; + } + + /** + * Method used to get all pars defined inside an url. + * @return a vector of strings representing all found pars. + **/ + const std::vector& get_url_pars() const + { + return url_pars; + } + + /** + * Method used to get all pieces of an url; considering an url splitted by '/'. + * @return a vector of strings representing all found pieces. + **/ + const std::vector& get_url_pieces() const + { + return url_pieces; + } + + /** + * Method used to get indexes of all parameters inside url + * @return a vector of int indicating all positions. + **/ + const std::vector& get_chunk_positions() const + { + return chunk_positions; + } + + bool is_family_url() const + { + return family_url; + } + + bool is_regex_compiled() const + { + return reg_compiled; + } + + /** + * Default constructor of the class. + **/ + http_endpoint(): + url_complete("/"), + url_normalized("/"), + re_url_normalized(std::regex("")), // initialize empty + family_url(false), + reg_compiled(false) + { + } + + /** + * Constructor of the class http_endpoint. It is used to initialize an http_endpoint starting from a string form URL. + * @param url The string representation of the endpoint. All endpoints are in the form "/path/to/resource". + * @param family boolean that indicates if the endpoint is a family endpoint. + * A family endpoint is an endpoint that identifies a root and all its child like the same resource. + * For example, if I identify "/path/" like a family endpoint and I associate to it the resource "A", also + * "/path/to/res/" is automatically associated to resource "A". Default is false. + * @param registration boolean that indicates to the system if this is an endpoint that need to be registered to a webserver + * or it is simply an endpoint to be used for comparisons. Default is false. + * @param use_regex boolean that indicates if regexes are checked or not. Default is true. + **/ + http_endpoint(const std::string& url, + bool family = false, + bool registration = false, + bool use_regex = false + ); + private: + /** + * The complete url extracted + **/ + std::string url_complete; + + /** + * The url standardized in order to use standard comparisons or regexes + **/ + std::string url_normalized; + + /** + * Vector containing parameters extracted from url + **/ + std::vector url_pars; + + /** + * Pieces the url can be splitted into (consider '/' as separator) + **/ + std::vector url_pieces; + + /** + * Position of url pieces representing parameters + **/ + std::vector chunk_positions; + + /** + * Regex used in comparisons + **/ + std::regex re_url_normalized; + + /** + * Boolean indicating wheter the endpoint represents a family + **/ + bool family_url; + + /** + * Boolean indicating if the regex is compiled + **/ + bool reg_compiled; +}; + +}; + +}; +#endif diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/details/modded_request.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/details/modded_request.hpp new file mode 100644 index 00000000..1ebe5b12 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/details/modded_request.hpp @@ -0,0 +1,76 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _MODDED_REQUEST_HPP_ +#define _MODDED_REQUEST_HPP_ + +#include "httpserver/http_request.hpp" + +namespace httpserver +{ + +namespace details +{ + +struct modded_request +{ + struct MHD_PostProcessor *pp = 0x0; + std::string* complete_uri = 0x0; + std::string* standardized_url = 0x0; + webserver* ws = 0x0; + + const std::shared_ptr (httpserver::http_resource::*callback)(const httpserver::http_request&); + + http_request* dhr = 0x0; + std::shared_ptr dhrs; + bool second = false; + bool has_body = false; + + modded_request() = default; + + modded_request(const modded_request& b) = default; + modded_request(modded_request&& b) = default; + + modded_request& operator=(const modded_request& b) = default; + modded_request& operator=(modded_request&& b) = default; + + ~modded_request() + { + if (NULL != pp) + { + MHD_destroy_post_processor (pp); + } + if(second) + delete dhr; //TODO: verify. It could be an error + delete complete_uri; + delete standardized_url; + } + +}; + +} //details + +} //httpserver + +#endif //_MODDED_REQUEST_HPP_ diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/digest_auth_fail_response.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/digest_auth_fail_response.hpp new file mode 100644 index 00000000..50abcee2 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/digest_auth_fail_response.hpp @@ -0,0 +1,75 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _DIGEST_AUTH_FAIL_RESPONSE_HPP_ +#define _DIGEST_AUTH_FAIL_RESPONSE_HPP_ + +#include +#include "http_utils.hpp" +#include "httpserver/string_response.hpp" + +struct MHD_Connection; +struct MHD_Response; + +namespace httpserver +{ + +class digest_auth_fail_response : public string_response +{ + public: + digest_auth_fail_response() = default; + + digest_auth_fail_response( + const std::string& content, + const std::string& realm = "", + const std::string& opaque = "", + bool reload_nonce = false, + int response_code = http::http_utils::http_ok, + const std::string& content_type = http::http_utils::text_plain + ): + string_response(content, response_code, content_type), + realm(realm), + opaque(opaque), + reload_nonce(reload_nonce) + { + } + + digest_auth_fail_response(const digest_auth_fail_response& other) = default; + digest_auth_fail_response(digest_auth_fail_response&& other) noexcept = default; + digest_auth_fail_response& operator=(const digest_auth_fail_response& b) = default; + digest_auth_fail_response& operator=(digest_auth_fail_response&& b) = default; + + ~digest_auth_fail_response() = default; + + int enqueue_response(MHD_Connection* connection, MHD_Response* response); + + private: + std::string realm = ""; + std::string opaque = ""; + bool reload_nonce = false; +}; + +} + +#endif // _DIGEST_AUTH_FAIL_RESPONSE_HPP_ diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/file_response.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/file_response.hpp new file mode 100644 index 00000000..0c9386fb --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/file_response.hpp @@ -0,0 +1,67 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _FILE_RESPONSE_HPP_ +#define _FILE_RESPONSE_HPP_ + +#include +#include "http_utils.hpp" +#include "httpserver/http_response.hpp" + +struct MHD_Response; + +namespace httpserver +{ + +class file_response : public http_response +{ + public: + file_response() = default; + + explicit file_response( + const std::string& filename, + int response_code = http::http_utils::http_ok, + const std::string& content_type = http::http_utils::text_plain + ): + http_response(response_code, content_type), + filename(filename) + { + } + + file_response(const file_response& other) = default; + file_response(file_response&& other) noexcept = default; + + file_response& operator=(const file_response& b) = default; + file_response& operator=(file_response&& b) = default; + + ~file_response() = default; + + MHD_Response* get_raw_response(); + + private: + std::string filename = ""; +}; + +} +#endif // _FILE_RESPONSE_HPP_ diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/http_request.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/http_request.hpp new file mode 100644 index 00000000..6aacbfe6 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/http_request.hpp @@ -0,0 +1,355 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _HTTP_REQUEST_HPP_ +#define _HTTP_REQUEST_HPP_ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "httpserver/http_utils.hpp" + +struct MHD_Connection; + +namespace httpserver +{ + +/** + * Class representing an abstraction for an Http Request. It is used from classes using these apis to receive information through http protocol. +**/ +class http_request +{ + public: + static const std::string EMPTY; + + /** + * Method used to get the username eventually passed through basic authentication. + * @return string representation of the username. + **/ + const std::string get_user() const; + + /** + * Method used to get the username extracted from a digest authentication + * @return the username + **/ + const std::string get_digested_user() const; + + /** + * Method used to get the password eventually passed through basic authentication. + * @return string representation of the password. + **/ + const std::string get_pass() const; + + /** + * Method used to get the path requested + * @return string representing the path requested. + **/ + const std::string& get_path() const + { + return path; + } + + /** + * Method used to get all pieces of the path requested; considering an url splitted by '/'. + * @return a vector of strings containing all pieces + **/ + const std::vector get_path_pieces() const + { + return http::http_utils::tokenize_url(path); + } + + /** + * Method used to obtain a specified piece of the path; considering an url splitted by '/'. + * @param index the index of the piece selected + * @return the selected piece in form of string + **/ + const std::string get_path_piece(int index) const + { + std::vector post_path = get_path_pieces(); + if(((int)(post_path.size())) > index) + return post_path[index]; + return EMPTY; + } + + /** + * Method used to get the METHOD used to make the request. + * @return string representing the method. + **/ + const std::string& get_method() const + { + return method; + } + + /** + * Method used to get all headers passed with the request. + * @param result a map > that will be filled with all headers + * @result the size of the map + **/ + const std::map get_headers() const; + + /** + * Method used to get all footers passed with the request. + * @param result a map > that will be filled with all footers + * @result the size of the map + **/ + const std::map get_footers() const; + + /** + * Method used to get all cookies passed with the request. + * @param result a map > that will be filled with all cookies + * @result the size of the map + **/ + const std::map get_cookies() const; + + /** + * Method used to get all args passed with the request. + * @param result a map > that will be filled with all args + * @result the size of the map + **/ + const std::map get_args() const; + + /** + * Method used to get a specific header passed with the request. + * @param key the specific header to get the value from + * @return the value of the header. + **/ + const std::string get_header(const std::string& key) const; + + const std::string get_cookie(const std::string& key) const; + + /** + * Method used to get a specific footer passed with the request. + * @param key the specific footer to get the value from + * @return the value of the footer. + **/ + const std::string get_footer(const std::string& key) const; + + /** + * Method used to get a specific argument passed with the request. + * @param ket the specific argument to get the value from + * @return the value of the arg. + **/ + const std::string get_arg(const std::string& key) const; + + /** + * Method used to get the content of the request. + * @return the content in string representation + **/ + const std::string& get_content() const + { + return content; + } + + /** + * Method to check whether the size of the content reached or exceeded content_size_limit. + * @return boolean + **/ + bool content_too_large() const + { + return content.size()>=content_size_limit; + } + /** + * Method used to get the content of the query string.. + * @return the query string in string representation + **/ + const std::string get_querystring() const; + + /** + * Method used to get the version of the request. + * @return the version in string representation + **/ + const std::string& get_version() const + { + return version; + } + + /** + * Method used to get the requestor. + * @return the requestor + **/ + const std::string get_requestor() const; + + /** + * Method used to get the requestor port used. + * @return the requestor port + **/ + unsigned short get_requestor_port() const; + + bool check_digest_auth(const std::string& realm, + const std::string& password, + int nonce_timeout, bool& reload_nonce + ) const; + + friend std::ostream &operator<< (std::ostream &os, http_request &r); + + private: + /** + * Default constructor of the class. It is a specific responsibility of apis to initialize this type of objects. + **/ + http_request() = default; + + http_request(MHD_Connection* underlying_connection, unescaper_ptr unescaper): + underlying_connection(underlying_connection), + unescaper(unescaper) + { + } + + /** + * Copy constructor. + * @param b http_request b to copy attributes from. + **/ + http_request(const http_request& b) = default; + http_request(http_request&& b) noexcept = default; + + http_request& operator=(const http_request& b) = default; + http_request& operator=(http_request&& b) = default; + + std::string path; + std::string method; + std::map args; + std::string content = ""; + size_t content_size_limit = static_cast(-1); + std::string version; + + struct MHD_Connection* underlying_connection = 0x0; + + unescaper_ptr unescaper = 0x0; + + static MHD_Result build_request_header(void *cls, enum MHD_ValueKind kind, + const char *key, const char *value + ); + + static MHD_Result build_request_args(void *cls, enum MHD_ValueKind kind, + const char *key, const char *value + ); + + static MHD_Result build_request_querystring(void *cls, enum MHD_ValueKind kind, + const char *key, const char *value + ); + + /** + * Method used to set an argument value by key. + * @param key The name identifying the argument + * @param value The value assumed by the argument + **/ + void set_arg(const std::string& key, const std::string& value) + { + args[key] = value.substr(0,content_size_limit); + } + + /** + * Method used to set an argument value by key. + * @param key The name identifying the argument + * @param value The value assumed by the argument + * @param size The size in number of char of the value parameter. + **/ + void set_arg(const char* key, const char* value, size_t size) + { + args[key] = std::string(value, std::min(size, content_size_limit)); + } + + /** + * Method used to set the content of the request + * @param content The content to set. + **/ + void set_content(const std::string& content) + { + this->content = content.substr(0,content_size_limit); + } + + /** + * Method used to set the maximum size of the content + * @param content_size_limit The limit on the maximum size of the content and arg's. + **/ + void set_content_size_limit(size_t content_size_limit) + { + this->content_size_limit = content_size_limit; + } + + /** + * Method used to append content to the request preserving the previous inserted content + * @param content The content to append. + * @param size The size of the data to append. + **/ + void grow_content(const char* content, size_t size) + { + this->content.append(content, size); + if (this->content.size() > content_size_limit) + { + this->content.resize (content_size_limit); + } + } + + /** + * Method used to set the path requested. + * @param path The path searched by the request. + **/ + void set_path(const std::string& path) + { + this->path = path; + } + + /** + * Method used to set the request METHOD + * @param method The method to set for the request + **/ + void set_method(const std::string& method); + + /** + * Method used to set the request http version (ie http 1.1) + * @param version The version to set in form of string + **/ + void set_version(const std::string& version) + { + this->version = version; + } + + /** + * Method used to set all arguments of the request. + * @param args The args key-value map to set for the request. + **/ + void set_args(const std::map& args) + { + std::map::const_iterator it; + for(it = args.begin(); it != args.end(); ++it) + this->args[it->first] = it->second.substr(0,content_size_limit); + } + + const std::string get_connection_value(const std::string& key, enum MHD_ValueKind kind) const; + const std::map get_headerlike_values(enum MHD_ValueKind kind) const; + + friend class webserver; +}; + +std::ostream &operator<< (std::ostream &os, const http_request &r); + +}; +#endif diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/http_resource.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/http_resource.hpp new file mode 100644 index 00000000..04f67cb8 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/http_resource.hpp @@ -0,0 +1,225 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _http_resource_hpp_ +#define _http_resource_hpp_ + +#ifdef DEBUG +#include +#endif + +#include +#include +#include +#include + +namespace httpserver { class http_request; } +namespace httpserver { class http_response; } + +namespace httpserver { + +namespace details { std::shared_ptr empty_render(const http_request& r); }; + +/** + * Class representing a callable http resource. +**/ + +void resource_init(std::map& res); + +class http_resource +{ + public: + /** + * Class destructor + **/ + virtual ~http_resource() = default; + + /** + * Method used to answer to a generic request + * @param req Request passed through http + * @return A http_response object + **/ + virtual const std::shared_ptr render(const http_request& req) + { + return details::empty_render(req); + } + /** + * Method used to answer to a GET request + * @param req Request passed through http + * @return A http_response object + **/ + virtual const std::shared_ptr render_GET(const http_request& req) + { + return render(req); + } + /** + * Method used to answer to a POST request + * @param req Request passed through http + * @return A http_response object + **/ + virtual const std::shared_ptr render_POST(const http_request& req) + { + return render(req); + } + /** + * Method used to answer to a PUT request + * @param req Request passed through http + * @return A http_response object + **/ + virtual const std::shared_ptr render_PUT(const http_request& req) + { + return render(req); + } + /** + * Method used to answer to a HEAD request + * @param req Request passed through http + * @return A http_response object + **/ + virtual const std::shared_ptr render_HEAD(const http_request& req) + { + return render(req); + } + /** + * Method used to answer to a DELETE request + * @param req Request passed through http + * @return A http_response object + **/ + virtual const std::shared_ptr render_DELETE(const http_request& req) + { + return render(req); + } + /** + * Method used to answer to a TRACE request + * @param req Request passed through http + * @return A http_response object + **/ + virtual const std::shared_ptr render_TRACE(const http_request& req) + { + return render(req); + } + /** + * Method used to answer to a OPTIONS request + * @param req Request passed through http + * @return A http_response object + **/ + virtual const std::shared_ptr render_OPTIONS(const http_request& req) + { + return render(req); + } + /** + * Method used to answer to a PATCH request + * @param req Request passed through http + * @return A http_response object + **/ + virtual const std::shared_ptr render_PATCH(const http_request& req) + { + return render(req); + } + /** + * Method used to answer to a CONNECT request + * @param req Request passed through http + * @return A http_response object + **/ + virtual const std::shared_ptr render_CONNECT(const http_request& req) + { + return render(req); + } + /** + * Method used to set if a specific method is allowed or not on this request + * @param method method to set permission on + * @param allowed boolean indicating if the method is allowed or not + **/ + void set_allowing(const std::string& method, bool allowed) + { + if(allowed_methods.count(method)) + { + allowed_methods[method] = allowed; + } + } + /** + * Method used to implicitly allow all methods + **/ + void allow_all() + { + std::map::iterator it; + for ( it=allowed_methods.begin() ; it != allowed_methods.end(); ++it ) + allowed_methods[(*it).first] = true; + } + /** + * Method used to implicitly disallow all methods + **/ + void disallow_all() + { + std::map::iterator it; + for ( it=allowed_methods.begin() ; it != allowed_methods.end(); ++it ) + allowed_methods[(*it).first] = false; + } + /** + * Method used to discover if an http method is allowed or not for this resource + * @param method Method to discover allowings + * @return true if the method is allowed + **/ + bool is_allowed(const std::string& method) + { + if(allowed_methods.count(method)) + { + return allowed_methods[method]; + } + else + { +#ifdef DEBUG + std::map::iterator it; + for(it = allowed_methods.begin(); it != allowed_methods.end(); ++it) + { + std::cout << (*it).first << " -> " << (*it).second << std::endl; + } +#endif //DEBUG + return false; + } + } + protected: + /** + * Constructor of the class + **/ + http_resource() + { + resource_init(allowed_methods); + } + + /** + * Copy constructor + **/ + http_resource(const http_resource& b) = default; + http_resource(http_resource&& b) noexcept = default; + http_resource& operator=(const http_resource& b) = default; + http_resource& operator=(http_resource&& b) = default; + + private: + friend class webserver; + friend void resource_init(std::map& res); + std::map allowed_methods; +}; + +} +#endif diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/http_response.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/http_response.hpp new file mode 100644 index 00000000..1f3f0971 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/http_response.hpp @@ -0,0 +1,157 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _HTTP_RESPONSE_HPP_ +#define _HTTP_RESPONSE_HPP_ + +#include +#include +#include +#include "httpserver/http_utils.hpp" + +struct MHD_Connection; +struct MHD_Response; + +namespace httpserver +{ + +/** + * Class representing an abstraction for an Http Response. It is used from classes using these apis to send information through http protocol. +**/ +class http_response +{ + public: + http_response() = default; + + explicit http_response(int response_code, const std::string& content_type): + response_code(response_code) + { + headers[http::http_utils::http_header_content_type] = content_type; + } + + /** + * Copy constructor + * @param b The http_response object to copy attributes value from. + **/ + http_response(const http_response& b) = default; + http_response(http_response&& b) noexcept = default; + + http_response& operator=(const http_response& b) = default; + http_response& operator=(http_response&& b) noexcept = default; + + virtual ~http_response() = default; + + /** + * Method used to get a specified header defined for the response + * @param key The header identification + * @return a string representing the value assumed by the header + **/ + const std::string& get_header(const std::string& key) + { + return headers[key]; + } + + /** + * Method used to get a specified footer defined for the response + * @param key The footer identification + * @return a string representing the value assumed by the footer + **/ + const std::string& get_footer(const std::string& key) + { + return footers[key]; + } + + const std::string& get_cookie(const std::string& key) + { + return cookies[key]; + } + + /** + * Method used to get all headers passed with the request. + * @return a map containing all headers. + **/ + const std::map& get_headers() const + { + return headers; + } + + /** + * Method used to get all footers passed with the request. + * @return a map containing all footers. + **/ + const std::map& get_footers() const + { + return footers; + } + + const std::map& get_cookies() const + { + return cookies; + } + + /** + * Method used to get the response code from the response + * @return The response code + **/ + int get_response_code() const + { + return response_code; + } + + void with_header(const std::string& key, const std::string& value) + { + headers[key] = value; + } + + void with_footer(const std::string& key, const std::string& value) + { + footers[key] = value; + } + + void with_cookie(const std::string& key, const std::string& value) + { + cookies[key] = value; + } + + void shoutCAST(); + + virtual MHD_Response* get_raw_response(); + virtual void decorate_response(MHD_Response* response); + virtual int enqueue_response(MHD_Connection* connection, MHD_Response* response); + + private: + int response_code = -1; + + std::map headers; + std::map footers; + std::map cookies; + + protected: + friend std::ostream &operator<< (std::ostream &os, const http_response &r); +}; + +std::ostream &operator<< (std::ostream &os, const http_response &r); + +}; +#endif diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/http_utils.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/http_utils.hpp new file mode 100644 index 00000000..e2aa0339 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/http_utils.hpp @@ -0,0 +1,395 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _HTTPUTILS_H_ +#define _HTTPUTILS_H_ + +#ifdef HAVE_GNUTLS +#include +#endif + +// needed to force Vista as a bare minimum to have inet_ntop (libmicro defines +// this to include XP support as a lower version). +#if defined(__MINGW32__) || defined(__CYGWIN32__) +#define _WINDOWS +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x600 +#endif + +// needed to have the fd_set definition ahead of microhttpd.h import +#if defined(__CYGWIN__) +#include +#endif + +#include +#include + +#if !defined(__MINGW32__) +#include +#endif + +#include +#include +#include +#include +#include +#include + +#define DEFAULT_MASK_VALUE 0xFFFF + +#if MHD_VERSION < 0x00097002 +typedef int MHD_Result; +#endif + +namespace httpserver { + +typedef void(*unescaper_ptr)(std::string&); + +namespace http { + +class http_utils +{ + public: + + enum cred_type_T + { + NONE = -1 +#ifdef HAVE_GNUTLS + ,CERTIFICATE = GNUTLS_CRD_CERTIFICATE, + ANON = GNUTLS_CRD_ANON, + SRP = GNUTLS_CRD_SRP, + PSK = GNUTLS_CRD_PSK, + IA = GNUTLS_CRD_IA +#endif + }; + + enum start_method_T + { +#if defined(__MINGW32__) || defined(__CYGWIN__) + #ifdef ENABLE_POLL + INTERNAL_SELECT = MHD_USE_SELECT_INTERNALLY | MHD_USE_POLL, + #else + INTERNAL_SELECT = MHD_USE_SELECT_INTERNALLY, + #endif +#else + #ifdef ENABLE_EPOLL + INTERNAL_SELECT = MHD_USE_SELECT_INTERNALLY | MHD_USE_EPOLL | MHD_USE_EPOLL_TURBO, + #else + INTERNAL_SELECT = MHD_USE_SELECT_INTERNALLY, + #endif +#endif +#ifdef ENABLE_POLL + THREAD_PER_CONNECTION = MHD_USE_THREAD_PER_CONNECTION | MHD_USE_POLL +#else + THREAD_PER_CONNECTION = MHD_USE_THREAD_PER_CONNECTION +#endif + }; + + enum policy_T + { + ACCEPT, + REJECT + }; + + enum IP_version_T + { + IPV4 = 4, IPV6 = 16 + }; + + static const short http_method_connect_code; + static const short http_method_delete_code; + static const short http_method_get_code; + static const short http_method_head_code; + static const short http_method_options_code; + static const short http_method_post_code; + static const short http_method_put_code; + static const short http_method_trace_code; + static const short http_method_patch_code; + static const short http_method_unknown_code; + + static const int http_continue; + static const int http_switching_protocol; + static const int http_processing; + + static const int http_ok; + static const int http_created; + static const int http_accepted; + static const int http_non_authoritative_information; + static const int http_no_content; + static const int http_reset_content; + static const int http_partial_content; + static const int http_multi_status; + + static const int http_multiple_choices; + static const int http_moved_permanently; + static const int http_found; + static const int http_see_other; + static const int http_not_modified; + static const int http_use_proxy; + static const int http_switch_proxy; + static const int http_temporary_redirect; + + static const int http_bad_request; + static const int http_unauthorized; + static const int http_payment_required; + static const int http_forbidden; + static const int http_not_found; + static const int http_method_not_allowed; + static const int http_method_not_acceptable; + static const int http_proxy_authentication_required; + static const int http_request_timeout; + static const int http_conflict; + static const int http_gone; + static const int http_length_required; + static const int http_precondition_failed; + static const int http_request_entity_too_large; + static const int http_request_uri_too_long; + static const int http_unsupported_media_type; + static const int http_requested_range_not_satisfiable; + static const int http_expectation_failed; + static const int http_unprocessable_entity; + static const int http_locked; + static const int http_failed_dependency; + static const int http_unordered_collection; + static const int http_upgrade_required; + static const int http_retry_with; + + static const int http_internal_server_error; + static const int http_not_implemented; + static const int http_bad_gateway; + static const int http_service_unavailable; + static const int http_gateway_timeout; + static const int http_version_not_supported; + static const int http_variant_also_negotiated; + static const int http_insufficient_storage; + static const int http_bandwidth_limit_exceeded; + static const int http_not_extended; + + static const int shoutcast_response; + + /* See also: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html */ + static const std::string http_header_accept; + static const std::string http_header_accept_charset; + static const std::string http_header_accept_encoding; + static const std::string http_header_accept_language; + static const std::string http_header_accept_ranges; + static const std::string http_header_age; + static const std::string http_header_allow; + static const std::string http_header_authorization; + static const std::string http_header_cache_control; + static const std::string http_header_connection; + static const std::string http_header_content_encoding; + static const std::string http_header_content_language; + static const std::string http_header_content_length; + static const std::string http_header_content_location; + static const std::string http_header_content_md5; + static const std::string http_header_content_range; + static const std::string http_header_content_type; + static const std::string http_header_date; + static const std::string http_header_etag; + static const std::string http_header_expect; + static const std::string http_header_expires; + static const std::string http_header_from; + static const std::string http_header_host; + static const std::string http_header_if_match; + static const std::string http_header_if_modified_since; + static const std::string http_header_if_none_match; + static const std::string http_header_if_range; + static const std::string http_header_if_unmodified_since; + static const std::string http_header_last_modified; + static const std::string http_header_location; + static const std::string http_header_max_forwards; + static const std::string http_header_pragma; + static const std::string http_header_proxy_authenticate; + static const std::string http_header_proxy_authentication; + static const std::string http_header_range; + static const std::string http_header_referer; + static const std::string http_header_retry_after; + static const std::string http_header_server; + static const std::string http_header_te; + static const std::string http_header_trailer; + static const std::string http_header_transfer_encoding; + static const std::string http_header_upgrade; + static const std::string http_header_user_agent; + static const std::string http_header_vary; + static const std::string http_header_via; + static const std::string http_header_warning; + static const std::string http_header_www_authenticate; + + static const std::string http_version_1_0; + static const std::string http_version_1_1; + + static const std::string http_method_connect; + static const std::string http_method_delete; + static const std::string http_method_head; + static const std::string http_method_get; + static const std::string http_method_options; + static const std::string http_method_post; + static const std::string http_method_put; + static const std::string http_method_trace; + static const std::string http_method_patch; + + static const std::string http_post_encoding_form_urlencoded; + static const std::string http_post_encoding_multipart_formdata; + + static const std::string text_plain; + + static std::vector tokenize_url(const std::string&, + const char separator = '/' + ); + static std::string standardize_url(const std::string&); +}; + +#define COMPARATOR(x, y, op) \ + { \ + size_t l1 = (x).size();\ + size_t l2 = (y).size();\ + if (l1 < l2) return true;\ + if (l1 > l2) return false;\ + \ + for (size_t n = 0; n < l1; n++)\ + {\ + int xc = op((x)[n]);\ + int yc = op((y)[n]);\ + if (xc < yc) return true;\ + if (xc > yc) return false;\ + }\ + return false;\ + } + +class header_comparator { + public: + /** + * Operator used to compare strings. + * @param first string + * @param second string + **/ + bool operator()(const std::string& x,const std::string& y) const + { + COMPARATOR(x, y, std::toupper); + } +}; + +/** + * Operator Class that is used to compare two strings. The comparison can be sensitive or insensitive. + * The default comparison is case sensitive. To obtain insensitive comparison you have to pass in + * compilation phase the flag CASE_INSENSITIVE to the preprocessor. +**/ +class arg_comparator { + public: + /** + * Operator used to compare strings. + * @param first string + * @param second string + **/ + bool operator()(const std::string& x,const std::string& y) const + { +#ifdef CASE_INSENSITIVE + COMPARATOR(x, y, std::toupper); +#else + COMPARATOR(x, y, ); +#endif + } +}; + +struct ip_representation +{ + http_utils::IP_version_T ip_version; + unsigned short pieces[16]; + unsigned short mask; + + ip_representation(http_utils::IP_version_T ip_version) : + ip_version(ip_version) + { + mask = DEFAULT_MASK_VALUE; + std::fill(pieces, pieces + 16, 0); + } + + ip_representation(const std::string& ip); + ip_representation(const struct sockaddr* ip); + + bool operator <(const ip_representation& b) const; + int weight() const + { + //variable-precision SWAR algorithm + unsigned short x = mask; + x = x - ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + return (((x + (x >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; + } +}; + +/** + * Method used to get an ip in form of string from a sockaddr structure + * @param sa The sockaddr object to find the ip address from + * @param maxlen Maxlen of the address (automatically discovered if not passed) + * @return string containing the ip address +**/ +std::string get_ip_str(const struct sockaddr *sa, socklen_t maxlen = 0); + +std::string get_ip_str_new(const struct sockaddr* sa, socklen_t maxlen = 0); +/** + * Method used to get a port from a sockaddr + * @param sa The sockaddr object to find the port from + * @return short representing the port +**/ +unsigned short get_port(const struct sockaddr* sa); + +/** + * Method to output the contents of a headers map to a std::ostream + * @param os The ostream + * @param prefix Prefix to identify the map + * @param map +**/ +void dump_header_map(std::ostream &os, const std::string &prefix, + const std::map &map); + +/** + * Method to output the contents of an arguments map to a std::ostream + * @param os The ostream + * @param prefix Prefix to identify the map + * @param map +**/ +void dump_arg_map(std::ostream &os, const std::string &prefix, + const std::map &map); + +/** + * Process escape sequences ('+'=space, %HH) Updates val in place; the + * result should be UTF-8 encoded and cannot be larger than the input. + * The result must also still be 0-terminated. + * + * @param val the string to unescape + * @return length of the resulting val (strlen(val) maybe + * shorter afterwards due to elimination of escape sequences) + */ +size_t http_unescape (std::string& val); + +const std::string load_file (const std::string& filename); + +size_t base_unescaper(std::string&, unescaper_ptr unescaper); + +}; +}; +#endif + diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/string_response.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/string_response.hpp new file mode 100644 index 00000000..43e7580d --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/string_response.hpp @@ -0,0 +1,68 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _STRING_RESPONSE_HPP_ +#define _STRING_RESPONSE_HPP_ + +#include +#include +#include "http_utils.hpp" +#include "httpserver/http_response.hpp" + +struct MHD_Response; + +namespace httpserver +{ + +class string_response : public http_response +{ + public: + string_response() = default; + + explicit string_response( + std::string content, + int response_code = http::http_utils::http_ok, + const std::string& content_type = http::http_utils::text_plain + ): + http_response(response_code, content_type), + content(std::move(content)) + { + } + + string_response(const string_response& other) = default; + string_response(string_response&& other) noexcept = default; + + string_response& operator=(const string_response& b) = default; + string_response& operator=(string_response&& b) = default; + + ~string_response() = default; + + MHD_Response* get_raw_response(); + + private: + std::string content = ""; +}; + +} +#endif // _STRING_RESPONSE_HPP_ diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/string_utilities.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/string_utilities.hpp new file mode 100644 index 00000000..e61762ab --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/string_utilities.hpp @@ -0,0 +1,51 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _STRING_UTILITIES_H_ +#define _STRING_UTILITIES_H_ + +#include +#include + +namespace httpserver +{ +namespace string_utilities +{ + +/** + * Function used to convert a string to its uppercase version. + * It generates a new string in output + * @param str The string to turn uppercase + * @return a string that is the uppercase version of the previous +**/ +const std::string to_upper_copy(const std::string& str); +const std::string to_lower_copy(const std::string& str); +const std::vector string_split(const std::string& s, + char sep = ' ', bool collapse = true +); +void to_upper(std::string& str); +}; +}; + +#endif diff --git a/3rd_party/libhttpserver-0.18.2/src/httpserver/webserver.hpp b/3rd_party/libhttpserver-0.18.2/src/httpserver/webserver.hpp new file mode 100644 index 00000000..02d626c5 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/httpserver/webserver.hpp @@ -0,0 +1,251 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION) +#error "Only or can be included directly." +#endif + +#ifndef _FRAMEWORK_WEBSERVER_HPP_ +#define _FRAMEWORK_WEBSERVER_HPP_ + +#define NOT_FOUND_ERROR "Not Found" +#define METHOD_ERROR "Method not Allowed" +#define NOT_METHOD_ERROR "Method not Acceptable" +#define GENERIC_ERROR "Internal Error" + +#include +#include +#include +#include +#include + +#if !defined(__MINGW32__) +#include +#endif + +#include +#include +#include +#include + +#include "http_utils.hpp" +#include "httpserver/create_webserver.hpp" +#include "httpserver/details/http_endpoint.hpp" + +namespace httpserver { class http_resource; } +namespace httpserver { class http_response; } +namespace httpserver { namespace details { struct modded_request; } } + +struct MHD_Connection; + +namespace httpserver { + +/** + * Class representing the webserver. Main class of the apis. +**/ +class webserver +{ + public: + webserver(const create_webserver& params); + /** + * Destructor of the class + **/ + ~webserver(); + /** + * Method used to start the webserver. + * This method can be blocking or not. + * @param blocking param indicating if the method is blocking or not + * @return a boolean indicating if the webserver is running or not. + **/ + bool start(bool blocking = false); + /** + * Method used to stop the webserver. + * @return true if the webserver is stopped. + **/ + bool stop(); + /** + * Method used to evaluate if the server is running or not. + * @return true if the webserver is running + **/ + bool is_running(); + /** + * Method used to register a resource with the webserver. + * @param resource The url pointing to the resource. This url could be also parametrized in the form /path/to/url/{par1}/and/{par2} + * or a regular expression. + * @param http_resource http_resource pointer to register. + * @param family boolean indicating whether the resource is registered for the endpoint and its child or not. + * @return true if the resource was registered + **/ + bool register_resource(const std::string& resource, + http_resource* res, bool family = false + ); + + void unregister_resource(const std::string& resource); + void ban_ip(const std::string& ip); + void allow_ip(const std::string& ip); + void unban_ip(const std::string& ip); + void disallow_ip(const std::string& ip); + + log_access_ptr get_access_logger() const + { + return log_access; + } + + log_error_ptr get_error_logger() const + { + return log_error; + } + + validator_ptr get_request_validator() const + { + return validator; + } + + unescaper_ptr get_unescaper() const + { + return unescaper; + } + + /** + * Method used to kill the webserver waiting for it to terminate + **/ + void sweet_kill(); + + protected: + webserver& operator=(const webserver& other); + + private: + const uint16_t port; + http::http_utils::start_method_T start_method; + const int max_threads; + const int max_connections; + const int memory_limit; + const size_t content_size_limit; + const int connection_timeout; + const int per_IP_connection_limit; + log_access_ptr log_access; + log_error_ptr log_error; + validator_ptr validator; + unescaper_ptr unescaper; + const struct sockaddr* bind_address; + /* Changed type to MHD_socket because this type will always reflect the + platform's actual socket type (e.g. SOCKET on windows, int on unixes)*/ + MHD_socket bind_socket; + const int max_thread_stack_size; + const bool use_ssl; + const bool use_ipv6; + const bool use_dual_stack; + const bool debug; + const bool pedantic; + const std::string https_mem_key; + const std::string https_mem_cert; + const std::string https_mem_trust; + const std::string https_priorities; + const http::http_utils::cred_type_T cred_type; + const std::string digest_auth_random; + const int nonce_nc_size; + bool running; + const http::http_utils::policy_T default_policy; + const bool basic_auth_enabled; + const bool digest_auth_enabled; + const bool regex_checking; + const bool ban_system_enabled; + const bool post_process_enabled; + const bool deferred_enabled; + bool single_resource; + bool tcp_nodelay; + pthread_mutex_t mutexwait; + pthread_cond_t mutexcond; + render_ptr not_found_resource; + render_ptr method_not_allowed_resource; + render_ptr internal_error_resource; + std::map registered_resources; + std::map registered_resources_str; + + std::set bans; + std::set allowances; + + struct MHD_Daemon* daemon; + + const std::shared_ptr method_not_allowed_page(details::modded_request* mr) const; + const std::shared_ptr internal_error_page(details::modded_request* mr, bool force_our = false) const; + const std::shared_ptr not_found_page(details::modded_request* mr) const; + + static void request_completed(void *cls, + struct MHD_Connection *connection, void **con_cls, + enum MHD_RequestTerminationCode toe + ); + + static MHD_Result answer_to_connection + ( + void* cls, MHD_Connection* connection, + const char* url, const char* method, + const char* version, const char* upload_data, + size_t* upload_data_size, void** con_cls + ); + static MHD_Result post_iterator + ( + void *cls, + enum MHD_ValueKind kind, + const char *key, + const char *filename, + const char *content_type, + const char *transfer_encoding, + const char *data, uint64_t off, size_t size + ); + static void upgrade_handler + ( + void *cls, + struct MHD_Connection* connection, + void **con_cls, int upgrade_socket + ); + + MHD_Result requests_answer_first_step(MHD_Connection* connection, + struct details::modded_request* mr + ); + + MHD_Result requests_answer_second_step(MHD_Connection* connection, + const char* method, const char* version, const char* upload_data, + size_t* upload_data_size, struct details::modded_request* mr + ); + + MHD_Result finalize_answer(MHD_Connection* connection, + struct details::modded_request* mr, const char* method + ); + + MHD_Result complete_request(MHD_Connection* connection, + struct details::modded_request* mr, + const char* version, const char* method + ); + + friend MHD_Result policy_callback (void *cls, + const struct sockaddr* addr, socklen_t addrlen + ); + friend void error_log(void* cls, const char* fmt, va_list ap); + friend void access_log(webserver* cls, std::string uri); + friend void* uri_log(void* cls, const char* uri); + friend size_t unescaper_func(void * cls, + struct MHD_Connection *c, char *s + ); + friend class http_response; +}; + +}; +#endif //_FRAMEWORK_WEBSERVER_HPP__ diff --git a/3rd_party/libhttpserver-0.18.2/src/string_response.cpp b/3rd_party/libhttpserver-0.18.2/src/string_response.cpp new file mode 100644 index 00000000..75a557f8 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/string_response.cpp @@ -0,0 +1,42 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/string_response.hpp" +#include +#include + +struct MHD_Response; + +using namespace std; + +namespace httpserver +{ + +MHD_Response* string_response::get_raw_response() +{ + size_t size = &(*content.end()) - &(*content.begin()); + return MHD_create_response_from_buffer( + size, + (void*) content.c_str(), + MHD_RESPMEM_PERSISTENT + ); +} + +} diff --git a/3rd_party/libhttpserver-0.18.2/src/string_utilities.cpp b/3rd_party/libhttpserver-0.18.2/src/string_utilities.cpp new file mode 100644 index 00000000..a3937f2e --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/string_utilities.cpp @@ -0,0 +1,85 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/string_utilities.hpp" + +#include +#include +#include +#include +#include + +namespace httpserver +{ +namespace string_utilities +{ + +const std::string to_upper_copy(const std::string& str) +{ + std::string result = str; + std::transform(result.begin(), + result.end(), + result.begin(), + (int(*)(int)) std::toupper + ); + + return result; +} + +void to_upper(std::string& str) +{ + std::transform(str.begin(), + str.end(), + str.begin(), + (int(*)(int)) std::toupper + ); +} + +const std::string to_lower_copy(const std::string& str) +{ + std::string result = str; + std::transform(result.begin(), + result.end(), + result.begin(), + (int(*)(int)) std::tolower + ); + + return result; +} + +const std::vector string_split( + const std::string& s, + char sep, + bool collapse +) +{ + std::vector result; + + std::istringstream buf(s); + for(std::string token; getline(buf, token, sep); ) + { + if((collapse && token != "") || !collapse) + result.push_back(token); + } + return result; +} + +}; +}; diff --git a/3rd_party/libhttpserver-0.18.2/src/webserver.cpp b/3rd_party/libhttpserver-0.18.2/src/webserver.cpp new file mode 100644 index 00000000..64892b3b --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/src/webserver.cpp @@ -0,0 +1,650 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/webserver.hpp" + +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +#include +#ifndef _WINDOWS +#define _WINDOWS +#endif +#else +#if defined(__FreeBSD__) +#include +#endif +#if defined(__CYGWIN__) +#include +#endif +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gettext.h" +#include "strings.h" +#include "httpserver/create_webserver.hpp" +#include "httpserver/details/http_endpoint.hpp" +#include "httpserver/details/modded_request.hpp" +#include "httpserver/http_request.hpp" +#include "httpserver/http_resource.hpp" +#include "httpserver/http_response.hpp" +#include "httpserver/http_utils.hpp" +#include "httpserver/string_response.hpp" + +struct MHD_Connection; + +#define _REENTRANT 1 + +#ifndef SOCK_CLOEXEC +#define SOCK_CLOEXEC 02000000 +#endif + +#if MHD_VERSION < 0x00097002 +typedef int MHD_Result; +#endif + +using namespace std; + +namespace httpserver { + +using namespace http; + +MHD_Result policy_callback(void *, const struct sockaddr *, socklen_t); +void error_log(void *, const char *, va_list); +void *uri_log(void *, const char *); +void access_log(webserver *, string); +size_t unescaper_func(void *, struct MHD_Connection *, char *); + +struct compare_value { + bool operator()(const std::pair &left, const std::pair &right) const { + return left.second < right.second; + } +}; + +#if !defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) +static void catcher(int sig) {} +#endif + +static void ignore_sigpipe() { +// Mingw doesn't implement SIGPIPE +#if !defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) + struct sigaction oldsig; + struct sigaction sig; + + sig.sa_handler = &catcher; + sigemptyset(&sig.sa_mask); +#ifdef SA_INTERRUPT + sig.sa_flags = SA_INTERRUPT; /* SunOS */ +#else // SA_INTERRUPT + sig.sa_flags = SA_RESTART; +#endif // SA_INTERRUPTT + if (0 != sigaction(SIGPIPE, &sig, &oldsig)) + fprintf(stderr, gettext("Failed to install SIGPIPE handler: %s\n"), strerror(errno)); +#endif +} + +// WEBSERVER +webserver::webserver(const create_webserver ¶ms) + : port(params._port), + start_method(params._start_method), + max_threads(params._max_threads), + max_connections(params._max_connections), + memory_limit(params._memory_limit), + content_size_limit(params._content_size_limit), + connection_timeout(params._connection_timeout), + per_IP_connection_limit(params._per_IP_connection_limit), + log_access(params._log_access), + log_error(params._log_error), + validator(params._validator), + unescaper(params._unescaper), + bind_address(params._bind_address), + bind_socket(params._bind_socket), + max_thread_stack_size(params._max_thread_stack_size), + use_ssl(params._use_ssl), + use_ipv6(params._use_ipv6), + use_dual_stack(params._use_dual_stack), + debug(params._debug), + pedantic(params._pedantic), + https_mem_key(params._https_mem_key), + https_mem_cert(params._https_mem_cert), + https_mem_trust(params._https_mem_trust), + https_priorities(params._https_priorities), + cred_type(params._cred_type), + digest_auth_random(params._digest_auth_random), + nonce_nc_size(params._nonce_nc_size), + running(false), + default_policy(params._default_policy), + basic_auth_enabled(params._basic_auth_enabled), + digest_auth_enabled(params._digest_auth_enabled), + regex_checking(params._regex_checking), + ban_system_enabled(params._ban_system_enabled), + post_process_enabled(params._post_process_enabled), + deferred_enabled(params._deferred_enabled), + single_resource(params._single_resource), + tcp_nodelay(params._tcp_nodelay), + not_found_resource(params._not_found_resource), + method_not_allowed_resource(params._method_not_allowed_resource), + internal_error_resource(params._internal_error_resource) { + ignore_sigpipe(); + pthread_mutex_init(&mutexwait, NULL); + pthread_cond_init(&mutexcond, NULL); +} + +webserver::~webserver() { + stop(); + pthread_mutex_destroy(&mutexwait); + pthread_cond_destroy(&mutexcond); +} + +void webserver::sweet_kill() { stop(); } + +void webserver::request_completed(void *cls, struct MHD_Connection *connection, void **con_cls, + enum MHD_RequestTerminationCode toe) { + details::modded_request *mr = static_cast(*con_cls); + if (mr == 0x0) + return; + + delete mr; + mr = 0x0; +} + +bool webserver::register_resource(const std::string &resource, http_resource *hrm, bool family) { + if (single_resource && ((resource != "" && resource != "/") || !family)) { + throw std::invalid_argument("The resource should be '' or '/' and be marked as family when " + "using a single_resource server"); + } + + details::http_endpoint idx(resource, family, true, regex_checking); + + pair::iterator, bool> result = + registered_resources.insert( + map::value_type(idx, hrm)); + + if (result.second) { + registered_resources_str.insert( + pair(idx.get_url_complete(), result.first->second)); + } + + return result.second; +} + +bool webserver::start(bool blocking) { + + struct { + MHD_OptionItem operator()(enum MHD_OPTION opt, intptr_t val, void *ptr = 0) { + MHD_OptionItem x = {opt, val, ptr}; + return x; + } + } gen; + vector iov; + + iov.push_back(gen(MHD_OPTION_NOTIFY_COMPLETED, (intptr_t)&request_completed, NULL)); + iov.push_back(gen(MHD_OPTION_URI_LOG_CALLBACK, (intptr_t)&uri_log, this)); + iov.push_back(gen(MHD_OPTION_EXTERNAL_LOGGER, (intptr_t)&error_log, this)); + iov.push_back(gen(MHD_OPTION_UNESCAPE_CALLBACK, (intptr_t)&unescaper_func, this)); + iov.push_back(gen(MHD_OPTION_CONNECTION_TIMEOUT, connection_timeout)); + if (bind_socket != 0) + iov.push_back(gen(MHD_OPTION_LISTEN_SOCKET, bind_socket)); + if (start_method == http_utils::THREAD_PER_CONNECTION && + (max_threads != 0 || max_thread_stack_size != 0)) { + throw std::invalid_argument( + "Cannot specify maximum number of threads when using a thread per connection"); + } + + if (max_threads != 0) + iov.push_back(gen(MHD_OPTION_THREAD_POOL_SIZE, max_threads)); + if (max_connections != 0) + iov.push_back(gen(MHD_OPTION_CONNECTION_LIMIT, max_connections)); + if (memory_limit != 0) + iov.push_back(gen(MHD_OPTION_CONNECTION_MEMORY_LIMIT, memory_limit)); + if (per_IP_connection_limit != 0) + iov.push_back(gen(MHD_OPTION_PER_IP_CONNECTION_LIMIT, per_IP_connection_limit)); + if (max_thread_stack_size != 0) + iov.push_back(gen(MHD_OPTION_THREAD_STACK_SIZE, max_thread_stack_size)); + if (nonce_nc_size != 0) + iov.push_back(gen(MHD_OPTION_NONCE_NC_SIZE, nonce_nc_size)); + if (use_ssl) + iov.push_back(gen(MHD_OPTION_HTTPS_MEM_KEY, 0, (void *)https_mem_key.c_str())); + if (use_ssl) + iov.push_back(gen(MHD_OPTION_HTTPS_MEM_CERT, 0, (void *)https_mem_cert.c_str())); + if (https_mem_trust != "" && use_ssl) + iov.push_back(gen(MHD_OPTION_HTTPS_MEM_TRUST, 0, (void *)https_mem_trust.c_str())); + if (https_priorities != "" && use_ssl) + iov.push_back(gen(MHD_OPTION_HTTPS_PRIORITIES, 0, (void *)https_priorities.c_str())); + if (digest_auth_random != "") + iov.push_back(gen(MHD_OPTION_DIGEST_AUTH_RANDOM, digest_auth_random.size(), + (char *)digest_auth_random.c_str())); +#ifdef HAVE_GNUTLS + if (cred_type != http_utils::NONE) + iov.push_back(gen(MHD_OPTION_HTTPS_CRED_TYPE, cred_type)); +#endif // HAVE_GNUTLS + + iov.push_back(gen(MHD_OPTION_END, 0, NULL)); + + int start_conf = start_method; + if (use_ssl) + start_conf |= MHD_USE_SSL; + if (use_ipv6) + start_conf |= MHD_USE_IPv6; + if (use_dual_stack) + start_conf |= MHD_USE_DUAL_STACK; + if (debug) + start_conf |= MHD_USE_DEBUG; + if (pedantic) + start_conf |= MHD_USE_PEDANTIC_CHECKS; + if (deferred_enabled) + start_conf |= MHD_USE_SUSPEND_RESUME; + +#ifdef USE_FASTOPEN + start_conf |= MHD_USE_TCP_FASTOPEN; +#endif + + daemon = NULL; + if (bind_address == 0x0) { + daemon = MHD_start_daemon(start_conf, port, &policy_callback, this, &answer_to_connection, this, + MHD_OPTION_ARRAY, &iov[0], MHD_OPTION_END); + } else { + daemon = MHD_start_daemon(start_conf, 1, &policy_callback, this, &answer_to_connection, this, + MHD_OPTION_ARRAY, &iov[0], MHD_OPTION_SOCK_ADDR, bind_address, + MHD_OPTION_END); + } + + if (daemon == NULL) { + throw std::invalid_argument("Unable to connect daemon to port: " + std::to_string(port)); + } + + bool value_onclose = false; + + running = true; + + if (blocking) { + pthread_mutex_lock(&mutexwait); + while (blocking && running) + pthread_cond_wait(&mutexcond, &mutexwait); + pthread_mutex_unlock(&mutexwait); + value_onclose = true; + } + return value_onclose; +} + +bool webserver::is_running() { return running; } + +bool webserver::stop() { + if (!running) + return false; + + pthread_mutex_lock(&mutexwait); + running = false; + pthread_cond_signal(&mutexcond); + pthread_mutex_unlock(&mutexwait); + + MHD_stop_daemon(daemon); + + shutdown(bind_socket, 2); + + return true; +} + +void webserver::unregister_resource(const string &resource) { + // family does not matter - it just checks the url_normalized anyhow + details::http_endpoint he(resource, false, true, regex_checking); + registered_resources.erase(he); + registered_resources.erase(he.get_url_complete()); + registered_resources_str.erase(he.get_url_complete()); +} + +void webserver::ban_ip(const string &ip) { + ip_representation t_ip(ip); + set::iterator it = bans.find(t_ip); + if (it != bans.end() && (t_ip.weight() < (*it).weight())) { + bans.erase(it); + bans.insert(t_ip); + } else + bans.insert(t_ip); +} + +void webserver::allow_ip(const string &ip) { + ip_representation t_ip(ip); + set::iterator it = allowances.find(t_ip); + if (it != allowances.end() && (t_ip.weight() < (*it).weight())) { + allowances.erase(it); + allowances.insert(t_ip); + } else + allowances.insert(t_ip); +} + +void webserver::unban_ip(const string &ip) { bans.erase(ip); } + +void webserver::disallow_ip(const string &ip) { allowances.erase(ip); } + +MHD_Result policy_callback(void *cls, const struct sockaddr *addr, socklen_t addrlen) { + if (!(static_cast(cls))->ban_system_enabled) + return MHD_YES; + + if ((((static_cast(cls))->default_policy == http_utils::ACCEPT) && + ((static_cast(cls))->bans.count(addr)) && + (!(static_cast(cls))->allowances.count(addr))) || + (((static_cast(cls))->default_policy == http_utils::REJECT) && + ((!(static_cast(cls))->allowances.count(addr)) || + ((static_cast(cls))->bans.count(addr))))) { + return MHD_NO; + } + + return MHD_YES; +} + +void *uri_log(void *cls, const char *uri) { + struct details::modded_request *mr = new details::modded_request(); + mr->complete_uri = new string(uri); + mr->second = false; + return ((void *)mr); +} + +void error_log(void *cls, const char *fmt, va_list ap) { + webserver *dws = static_cast(cls); + if (dws->log_error != 0x0) + dws->log_error(fmt); +} + +void access_log(webserver *dws, string uri) { + if (dws->log_access != 0x0) + dws->log_access(uri); +} + +size_t unescaper_func(void *cls, struct MHD_Connection *c, char *s) { + // THIS IS USED TO AVOID AN UNESCAPING OF URL BEFORE THE ANSWER. + // IT IS DUE TO A BOGUS ON libmicrohttpd (V0.99) THAT PRODUCING A + // STRING CONTAINING '\0' AFTER AN UNESCAPING, IS UNABLE TO PARSE + // ARGS WITH get_connection_values FUNC OR lookup FUNC. + return std::string(s).size(); +} + +MHD_Result webserver::post_iterator(void *cls, enum MHD_ValueKind kind, const char *key, + const char *filename, const char *content_type, + const char *transfer_encoding, const char *data, uint64_t off, + size_t size) { + struct details::modded_request *mr = (struct details::modded_request *)cls; + mr->dhr->set_arg(key, mr->dhr->get_arg(key) + std::string(data, size)); + return MHD_YES; +} + +void webserver::upgrade_handler(void *cls, struct MHD_Connection *connection, void **con_cls, + int upgrade_socket) {} + +const std::shared_ptr webserver::not_found_page(details::modded_request *mr) const { + if (not_found_resource != 0x0) { + return not_found_resource(*mr->dhr); + } else { + return std::shared_ptr( + new string_response(NOT_FOUND_ERROR, http_utils::http_not_found)); + } +} + +const std::shared_ptr +webserver::method_not_allowed_page(details::modded_request *mr) const { + if (method_not_allowed_resource != 0x0) { + return method_not_allowed_resource(*mr->dhr); + } else { + return std::shared_ptr( + new string_response(METHOD_ERROR, http_utils::http_method_not_allowed)); + } +} + +const std::shared_ptr webserver::internal_error_page(details::modded_request *mr, + bool force_our) const { + if (internal_error_resource != 0x0 && !force_our) { + return internal_error_resource(*mr->dhr); + } else { + return std::shared_ptr( + new string_response(GENERIC_ERROR, http_utils::http_internal_server_error, "text/plain")); + } +} + +MHD_Result webserver::requests_answer_first_step(MHD_Connection *connection, + struct details::modded_request *mr) { + mr->second = true; + mr->dhr = new http_request(connection, unescaper); + + if (!mr->has_body) { + return MHD_YES; + } + + mr->dhr->set_content_size_limit(content_size_limit); + const char *encoding = MHD_lookup_connection_value(connection, MHD_HEADER_KIND, + http_utils::http_header_content_type.c_str()); + + if (post_process_enabled && + (0x0 != encoding && + ((0 == strncasecmp(http_utils::http_post_encoding_form_urlencoded.c_str(), encoding, + http_utils::http_post_encoding_form_urlencoded.size())) || + (0 == strncasecmp(http_utils::http_post_encoding_multipart_formdata.c_str(), encoding, + http_utils::http_post_encoding_multipart_formdata.size()))))) { + const size_t post_memory_limit(32 * 1024); // Same as #MHD_POOL_SIZE_DEFAULT + mr->pp = MHD_create_post_processor(connection, post_memory_limit, &post_iterator, mr); + } else { + mr->pp = NULL; + } + return MHD_YES; +} + +MHD_Result webserver::requests_answer_second_step(MHD_Connection *connection, const char *method, + const char *version, const char *upload_data, + size_t *upload_data_size, + struct details::modded_request *mr) { + if (0 == *upload_data_size) + return complete_request(connection, mr, version, method); + + if (mr->has_body) { + +#ifdef DEBUG + cout << "Writing content: " << upload_data << endl; +#endif // DEBUG + mr->dhr->grow_content(upload_data, *upload_data_size); + + if (mr->pp != NULL) + MHD_post_process(mr->pp, upload_data, *upload_data_size); + } + + *upload_data_size = 0; + return MHD_YES; +} + +MHD_Result webserver::finalize_answer(MHD_Connection *connection, + struct details::modded_request *mr, const char *method) { + int to_ret = MHD_NO; + + map::iterator fe; + + http_resource *hrm; + + bool found = false; + struct MHD_Response *raw_response; + if (!single_resource) { + const char *st_url = mr->standardized_url->c_str(); + fe = registered_resources_str.find(st_url); + if (fe == registered_resources_str.end()) { + if (regex_checking) { + + map::iterator found_endpoint; + + details::http_endpoint endpoint(st_url, false, false, false); + + map::iterator it; + + size_t len = 0; + size_t tot_len = 0; + for (it = registered_resources.begin(); it != registered_resources.end(); ++it) { + size_t endpoint_pieces_len = (*it).first.get_url_pieces().size(); + size_t endpoint_tot_len = (*it).first.get_url_complete().size(); + if (!found || endpoint_pieces_len > len || + (endpoint_pieces_len == len && endpoint_tot_len > tot_len)) { + if ((*it).first.match(endpoint)) { + found = true; + len = endpoint_pieces_len; + tot_len = endpoint_tot_len; + found_endpoint = it; + } + } + } + if (found) { + vector url_pars = found_endpoint->first.get_url_pars(); + + vector url_pieces = endpoint.get_url_pieces(); + vector chunks = found_endpoint->first.get_chunk_positions(); + for (unsigned int i = 0; i < url_pars.size(); i++) { + mr->dhr->set_arg(url_pars[i], url_pieces[chunks[i]]); + } + + hrm = found_endpoint->second; + } + } + } else { + hrm = fe->second; + found = true; + } + } else { + hrm = registered_resources.begin()->second; + found = true; + } + + if (found) { + try { + if (hrm->is_allowed(method)) { + mr->dhrs = ((hrm)->*(mr->callback))(*mr->dhr); // copy in memory (move in case) + if (mr->dhrs->get_response_code() == -1) { + mr->dhrs = internal_error_page(mr); + } + } else { + mr->dhrs = method_not_allowed_page(mr); + } + } catch (const std::exception &e) { + mr->dhrs = internal_error_page(mr); + } catch (...) { + mr->dhrs = internal_error_page(mr); + } + } else { + mr->dhrs = not_found_page(mr); + } + + try { + try { + raw_response = mr->dhrs->get_raw_response(); + } catch (const std::invalid_argument &iae) { + mr->dhrs = not_found_page(mr); + raw_response = mr->dhrs->get_raw_response(); + } catch (const std::exception &e) { + mr->dhrs = internal_error_page(mr); + raw_response = mr->dhrs->get_raw_response(); + } catch (...) { + mr->dhrs = internal_error_page(mr); + raw_response = mr->dhrs->get_raw_response(); + } + } catch (...) // catches errors in internal error page + { + mr->dhrs = internal_error_page(mr, true); + raw_response = mr->dhrs->get_raw_response(); + } + mr->dhrs->decorate_response(raw_response); + to_ret = mr->dhrs->enqueue_response(connection, raw_response); + MHD_destroy_response(raw_response); + return (MHD_Result)to_ret; +} + +MHD_Result webserver::complete_request(MHD_Connection *connection, + struct details::modded_request *mr, const char *version, + const char *method) { + mr->ws = this; + + mr->dhr->set_path(mr->standardized_url->c_str()); + mr->dhr->set_method(method); + mr->dhr->set_version(version); + + return finalize_answer(connection, mr, method); +} + +MHD_Result webserver::answer_to_connection(void *cls, MHD_Connection *connection, const char *url, + const char *method, const char *version, + const char *upload_data, size_t *upload_data_size, + void **con_cls) { + struct details::modded_request *mr = static_cast(*con_cls); + + if (mr->second != false) { + return static_cast(cls)->requests_answer_second_step( + connection, method, version, upload_data, upload_data_size, mr); + } + + const MHD_ConnectionInfo *conninfo = + MHD_get_connection_info(connection, MHD_CONNECTION_INFO_CONNECTION_FD); + + if (static_cast(cls)->tcp_nodelay) { + int yes = 1; + setsockopt(conninfo->connect_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&yes, sizeof(int)); + } + + std::string t_url = url; + + base_unescaper(t_url, static_cast(cls)->unescaper); + mr->standardized_url = new string(http_utils::standardize_url(t_url)); + + mr->has_body = false; + + access_log(static_cast(cls), *(mr->complete_uri) + " METHOD: " + method); + + if (0 == strcasecmp(method, http_utils::http_method_get.c_str())) { + mr->callback = &http_resource::render_GET; + } else if (0 == strcmp(method, http_utils::http_method_post.c_str())) { + mr->callback = &http_resource::render_POST; + mr->has_body = true; + } else if (0 == strcasecmp(method, http_utils::http_method_put.c_str())) { + mr->callback = &http_resource::render_PUT; + mr->has_body = true; + } else if (0 == strcasecmp(method, http_utils::http_method_delete.c_str())) { + mr->callback = &http_resource::render_DELETE; + mr->has_body = true; + } else if (0 == strcasecmp(method, http_utils::http_method_patch.c_str())) { + mr->callback = &http_resource::render_PATCH; + mr->has_body = true; + } else if (0 == strcasecmp(method, http_utils::http_method_head.c_str())) { + mr->callback = &http_resource::render_HEAD; + } else if (0 == strcasecmp(method, http_utils::http_method_connect.c_str())) { + mr->callback = &http_resource::render_CONNECT; + } else if (0 == strcasecmp(method, http_utils::http_method_trace.c_str())) { + mr->callback = &http_resource::render_TRACE; + } else if (0 == strcasecmp(method, http_utils::http_method_options.c_str())) { + mr->callback = &http_resource::render_OPTIONS; + } + + return static_cast(cls)->requests_answer_first_step(connection, mr); +} + +}; // namespace httpserver diff --git a/3rd_party/libhttpserver-0.18.2/test/Makefile.am b/3rd_party/libhttpserver-0.18.2/test/Makefile.am new file mode 100644 index 00000000..e6c91b02 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/Makefile.am @@ -0,0 +1,50 @@ +# +# This file is part of libhttpserver +# Copyright (C) 2011-2019 Sebastiano Merlino +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +LDADD = $(top_builddir)/src/libhttpserver.la +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/httpserver/ +METASOURCES = AUTO +check_PROGRAMS = basic http_utils threaded nodelay string_utilities http_endpoint ban_system ws_start_stop authentication deferred + +MOSTLYCLEANFILES = *.gcda *.gcno *.gcov + +basic_SOURCES = integ/basic.cpp +threaded_SOURCES = integ/threaded.cpp +ban_system_SOURCES = integ/ban_system.cpp +ws_start_stop_SOURCES = integ/ws_start_stop.cpp +authentication_SOURCES = integ/authentication.cpp +deferred_SOURCES = integ/deferred.cpp +http_utils_SOURCES = unit/http_utils_test.cpp +string_utilities_SOURCES = unit/string_utilities_test.cpp +http_endpoint_SOURCES = unit/http_endpoint_test.cpp +nodelay_SOURCES = integ/nodelay.cpp + +noinst_HEADERS = littletest.hpp +AM_CXXFLAGS += -lcurl -Wall -fPIC + +if COND_GCOV +AM_CFLAGS += -O0 --coverage --no-inline +AM_CXXFLAGS += -O0 --coverage --no-inline +AM_LDFLAGS += -O0 --coverage -lgcov --no-inline +endif + +TESTS = $(check_PROGRAMS) + +@VALGRIND_CHECK_RULES@ +VALGRIND_SUPPRESSIONS_FILES = libhttpserver.supp +EXTRA_DIST = libhttpserver.supp diff --git a/3rd_party/libhttpserver-0.18.2/test/cert.pem b/3rd_party/libhttpserver-0.18.2/test/cert.pem new file mode 100644 index 00000000..2c766dff --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/cert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICpjCCAZCgAwIBAgIESEPtjjALBgkqhkiG9w0BAQUwADAeFw0wODA2MDIxMjU0 +MzhaFw0wOTA2MDIxMjU0NDZaMAAwggEfMAsGCSqGSIb3DQEBAQOCAQ4AMIIBCQKC +AQC03TyUvK5HmUAirRp067taIEO4bibh5nqolUoUdo/LeblMQV+qnrv/RNAMTx5X +fNLZ45/kbM9geF8qY0vsPyQvP4jumzK0LOJYuIwmHaUm9vbXnYieILiwCuTgjaud +3VkZDoQ9fteIo+6we9UTpVqZpxpbLulBMh/VsvX0cPJ1VFC7rT59o9hAUlFf9jX/ +GmKdYI79MtgVx0OPBjmmSD6kicBBfmfgkO7bIGwlRtsIyMznxbHu6VuoX/eVxrTv +rmCwgEXLWRZ6ru8MQl5YfqeGXXRVwMeXU961KefbuvmEPccgCxm8FZ1C1cnDHFXh +siSgAzMBjC/b6KVhNQ4KnUdZAgMBAAGjLzAtMAwGA1UdEwEB/wQCMAAwHQYDVR0O +BBYEFJcUvpjvE5fF/yzUshkWDpdYiQh/MAsGCSqGSIb3DQEBBQOCAQEARP7eKSB2 +RNd6XjEjK0SrxtoTnxS3nw9sfcS7/qD1+XHdObtDFqGNSjGYFB3Gpx8fpQhCXdoN +8QUs3/5ZVa5yjZMQewWBgz8kNbnbH40F2y81MHITxxCe1Y+qqHWwVaYLsiOTqj2/ +0S3QjEJ9tvklmg7JX09HC4m5QRYfWBeQLD1u8ZjA1Sf1xJriomFVyRLI2VPO2bNe +JDMXWuP+8kMC7gEvUnJ7A92Y2yrhu3QI3bjPk8uSpHea19Q77tul1UVBJ5g+zpH3 +OsF5p0MyaVf09GTzcLds5nE/osTdXGUyHJapWReVmPm3Zn6gqYlnzD99z+DPIgIV +RhZvQx74NQnS6g== +-----END CERTIFICATE----- diff --git a/3rd_party/libhttpserver-0.18.2/test/integ/authentication.cpp b/3rd_party/libhttpserver-0.18.2/test/integ/authentication.cpp new file mode 100644 index 00000000..da89f0a2 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/integ/authentication.cpp @@ -0,0 +1,231 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if defined(_WIN32) && ! defined(__CYGWIN__) +#define _WINDOWS +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x600 +#include +#include +#else +#include +#include +#include +#endif + +#include + +#include "httpserver.hpp" +#include "littletest.hpp" + +#define MY_OPAQUE "11733b200778ce33060f31c9af70a870ba96ddd4" + +using namespace std; +using namespace httpserver; + +size_t writefunc(void *ptr, size_t size, size_t nmemb, std::string *s) +{ + s->append((char*) ptr, size*nmemb); + return size*nmemb; +} + +class user_pass_resource : public httpserver::http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + if (req.get_user() != "myuser" || req.get_pass() != "mypass") + { + return shared_ptr(new basic_auth_fail_response("FAIL", "examplerealm")); + } + return shared_ptr(new string_response(req.get_user() + " " + req.get_pass(), 200, "text/plain")); + } +}; + +class digest_resource : public httpserver::http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + if (req.get_digested_user() == "") { + return shared_ptr(new digest_auth_fail_response("FAIL", "examplerealm", MY_OPAQUE, true)); + } + else + { + bool reload_nonce = false; + if(!req.check_digest_auth("examplerealm", "mypass", 300, reload_nonce)) + { + return shared_ptr(new digest_auth_fail_response("FAIL", "examplerealm", MY_OPAQUE, reload_nonce)); + } + } + return shared_ptr(new string_response("SUCCESS", 200, "text/plain")); + } +}; + +LT_BEGIN_SUITE(authentication_suite) + void set_up() + { + } + + void tear_down() + { + } +LT_END_SUITE(authentication_suite) + +LT_BEGIN_AUTO_TEST(authentication_suite, base_auth) + webserver ws = create_webserver(8080); + + user_pass_resource user_pass; + ws.register_resource("base", &user_pass); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_USERNAME, "myuser"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "mypass"); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "myuser mypass"); + curl_easy_cleanup(curl); + + ws.stop(); +LT_END_AUTO_TEST(base_auth) + +LT_BEGIN_AUTO_TEST(authentication_suite, base_auth_fail) + webserver ws = create_webserver(8080); + + user_pass_resource user_pass; + ws.register_resource("base", &user_pass); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_USERNAME, "myuser"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "wrongpass"); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "FAIL"); + curl_easy_cleanup(curl); + + ws.stop(); +LT_END_AUTO_TEST(base_auth_fail) + +// do not run the digest auth tests on windows as curl +// appears to have problems with it. +// Will fix this separately +#ifndef _WINDOWS + +LT_BEGIN_AUTO_TEST(authentication_suite, digest_auth) + webserver ws = create_webserver(8080) + .digest_auth_random("myrandom") + .nonce_nc_size(300); + + digest_resource digest; + ws.register_resource("base", &digest); + ws.start(false); + +#if defined(_WINDOWS) + curl_global_init(CURL_GLOBAL_WIN32 ); +#else + curl_global_init(CURL_GLOBAL_ALL); +#endif + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); +#if defined(_WINDOWS) + curl_easy_setopt(curl, CURLOPT_USERPWD, "examplerealm/myuser:mypass"); +#else + curl_easy_setopt(curl, CURLOPT_USERPWD, "myuser:mypass"); +#endif + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 150L); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 150L); + curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "SUCCESS"); + curl_easy_cleanup(curl); + + ws.stop(); +LT_END_AUTO_TEST(digest_auth) + +LT_BEGIN_AUTO_TEST(authentication_suite, digest_auth_wrong_pass) + webserver ws = create_webserver(8080) + .digest_auth_random("myrandom") + .nonce_nc_size(300); + + digest_resource digest; + ws.register_resource("base", &digest); + ws.start(false); + +#if defined(_WINDOWS) + curl_global_init(CURL_GLOBAL_WIN32 ); +#else + curl_global_init(CURL_GLOBAL_ALL); +#endif + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); +#if defined(_WINDOWS) + curl_easy_setopt(curl, CURLOPT_USERPWD, "examplerealm/myuser:wrongpass"); +#else + curl_easy_setopt(curl, CURLOPT_USERPWD, "myuser:wrongpass"); +#endif + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 150L); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 150L); + curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "FAIL"); + curl_easy_cleanup(curl); + + ws.stop(); +LT_END_AUTO_TEST(digest_auth_wrong_pass) + +#endif + +LT_BEGIN_AUTO_TEST_ENV() + AUTORUN_TESTS() +LT_END_AUTO_TEST_ENV() diff --git a/3rd_party/libhttpserver-0.18.2/test/integ/ban_system.cpp b/3rd_party/libhttpserver-0.18.2/test/integ/ban_system.cpp new file mode 100644 index 00000000..07f3e8d8 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/integ/ban_system.cpp @@ -0,0 +1,166 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include +#include +#include + +#include "httpserver.hpp" +#include "httpserver/http_utils.hpp" +#include "littletest.hpp" + +using namespace httpserver; +using namespace std; +using namespace http; + +size_t writefunc(void *ptr, size_t size, size_t nmemb, std::string *s) +{ + s->append((char*) ptr, size*nmemb); + return size*nmemb; +} + +class ok_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } +}; + +LT_BEGIN_SUITE(ban_system_suite) + void set_up() + { + } + + void tear_down() + { + } +LT_END_SUITE(ban_system_suite) + +LT_BEGIN_AUTO_TEST(ban_system_suite, accept_default_ban_blocks) + webserver ws = create_webserver(8080).default_policy(http_utils::ACCEPT); + ws.start(false); + + ok_resource resource; + ws.register_resource("base", &resource); + + curl_global_init(CURL_GLOBAL_ALL); + + { + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + } + + { + ws.ban_ip("127.0.0.1"); + + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + res = curl_easy_perform(curl); + LT_ASSERT_NEQ(res, 0); + curl_easy_cleanup(curl); + } + + { + ws.unban_ip("127.0.0.1"); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + } + + curl_global_cleanup(); + ws.stop(); +LT_END_AUTO_TEST(accept_default_ban_blocks) + +LT_BEGIN_AUTO_TEST(ban_system_suite, reject_default_allow_passes) + webserver ws = create_webserver(8080).default_policy(http_utils::REJECT); + ws.start(false); + + ok_resource resource; + ws.register_resource("base", &resource); + + curl_global_init(CURL_GLOBAL_ALL); + + { + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + res = curl_easy_perform(curl); + LT_ASSERT_NEQ(res, 0); + curl_easy_cleanup(curl); + } + + { + ws.allow_ip("127.0.0.1"); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + } + + { + ws.disallow_ip("127.0.0.1"); + + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + res = curl_easy_perform(curl); + LT_ASSERT_NEQ(res, 0); + curl_easy_cleanup(curl); + } + + curl_global_cleanup(); + ws.stop(); +LT_END_AUTO_TEST(reject_default_allow_passes) + +LT_BEGIN_AUTO_TEST_ENV() + AUTORUN_TESTS() +LT_END_AUTO_TEST_ENV() diff --git a/3rd_party/libhttpserver-0.18.2/test/integ/basic.cpp b/3rd_party/libhttpserver-0.18.2/test/integ/basic.cpp new file mode 100644 index 00000000..fdb503de --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/integ/basic.cpp @@ -0,0 +1,1016 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include +#include +#include +#include + +#include "httpserver.hpp" +#include "httpserver/string_utilities.hpp" +#include "littletest.hpp" + +using namespace httpserver; +using namespace std; + +std::string lorem_ipsum(" , unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci v'elit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur? [33] At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. , unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci v'elit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur? [33] At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. , unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci v'elit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur? [33] At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. , unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci v'elit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur? [33] At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. , unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci v'elit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur? [33] At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."); + +size_t writefunc(void *ptr, size_t size, size_t nmemb, std::string *s) +{ + s->append((char*) ptr, size*nmemb); + return size*nmemb; +} + +size_t headerfunc(void *ptr, size_t size, size_t nmemb, map* ss) +{ + string s_ptr((char*)ptr, size*nmemb); + size_t pos = s_ptr.find(":"); + if(pos != string::npos) + (*ss)[s_ptr.substr(0, pos)] = + s_ptr.substr(pos + 2, s_ptr.size() - pos - 4); + return size*nmemb; +} + +class simple_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } + const shared_ptr render_POST(const http_request& req) + { + return shared_ptr(new string_response(req.get_arg("arg1")+req.get_arg("arg2"), 200, "text/plain")); + } +}; + +class args_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response(req.get_arg("arg") + req.get_arg("arg2"), 200, "text/plain")); + } +}; + +class long_content_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response(lorem_ipsum, 200, "text/plain")); + } +}; + +class header_set_test_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + shared_ptr hrb(new string_response("OK", 200, "text/plain")); + hrb->with_header("KEY", "VALUE"); + return hrb; + } +}; + +class cookie_set_test_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + shared_ptr hrb(new string_response("OK", 200, "text/plain")); + hrb->with_cookie("MyCookie", "CookieValue"); + return hrb; + } +}; + +class cookie_reading_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response(req.get_cookie("name"), 200, "text/plain")); + } +}; + +class header_reading_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response(req.get_header("MyHeader"), 200, "text/plain")); + } +}; + +class full_args_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response(req.get_args().at("arg"), 200, "text/plain")); + } +}; + +class querystring_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response(req.get_querystring(), 200, "text/plain")); + } +}; + +class path_pieces_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + std::stringstream ss; + for (unsigned int i = 0; i < req.get_path_pieces().size(); i++) + { + ss << req.get_path_piece(i) << ","; + } + return shared_ptr(new string_response(ss.str(), 200, "text/plain")); + } +}; + +class complete_test_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } + const shared_ptr render_POST(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } + const shared_ptr render_PUT(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } + const shared_ptr render_DELETE(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } + const shared_ptr render_CONNECT(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } + const shared_ptr render_PATCH(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } +}; + +class only_render_resource : public http_resource +{ + public: + const shared_ptr render(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } +}; + +class ok_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } +}; + +class nok_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response("NOK", 200, "text/plain")); + } +}; + +class no_response_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new http_response()); + } +}; + +class file_response_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new file_response("test_content", 200, "text/plain")); + } +}; + +class exception_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + throw std::domain_error("invalid"); + } +}; + +class error_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + throw "invalid"; + } +}; + +class print_request_resource : public http_resource +{ + public: + print_request_resource(std::stringstream* ss) + { + this->ss = ss; + } + + const shared_ptr render_GET(const http_request& req) + { + (*ss) << req; + return shared_ptr(new string_response("OK", 200, "text/plain")); + } + + private: + std::stringstream* ss; +}; + +class print_response_resource : public http_resource +{ + public: + print_response_resource(std::stringstream* ss) + { + this->ss = ss; + } + + const shared_ptr render_GET(const http_request& req) + { + shared_ptr hresp(new string_response("OK", 200, "text/plain")); + + hresp->with_header("MyResponseHeader", "MyResponseHeaderValue"); + hresp->with_footer("MyResponseFooter", "MyResponseFooterValue"); + hresp->with_cookie("MyResponseCookie", "MyResponseCookieValue"); + + (*ss) << *hresp; + + return hresp; + } + + private: + std::stringstream* ss; +}; + +LT_BEGIN_SUITE(basic_suite) + + webserver* ws; + + void set_up() + { + ws = new webserver(create_webserver(8080)); + ws->start(false); + } + + void tear_down() + { + ws->stop(); + delete ws; + } +LT_END_SUITE(basic_suite) + +LT_BEGIN_AUTO_TEST(basic_suite, server_runs) + LT_CHECK_EQ(ws->is_running(), true); +LT_END_AUTO_TEST(server_runs) + +LT_BEGIN_AUTO_TEST(basic_suite, two_endpoints) + ok_resource ok; + ws->register_resource("OK", &ok); + nok_resource nok; + ws->register_resource("NOK", &nok); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + { + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/OK"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + } + + std::string t; + { + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/NOK"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &t); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(t, "NOK"); + curl_easy_cleanup(curl); + } +LT_END_AUTO_TEST(two_endpoints) + +LT_BEGIN_AUTO_TEST(basic_suite, read_body) + simple_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(read_body) + +LT_BEGIN_AUTO_TEST(basic_suite, read_long_body) + long_content_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s.size(), lorem_ipsum.size()); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(read_long_body) + +LT_BEGIN_AUTO_TEST(basic_suite, resource_setting_header) + header_set_test_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + map ss; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, headerfunc); + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &ss); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + LT_CHECK_EQ(ss["KEY"], "VALUE"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(resource_setting_header) + +LT_BEGIN_AUTO_TEST(basic_suite, resource_setting_cookie) + cookie_set_test_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); + curl_easy_setopt(curl, CURLOPT_COOKIEJAR, ""); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + + struct curl_slist *cookies; + curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies); + + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + std::string read_cookie = ""; + + read_cookie = cookies->data; + curl_slist_free_all(cookies); + + std::vector cookie_parts = string_utilities::string_split(read_cookie, '\t', false); + LT_CHECK_EQ(cookie_parts[5], "MyCookie"); + LT_CHECK_EQ(cookie_parts[6], "CookieValue"); + + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(resource_setting_cookie) + +LT_BEGIN_AUTO_TEST(basic_suite, request_with_header) + header_reading_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + + struct curl_slist *list = NULL; + list = curl_slist_append(list, "MyHeader: MyValue"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "MyValue"); + curl_slist_free_all(list); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(request_with_header) + +LT_BEGIN_AUTO_TEST(basic_suite, request_with_cookie) + cookie_reading_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + curl_easy_setopt(curl, CURLOPT_COOKIE, "name=myname; present=yes;"); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "myname"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(request_with_cookie) + +LT_BEGIN_AUTO_TEST(basic_suite, complete) + complete_test_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + { + CURL* curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + CURLcode res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + curl_easy_cleanup(curl); + } + + { + CURL* curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + CURLcode res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + curl_easy_cleanup(curl); + } + + { + CURL* curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); + CURLcode res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + curl_easy_cleanup(curl); + } + + { + CURL* curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PATCH"); + CURLcode res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + curl_easy_cleanup(curl); + } +/* + { + CURL* curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "CONNECT"); + CURLcode res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + curl_easy_cleanup(curl); + } +*/ + + { + CURL* curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_POST, 1L); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, NULL); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0); + CURLcode res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + curl_easy_cleanup(curl); + } +LT_END_AUTO_TEST(complete) + +LT_BEGIN_AUTO_TEST(basic_suite, only_render) + only_render_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL* curl; + CURLcode res; + + s = ""; + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + s = ""; + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + s = ""; + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + +/* + s = ""; + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "CONNECT"); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); +*/ + + s = ""; + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "NOT_EXISTENT"); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "Method not Allowed"); + curl_easy_cleanup(curl); + + s = ""; + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_POST, 1L); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, NULL); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(only_render) + +LT_BEGIN_AUTO_TEST(basic_suite, postprocessor) + simple_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "arg1=lib&arg2=httpserver"); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "libhttpserver"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(postprocessor) + +LT_BEGIN_AUTO_TEST(basic_suite, empty_arg) + simple_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "arg1"); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(empty_arg) + +LT_BEGIN_AUTO_TEST(basic_suite, no_response) + no_response_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + CURL* curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + CURLcode res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + long http_code = 0; + curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); + LT_ASSERT_EQ(http_code, 500); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(no_response) + +LT_BEGIN_AUTO_TEST(basic_suite, regex_matching) + simple_resource resource; + ws->register_resource("regex/matching/number/[0-9]+", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/regex/matching/number/10"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(regex_matching) + +LT_BEGIN_AUTO_TEST(basic_suite, regex_matching_arg) + args_resource resource; + ws->register_resource("this/captures/{arg}/passed/in/input", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/this/captures/whatever/passed/in/input"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "whatever"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(regex_matching_arg) + +LT_BEGIN_AUTO_TEST(basic_suite, regex_matching_arg_custom) + args_resource resource; + ws->register_resource("this/captures/numeric/{arg|([0-9]+)}/passed/in/input", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + { + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/this/captures/numeric/11/passed/in/input"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "11"); + curl_easy_cleanup(curl); + } + + { + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/this/captures/numeric/text/passed/in/input"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "Not Found"); + long http_code = 0; + curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); + LT_ASSERT_EQ(http_code, 404); + curl_easy_cleanup(curl); + } +LT_END_AUTO_TEST(regex_matching_arg_custom) + +LT_BEGIN_AUTO_TEST(basic_suite, querystring_processing) + args_resource resource; + ws->register_resource("this/captures/args/passed/in/the/querystring", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/this/captures/args/passed/in/the/querystring?arg=first&arg2=second"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "firstsecond"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(querystring_processing) + +LT_BEGIN_AUTO_TEST(basic_suite, full_arguments_processing) + full_args_resource resource; + ws->register_resource("this/captures/args/passed/in/the/querystring", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/this/captures/args/passed/in/the/querystring?arg=argument"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "argument"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(full_arguments_processing) + +LT_BEGIN_AUTO_TEST(basic_suite, querystring_query_processing) + querystring_resource resource; + ws->register_resource("this/captures/args/passed/in/the/querystring", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/this/captures/args/passed/in/the/querystring?arg1=value1&arg2=value2&arg3=value3"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "?arg1=value1&arg2=value2&arg3=value3"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(querystring_query_processing) + +LT_BEGIN_AUTO_TEST(basic_suite, register_unregister) + simple_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + { + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + } + + ws->unregister_resource("base"); + { + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + + long http_code = 0; + curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); + LT_ASSERT_EQ(http_code, 404); + + LT_CHECK_EQ(s, "Not Found"); + + curl_easy_cleanup(curl); + } + + ws->register_resource("base", &resource); + { + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + } +LT_END_AUTO_TEST(register_unregister) + +LT_BEGIN_AUTO_TEST(basic_suite, file_serving_resource) + file_response_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "test content of file\n"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(file_serving_resource) + +LT_BEGIN_AUTO_TEST(basic_suite, exception_forces_500) + exception_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "Internal Error"); + + long http_code = 0; + curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); + LT_ASSERT_EQ(http_code, 500); + + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(exception_forces_500) + +LT_BEGIN_AUTO_TEST(basic_suite, untyped_error_forces_500) + error_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "Internal Error"); + + long http_code = 0; + curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); + LT_ASSERT_EQ(http_code, 500); + + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(untyped_error_forces_500) + +LT_BEGIN_AUTO_TEST(basic_suite, request_is_printable) + std::stringstream ss; + print_request_resource resource(&ss); + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + + struct curl_slist *list = NULL; + list = curl_slist_append(NULL, "MyHeader: MyValue"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); + + res = curl_easy_perform(curl); + curl_slist_free_all(list); + + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + + std::string actual = ss.str(); + LT_CHECK_EQ(actual.find("GET Request") != string::npos, true); + LT_CHECK_EQ(actual.find("Headers [") != string::npos, true); + LT_CHECK_EQ(actual.find("Host") != string::npos, true); + LT_CHECK_EQ(actual.find("Accept:\"*/*\"") != string::npos, true); + LT_CHECK_EQ(actual.find("MyHeader:\"MyValue\"") != string::npos, true); + LT_CHECK_EQ(actual.find("Version [ HTTP/1.1 ]") != string::npos, true); + + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(request_is_printable) + +LT_BEGIN_AUTO_TEST(basic_suite, response_is_printable) + std::stringstream ss; + print_response_resource resource(&ss); + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + + struct curl_slist *list = NULL; + list = curl_slist_append(NULL, "MyHeader: MyValue"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); + + res = curl_easy_perform(curl); + curl_slist_free_all(list); + + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + + std::string actual = ss.str(); + LT_CHECK_EQ(actual.find("Response [response_code:200]") != string::npos, true); + LT_CHECK_EQ(actual.find("Headers [Content-Type:\"text/plain\" MyResponseHeader:\"MyResponseHeaderValue\" ]") != string::npos, true); + LT_CHECK_EQ(actual.find("Footers [MyResponseFooter:\"MyResponseFooterValue\" ]") != string::npos, true); + LT_CHECK_EQ(actual.find("Cookies [MyResponseCookie:\"MyResponseCookieValue\" ]") != string::npos, true); + + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(response_is_printable) + +LT_BEGIN_AUTO_TEST(basic_suite, long_path_pieces) + path_pieces_resource resource; + ws->register_resource("/settings", &resource, true); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/settings/somestringthatisreallylong/with_really_a_lot_of_content/and_underscores_and_looooooooooooooooooong_stuff"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "settings,somestringthatisreallylong,with_really_a_lot_of_content,and_underscores_and_looooooooooooooooooong_stuff,"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(long_path_pieces) + +LT_BEGIN_AUTO_TEST(basic_suite, url_with_regex_like_pieces) + path_pieces_resource resource; + ws->register_resource("/settings", &resource, true); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/settings/{}"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "settings,{},"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(url_with_regex_like_pieces) + +LT_BEGIN_AUTO_TEST_ENV() + AUTORUN_TESTS() +LT_END_AUTO_TEST_ENV() diff --git a/3rd_party/libhttpserver-0.18.2/test/integ/deferred.cpp b/3rd_party/libhttpserver-0.18.2/test/integ/deferred.cpp new file mode 100644 index 00000000..571c36a5 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/integ/deferred.cpp @@ -0,0 +1,165 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if defined(_WIN32) && ! defined(__CYGWIN__) +#define _WINDOWS +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x600 +#include +#include +#else +#include +#include +#include +#endif + +#include +#include +#include + +#include "httpserver.hpp" +#include "littletest.hpp" + +using namespace std; +using namespace httpserver; + +size_t writefunc(void *ptr, size_t size, size_t nmemb, std::string *s) +{ + s->append((char*) ptr, size*nmemb); + return size*nmemb; +} + +static int counter = 0; + +struct test_data +{ + int value; +}; + +ssize_t test_callback(std::shared_ptr closure_data, char* buf, size_t max) +{ + if (counter == 2) + { + return -1; + } + else + { + memset(buf, 0, max); + strcat(buf, "test"); + counter++; + return std::string(buf).size(); + } +} + +ssize_t test_callback_with_data(std::shared_ptr closure_data, char* buf, size_t max) +{ + if (counter == 2) + { + return -1; + } + else + { + memset(buf, 0, max); + strcat(buf, ("test" + std::to_string(closure_data->value)).c_str()); + + closure_data->value = 84; + + counter++; + return std::string(buf).size(); + } +} + +class deferred_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr>(new deferred_response(test_callback, nullptr, "cycle callback response")); + } +}; + +class deferred_resource_with_data : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + std::shared_ptr internal_info(new test_data); + internal_info->value = 42; + return shared_ptr>(new deferred_response(test_callback_with_data, internal_info, "cycle callback response")); + } +}; + +LT_BEGIN_SUITE(deferred_suite) + webserver* ws; + + void set_up() + { + ws = new webserver(create_webserver(8080)); + ws->start(false); + } + + void tear_down() + { + counter = 0; + + ws->stop(); + delete ws; + } +LT_END_SUITE(deferred_suite) + +LT_BEGIN_AUTO_TEST(deferred_suite, deferred_response) + deferred_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "testtest"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(deferred_response) + +LT_BEGIN_AUTO_TEST(deferred_suite, deferred_response_with_data) + deferred_resource_with_data resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "test42test84"); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(deferred_response_with_data) + +LT_BEGIN_AUTO_TEST_ENV() + AUTORUN_TESTS() +LT_END_AUTO_TEST_ENV() diff --git a/3rd_party/libhttpserver-0.18.2/test/integ/nodelay.cpp b/3rd_party/libhttpserver-0.18.2/test/integ/nodelay.cpp new file mode 100644 index 00000000..0284a3f9 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/integ/nodelay.cpp @@ -0,0 +1,75 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include +#include +#include + +#include "httpserver.hpp" +#include "littletest.hpp" + +using namespace httpserver; +using namespace std; + +class ok_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } +}; + +LT_BEGIN_SUITE(threaded_suite) + + webserver* ws; + + void set_up() + { + ws = new webserver(create_webserver(8080).tcp_nodelay()); + ws->start(false); + } + + void tear_down() + { + ws->stop(); + delete ws; + } +LT_END_SUITE(threaded_suite) + +LT_BEGIN_AUTO_TEST(threaded_suite, base) + ok_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL* curl; + CURLcode res; + + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(base) + +LT_BEGIN_AUTO_TEST_ENV() + AUTORUN_TESTS() +LT_END_AUTO_TEST_ENV() diff --git a/3rd_party/libhttpserver-0.18.2/test/integ/threaded.cpp b/3rd_party/libhttpserver-0.18.2/test/integ/threaded.cpp new file mode 100644 index 00000000..1b29d512 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/integ/threaded.cpp @@ -0,0 +1,75 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include +#include +#include + +#include "httpserver.hpp" +#include "littletest.hpp" + +using namespace httpserver; +using namespace std; + +class ok_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } +}; + +LT_BEGIN_SUITE(threaded_suite) + + webserver* ws; + + void set_up() + { + ws = new webserver(create_webserver(8080).start_method(http::http_utils::INTERNAL_SELECT).max_threads(5)); + ws->start(false); + } + + void tear_down() + { + ws->stop(); + delete ws; + } +LT_END_SUITE(threaded_suite) + +LT_BEGIN_AUTO_TEST(threaded_suite, base) + ok_resource resource; + ws->register_resource("base", &resource); + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL* curl; + CURLcode res; + + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + curl_easy_cleanup(curl); +LT_END_AUTO_TEST(base) + +LT_BEGIN_AUTO_TEST_ENV() + AUTORUN_TESTS() +LT_END_AUTO_TEST_ENV() diff --git a/3rd_party/libhttpserver-0.18.2/test/integ/ws_start_stop.cpp b/3rd_party/libhttpserver-0.18.2/test/integ/ws_start_stop.cpp new file mode 100644 index 00000000..7aa185e8 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/integ/ws_start_stop.cpp @@ -0,0 +1,607 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#if defined(_WIN32) && ! defined(__CYGWIN__) +#define _WINDOWS +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x600 +#include +#include +#else +#include +#include +#include +#endif + +#include +#include +#include + +#include "httpserver.hpp" +#include "littletest.hpp" + +using namespace std; +using namespace httpserver; + +size_t writefunc(void *ptr, size_t size, size_t nmemb, std::string *s) +{ + s->append((char*) ptr, size*nmemb); + return size*nmemb; +} + +class ok_resource : public http_resource +{ + public: + const shared_ptr render_GET(const http_request& req) + { + return shared_ptr(new string_response("OK", 200, "text/plain")); + } +}; + +const shared_ptr not_found_custom(const http_request& req) +{ + return shared_ptr(new string_response("Not found custom", 404, "text/plain")); +} + +const shared_ptr not_allowed_custom(const http_request& req) +{ + return shared_ptr(new string_response("Not allowed custom", 405, "text/plain")); +} + +LT_BEGIN_SUITE(ws_start_stop_suite) + void set_up() + { + } + + void tear_down() + { + } +LT_END_SUITE(ws_start_stop_suite) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, start_stop) + { + webserver ws = create_webserver(8080); + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); + } + + { + webserver ws = create_webserver(8080).start_method(http::http_utils::INTERNAL_SELECT); + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); + } + + { + webserver ws = create_webserver(8080).start_method(http::http_utils::THREAD_PER_CONNECTION); + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); + } +LT_END_AUTO_TEST(start_stop) + +#if defined(IPV6_TESTS_ENABLED) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, ipv6) + { + webserver ws = create_webserver(8080).use_ipv6(); + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); + } +LT_END_AUTO_TEST(ipv6) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, dual_stack) + { + webserver ws = create_webserver(8080).use_dual_stack(); + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); + } +LT_END_AUTO_TEST(dual_stack) + +#endif + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, sweet_kill) + webserver ws = create_webserver(8080); + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + { + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + } + + ws.sweet_kill(); + + { + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 7); + curl_easy_cleanup(curl); + } +LT_END_AUTO_TEST(sweet_kill) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, disable_options) + webserver ws = create_webserver(8080) + .no_ssl() + .no_ipv6() + .no_debug() + .no_pedantic() + .no_basic_auth() + .no_digest_auth() + .no_deferred() + .no_regex_checking() + .no_ban_system() + .no_post_process(); + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); +LT_END_AUTO_TEST(disable_options) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, enable_options) + webserver ws = create_webserver(8080) + .debug() + .pedantic() + .deferred() + .regex_checking() + .ban_system() + .post_process(); + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); +LT_END_AUTO_TEST(enable_options) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, custom_socket) +#ifndef DARWIN + int fd = socket(AF_INET, SOCK_STREAM, 0); + + struct sockaddr_in address; + address.sin_family = AF_INET; + address.sin_addr.s_addr = inet_addr("127.0.0.1"); + address.sin_port = htons(8181); + bind(fd, (struct sockaddr*) &address, sizeof(address)); + listen(fd, 10000); + + webserver ws = create_webserver(-1).bind_socket(fd); //whatever port here doesn't matter + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8181/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); +#endif +LT_END_AUTO_TEST(custom_socket) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, single_resource) + webserver ws = create_webserver(8080).single_resource(); + ok_resource ok; + ws.register_resource("/", &ok, true); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/any/url/works"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); +LT_END_AUTO_TEST(single_resource) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, single_resource_not_default_resource) + webserver ws = create_webserver(8080).single_resource(); + ok_resource ok; + LT_CHECK_THROW(ws.register_resource("/other", &ok, true)); + LT_CHECK_THROW(ws.register_resource("/", &ok, false)); + ws.start(false); + + ws.stop(); +LT_END_AUTO_TEST(single_resource_not_default_resource) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, thread_per_connection_fails_with_max_threads) + { + webserver ws = create_webserver(8080) + .start_method(http::http_utils::THREAD_PER_CONNECTION) + .max_threads(5); + LT_CHECK_THROW(ws.start(false)); + } +LT_END_AUTO_TEST(thread_per_connection_fails_with_max_threads) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, thread_per_connection_fails_with_max_threads_stack_size) + { + webserver ws = create_webserver(8080) + .start_method(http::http_utils::THREAD_PER_CONNECTION) + .max_thread_stack_size(4*1024*1024); + LT_CHECK_THROW(ws.start(false)); + } +LT_END_AUTO_TEST(thread_per_connection_fails_with_max_threads_stack_size) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, tuning_options) + webserver ws = create_webserver(8080) + .max_connections(10) + .max_threads(10) + .memory_limit(10000) + .per_IP_connection_limit(10) + .max_thread_stack_size(4*1024*1024) + .nonce_nc_size(10); + ; + + ok_resource ok; + ws.register_resource("base", &ok); + LT_CHECK_NOTHROW(ws.start(false)); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); +LT_END_AUTO_TEST(tuning_options) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, ssl_base) + webserver ws = create_webserver(8080) + .use_ssl() + .https_mem_key("key.pem") + .https_mem_cert("cert.pem"); + + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // avoid verifying ssl + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); // avoid verifying ssl + curl_easy_setopt(curl, CURLOPT_URL, "https://localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + curl_global_cleanup(); + + ws.stop(); +LT_END_AUTO_TEST(ssl_base) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, ssl_with_protocol_priorities) + webserver ws = create_webserver(8080) + .use_ssl() + .https_mem_key("key.pem") + .https_mem_cert("cert.pem") + .https_priorities("NONE:+VERS-TLS1.0:+AES-128-CBC:+SHA1:+RSA:+COMP-NULL"); + + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // avoid verifying ssl + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); // avoid verifying ssl + curl_easy_setopt(curl, CURLOPT_URL, "https://localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); +LT_END_AUTO_TEST(ssl_with_protocol_priorities) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, ssl_with_trust) + webserver ws = create_webserver(8080) + .use_ssl() + .https_mem_key("key.pem") + .https_mem_cert("cert.pem") + .https_mem_trust("test_root_ca.pem"); + + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // avoid verifying ssl + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); // avoid verifying ssl + curl_easy_setopt(curl, CURLOPT_URL, "https://localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); +LT_END_AUTO_TEST(ssl_with_trust) + +void* start_ws_blocking(void* par) +{ + webserver* ws = (webserver*) par; + ok_resource ok; + ws->register_resource("base", &ok); + ws->start(true); + + return 0x0; +} + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, blocking_server) + webserver ws = create_webserver(8080); + + pthread_t tid; + pthread_create(&tid, NULL, start_ws_blocking, (void *) &ws); + + sleep(1); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + + ws.stop(); + + char* b; + pthread_join(tid,(void**) &b); + free(b); +LT_END_AUTO_TEST(blocking_server) + +LT_BEGIN_AUTO_TEST(ws_start_stop_suite, custom_error_resources) + webserver ws = create_webserver(8080) + .not_found_resource(not_found_custom) + .method_not_allowed_resource(not_allowed_custom); + + ok_resource ok; + ws.register_resource("base", &ok); + ws.start(false); + + { + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "OK"); + curl_easy_cleanup(curl); + } + + { + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/not_registered"); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "Not found custom"); + + long http_code = 0; + curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); + LT_ASSERT_EQ(http_code, 404); + + curl_easy_cleanup(curl); + } + + { + ok.set_allowing("PUT", false); + + curl_global_init(CURL_GLOBAL_ALL); + std::string s; + CURL *curl = curl_easy_init(); + CURLcode res; + curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/base"); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); + res = curl_easy_perform(curl); + LT_ASSERT_EQ(res, 0); + LT_CHECK_EQ(s, "Not allowed custom"); + + long http_code = 0; + curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code); + LT_ASSERT_EQ(http_code, 405); + + curl_easy_cleanup(curl); + } + + ws.stop(); +LT_END_AUTO_TEST(custom_error_resources) + +LT_BEGIN_AUTO_TEST_ENV() + AUTORUN_TESTS() +LT_END_AUTO_TEST_ENV() diff --git a/3rd_party/libhttpserver-0.18.2/test/key.pem b/3rd_party/libhttpserver-0.18.2/test/key.pem new file mode 100644 index 00000000..a5848eed --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAtN08lLyuR5lAIq0adOu7WiBDuG4m4eZ6qJVKFHaPy3m5TEFf +qp67/0TQDE8eV3zS2eOf5GzPYHhfKmNL7D8kLz+I7psytCziWLiMJh2lJvb2152I +niC4sArk4I2rnd1ZGQ6EPX7XiKPusHvVE6VamacaWy7pQTIf1bL19HDydVRQu60+ +faPYQFJRX/Y1/xpinWCO/TLYFcdDjwY5pkg+pInAQX5n4JDu2yBsJUbbCMjM58Wx +7ulbqF/3lca0765gsIBFy1kWeq7vDEJeWH6nhl10VcDHl1PetSnn27r5hD3HIAsZ +vBWdQtXJwxxV4bIkoAMzAYwv2+ilYTUOCp1HWQIDAQABAoIBAArOQv3R7gmqDspj +lDaTFOz0C4e70QfjGMX0sWnakYnDGn6DU19iv3GnX1S072ejtgc9kcJ4e8VUO79R +EmqpdRR7k8dJr3RTUCyjzf/C+qiCzcmhCFYGN3KRHA6MeEnkvRuBogX4i5EG1k5l +/5t+YBTZBnqXKWlzQLKoUAiMLPg0eRWh+6q7H4N7kdWWBmTpako7TEqpIwuEnPGx +u3EPuTR+LN6lF55WBePbCHccUHUQaXuav18NuDkcJmCiMArK9SKb+h0RqLD6oMI/ +dKD6n8cZXeMBkK+C8U/K0sN2hFHACsu30b9XfdnljgP9v+BP8GhnB0nCB6tNBCPo +32srOwECgYEAxWh3iBT4lWqL6bZavVbnhmvtif4nHv2t2/hOs/CAq8iLAw0oWGZc ++JEZTUDMvFRlulr0kcaWra+4fN3OmJnjeuFXZq52lfMgXBIKBmoSaZpIh2aDY1Rd +RbEse7nQl9hTEPmYspiXLGtnAXW7HuWqVfFFP3ya8rUS3t4d07Hig8ECgYEA6ou6 +OHiBRTbtDqLIv8NghARc/AqwNWgEc9PelCPe5bdCOLBEyFjqKiT2MttnSSUc2Zob +XhYkHC6zN1Mlq30N0e3Q61YK9LxMdU1vsluXxNq2rfK1Scb1oOlOOtlbV3zA3VRF +hV3t1nOA9tFmUrwZi0CUMWJE/zbPAyhwWotKyZkCgYEAh0kFicPdbABdrCglXVae +SnfSjVwYkVuGd5Ze0WADvjYsVkYBHTvhgRNnRJMg+/vWz3Sf4Ps4rgUbqK8Vc20b +AU5G6H6tlCvPRGm0ZxrwTWDHTcuKRVs+pJE8C/qWoklE/AAhjluWVoGwUMbPGuiH +6Gf1bgHF6oj/Sq7rv/VLZ8ECgYBeq7ml05YyLuJutuwa4yzQ/MXfghzv4aVyb0F3 +QCdXR6o2IYgR6jnSewrZKlA9aPqFJrwHNR6sNXlnSmt5Fcf/RWO/qgJQGLUv3+rG +7kuLTNDR05azSdiZc7J89ID3Bkb+z2YkV+6JUiPq/Ei1+nDBEXb/m+/HqALU/nyj +P3gXeQKBgBusb8Rbd+KgxSA0hwY6aoRTPRt8LNvXdsB9vRcKKHUFQvxUWiUSS+L9 +/Qu1sJbrUquKOHqksV5wCnWnAKyJNJlhHuBToqQTgKXjuNmVdYSe631saiI7PHyC +eRJ6DxULPxABytJrYCRrNqmXi5TCiqR2mtfalEMOPxz8rUU8dYyx +-----END RSA PRIVATE KEY----- diff --git a/3rd_party/libhttpserver-0.18.2/test/libhttpserver.supp b/3rd_party/libhttpserver-0.18.2/test/libhttpserver.supp new file mode 100644 index 00000000..6da3d3c8 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/libhttpserver.supp @@ -0,0 +1,5 @@ +{ + gnutls_session_get_data + Memcheck:Cond + fun:gnutls_session_get_data +} diff --git a/3rd_party/libhttpserver-0.18.2/test/littletest.hpp b/3rd_party/libhttpserver-0.18.2/test/littletest.hpp new file mode 100644 index 00000000..bf9539fd --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/littletest.hpp @@ -0,0 +1,591 @@ +/* + This file is part of liblittletest + Copyright (C) 2012 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +//TODO: personalized messages + +#ifndef _LITTLETEST_HPP_ +#define _LITTLETEST_HPP_ + +#include +#include +#include +#include +#include +#include + +#define LT_VERSION 1.0 + +#define WARN 0 +#define CHECK 1 +#define ASSERT 2 + +#define LT_BEGIN_TEST_ENV() int main() { + +#define LT_END_TEST_ENV() } + +#define LT_BEGIN_AUTO_TEST_ENV() LT_BEGIN_TEST_ENV() + +#define LT_END_AUTO_TEST_ENV() \ + return (__lt_result__); \ + } + +#define AUTORUN_TESTS() \ + std::vector::iterator __lt_autorun_it__; \ + for(__lt_autorun_it__ = littletest::auto_test_vector.begin(); __lt_autorun_it__ != littletest::auto_test_vector.end(); ++__lt_autorun_it__) \ + littletest::auto_test_runner((*__lt_autorun_it__)); \ + int __lt_result__ = littletest::auto_test_runner(); + +#define LT_CREATE_RUNNER(__lt_suite_name__, __lt_runner_name__) \ + std::cout << "** Initializing Runner \"" << #__lt_runner_name__ << "\" **" << std::endl; \ + littletest::test_runner __lt_runner_name__ + +#define LT_RUNNER(__lt_runner_name__) __lt_runner_name__ + +#define LT_BEGIN_SUITE(__lt_name__) \ + struct __lt_name__ : public littletest::suite<__lt_name__> \ + { + +#define LT_END_SUITE(__lt_name__) \ + }; + +#define LT_CHECKPOINT() __lt_tr__->set_checkpoint(__FILE__, __LINE__) + +#define LT_BEGIN_TEST(__lt_suite_name__, __lt_test_name__) \ + struct __lt_test_name__ ## _class: public __lt_suite_name__, littletest::test<__lt_test_name__ ## _class> \ + { \ + __lt_test_name__ ## _class() \ + { \ + __lt_name__ = #__lt_test_name__; \ + littletest::auto_test_vector.push_back(this); \ + } \ + void operator()(littletest::test_runner* __lt_tr__) \ + { + +#define LT_END_TEST(__lt_test_name__) \ + } \ + }; \ + __lt_test_name__ ## _class __lt_test_name__; \ + +#define LT_BEGIN_AUTO_TEST(__lt_suite_name__, __lt_test_name__) LT_BEGIN_TEST(__lt_suite_name__, __lt_test_name__) + +#define LT_END_AUTO_TEST(__lt_test_name__) \ + LT_END_TEST(__lt_test_name__) \ + +#define LT_SWITCH_MODE(__lt_mode__) \ + switch(__lt_mode__) \ + { \ + case(WARN): \ + throw littletest::warn_unattended(__lt_ss__.str()); \ + case(CHECK): \ + throw littletest::check_unattended(__lt_ss__.str()); \ + case(ASSERT): \ + throw littletest::assert_unattended(__lt_ss__.str()); \ + } + +#define LT_SIMPLE_OP(__lt_name__, __lt_val__, __lt_file__, __lt_line__, __lt_mode__) \ + if(!((__lt_val__))) \ + { \ + std::stringstream __lt_ss__; \ + __lt_ss__ << "(" << __lt_file__ << ":" << __lt_line__ << ") - error in " << "\"" << __lt_name__ << "\""; \ + LT_SWITCH_MODE(__lt_mode__) \ + } + +#define LT_THROW_OP(__lt_name__, __lt_operation__, __lt_file__, __lt_line__, __lt_mode__) \ + bool __lt_thrown__ = false; \ + std::stringstream __lt_ss__; \ + try \ + { \ + (__lt_operation__) ;\ + __lt_ss__ << "(" << __lt_file__ << ":" << __lt_line__ << ") - error in " << "\"" << __lt_name__ << "\": no exceptions thown by " << #__lt_operation__; \ + __lt_thrown__ = true; \ + } \ + catch(...) { } \ + if(__lt_thrown__) \ + LT_SWITCH_MODE(__lt_mode__) + +#define LT_NOTHROW_OP(__lt_name__, __lt_operation__, __lt_file__, __lt_line__, __lt_mode__) \ + try \ + { \ + (__lt_operation__) ;\ + } \ + catch(...) \ + { \ + std::stringstream __lt_ss__; \ + __lt_ss__ << "(" << __lt_file__ << ":" << __lt_line__ << ") - error in " << "\"" << __lt_name__ << "\": exceptions thown by " << #__lt_operation__; \ + LT_SWITCH_MODE(__lt_mode__) \ + } + +#define LT_COLLEQ_OP(__lt_name__, __lt_first_begin__, __lt_first_end__, __lt_second_begin__, __lt_file__, __lt_line__, __lt_mode__) \ + if(! std::equal((__lt_first_begin__), (__lt_first_end__), (__lt_second_begin__))) \ + { \ + std::stringstream __lt_ss__; \ + __lt_ss__ << "(" << __lt_file__ << ":" << __lt_line__ << ") - error in " << "\"" << __lt_name__ << "\": collections are different"; \ + LT_SWITCH_MODE(__lt_mode__) \ + } + +#define LT_COLLNEQ_OP(__lt_name__, __lt_first_begin__, __lt_first_end__, __lt_second_begin__, __lt_file__, __lt_line__, __lt_mode__) \ + if(std::equal((__lt_first_begin__), (__lt_first_end__), (__lt_second_begin__))) \ + { \ + std::stringstream __lt_ss__; \ + __lt_ss__ << "(" << __lt_file__ << ":" << __lt_line__ << ") - error in " << "\"" << __lt_name__ << "\": collections are equal"; \ + LT_SWITCH_MODE(__lt_mode__) \ + } + +#define LT_OP(__lt_name__, __lt_a__, __lt_b__, __lt_file__, __lt_line__, __lt_op__, __lt_mode__) \ + if((__lt_a__) __lt_op__ (__lt_b__)) \ + { \ + std::stringstream __lt_ss__; \ + __lt_ss__ << "(" << __lt_file__ << ":" << __lt_line__ << ") - error in " << "\"" << __lt_name__ << "\": " << (__lt_a__) << #__lt_op__ << (__lt_b__); \ + LT_SWITCH_MODE(__lt_mode__) \ + } + +#define LT_CATCH_ERRORS \ + catch(littletest::check_unattended& __lt_cu__) \ + { \ + std::cout << "[CHECK FAILURE] " << __lt_cu__.what() << std::endl; \ + __lt_tr__->add_failure(); \ + } \ + catch(littletest::assert_unattended& __lt_au__) \ + { \ + std::cout << "[ASSERT FAILURE] " << __lt_au__.what() << std::endl; \ + __lt_tr__->add_failure(); \ + throw __lt_au__; \ + } \ + catch(littletest::warn_unattended& __lt_wu__) \ + { \ + std::cout << "[WARN] " << __lt_wu__.what() << std::endl; \ + } + +#define LT_ADD_SUCCESS(__lt_mode__) \ + if(__lt_mode__) \ + __lt_tr__->add_success(); + +#define LT_EV(__lt_a__, __lt_b__, __lt_op__, __lt_mode__) \ + try \ + { \ + LT_OP(__lt_name__, (__lt_a__), (__lt_b__), __FILE__, __LINE__, __lt_op__, __lt_mode__); \ + LT_ADD_SUCCESS(__lt_mode__) \ + } \ + LT_CATCH_ERRORS + +#define LT_SIMPLE_EV(__lt_val__, __lt_mode__) \ + try \ + { \ + LT_SIMPLE_OP(__lt_name__, (__lt_val__), __FILE__, __LINE__, __lt_mode__); \ + LT_ADD_SUCCESS(__lt_mode__) \ + } \ + LT_CATCH_ERRORS + +#define LT_THROW_EV(__lt_operation__, __lt_mode__) \ + try \ + { \ + LT_THROW_OP(__lt_name__, (__lt_operation__), __FILE__, __LINE__, __lt_mode__); \ + LT_ADD_SUCCESS(__lt_mode__) \ + } \ + LT_CATCH_ERRORS + +#define LT_NOTHROW_EV(__lt_operation__, __lt_mode__) \ + try \ + { \ + LT_NOTHROW_OP(__lt_name__, (__lt_operation__), __FILE__, __LINE__, __lt_mode__); \ + LT_ADD_SUCCESS(__lt_mode__) \ + } \ + LT_CATCH_ERRORS + +#define LT_COLLEQ_EV(__lt_first_begin__, __lt_first_end__, __lt_second_begin__, __lt_mode__) \ + try \ + { \ + LT_COLLEQ_OP(__lt_name__, (__lt_first_begin__), (__lt_first_end__), (__lt_second_begin__), __FILE__, __LINE__, __lt_mode__); \ + LT_ADD_SUCCESS(__lt_mode__) \ + } \ + LT_CATCH_ERRORS + +#define LT_COLLNEQ_EV(__lt_first_begin__, __lt_first_end__, __lt_second_begin__, __lt_mode__) \ + try \ + { \ + LT_COLLNEQ_OP(__lt_name__, (__lt_first_begin__), (__lt_first_end__), (__lt_second_begin__), __FILE__, __LINE__, __lt_mode__); \ + LT_ADD_SUCCESS(__lt_mode__) \ + } \ + LT_CATCH_ERRORS + +#define LT_WARN(__lt_val__) LT_SIMPLE_EV((__lt_val__), WARN) +#define LT_WARN_EQ(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), !=, WARN) +#define LT_WARN_NEQ(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), ==, WARN) +#define LT_WARN_GT(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), <=, WARN) +#define LT_WARN_GTE(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), <, WARN) +#define LT_WARN_LT(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), >=, WARN) +#define LT_WARN_LTE(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), >, WARN) +#define LT_WARN_THROW(__lt_operation__) LT_THROW_EV((__lt_operation__), WARN) +#define LT_WARN_NOTHROW(__lt_operation__) LT_NOTHROW_EV((__lt_operation__), WARN) +#define LT_WARN_COLLECTIONS_EQ(__lt_first_begin__, __lt_first_end__, __lt_second_begin__) LT_COLLEQ_EV((__lt_first_begin__), (__lt_first_end__), (__lt_second_begin__), WARN) +#define LT_WARN_COLLECTIONS_NEQ(__lt_first_begin__, __lt_first_end__, __lt_second_begin__) LT_COLLNEQ_EV((__lt_first_begin__), (__lt_first_end__), (__lt_second_begin__), WARN) + +#define LT_CHECK(__lt_val__) LT_SIMPLE_EV((__lt_val__), CHECK) +#define LT_CHECK_EQ(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), !=, CHECK) +#define LT_CHECK_NEQ(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), ==, CHECK) +#define LT_CHECK_GT(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), <=, CHECK) +#define LT_CHECK_GTE(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), <, CHECK) +#define LT_CHECK_LT(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), >=, CHECK) +#define LT_CHECK_LTE(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), >, CHECK) +#define LT_CHECK_THROW(__lt_operation__) LT_THROW_EV((__lt_operation__), CHECK) +#define LT_CHECK_NOTHROW(__lt_operation__) LT_NOTHROW_EV((__lt_operation__), CHECK) +#define LT_CHECK_COLLECTIONS_EQ(__lt_first_begin__, __lt_first_end__, __lt_second_begin__) LT_COLLEQ_EV((__lt_first_begin__), (__lt_first_end__), (__lt_second_begin__), CHECK) +#define LT_CHECK_COLLECTIONS_NEQ(__lt_first_begin__, __lt_first_end__, __lt_second_begin__) LT_COLLNEQ_EV((__lt_first_begin__), (__lt_first_end__), (__lt_second_begin__), CHECK) + +#define LT_ASSERT(__lt_val__) LT_SIMPLE_EV((__lt_val__), ASSERT) +#define LT_ASSERT_EQ(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), !=, ASSERT) +#define LT_ASSERT_NEQ(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), ==, ASSERT) +#define LT_ASSERT_GT(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), <=, ASSERT) +#define LT_ASSERT_GTE(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), <, ASSERT) +#define LT_ASSERT_LT(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), >=, ASSERT) +#define LT_ASSERT_LTE(__lt_a__, __lt_b__) LT_EV((__lt_a__), (__lt_b__), >, ASSERT) +#define LT_ASSERT_THROW(__lt_operation__) LT_THROW_EV((__lt_operation__), ASSERT) +#define LT_ASSERT_NOTHROW(__lt_operation__) LT_NOTHROW_EV((__lt_operation__), ASSERT) +#define LT_ASSERT_COLLECTIONS_EQ(__lt_first_begin__, __lt_first_end__, __lt_second_begin__) LT_COLLEQ_EV((__lt_first_begin__), (__lt_first_end__), (__lt_second_begin__), ASSERT) +#define LT_ASSERT_COLLECTIONS_NEQ(__lt_first_begin__, __lt_first_end__, __lt_second_begin__) LT_COLLNEQ_EV((__lt_first_begin__), (__lt_first_end__), (__lt_second_begin__), ASSERT) + +#define LT_FAIL(__lt_message__) \ + std::cout << "[ASSERT FAILURE] (" << __FILE__ << ":" << __LINE__ << ") - error in " << "\"" << (__lt_name__) << "\": " << (__lt_message__) << std::endl; \ + __lt_tr__->add_failure(); \ + throw littletest::assert_unattended(""); + +namespace littletest +{ + +struct check_unattended : public std::exception +{ + check_unattended(const std::string& message): + message(message) + { + } + ~check_unattended() throw() { } + + virtual const char* what() const throw() + { + return message.c_str(); + } + + private: + std::string message; +}; + +struct assert_unattended : public std::exception +{ + assert_unattended(const std::string& message): + message(message) + { + } + ~assert_unattended() throw() { } + virtual const char* what() const throw() + { + return message.c_str(); + } + + private: + std::string message; +}; + +struct warn_unattended : public std::exception +{ + warn_unattended(const std::string& message): + message(message) + { + } + ~warn_unattended() throw() { } + virtual const char* what() const throw() + { + return message.c_str(); + } + + private: + std::string message; +}; + +template +class suite +{ + public: + void suite_set_up() + { + static_cast(this)->set_up(); + } + + void suite_tear_down() + { + static_cast(this)->tear_down(); + } + + suite() { } + suite(const suite& s) { } +}; + +double calculate_duration(timeval* before, timeval* after) +{ + return ((after->tv_sec * 1000 + (after->tv_usec / 1000.0)) - + (before->tv_sec * 1000 + (before->tv_usec / 1000.0))); +} + +class test_base; + +std::vector auto_test_vector; + +class test_runner +{ + public: + test_runner() : + last_checkpoint_file(""), + last_checkpoint_line(-1), + test_counter(1), + success_counter(0), + failures_counter(0), + good_time_total(0.0), + total_set_up_time(0.0), + total_tear_down_time(0.0), + total_time(0.0) + { + } + + template + test_runner& run(test_impl* t) + { + std::cout << "Running test (" << + test_counter << "): " << + t->__lt_name__ << std::endl; + + t->run_test(this); + + test_counter++; + return *this; + } + + template + test_runner& operator()(test_impl& t) + { + return run(&t); + } + + template + test_runner& operator()(test_impl* t) + { + return run(t); + } + + void clear_runner() + { + last_checkpoint_file = ""; + last_checkpoint_line = -1; + test_counter = 1; + success_counter = 0; + failures_counter = 0; + good_time_total = 0.0, + total_set_up_time = 0.0; + total_tear_down_time = 0.0; + total_time = 0.0; + } + + int operator()() + { + std::cout << "** Runner terminated! **" << std::endl; + std::cout << (test_counter - 1) << " tests executed" << std::endl; + std::cout << (failures_counter + success_counter) << " checks" << std::endl; + std::cout << "-> " << success_counter << " successes" << std::endl; + std::cout << "-> " << failures_counter << " failures" << std::endl; + std::cout << "Total run time: " << total_time << " ms"<< std::endl; + std::cout << "Total time spent in tests: " << good_time_total << " ms" << std::endl; + std::cout << "Average set up time: " << (total_set_up_time / test_counter) << " ms" << std::endl; + std::cout << "Average tear down time: " << (total_tear_down_time / test_counter) << " ms" << std::endl; + int to_ret = failures_counter; + clear_runner(); + return to_ret; + } + + void add_failure() + { + failures_counter++; + } + + void add_success() + { + success_counter++; + } + + void set_checkpoint(const char* file, int line) + { + last_checkpoint_file = file; + last_checkpoint_line = line; + } + + void add_good_time(double t) + { + good_time_total += t; + } + + void add_set_up_time(double t) + { + total_set_up_time += t; + } + + void add_tear_down_time(double t) + { + total_tear_down_time += t; + } + + void add_total_time(double t) + { + total_time += t; + } + + operator int() + { + return failures_counter; + } + + int get_test_number() + { + return test_counter; + } + + int get_successes() + { + return success_counter; + } + + int get_failures() + { + return failures_counter; + } + + double get_test_time() + { + return good_time_total; + } + + double get_total_time() + { + return total_time; + } + + std::string last_checkpoint_file; + int last_checkpoint_line; + + private: + int test_counter; + int success_counter; + int failures_counter; + double good_time_total; + double total_set_up_time; + double total_tear_down_time; + double total_time; +}; + +class test_base +{ + public: + const char* __lt_name__; + virtual void run_test(test_runner* tr) { } + virtual void operator()() { } +}; + +test_runner auto_test_runner; + +template +class test : public test_base +{ + virtual void run_test(test_runner* tr) + { + double set_up_duration = 0.0, tear_down_duration = 0.0, test_duration = 0.0; + timeval before, after; + try + { + gettimeofday(&before, NULL); + static_cast(this)->suite_set_up(); + gettimeofday(&after, NULL); + set_up_duration = calculate_duration(&before, &after); + tr->add_set_up_time(set_up_duration); + } + catch(std::exception& e) + { + std::cout << "Exception during " << static_cast(this)->__lt_name__ << " set up" << std::endl; + std::cout << e.what() << std::endl; + } + catch(...) + { + std::cout << "Exception during " << static_cast(this)->__lt_name__ << " set up" << std::endl; + } + try + { + gettimeofday(&before, NULL); + (*static_cast(this))(tr); + } + catch(assert_unattended& au) + { + ; + } + catch(std::exception& e) + { + std::cout << "Exception during " << static_cast(this)->__lt_name__ << " run" << std::endl; + std::cout << e.what() << std::endl; + if(tr->last_checkpoint_line != -1) + std::cout << "Last checkpoint in " << tr->last_checkpoint_file << ":" << tr->last_checkpoint_line << std::endl; + } + catch(...) + { + std::cout << "Exception during " << static_cast(this)->__lt_name__ << " run" << std::endl; + if(tr->last_checkpoint_line != -1) + std::cout << "Last checkpoint in " << tr->last_checkpoint_file << ":" << tr->last_checkpoint_line << std::endl; + } + gettimeofday(&after, NULL); + + test_duration = calculate_duration(&before, &after); + + tr->add_good_time(test_duration); + + std::cout << "- Time spent during \"" << static_cast(this)->__lt_name__ << "\": " << test_duration << " ms"<< std::endl; + + try + { + gettimeofday(&before, NULL); + static_cast(this)->suite_tear_down(); + gettimeofday(&after, NULL); + tear_down_duration = calculate_duration(&before, &after); + tr->add_tear_down_time(tear_down_duration); + } + catch(std::exception& e) + { + std::cout << "Exception during " << static_cast(this)->__lt_name__ << " tear down" << std::endl; + std::cout << e.what() << std::endl; + } + catch(...) + { + std::cout << "Exception during " << static_cast(this)->__lt_name__ << " tear down" << std::endl; + } + double total = set_up_duration + test_duration + tear_down_duration; + tr->add_total_time(total); + } + protected: + test() { } + test(const test& t) { } + + friend class test_runner; +}; + +}; + +#endif //_LITTLETEST_HPP_ diff --git a/3rd_party/libhttpserver-0.18.2/test/test_content b/3rd_party/libhttpserver-0.18.2/test/test_content new file mode 100644 index 00000000..5f643138 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/test_content @@ -0,0 +1 @@ +test content of file diff --git a/3rd_party/libhttpserver-0.18.2/test/test_root_ca.pem b/3rd_party/libhttpserver-0.18.2/test/test_root_ca.pem new file mode 100644 index 00000000..998460f1 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/test_root_ca.pem @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- diff --git a/3rd_party/libhttpserver-0.18.2/test/unit/http_endpoint_test.cpp b/3rd_party/libhttpserver-0.18.2/test/unit/http_endpoint_test.cpp new file mode 100644 index 00000000..677b0fa4 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/unit/http_endpoint_test.cpp @@ -0,0 +1,353 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/details/http_endpoint.hpp" + +#include "littletest.hpp" + +using namespace httpserver; +using namespace std; +using namespace details; + +LT_BEGIN_SUITE(http_endpoint_suite) + void set_up() + { + } + + void tear_down() + { + } +LT_END_SUITE(http_endpoint_suite) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_default) + http_endpoint test_endpoint; + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "/"); + + LT_CHECK_EQ(test_endpoint.get_url_pars().size(), 0); + LT_CHECK_EQ(test_endpoint.get_url_pieces().size(), 0); + LT_CHECK_EQ(test_endpoint.get_chunk_positions().size(), 0); + + LT_CHECK_EQ(test_endpoint.is_family_url(), false); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), false); +LT_END_AUTO_TEST(http_endpoint_default) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_from_string_registration) + http_endpoint test_endpoint("/path/to/resource", false, true, true); + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/path/to/resource"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "^/path/to/resource$"); + + LT_CHECK_EQ(test_endpoint.get_url_pars().size(), 0); + + string expected_arr[] = { "path", "to", "resource" }; + vector expected_pieces(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pieces().begin(), test_endpoint.get_url_pieces().end(), expected_pieces.begin()); + + LT_CHECK_EQ(test_endpoint.get_chunk_positions().size(), 0); + + LT_CHECK_EQ(test_endpoint.is_family_url(), false); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), true); +LT_END_AUTO_TEST(http_endpoint_from_string_registration) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_from_string_not_beginning_with_slash) + http_endpoint test_endpoint("path/to/resource", false, true, true); + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/path/to/resource"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "^/path/to/resource$"); + + LT_CHECK_EQ(test_endpoint.get_url_pars().size(), 0); + + string expected_arr[] = { "path", "to", "resource" }; + vector expected_pieces(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pieces().begin(), test_endpoint.get_url_pieces().end(), expected_pieces.begin()); + + LT_CHECK_EQ(test_endpoint.get_chunk_positions().size(), 0); + + LT_CHECK_EQ(test_endpoint.is_family_url(), false); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), true); +LT_END_AUTO_TEST(http_endpoint_from_string_not_beginning_with_slash) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_from_string_ending_with_slash) + http_endpoint test_endpoint("path/to/resource/", false, true, true); + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/path/to/resource"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "^/path/to/resource$"); + + LT_CHECK_EQ(test_endpoint.get_url_pars().size(), 0); + + string expected_arr[] = { "path", "to", "resource" }; + vector expected_pieces(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pieces().begin(), test_endpoint.get_url_pieces().end(), expected_pieces.begin()); + + LT_CHECK_EQ(test_endpoint.get_chunk_positions().size(), 0); + + LT_CHECK_EQ(test_endpoint.is_family_url(), false); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), true); +LT_END_AUTO_TEST(http_endpoint_from_string_ending_with_slash) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_from_string_family) + http_endpoint test_endpoint("/path/to/resource", true, true, true); + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/path/to/resource"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "^/path/to/resource$"); + + LT_CHECK_EQ(test_endpoint.get_url_pars().size(), 0); + + string expected_arr[] = { "path", "to", "resource" }; + vector expected_pieces(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pieces().begin(), test_endpoint.get_url_pieces().end(), expected_pieces.begin()); + + LT_CHECK_EQ(test_endpoint.get_chunk_positions().size(), 0); + + LT_CHECK_EQ(test_endpoint.is_family_url(), true); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), true); +LT_END_AUTO_TEST(http_endpoint_from_string_family) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_default_no_regex) + http_endpoint test_endpoint("/path/to/resource"); + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/path/to/resource"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "/path/to/resource"); + + LT_CHECK_EQ(test_endpoint.get_url_pars().size(), 0); + + string expected_arr[] = { "path", "to", "resource" }; + vector expected_pieces(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pieces().begin(), test_endpoint.get_url_pieces().end(), expected_pieces.begin()); + + LT_CHECK_EQ(test_endpoint.get_chunk_positions().size(), 0); + + LT_CHECK_EQ(test_endpoint.is_family_url(), false); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), false); +LT_END_AUTO_TEST(http_endpoint_default_no_regex) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_from_string_no_regex) + http_endpoint test_endpoint("/path/to/resource", false, false, false); + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/path/to/resource"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "/path/to/resource"); + + LT_CHECK_EQ(test_endpoint.get_url_pars().size(), 0); + + string expected_arr[] = { "path", "to", "resource" }; + vector expected_pieces(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pieces().begin(), test_endpoint.get_url_pieces().end(), expected_pieces.begin()); + + LT_CHECK_EQ(test_endpoint.get_chunk_positions().size(), 0); + + LT_CHECK_EQ(test_endpoint.is_family_url(), false); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), false); +LT_END_AUTO_TEST(http_endpoint_from_string_no_regex) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_registration) + http_endpoint test_endpoint("/path/to/resource", false, true, true); + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/path/to/resource"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "^/path/to/resource$"); + + LT_CHECK_EQ(test_endpoint.get_url_pars().size(), 0); + + string expected_arr[] = { "path", "to", "resource" }; + vector expected_pieces(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pieces().begin(), test_endpoint.get_url_pieces().end(), expected_pieces.begin()); + + LT_CHECK_EQ(test_endpoint.get_chunk_positions().size(), 0); + + LT_CHECK_EQ(test_endpoint.is_family_url(), false); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), true); +LT_END_AUTO_TEST(http_endpoint_registration) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_registration_nested_regex) + http_endpoint test_endpoint("/path/to/resource/with/[0-9]+/to/fetch", false, true, true); + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/path/to/resource/with/[0-9]+/to/fetch"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "^/path/to/resource/with/[0-9]+/to/fetch$"); + + LT_CHECK_EQ(test_endpoint.get_url_pars().size(), 0); + + string expected_arr[] = { "path", "to", "resource", "with", "[0-9]+", "to", "fetch" }; + vector expected_pieces(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pieces().begin(), test_endpoint.get_url_pieces().end(), expected_pieces.begin()); + + LT_CHECK_EQ(test_endpoint.get_chunk_positions().size(), 0); + + LT_CHECK_EQ(test_endpoint.is_family_url(), false); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), true); +LT_END_AUTO_TEST(http_endpoint_registration_nested_regex) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_registration_arg) + http_endpoint test_endpoint("/path/to/resource/with/{arg}/to/fetch", false, true, true); + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/path/to/resource/with/{arg}/to/fetch"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "^/path/to/resource/with/([^\\/]+)/to/fetch$"); + + string expected_pars_arr[] = { "arg" }; + vector expected_pars(expected_pars_arr, expected_pars_arr + sizeof(expected_pars_arr) / sizeof(expected_pars_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pars().begin(), test_endpoint.get_url_pars().end(), expected_pars.begin()); + + string expected_arr[] = { "path", "to", "resource", "with", "{arg}", "to", "fetch" }; + vector expected_pieces(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pieces().begin(), test_endpoint.get_url_pieces().end(), expected_pieces.begin()); + + int expected_chunk_positions_arr[] = { 4 }; + vector expected_chunk_positions(expected_chunk_positions_arr, expected_chunk_positions_arr + sizeof(expected_chunk_positions_arr) / sizeof(expected_chunk_positions_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_chunk_positions().begin(), test_endpoint.get_chunk_positions().end(), expected_chunk_positions.begin()); + + LT_CHECK_EQ(test_endpoint.is_family_url(), false); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), true); +LT_END_AUTO_TEST(http_endpoint_registration_arg) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_registration_arg_custom_regex) + http_endpoint test_endpoint("/path/to/resource/with/{arg|([0-9]+)}/to/fetch", false, true, true); + + LT_CHECK_EQ(test_endpoint.get_url_complete(), "/path/to/resource/with/{arg|([0-9]+)}/to/fetch"); + LT_CHECK_EQ(test_endpoint.get_url_normalized(), "^/path/to/resource/with/([0-9]+)/to/fetch$"); + + string expected_pars_arr[] = { "arg" }; + vector expected_pars(expected_pars_arr, expected_pars_arr + sizeof(expected_pars_arr) / sizeof(expected_pars_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pars().begin(), test_endpoint.get_url_pars().end(), expected_pars.begin()); + + string expected_arr[] = { "path", "to", "resource", "with", "{arg|([0-9]+)}", "to", "fetch" }; + vector expected_pieces(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_url_pieces().begin(), test_endpoint.get_url_pieces().end(), expected_pieces.begin()); + + int expected_chunk_positions_arr[] = { 4 }; + vector expected_chunk_positions(expected_chunk_positions_arr, expected_chunk_positions_arr + sizeof(expected_chunk_positions_arr) / sizeof(expected_chunk_positions_arr[0])); + LT_CHECK_COLLECTIONS_EQ(test_endpoint.get_chunk_positions().begin(), test_endpoint.get_chunk_positions().end(), expected_chunk_positions.begin()); + + LT_CHECK_EQ(test_endpoint.is_family_url(), false); + LT_CHECK_EQ(test_endpoint.is_regex_compiled(), true); +LT_END_AUTO_TEST(http_endpoint_registration_arg_custom_regex) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_registration_invalid_arg) + LT_CHECK_THROW(http_endpoint("/path/to/resource/with/{}/to/fetch", false, true)); +LT_END_AUTO_TEST(http_endpoint_registration_invalid_arg) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_copy_constructor) + http_endpoint a("/path/to/resource/with/{arg|([0-9]+)}/to/fetch", false, true, true); + http_endpoint b(a); + + LT_CHECK_EQ(a.get_url_complete(), b.get_url_complete()); + LT_CHECK_EQ(a.get_url_normalized(), b.get_url_normalized()); + LT_CHECK_COLLECTIONS_EQ(a.get_url_pars().begin(), a.get_url_pars().end(), b.get_url_pars().begin()); + LT_CHECK_COLLECTIONS_EQ(a.get_url_pieces().begin(), a.get_url_pieces().end(), b.get_url_pieces().begin()); + LT_CHECK_COLLECTIONS_EQ(a.get_chunk_positions().begin(), a.get_chunk_positions().end(), b.get_chunk_positions().begin()); + LT_CHECK_EQ(a.is_family_url(), b.is_family_url()); + LT_CHECK_EQ(a.is_regex_compiled(), b.is_regex_compiled()); + + LT_CHECK_EQ(a.match(http_endpoint("/path/to/resource/with/10/to/fetch")), true); + LT_CHECK_EQ(b.match(http_endpoint("/path/to/resource/with/10/to/fetch")), true); +LT_END_AUTO_TEST(http_endpoint_copy_constructor) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_assignment) + http_endpoint a("/path/to/resource/with/{arg|([0-9]+)}/to/fetch", false, true, true); + http_endpoint b("whatever/initial/value"); + + LT_CHECK_NEQ(a.get_url_complete(), b.get_url_complete()); + + std::cout << "before assigning" << std::endl; + b = a; + std::cout << "after assigning" << std::endl; + + LT_CHECK_EQ(a.get_url_complete(), b.get_url_complete()); + LT_CHECK_EQ(a.get_url_normalized(), b.get_url_normalized()); + LT_CHECK_COLLECTIONS_EQ(a.get_url_pars().begin(), a.get_url_pars().end(), b.get_url_pars().begin()); + LT_CHECK_COLLECTIONS_EQ(a.get_url_pieces().begin(), a.get_url_pieces().end(), b.get_url_pieces().begin()); + LT_CHECK_COLLECTIONS_EQ(a.get_chunk_positions().begin(), a.get_chunk_positions().end(), b.get_chunk_positions().begin()); + LT_CHECK_EQ(a.is_family_url(), b.is_family_url()); + LT_CHECK_EQ(a.is_regex_compiled(), b.is_regex_compiled()); + + LT_CHECK_EQ(a.match(http_endpoint("/path/to/resource/with/10/to/fetch")), true); + LT_CHECK_EQ(b.match(http_endpoint("/path/to/resource/with/10/to/fetch")), true); +LT_END_AUTO_TEST(http_endpoint_assignment) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_match_regex) + http_endpoint test_endpoint("/path/to/resource/", false, true, true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to2/resource")), false); +LT_END_AUTO_TEST(http_endpoint_match_regex) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_match_regex_nested) + http_endpoint test_endpoint("/path/to/resource/with/[0-9]+/to/fetch", false, true, true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/0/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/10/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("path/to/resource/with/1/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/1/to/fetch/")), true); +LT_END_AUTO_TEST(http_endpoint_match_regex_nested) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_match_regex_nested_capture) + http_endpoint test_endpoint("/path/to/resource/with/([0-9]+)/to/fetch", false, true, true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/0/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/10/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("path/to/resource/with/1/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/1/to/fetch/")), true); +LT_END_AUTO_TEST(http_endpoint_match_regex_nested_capture) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_match_regex_nested_arg) + http_endpoint test_endpoint("/path/to/resource/with/{arg}/to/fetch", false, true, true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/0/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/10/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("path/to/resource/with/1/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/1/to/fetch/")), true); +LT_END_AUTO_TEST(http_endpoint_match_regex_nested_arg) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_match_regex_nested_custom_arg) + http_endpoint test_endpoint("/path/to/resource/with/{arg|([0-9]+)}/to/fetch", false, true, true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/0/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/10/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("path/to/resource/with/1/to/fetch")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/with/1/to/fetch/")), true); +LT_END_AUTO_TEST(http_endpoint_match_regex_nested_custom_arg) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_match_regex_family) + http_endpoint test_endpoint("/path/to/resource", true, true, true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("path/to/resource")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("path/to/resource/")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource")), true); + LT_CHECK_EQ(test_endpoint.match(http_endpoint("/path/to/resource/followed/by/anything")), true); + + LT_CHECK_EQ(test_endpoint.match(http_endpoint("path/to2/resource")), false); +LT_END_AUTO_TEST(http_endpoint_match_regex_family) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_match_regex_disabled) + http_endpoint test_endpoint("/path/to/resource", false, true, false); + LT_CHECK_THROW(test_endpoint.match(http_endpoint("/path/to/resource"))); +LT_END_AUTO_TEST(http_endpoint_match_regex_disabled) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, http_endpoint_cannot_use_regex_if_not_registering) + LT_CHECK_THROW(http_endpoint("/path/to/resource", false, false, true)); +LT_END_AUTO_TEST(http_endpoint_cannot_use_regex_if_not_registering) + +LT_BEGIN_AUTO_TEST(http_endpoint_suite, comparator) + LT_CHECK_EQ(http_endpoint("/a/b") < http_endpoint("/a/c"), true); + LT_CHECK_EQ(http_endpoint("/a/c") < http_endpoint("/a/b"), false); + + LT_CHECK_EQ(http_endpoint("/a/b") < http_endpoint("/a/b/c"), true); + LT_CHECK_EQ(http_endpoint("/a/b/c") < http_endpoint("/a/b"), false); +LT_END_AUTO_TEST(comparator) + +LT_BEGIN_AUTO_TEST_ENV() + AUTORUN_TESTS() +LT_END_AUTO_TEST_ENV() diff --git a/3rd_party/libhttpserver-0.18.2/test/unit/http_utils_test.cpp b/3rd_party/libhttpserver-0.18.2/test/unit/http_utils_test.cpp new file mode 100644 index 00000000..6ef9cb99 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/unit/http_utils_test.cpp @@ -0,0 +1,608 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/http_utils.hpp" + +#if defined(_WIN32) && ! defined(__CYGWIN__) +#define _WINDOWS +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x600 +#include +#include +#else +#include +#endif + +#include + +#include "littletest.hpp" + +using namespace httpserver; +using namespace std; + +LT_BEGIN_SUITE(http_utils_suite) + void set_up() + { + } + + void tear_down() + { + } +LT_END_SUITE(http_utils_suite) + +LT_BEGIN_AUTO_TEST(http_utils_suite, unescape) + char* with_plus = (char*) malloc(6 * sizeof(char)); + sprintf(with_plus, "%s", "A%20B"); + std::string string_with_plus = with_plus; + int expected_size = http::http_unescape(string_with_plus); + + char* expected = (char*) malloc(4 * sizeof(char)); + sprintf(expected, "%s", "A B"); + + std::cout << "|||||" << string_with_plus << "||||" << std::endl; + std::cout << expected << std::endl; + + LT_CHECK_EQ(string_with_plus, string(expected)); + LT_CHECK_EQ(expected_size, 3); + + free(with_plus); + free(expected); +LT_END_AUTO_TEST(unescape) + +LT_BEGIN_AUTO_TEST(http_utils_suite, unescape_plus) + char* with_plus = (char*) malloc(6 * sizeof(char)); + sprintf(with_plus, "%s", "A+B"); + std::string string_with_plus = with_plus; + int expected_size = http::http_unescape(string_with_plus); + + char* expected = (char*) malloc(4 * sizeof(char)); + sprintf(expected, "%s", "A B"); + + LT_CHECK_EQ(string_with_plus, string(expected)); + LT_CHECK_EQ(expected_size, 3); + + free(with_plus); + free(expected); +LT_END_AUTO_TEST(unescape_plus) + +LT_BEGIN_AUTO_TEST(http_utils_suite, tokenize_url) + string value = "test/this/url/here"; + string expected_arr[] = { "test", "this", "url", "here" }; + vector expected(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + vector actual = http::http_utils::tokenize_url(value, '/'); + + LT_CHECK_COLLECTIONS_EQ(expected.begin(), expected.end(), actual.begin()); +LT_END_AUTO_TEST(tokenize_url) + +LT_BEGIN_AUTO_TEST(http_utils_suite, tokenize_url_multiple_spaces) + string value = "test//this//url//here"; + string expected_arr[] = { "test", "this", "url", "here" }; + vector expected(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + vector actual = http::http_utils::tokenize_url(value, '/'); + + LT_CHECK_COLLECTIONS_EQ(expected.begin(), expected.end(), actual.begin()); +LT_END_AUTO_TEST(tokenize_url_multiple_spaces) + +LT_BEGIN_AUTO_TEST(http_utils_suite, tokenize_url_end_slash) + string value = "test/this/url/here/"; + string expected_arr[] = { "test", "this", "url", "here" }; + vector expected(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + vector actual = http::http_utils::tokenize_url(value, '/'); + + LT_CHECK_COLLECTIONS_EQ(expected.begin(), expected.end(), actual.begin()); +LT_END_AUTO_TEST(tokenize_url_end_slash) + +LT_BEGIN_AUTO_TEST(http_utils_suite, standardize_url) + string url = "/", result; + result = http::http_utils::standardize_url(url); + LT_CHECK_EQ(result, "/"); + + url = "/abc/", result = ""; + result = http::http_utils::standardize_url(url); + LT_CHECK_EQ(result, "/abc"); + + url = "/abc", result = ""; + result = http::http_utils::standardize_url(url); + LT_CHECK_EQ(result, "/abc"); + + url = "/abc/pqr/", result = ""; + result = http::http_utils::standardize_url(url); + LT_CHECK_EQ(result, "/abc/pqr"); + + url = "/abc/pqr", result = ""; + result = http::http_utils::standardize_url(url); + LT_CHECK_EQ(result, "/abc/pqr"); + + url = "/abc//pqr", result = ""; + result = http::http_utils::standardize_url(url); + LT_CHECK_EQ(result, "/abc/pqr"); +LT_END_AUTO_TEST(standardize_url) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str) + struct sockaddr_in ip4addr; + + ip4addr.sin_family = AF_INET; + ip4addr.sin_port = htons(3490); + ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1"); + + string result = http::get_ip_str((struct sockaddr*) &ip4addr); + unsigned short port = http::get_port((struct sockaddr*) &ip4addr); + + LT_CHECK_EQ(result, "127.0.0.1"); + LT_CHECK_EQ(port, htons(3490)); +LT_END_AUTO_TEST(ip_to_str) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str6) + struct sockaddr_in6 ip6addr; + + ip6addr.sin6_family = AF_INET6; + ip6addr.sin6_port = htons(3490); + inet_pton(AF_INET6, "2001:db8:8714:3a90::12", &(ip6addr.sin6_addr)); + + string result = http::get_ip_str((struct sockaddr *) &ip6addr); + unsigned short port = http::get_port((struct sockaddr*) &ip6addr); + + LT_CHECK_EQ(result, "2001:db8:8714:3a90::12"); + LT_CHECK_EQ(port, htons(3490)); +LT_END_AUTO_TEST(ip_to_str6) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str_invalid_family) + struct sockaddr_in ip4addr; + + ip4addr.sin_family = 55; + ip4addr.sin_port = htons(3490); + ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1"); + + LT_CHECK_THROW(http::get_ip_str((struct sockaddr*) &ip4addr)); +LT_END_AUTO_TEST(ip_to_str_invalid_family) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str_null) + LT_CHECK_THROW(http::get_ip_str((struct sockaddr*) 0x0)); +LT_END_AUTO_TEST(ip_to_str_null) + +LT_BEGIN_AUTO_TEST(http_utils_suite, get_port_invalid_family) + struct sockaddr_in ip4addr; + + ip4addr.sin_family = 55; + ip4addr.sin_port = htons(3490); + ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1"); + + LT_CHECK_THROW(http::get_port((struct sockaddr*) &ip4addr)); +LT_END_AUTO_TEST(get_port_invalid_family) + +LT_BEGIN_AUTO_TEST(http_utils_suite, get_port_null) + LT_CHECK_THROW(http::get_port((struct sockaddr*) 0x0)); +LT_END_AUTO_TEST(get_port_null) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation4_str) + http::ip_representation test_ip("192.168.5.5"); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV4); + + for (int i = 0; i < 12; i++) { + LT_CHECK_EQ(test_ip.pieces[i], 0); + } + + LT_CHECK_EQ(test_ip.pieces[12], 192); + LT_CHECK_EQ(test_ip.pieces[13], 168); + LT_CHECK_EQ(test_ip.pieces[14], 5); + LT_CHECK_EQ(test_ip.pieces[15], 5); + + LT_CHECK_EQ(test_ip.mask, 0xFFFF); +LT_END_AUTO_TEST(ip_representation4_str) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation4_str_mask) + http::ip_representation test_ip("192.168.*.*"); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV4); + + for (int i = 0; i < 12; i++) { + LT_CHECK_EQ(test_ip.pieces[i], 0); + } + + LT_CHECK_EQ(test_ip.pieces[12], 192); + LT_CHECK_EQ(test_ip.pieces[13], 168); + LT_CHECK_EQ(test_ip.pieces[14], 0); + LT_CHECK_EQ(test_ip.pieces[15], 0); + + LT_CHECK_EQ(test_ip.mask, 0x3FFF); +LT_END_AUTO_TEST(ip_representation4_str_mask) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation4_str_invalid) + LT_CHECK_THROW(http::ip_representation("192.168.5.5.5")); +LT_END_AUTO_TEST(ip_representation4_str_invalid) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation4_str_beyond255) + LT_CHECK_THROW(http::ip_representation("192.168.256.5")); +LT_END_AUTO_TEST(ip_representation4_str_beyond255) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str) + http::ip_representation test_ip("2001:db8:8714:3a90::12"); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV6); + + LT_CHECK_EQ(test_ip.pieces[0], 32); + LT_CHECK_EQ(test_ip.pieces[1], 1); + LT_CHECK_EQ(test_ip.pieces[2], 13); + LT_CHECK_EQ(test_ip.pieces[3], 184); + LT_CHECK_EQ(test_ip.pieces[4], 135); + LT_CHECK_EQ(test_ip.pieces[5], 20); + LT_CHECK_EQ(test_ip.pieces[6], 58); + LT_CHECK_EQ(test_ip.pieces[7], 144); + LT_CHECK_EQ(test_ip.pieces[8], 0); + LT_CHECK_EQ(test_ip.pieces[9], 0); + LT_CHECK_EQ(test_ip.pieces[10], 0); + LT_CHECK_EQ(test_ip.pieces[11], 0); + LT_CHECK_EQ(test_ip.pieces[12], 0); + LT_CHECK_EQ(test_ip.pieces[13], 0); + LT_CHECK_EQ(test_ip.pieces[14], 0); + LT_CHECK_EQ(test_ip.pieces[15], 18); + + LT_CHECK_EQ(test_ip.mask, 0xFFFF); +LT_END_AUTO_TEST(ip_representation6_str) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_mask) + http::ip_representation test_ip("2001:db8:8714:3a90:*:*"); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV6); + + LT_CHECK_EQ(test_ip.pieces[0], 32); + LT_CHECK_EQ(test_ip.pieces[1], 1); + LT_CHECK_EQ(test_ip.pieces[2], 13); + LT_CHECK_EQ(test_ip.pieces[3], 184); + LT_CHECK_EQ(test_ip.pieces[4], 135); + LT_CHECK_EQ(test_ip.pieces[5], 20); + LT_CHECK_EQ(test_ip.pieces[6], 58); + LT_CHECK_EQ(test_ip.pieces[7], 144); + LT_CHECK_EQ(test_ip.pieces[8], 0); + LT_CHECK_EQ(test_ip.pieces[9], 0); + LT_CHECK_EQ(test_ip.pieces[10], 0); + LT_CHECK_EQ(test_ip.pieces[11], 0); + LT_CHECK_EQ(test_ip.pieces[12], 0); + LT_CHECK_EQ(test_ip.pieces[13], 0); + LT_CHECK_EQ(test_ip.pieces[14], 0); + LT_CHECK_EQ(test_ip.pieces[15], 0); + + LT_CHECK_EQ(test_ip.mask, 0xF0FF); +LT_END_AUTO_TEST(ip_representation6_str_mask) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_nested) + http::ip_representation test_ip("::ffff:192.0.2.128"); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV6); + + LT_CHECK_EQ(test_ip.pieces[0], 0); + LT_CHECK_EQ(test_ip.pieces[1], 0); + LT_CHECK_EQ(test_ip.pieces[2], 0); + LT_CHECK_EQ(test_ip.pieces[3], 0); + LT_CHECK_EQ(test_ip.pieces[4], 0); + LT_CHECK_EQ(test_ip.pieces[5], 0); + LT_CHECK_EQ(test_ip.pieces[6], 0); + LT_CHECK_EQ(test_ip.pieces[7], 0); + LT_CHECK_EQ(test_ip.pieces[8], 0); + LT_CHECK_EQ(test_ip.pieces[9], 0); + LT_CHECK_EQ(test_ip.pieces[10], 255); + LT_CHECK_EQ(test_ip.pieces[11], 255); + LT_CHECK_EQ(test_ip.pieces[12], 192); + LT_CHECK_EQ(test_ip.pieces[13], 0); + LT_CHECK_EQ(test_ip.pieces[14], 2); + LT_CHECK_EQ(test_ip.pieces[15], 128); + + LT_CHECK_EQ(test_ip.mask, 0xFFFF); +LT_END_AUTO_TEST(ip_representation6_str_nested) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_nested_deprecated) + LT_CHECK_NOTHROW(http::ip_representation("::192.0.2.128")); + http::ip_representation test_ip("::192.0.2.128"); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV6); + + LT_CHECK_EQ(test_ip.pieces[0], 0); + LT_CHECK_EQ(test_ip.pieces[1], 0); + LT_CHECK_EQ(test_ip.pieces[2], 0); + LT_CHECK_EQ(test_ip.pieces[3], 0); + LT_CHECK_EQ(test_ip.pieces[4], 0); + LT_CHECK_EQ(test_ip.pieces[5], 0); + LT_CHECK_EQ(test_ip.pieces[6], 0); + LT_CHECK_EQ(test_ip.pieces[7], 0); + LT_CHECK_EQ(test_ip.pieces[8], 0); + LT_CHECK_EQ(test_ip.pieces[9], 0); + LT_CHECK_EQ(test_ip.pieces[10], 0); + LT_CHECK_EQ(test_ip.pieces[11], 0); + LT_CHECK_EQ(test_ip.pieces[12], 192); + LT_CHECK_EQ(test_ip.pieces[13], 0); + LT_CHECK_EQ(test_ip.pieces[14], 2); + LT_CHECK_EQ(test_ip.pieces[15], 128); + + LT_CHECK_EQ(test_ip.mask, 0xFFFF); +LT_END_AUTO_TEST(ip_representation6_str_nested_deprecated) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_ipv4_mask) + http::ip_representation test_ip("::ffff:192.0.*.*"); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV6); + + LT_CHECK_EQ(test_ip.pieces[0], 0); + LT_CHECK_EQ(test_ip.pieces[1], 0); + LT_CHECK_EQ(test_ip.pieces[2], 0); + LT_CHECK_EQ(test_ip.pieces[3], 0); + LT_CHECK_EQ(test_ip.pieces[4], 0); + LT_CHECK_EQ(test_ip.pieces[5], 0); + LT_CHECK_EQ(test_ip.pieces[6], 0); + LT_CHECK_EQ(test_ip.pieces[7], 0); + LT_CHECK_EQ(test_ip.pieces[8], 0); + LT_CHECK_EQ(test_ip.pieces[9], 0); + LT_CHECK_EQ(test_ip.pieces[10], 255); + LT_CHECK_EQ(test_ip.pieces[11], 255); + LT_CHECK_EQ(test_ip.pieces[12], 192); + LT_CHECK_EQ(test_ip.pieces[13], 0); + LT_CHECK_EQ(test_ip.pieces[14], 0); + LT_CHECK_EQ(test_ip.pieces[15], 0); + + LT_CHECK_EQ(test_ip.mask, 0x3FFF); +LT_END_AUTO_TEST(ip_representation6_str_ipv4_mask) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_clustered_middle) + http::ip_representation test_ip("2001:db8::ff00:42:8329"); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV6); + + LT_CHECK_EQ(test_ip.pieces[0], 32); + LT_CHECK_EQ(test_ip.pieces[1], 1); + LT_CHECK_EQ(test_ip.pieces[2], 13); + LT_CHECK_EQ(test_ip.pieces[3], 184); + LT_CHECK_EQ(test_ip.pieces[4], 0); + LT_CHECK_EQ(test_ip.pieces[5], 0); + LT_CHECK_EQ(test_ip.pieces[6], 0); + LT_CHECK_EQ(test_ip.pieces[7], 0); + LT_CHECK_EQ(test_ip.pieces[8], 0); + LT_CHECK_EQ(test_ip.pieces[9], 0); + LT_CHECK_EQ(test_ip.pieces[10], 255); + LT_CHECK_EQ(test_ip.pieces[11], 0); + LT_CHECK_EQ(test_ip.pieces[12], 0); + LT_CHECK_EQ(test_ip.pieces[13], 66); + LT_CHECK_EQ(test_ip.pieces[14], 131); + LT_CHECK_EQ(test_ip.pieces[15], 41); + + LT_CHECK_EQ(test_ip.mask, 0xFFFF); +LT_END_AUTO_TEST(ip_representation6_str_clustered_middle) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_loopback) + http::ip_representation test_ip("::1"); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV6); + + LT_CHECK_EQ(test_ip.pieces[0], 0); + LT_CHECK_EQ(test_ip.pieces[1], 0); + LT_CHECK_EQ(test_ip.pieces[2], 0); + LT_CHECK_EQ(test_ip.pieces[3], 0); + LT_CHECK_EQ(test_ip.pieces[4], 0); + LT_CHECK_EQ(test_ip.pieces[5], 0); + LT_CHECK_EQ(test_ip.pieces[6], 0); + LT_CHECK_EQ(test_ip.pieces[7], 0); + LT_CHECK_EQ(test_ip.pieces[8], 0); + LT_CHECK_EQ(test_ip.pieces[9], 0); + LT_CHECK_EQ(test_ip.pieces[10], 0); + LT_CHECK_EQ(test_ip.pieces[11], 0); + LT_CHECK_EQ(test_ip.pieces[12], 0); + LT_CHECK_EQ(test_ip.pieces[13], 0); + LT_CHECK_EQ(test_ip.pieces[14], 0); + LT_CHECK_EQ(test_ip.pieces[15], 1); + + LT_CHECK_EQ(test_ip.mask, 0xFFFF); +LT_END_AUTO_TEST(ip_representation6_str_loopback) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation_weight) + LT_CHECK_EQ(http::ip_representation("::1").weight(), 16); + LT_CHECK_EQ(http::ip_representation("192.168.0.1").weight(), 16); + LT_CHECK_EQ(http::ip_representation("192.168.*.*").weight(), 14); + LT_CHECK_EQ(http::ip_representation("::ffff:192.0.*.*").weight(), 14); + LT_CHECK_EQ(http::ip_representation("2001:db8:8714:3a90:*:*").weight(), 12); + LT_CHECK_EQ(http::ip_representation("2001:db8:8714:3a90:8714:2001:db8:3a90").weight(), 16); + LT_CHECK_EQ(http::ip_representation("2001:db8:8714:3a90:8714:2001:*:*").weight(), 12); + LT_CHECK_EQ(http::ip_representation("*:*:*:*:*:*:*:*").weight(), 0); +LT_END_AUTO_TEST(ip_representation_weight) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid) + LT_CHECK_THROW(http::ip_representation("2001:db8:8714:3a90::12:4:4:4")); +LT_END_AUTO_TEST(ip_representation6_str_invalid) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_block_too_long) + LT_CHECK_THROW(http::ip_representation("2001:db8:87214:3a90::12:4:4")); +LT_END_AUTO_TEST(ip_representation6_str_block_too_long) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_multiple_clusters) + LT_CHECK_THROW(http::ip_representation("2001::3a90::12:4:4")); +LT_END_AUTO_TEST(ip_representation6_str_invalid_multiple_clusters) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_too_long_before_nested) + LT_CHECK_THROW(http::ip_representation("2001:db8:8714:3a90:13:12:13:192.0.2.128")); +LT_END_AUTO_TEST(ip_representation6_str_invalid_too_long_before_nested) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_nested_beyond255) + LT_CHECK_THROW(http::ip_representation("::ffff:192.0.256.128")); +LT_END_AUTO_TEST(ip_representation6_str_invalid_nested_beyond255) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_nested_more_than_4_parts) + LT_CHECK_THROW(http::ip_representation("::ffff:192.0.5.128.128")); +LT_END_AUTO_TEST(ip_representation6_str_invalid_nested_more_than_4_parts) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_nested_not_at_end) + LT_CHECK_THROW(http::ip_representation("::ffff:192.0.256.128:ffff")); +LT_END_AUTO_TEST(ip_representation6_str_invalid_nested_not_at_end) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_nested_starting_non_zero) + LT_CHECK_THROW(http::ip_representation("0:0:1::ffff:192.0.5.128")); +LT_END_AUTO_TEST(ip_representation6_str_invalid_nested_starting_non_zero) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_str_invalid_nested_starting_wrong_prefix) + LT_CHECK_THROW(http::ip_representation("::ffcc:192.0.5.128")); + LT_CHECK_THROW(http::ip_representation("::ccff:192.0.5.128")); +LT_END_AUTO_TEST(ip_representation6_str_invalid_nested_starting_wrong_prefix) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation4_sockaddr) + struct sockaddr_in ip4addr; + + ip4addr.sin_family = AF_INET; + ip4addr.sin_port = htons(3490); + ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1"); + + http::ip_representation test_ip((sockaddr*) &ip4addr); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV4); + + for (int i = 0; i < 12; i++) { + LT_CHECK_EQ(test_ip.pieces[i], 0); + } + + LT_CHECK_EQ(test_ip.pieces[12], 127); + LT_CHECK_EQ(test_ip.pieces[13], 0); + LT_CHECK_EQ(test_ip.pieces[14], 0); + LT_CHECK_EQ(test_ip.pieces[15], 1); + + LT_CHECK_EQ(test_ip.mask, 0xFFFF); +LT_END_AUTO_TEST(ip_representation4_sockaddr) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation6_sockaddr) + struct sockaddr_in6 ip6addr; + + ip6addr.sin6_family = AF_INET6; + ip6addr.sin6_port = htons(3490); + inet_pton(AF_INET6, "2001:db8:8714:3a90::12", &(ip6addr.sin6_addr)); + + http::ip_representation test_ip((sockaddr*) &ip6addr); + + LT_CHECK_EQ(test_ip.ip_version, http::http_utils::IPV6); + + LT_CHECK_EQ(test_ip.pieces[0], 32); + LT_CHECK_EQ(test_ip.pieces[1], 1); + LT_CHECK_EQ(test_ip.pieces[2], 13); + LT_CHECK_EQ(test_ip.pieces[3], 184); + LT_CHECK_EQ(test_ip.pieces[4], 135); + LT_CHECK_EQ(test_ip.pieces[5], 20); + LT_CHECK_EQ(test_ip.pieces[6], 58); + LT_CHECK_EQ(test_ip.pieces[7], 144); + LT_CHECK_EQ(test_ip.pieces[8], 0); + LT_CHECK_EQ(test_ip.pieces[9], 0); + LT_CHECK_EQ(test_ip.pieces[10], 0); + LT_CHECK_EQ(test_ip.pieces[11], 0); + LT_CHECK_EQ(test_ip.pieces[12], 0); + LT_CHECK_EQ(test_ip.pieces[13], 0); + LT_CHECK_EQ(test_ip.pieces[14], 0); + LT_CHECK_EQ(test_ip.pieces[15], 18); + + LT_CHECK_EQ(test_ip.mask, 0xFFFF); +LT_END_AUTO_TEST(ip_representation6_sockaddr) + +LT_BEGIN_AUTO_TEST(http_utils_suite, load_file) + LT_CHECK_EQ(http::load_file("test_content"), "test content of file\n"); +LT_END_AUTO_TEST(load_file) + +LT_BEGIN_AUTO_TEST(http_utils_suite, load_file_invalid) + LT_CHECK_THROW(http::load_file("test_content_invalid")); +LT_END_AUTO_TEST(load_file_invalid) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation_less_than) + LT_CHECK_EQ(http::ip_representation("127.0.0.1") < http::ip_representation("127.0.0.2"), true); + LT_CHECK_EQ(http::ip_representation("128.0.0.1") < http::ip_representation("127.0.0.2"), false); + LT_CHECK_EQ(http::ip_representation("127.0.0.2") < http::ip_representation("127.0.0.1"), false); + LT_CHECK_EQ(http::ip_representation("127.0.0.1") < http::ip_representation("127.0.0.1"), false); + LT_CHECK_EQ(http::ip_representation("127.0.0.1") < http::ip_representation("127.0.0.1"), false); + + LT_CHECK_EQ(http::ip_representation("2001:db8::ff00:42:8329") < http::ip_representation("2001:db8::ff00:42:8329"), false); + LT_CHECK_EQ(http::ip_representation("2001:db8::ff00:42:8330") < http::ip_representation("2001:db8::ff00:42:8329"), false); + LT_CHECK_EQ(http::ip_representation("2001:db8::ff00:42:8329") < http::ip_representation("2001:db8::ff00:42:8330"), true); + LT_CHECK_EQ(http::ip_representation("2002:db8::ff00:42:8329") < http::ip_representation("2001:db8::ff00:42:8330"), false); + + LT_CHECK_EQ(http::ip_representation("::192.0.2.128") < http::ip_representation("::192.0.2.128"), false); + LT_CHECK_EQ(http::ip_representation("::192.0.2.129") < http::ip_representation("::192.0.2.128"), false); + LT_CHECK_EQ(http::ip_representation("::192.0.2.128") < http::ip_representation("::192.0.2.129"), true); + + LT_CHECK_EQ(http::ip_representation("::ffff:192.0.2.128") < http::ip_representation("::ffff:192.0.2.128"), false); + LT_CHECK_EQ(http::ip_representation("::ffff:192.0.2.129") < http::ip_representation("::ffff:192.0.2.128"), false); + LT_CHECK_EQ(http::ip_representation("::ffff:192.0.2.128") < http::ip_representation("::ffff:192.0.2.129"), true); + + LT_CHECK_EQ(http::ip_representation("::ffff:192.0.2.128") < http::ip_representation("::192.0.2.128"), false); + LT_CHECK_EQ(http::ip_representation("::ffff:192.0.2.128") < http::ip_representation("::192.0.2.128"), false); + LT_CHECK_EQ(http::ip_representation("::192.0.2.128") < http::ip_representation("::ffff:192.0.2.129"), true); +LT_END_AUTO_TEST(ip_representation_less_than) + +LT_BEGIN_AUTO_TEST(http_utils_suite, ip_representation_less_than_with_masks) + LT_CHECK_EQ(http::ip_representation("127.0.*.*") < http::ip_representation("127.0.0.1"), false); + LT_CHECK_EQ(http::ip_representation("127.0.0.1") < http::ip_representation("127.0.*.*"), false); + LT_CHECK_EQ(http::ip_representation("127.0.0.*") < http::ip_representation("127.0.*.*"), false); + LT_CHECK_EQ(http::ip_representation("127.0.*.1") < http::ip_representation("127.0.0.1"), false); + LT_CHECK_EQ(http::ip_representation("127.0.0.1") < http::ip_representation("127.0.*.1"), false); + LT_CHECK_EQ(http::ip_representation("127.1.0.1") < http::ip_representation("127.0.*.1"), false); + LT_CHECK_EQ(http::ip_representation("127.0.*.1") < http::ip_representation("127.1.0.1"), true); + LT_CHECK_EQ(http::ip_representation("127.1.*.1") < http::ip_representation("127.0.*.1"), false); + LT_CHECK_EQ(http::ip_representation("127.0.*.1") < http::ip_representation("127.1.*.1"), true); + + LT_CHECK_EQ(http::ip_representation("2001:db8::ff00:42:*") < http::ip_representation("2001:db8::ff00:42:8329"), false); + LT_CHECK_EQ(http::ip_representation("2001:db8::ff00:42:8329") < http::ip_representation("2001:db8::ff00:42:*"), false); +LT_END_AUTO_TEST(ip_representation_less_than_with_masks) + +LT_BEGIN_AUTO_TEST(http_utils_suite, dump_header_map) + std::map header_map; + header_map["HEADER_ONE"] = "VALUE_ONE"; + header_map["HEADER_TWO"] = "VALUE_TWO"; + header_map["HEADER_THREE"] = "VALUE_THREE"; + + std::stringstream ss; + http::dump_header_map(ss, "prefix", header_map); + LT_CHECK_EQ(ss.str(), " prefix [HEADER_ONE:\"VALUE_ONE\" HEADER_TWO:\"VALUE_TWO\" HEADER_THREE:\"VALUE_THREE\" ]\n"); +LT_END_AUTO_TEST(dump_header_map) + +LT_BEGIN_AUTO_TEST(http_utils_suite, dump_header_map_no_prefix) + std::map header_map; + header_map["HEADER_ONE"] = "VALUE_ONE"; + header_map["HEADER_TWO"] = "VALUE_TWO"; + header_map["HEADER_THREE"] = "VALUE_THREE"; + + std::stringstream ss; + http::dump_header_map(ss, "", header_map); + LT_CHECK_EQ(ss.str(), " [HEADER_ONE:\"VALUE_ONE\" HEADER_TWO:\"VALUE_TWO\" HEADER_THREE:\"VALUE_THREE\" ]\n"); +LT_END_AUTO_TEST(dump_header_map_no_prefix) + +LT_BEGIN_AUTO_TEST(http_utils_suite, dump_arg_map) + std::map arg_map; + arg_map["ARG_ONE"] = "VALUE_ONE"; + arg_map["ARG_TWO"] = "VALUE_TWO"; + arg_map["ARG_THREE"] = "VALUE_THREE"; + + std::stringstream ss; + http::dump_arg_map(ss, "prefix", arg_map); + LT_CHECK_EQ(ss.str(), " prefix [ARG_ONE:\"VALUE_ONE\" ARG_TWO:\"VALUE_TWO\" ARG_THREE:\"VALUE_THREE\" ]\n"); +LT_END_AUTO_TEST(dump_arg_map) + +LT_BEGIN_AUTO_TEST(http_utils_suite, dump_arg_map_no_prefix) + std::map arg_map; + arg_map["ARG_ONE"] = "VALUE_ONE"; + arg_map["ARG_TWO"] = "VALUE_TWO"; + arg_map["ARG_THREE"] = "VALUE_THREE"; + + std::stringstream ss; + http::dump_arg_map(ss, "", arg_map); + LT_CHECK_EQ(ss.str(), " [ARG_ONE:\"VALUE_ONE\" ARG_TWO:\"VALUE_TWO\" ARG_THREE:\"VALUE_THREE\" ]\n"); +LT_END_AUTO_TEST(dump_arg_map_no_prefix) + +LT_BEGIN_AUTO_TEST_ENV() + AUTORUN_TESTS() +LT_END_AUTO_TEST_ENV() diff --git a/3rd_party/libhttpserver-0.18.2/test/unit/string_utilities_test.cpp b/3rd_party/libhttpserver-0.18.2/test/unit/string_utilities_test.cpp new file mode 100644 index 00000000..2539ac08 --- /dev/null +++ b/3rd_party/libhttpserver-0.18.2/test/unit/string_utilities_test.cpp @@ -0,0 +1,98 @@ +/* + This file is part of libhttpserver + Copyright (C) 2011-2019 Sebastiano Merlino + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA +*/ + +#include "httpserver/string_utilities.hpp" + +#include + +#include "littletest.hpp" + +using namespace httpserver; +using namespace std; + +LT_BEGIN_SUITE(string_utilities_suite) + void set_up() + { + } + + void tear_down() + { + } +LT_END_SUITE(string_utilities_suite) + +LT_BEGIN_AUTO_TEST(string_utilities_suite, to_upper_copy) + LT_CHECK_EQ(string_utilities::to_upper_copy("test message"), string("TEST MESSAGE")); + LT_CHECK_EQ(string_utilities::to_upper_copy("tEsT mEssAge 245&$"), string("TEST MESSAGE 245&$")); +LT_END_AUTO_TEST(to_upper_copy) + +LT_BEGIN_AUTO_TEST(string_utilities_suite, to_upper) + string value = "test message"; + string_utilities::to_upper(value); + LT_CHECK_EQ(value, string("TEST MESSAGE")); + + value = "tEsT mEssAge 245&$"; + string_utilities::to_upper(value); + LT_CHECK_EQ(value, string("TEST MESSAGE 245&$")); +LT_END_AUTO_TEST(to_upper) + +LT_BEGIN_AUTO_TEST(string_utilities_suite, to_lower_copy) + LT_CHECK_EQ(string_utilities::to_lower_copy("TEST MESSAGE"), string("test message")); + LT_CHECK_EQ(string_utilities::to_lower_copy("tEsT mEssAge 245&$"), string("test message 245&$")); +LT_END_AUTO_TEST(to_lower_copy) + +LT_BEGIN_AUTO_TEST(string_utilities_suite, split_string) + string value = "test this message here"; + string expected_arr[] = { "test", "this", "message", "here" }; + vector expected(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + vector actual = string_utilities::string_split(value, ' ', false); + + LT_CHECK_COLLECTIONS_EQ(expected.begin(), expected.end(), actual.begin()); +LT_END_AUTO_TEST(split_string) + +LT_BEGIN_AUTO_TEST(string_utilities_suite, split_string_multiple_spaces) + string value = "test this message here"; + string expected_arr[] = { "test", "", "this", "", "message", "", "here" }; + vector expected(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + vector actual = string_utilities::string_split(value, ' ', false); + + LT_CHECK_COLLECTIONS_EQ(expected.begin(), expected.end(), actual.begin()); +LT_END_AUTO_TEST(split_string_multiple_spaces) + +LT_BEGIN_AUTO_TEST(string_utilities_suite, split_string_multiple_spaces_collapse) + string value = "test this message here"; + string expected_arr[] = { "test", "this", "message", "here" }; + vector expected(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + vector actual = string_utilities::string_split(value, ' ', true); + + LT_CHECK_COLLECTIONS_EQ(expected.begin(), expected.end(), actual.begin()); +LT_END_AUTO_TEST(split_string_multiple_spaces_collapse) + +LT_BEGIN_AUTO_TEST(string_utilities_suite, split_string_end_space) + string value = "test this message here "; + string expected_arr[] = { "test", "this", "message", "here" }; + vector expected(expected_arr, expected_arr + sizeof(expected_arr) / sizeof(expected_arr[0])); + vector actual = string_utilities::string_split(value, ' ', false); + + LT_CHECK_COLLECTIONS_EQ(expected.begin(), expected.end(), actual.begin()); +LT_END_AUTO_TEST(split_string_end_space) + +LT_BEGIN_AUTO_TEST_ENV() + AUTORUN_TESTS() +LT_END_AUTO_TEST_ENV() diff --git a/3rd_party/libmicrohttpd/build.cmd b/3rd_party/libmicrohttpd/build.cmd new file mode 100644 index 00000000..1dcf4eb7 --- /dev/null +++ b/3rd_party/libmicrohttpd/build.cmd @@ -0,0 +1,5 @@ +pushd "%1" + cd w32\VS2019 + if "%3" == "ON" (set BUILD_TYPE=Win32) else (set BUILD_TYPE=x64) + msbuild libmicrohttpd.sln /p:Configuration=%2-static /p:Platform="%BUILD_TYPE%" /t:libmicrohttpd || exit 1 +exit 0 \ No newline at end of file diff --git a/3rd_party/ttmath-0.9.3/CHANGELOG b/3rd_party/ttmath-0.9.3/CHANGELOG new file mode 100644 index 00000000..ab31e4b4 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/CHANGELOG @@ -0,0 +1,601 @@ +Version 0.9.3 (2012.11.28): + * fixed: in Big::FromDouble(double value) (only 32 bit version) + buffer overflow in referencing to UInt<2> + this was used when 'value' was in so called "unnormalized" state + (E=0 and F is nonzero) + it produced incorrect mantissa (on about 8th decimal digit up) + * added: Parser::InitCGamma() + initializing coefficients used when calculating the gamma (or factorial) function + this speed up the next calculations + you don't have to call this method explicitly + these coefficients will be calculated when needed + * added: option 'group_digits' to Conv struct + you can set how many digits should be grouped + * changed: small optimizations in UInt::ToString() and Big::FromString() + + +Version 0.9.2 (2010.09.23): + * fixed: Big::Add() sometimes incorrectly rounded the last bit from its mantissa + * fixed: Big::BigAnd() Big::BigOr() Big::BigXor() should have set NaN + when the argument was negative (they only returned 2) + * fixed: recurrence calling in Big::FromString(const std::string &, uint, const wchar_t **, bool *) + it should have the signature: Big::FromString(const std::string &, uint, const char **, bool *) + * fixed: Big::ToString method + in some cases when in the output string the exponent should be equal zero + the method changes the exponent to one so the last digit from the mantissa + was lost + * fixed: Big::ToDouble(double &) set always +INF (infinity) + when the value was too large (even for negative values) + (it should set -INF in such a case) + * added: some missing operators + UInt::operator~() /* bitwise neg */ + UInt::operator&() /* bitwise and */ + UInt::operator&=() + UInt::operator|() /* bitwise or */ + UInt::operator|=() + UInt::operator^() /* bitwise xor */ + UInt::operator^=() + Big::operator&() + Big::operator&=() + Big::operator|() + Big::operator|=() + Big::operator^() + Big::operator^=() + for Big<> we do not define bitwise neg + Big::operator++() + Big::operator++(int) + Big::operator--() + Big::operator--(int) + * added: macro TTMATH_DONT_USE_WCHAR + if defined then the library does not use wide characters + (wchar_t, std::wstring, ...) this is a workaround for some compilers + * added: bool UInt::IsOnlyTheHighestBitSet() + bool UInt::IsOnlyTheLowestBitSet() + returning true if only the highest/lowest bit is set + * added: uint Int::MulInt(sint ss2) + * added: void UInt::Swap(UInt & ss2) + void Big::Swap(UInt & ss2) + method for swapping this for an argument + * added: macro TTMATH_BIG_DEFAULT_CLEAR + when defined the default constructor from Big<> clears its mantissa and exponent + Big<1, 2> var; + var.mantissa and var.exponent will be set to zero + (but var has the NaN flag set too - it is not zero value, this is mainly for debug purposes) + * added: only on 32bit platforms: + uint UInt::FromUInt(uint64_t n) + uint Int::FromInt(int64_t n) + void Big::FromUInt(uint64_t n) + void Big::FromInt(int64_t n) + and appropriate constructors and operators + * added: TTMATH_FORCEASM macro + asm version of the library is available by default only for: + x86 and amd64 platforms and for Microsoft Visual and GCC compilers, + but you can force using asm version (the same asm as for Microsoft Visual) + by defining TTMATH_FORCEASM macro + you have to be sure that your compiler accept such an asm format + * added: some missing methods for converting + for UInt<>, Int<> and Big<> classes: + uint ToUInt() + sint ToInt() + ToUInt(uint32_t &) + ToInt(uint32_t &) + ToInt(int32_t &) + ToUInt(uint64_t &) + ToInt(uint64_t &) + ToInt(int64_t &) + FromUInt(uint32_t &) + FromInt(uint32_t &) + FromInt(int32_t &) + FromUInt(uint64_t &) + FromInt(uint64_t &) + FromInt(int64_t &) + and appropriate constructors and operators + * added: double Big::ToDouble() /there was only Big::ToDouble(double &) / + uint Big::ToFloat(float &) + float Big::ToFloat() + * changed: now asm version is available only on x86 and amd64 + (and only for GCC and MS VC compilers) + * removed: macro TTMATH_RELEASE (now the 'release' version is default) + for debug version define TTMATH_DEBUG macro + TTMATH_DEBUG is also automatically defined when DEBUG or _DEBUG is set + * removed: macro TTMATH_REFERENCE_ASSERT from all methods in public interface + + +Version 0.9.1 (2010.02.07): + * fixed: the parser didn't use characters for changing the base (# and &) + those characters were skipped + (this bug was introduced in 0.9.0) + * fixed: added in the parser: operator's associativity + operator ^ (powering) is right-associative: + sample: 2^3^4 is equal 2^(3^4) and it is: 2.41e+24 + previously was: 2^3^4 = (2^3)^4 = 4096 + * fixed: in Big::ToString_CreateNewMantissaAndExponent() changed the formula: + new_exp_ = [log base (2^exponent)] + 1 + now the part '+ 1' is only made when the logarithm is positive and with fraction + if the value is negative we can only skip the fraction, previously + we lost some last digits from the new mantissa + Consider this binary value (32 bit mantissa): + (bin)1.0000000000000000000000000000011 + previously ToString() gave 1, now we have: 1.000000001 + * changed: in Big::ToString() the base rounding is made only if the result value + would not be an integer, e.g. if the value is 1.999999999999 then + the base rounding will not be done - because as the result would be 2 + * added: IEEE 754 half-to-even rounding (bankers' rounding) to the following + floating point algorithms: Big::Add, Big::Sub, Big::Mul, Big::Div + * added: static sint UInt::FindLowestBitInWord(uint x) + this method is looking for the lowest set bit in a word + * added: UInt::FindLowestBit(uint & table_id, uint & index) + this method is looking for the lowest set bit + + +Version 0.9.0 (2009.11.25): + * added: support for wide characters (wchar_t, std::wstring) + * added: Big::IsInteger() + returns true if the value is integer (without fraction) + (NaN flag is not checked) + * added: global Gamma() function + * added: gamma() function to the parser + * added: CGamma class + is used with Gamma() and Factorial() in multithreaded environment + * added: multithread support for Big<> class + you should compile with TTMATH_MULTITHREADS + and use TTMATH_MULTITHREADS_HELPER macro somewhere in your *.cpp file + * added: x86_64 asm code for Microsoft Visual compiler + file: ttmathuint_x86_64_msvc.asm + (this file should be compiled first because MS VC doesn't support inline assembler in x86_64 mode) + * added: flag TTMATH_BIG_ZERO to Big<> class + if this flag is set then there is a value zero + Big::IsZero() is faster now + * added: Big::ClearInfoBit(unsigned char) + Big::SetInfoBit(unsigned char) + Big::IsInfoBit(unsigned char) + some methods for manipulating the info flags + * added: macro: TTMATH_BITS(min_bits) + which returns the number of machine words + capable to hold min_bits bits + * added: bool Parser::Calculated() + this method returns true is something was calculated + (at least one mathematical operator was used or a function or variable) + * added: to the parser: operator percentage + e.g. 1000-50%=1000-(1000*0,5)=500 + * added: struct: Conv + consists of some parameters used + in ToString() and FromString() + * added: Big::ToString() can group digits + e.g. 1234567 -> 1`234`567 + * added: Parser::SetGroup(int g) + Parser::SetComma(int c, int c2 = 0) + Parser::SetParamSep(int s) + * added: std::string UInt::ToString(uint b = 10) + std::wstring UInt::ToWString(uint b = 10) + std::string Int::ToString(uint b = 10) + std::wstring Int::ToWString(uint b = 10) + uint Big::ToString(std::string & result, const Conv & conv) + uint Big::ToString(std::wstring & result, const Conv & conv) + std::string Big::ToString(const Conv & conv) + std::string Big::ToString() + std::wstring Big::ToWString(const Conv & conv) + std::wstring Big::ToWString() + * added: uint FromString(const char * source, const Conv & conv, const char **, bool *) + uint FromString(const wchar_t * source, const Conv & conv, const wchar_t **, bool *) + uint FromString(const std::string & string, const Conv & conv, const wchar_t **, bool *) + uint FromString(const std::wstring & string, const Conv & conv, const wchar_t **, bool *) + * added: UInt::Sqrt() - a new algorithm for calculating the square root + * added: to the parser: function frac() - returns a value without the integer part + (only fraction remains) + * added: Int::DivInt(sint divisor, sint * remainder) + * added: const char * UInt::LibTypeStr() + const char * Big::LibTypeStr() + LibTypeCode UInt::LibType() + LibTypeCode Big::LibType() + returning a string/enum represents the currect type of the library + we have following types: + asm_vc_32 - with asm code designed for Microsoft Visual C++ (32 bits) + asm_gcc_32 - with asm code designed for GCC (32 bits) + asm_vc_64 - with asm for VC (64 bit) + asm_gcc_64 - with asm for GCC (64 bit) + no_asm_32 - pure C++ version (32 bit) - without any asm code + no_asm_64 - pure C++ version (64 bit) - without any asm code + * added: UInt::operator>>(int) + UInt::operator>>=(int) + UInt::operator<<(int) + UInt::operator<<=(int) + * changed: Factorial() is using the Gamma() function now + * changed: Big::Div(ss2) + Big::Mod(ss2) + they return 2 when ss2 is zero + previously returned 1 + * changed: algorithms in Big::Sqrt() and ttmath::Root(x ; n) + they were not too much accurate for some integers + e.g. Root(16;4) returned a value very closed to 2 (not exactly 2) + * changed: added specializations to Big::ToString() when the base is equal 4, 8 or 16 + the previous version was not accurate on some last digits (after the comma operator) + consider this binary value (32 bit mantissa): + base 2: 1.1111 1111 1111 1111 1111 1111 1110 101 + previous ToString() gave: + base 4: 1.33333333333332 + base 8: 1.777777777 + base 16: 1.FFFFFF + now we have: + base 4: 1.3333333333333222 + base 8: 1.77777777724 + base 16: 1.FFFFFFEA + * changed: in Big::ToString() some additional rounding (base_round) is now made only + when the value is not an integer + * changed: another compilers than MS VC or GCC by default use no asm version (TTMATH_NOASM) + * removed: Parser<>::SetFactorialMax() method + the factorial() is such a fast now that we don't need the method longer + * removed: ErrorCode::err_too_big_factorial + * removed: macros: TTMATH_COMMA_CHARACTER_1 and TTMATH_COMMA_CHARACTER_2 + the comma characters we have in Conv struct now + + +Version 0.8.6 (2009.10.25): + * fixed: UInt::SetBitInWord(uint & value, uint bit) set 1 if the bit was + equal 1 (should be set 2) + this affected only no-asm parts - when macro TTMATH_NOASM was defined + * fixed: UInt::MulInt(uint ss2) + there was a buffer overflow when value_size was equal 1 + * fixed: UInt::AddVector() and UInt::SubVector() didn't want to compile + when macro TTMATH_NOASM was defined + * fixed: Big::operator>> didn't correctly recognize values in scientific mode (with 'e' character) + * fixed: Int::FromString(const tt_string & s, uint b = 10) + didn't use 'b' (always was '10') + * fixed: buffer overflow in Big::ToInt(Int & result) + * fixed: powering algorithm in: + UInt::Pow(UInt pow) + Big::Pow(UInt pow) + Big::PowUInt(Big pow) + when 'pow' was sufficient large the algorithm returned carry + but the result could have been calculated correctly + + +Version 0.8.5 (2009.06.16): + * fixed: Big::Mod(x) didn't correctly return a carry + and the result was sometimes very big (even greater than x) + * fixed: global function Mod(x) didn't set an ErrorCode object + * fixed: global function Round() didn't test a carry + now it sets ErrorCode object + * changed: function Sin(x) to Sin(x, ErrorCode * err=0) + when x was very big the function returns zero + now it sets ErrorCode object to err_overflow + and the result has a NaN flag set + the same is to Cos() function + * changed: PrepareSin(x) is using Big::Mod() now when reducing 2PI period + should be a little accurate especially on a very big 'x' + * changed: uint Mul(const UInt & ss2, uint algorithm = 100) + void MulBig(const UInt & ss2, UInt & result, uint algorithm = 100) + those methods by default use MulFastest() and MulFastestBig() + * changed: changed a little Mul2Big() to cooperate with Mul3Big() + * added: uint UInt::Mul3(const UInt & ss2) + void UInt::Mul3Big(const UInt & ss2, UInt & result) + a new multiplication algorithm: Karatsuba multiplication, + on a vector UInt<100> with all items different from zero this algorithm is faster + about 3 times than Mul2Big(), and on a vector UInt<1000> with all items different from + zero this algorithm is faster more than 5 times than Mul2Big() + (measured on 32bit platform with GCC 4.3.3 with -O3 and -DTTMATH_RELEASE) + * added: uint MulFastest(const UInt & ss2) + void MulFastestBig(const UInt & ss2, UInt & result) + those methods are trying to select the fastest multiplication algorithm + * added: uint AddVector(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result) + uint SubVector(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result) + three forms: asm x86, asm x86_64, no-asm + those methods are used by the Karatsuba multiplication algorithm + * added: to Big<> class: support for NaN flag (Not a Number) + bool Big::IsNan() - returns true if the NaN flag is set + void Big::SetNan() - sets the NaN flag + The NaN flag is set by default after creating an object: + Big<1, 2> a; // NaN is set (it means the object has not a valid number) + std::cout << a; // cout gives "NaN" + a = 123; // now NaN is not set + std::cout << a; // cout gives "123" + The NaN is set if there was a carry during calculations + a.Mul(very_big_value); // a will have a NaN set + The NaN is set if an argument is NaN too + b.SetNan(); + a.Add(b); // a will have NaN because b has NaN too + If you try to do something on a NaN object, the result is a NaN too + a.SetNan(); + a.Add(2); // a is still a NaN + The NaN is set if you use incorrect arguments + a.Ln(-10); // a will have the NaN flag + The only way to clear the NaN flag is to assign a correct value or other correct object, + supposing 'a' has NaN flag, to remove the flag you can either: + a = 10; + a.FromInt(30); + a.SetOne(); + a.FromBig(other_object_without_nan); + etc. + + +Version 0.8.4 (2009.05.08): + * fixed: UInt::DivInt() didn't check whether the divisor is zero + there was a hardware interruption when the divisor was zero + (now the method returns one) + * fixed: the problem with GCC optimization on x86_64 + sometimes when using -O2 or -O3 GCC doesn't set correctly + the stack pointer (actually the stack is used for other things) + and you can't use instructions like push/pop in assembler code. + All the asm code in x86_64 have been rewritten, now instructions + push/pop are not used, other thing which have access to stack + (like "m" (mask) constraints in Rcl2 and Rcr2) have also gone away, + now the library works well with -O2 and -O3 and the asm code + is a little faster + * added: UInt::PrintLog(const char * msg, std::ostream & output) + used (for debugging purposes) by macro TTMATH_LOG(msg) + (it is used in nearly all methods in UInt class) + * added: macro TTMATH_DEBUG_LOG: when defined then TTMATH_LOG() + put some debug information (to std::cout) + * added: ttmathuint_x86.h, ttmathuint_x86_64.h, ttmathuint_noasm.h, + all the methods which are using assembler code have been + rewritten to no-asm forms, now we have: + 1. asm for x86 file: ttmathuint_x86.h + 2. asm for x86_64 file: ttmathuint_x86_64.h + 3. no asm file: ttmathuint_noasm.h + (it's used when macro TTMATH_NOASM is defined) + The third form can be used on x86 and x86_64 as well and + on other platforms with a little effort. + + +Version 0.8.3 (2009.04.06): + * fixed: RclMoveAllWords() and RcrMoveAllWords() sometimes didn't return + the proper carry, (when 'bits' was greater than or equal to 'value_size') + this had impact on Rcl() and Rcr(), they also returned the wrong carry + * fixed: UInt::Div() didn't return a correct result when the divisor was equal 1 + there was an error in UInt::DivInt() - when the divisor was 1 it returned + zero and the carry was set + * fixed: there was a TTMATH_REREFENCE_ASSERT error in Big::PowUInt() caused by: start.Mul(start) + * fixed: Big::Add incorrectly rounded 'this' when both exponents were equal + it caused that sometimes when adding a zero the result has changed + this had impact among other things on FromString() method + "0,8" had different binary representation from "0,80" + * fixed: template Big::FromBig(const Big & another) + didn't correctly set the exponent (when the mantisses had different size - + when 'man' was different from 'another_man') + this had impact on operator= too + sample: + Big<2,3> a = 100; + Big<3,5> b; + b = a; // b had a wrong value + * fixed: Big::Pow(const Big & pow) + it's using PowInt() only when pow.exponent is in range (-man*TTMATH_BITS_PER_UINT; 0] + previously the powering 'hung' on an input like this: "(1+ 1e-10000) ^ 10e100000000" + (there was 10e100000000 iterations in PowInt()) + * fixed: in function DegToRad(const ValueType & x, ErrorCode * err = 0) it is better + to make division first and then mutliplication -- the result is more + accurate especially when x is: 90,180,270 or 360 + * fixed: the parser didn't correctly treat operators for changing the base + (radix) -- operators '#' and '&', e.g.: + '#sin(1)' was equal '0' -- there was a zero from '#' and then + it was multipied by 'sin(1)' + the parser didn't check whether Big::FromString() has actually + read a proper value -- the method Big::FromString() didn't have + something to report such a situation + * fixed: Big::FromString() when the base is 10, the method reads the scientific + part only if such a part it correctly supplied, e.g: + '1234e10', '1234e+10', '1234e-5' + previous '1234e' was treated as: '1234e0' (now parsing stops on 'e' and + the 'e' can be parsed by other parsers, e.g. the mathematical + parser -- now in the parser would be: '1234e' = '1234 * e' = '3354,3597...' ) + * changed: renamed: Big::PowUInt(UInt pow) -> Big::Pow(UInt pow) + it returns 2 when there is: 0^0 + * changed: renamed: Big::PowInt(Int pow) -> Big::Pow(Int pow) + it returns 2 when there is: 0^0 or 0^(-something) + * changed: renamed: Big::PowBUInt() -> PowUInt(), Big::PowBInt() -> Big::PowInt() + they return 2 when the arguments are incorrect (like above) + * changed: UInt::SetBitInWord(uint & value, uint bit) is taking the first argument by a reference now, + the specific bit is set in the 'value' and the method returns the last state of the bit (zero or one) + * changed: UInt::SetBit(uint bit_index) - it's using TTMATH_ASSERT now + * changed: the size of built-in variables (constants) in ttmathbig.h + now they consist of 256 32bit words + macro TTMATH_BUILTIN_VARIABLES_SIZE is equal: 256u on a 32bit platform and 128ul on a 64bit platform + * changed: the asm code in ttmathuint.h and ttmathuint64.h has been completely rewritten + now UInt<> is faster about 15-30% than UInt<> from 0.8.2 + this has impact on Big<> too - it's faster about 10% now + * changed: in the parser: the form with operators '#' and '&' is as follows: + [-|+][#|&]numeric_value + previous was: [-|+][#|&][-|+]numeric_value + * changed: in the parser: the short form of multiplication has the same + priority as the normal multiplication, e.g.: + '2x^3' = 2 * (x^3) + previous the priority was greater than powering priority + previous: '2x^3' = (2*x) ^ 3 + * added: UInt::GetBit(uint bit_index) - returning the state of the specific bit + * added: Big::operator=(double) and Big::Big(double) + * added: UInt::Pow(UInt pow) and Int::Pow(Int pow) + * added: global template functions in ttmath.h: + ValueType GradToRad(const ValueType & x, ErrorCode * err = 0) + ValueType RadToGrad(const ValueType & x, ErrorCode * err = 0) + ValueType DegToGrad(const ValueType & x, ErrorCode * err = 0) + ValueType DegToGrad(const ValueType & d, const ValueType & m, + const ValueType & s, ErrorCode * err = 0) + ValueType GradToDeg(const ValueType & x, ErrorCode * err = 0) + * added: Parser::SetDegRadGrad(int angle) - 0 deg, 1 rad (default), 2 grad + this affects following functions (in the parser only): sin, cos, tan, cot, + asin, acos, atan, acot + * added: functions to the parser: gradtorad(grad), radtograd(rad), degtograd(deg), + degtograd(d,m,s), gradtodeg(grad) + * added: UInt::FromString, added a parametr 'after_source' + which is pointing at the end of the parsed string + * added: Int::FromString(): parameter 'const char ** after_source = 0' + if exists it's pointing at the end of the parsed string + * added: to UInt::FromString(), Int::FromString(), Big::FromString(): + parameter 'bool * value_read = 0' - (if exists) tells + whether something has actually been read (at least one digit) + * added: Objects::IsDefined(const std::string & name) + returning true if such an object is defined + * removed: Big::FromString() this method doesn't longer recognize operators + for changing the base ('#' and '&') + + +Version 0.8.2 (2008.06.18): + * added: UInt::BitNot2() this method has been proposed by + Arek + * changed: Int::FromInt(const Int & p), + Int::FromInt(sint value) (it returns zero now) + Int::operator=(uint i) + Int::Int(uint i) + * added: Int::FromUInt(const UInt & p), + Int::FromUInt(uint value) + and appropriate constructors and assignment + operators as well + * changed: Big::FromInt(Int value), + * added: Big::FromUInt(UInt value), + Big::operator=(const UInt & value) + Big::Big(const UInt & value) + * changed: the parser is allowed to recognize values which + begin with a dot, e.g '.5' is treated as '0.5' + * added: a method Big::FromDouble(double) which converts from + standard double into a Big + * added: uint Big::ToDouble(double&) - converting into double + * added: Big::FromBig() and an operator= and a contructor + for converting from another kind of a Big class + * added: to the parser: avg(), sum() + * added: 'decimal_point' parameter into Big::ToString(...) + * fixed: Big::operator>> didn't use TTMATH_COMMA_CHARACTER_2 macro + * added: a short form of multiplication (without the '*' character) + e.g. '5y', (it's used only if the second parameter + is a variable or function) + * changed: variables and functions are case-sensitive now + * added: variables and functions can have underline characters + in their names + * changed: 'max_digit_after_comma' in Big::ToString() + remove the -2 state + * added: 'remove_trailing_zeroes' in Big::ToString() + it's either true or false + * fixed/changed: the way of using Big::SetSign() + the method do not check whether there is a zero or not now + (even if there's a zero the method can set a sign bit) + I changed this due to some prior errors + (errors corrected in revision 17, 49 and 58) + + +Version 0.8.1 (2007.04.17): + * fixed: Big::PowFrac(..) didn't return a correct error code + (when 'this' was negative) + * added: Root(x; index) (and to the parser as well) + * added: macro: TTMATH_PRERELEASE_VER (can be either zero or one) + * added: UInt::MulInt(int, UInt::&) + * added: Big::MulUInt(uint) + * changed: Big::MulInt(sint) + * added: Big::ToUInt(uint &) + * changed: Big::ToInt(sint&) + * changed: Factorial() it uses Big::MulUInt() at the beginning + (faster now especially more on a 32bit platform) + * added: doxygen.cfg for generating a documentation from the doxygen + * changed: UInt::Rcl(uint c=0) and UInt::Rcr(uint c=0) into + UInt::Rcl2(uint bits, uint c) and UInt::Rcr2(uint bits, uint c) + now they can move more than one bit and they are only private + * fixed: UInt::Rcl(uint bits, uint c) and UInt::Rcr(uint bits, uint c) + didn't correctly return a carry if the 'bits' were equal + to 'value_size*TTMATH_BITS_PER_UINT' + * changed: UInt::Rcl(uint bits, uint c) and UInt::Rcr(uint bits, uint c) + into UInt::Rcl(uint bits, uint c=0) and + UInt::Rcr(uint bits, uint c=0) + they are faster now when the bits is greater than a half of + the TTMATH_BITS_PER_UINT + * changed: UInt::CompensationToLeft() it's faster now + * changed: more small changes where there were UInt::Rcl(uint c=0) and + UInt::Rcr(uint c=0) used + * changed: as the Big type uses UInt::Rcl() and UInt::Rcr() a lot then + it is much faster now (about 5-25%) + * added: ASinh(), ACosh(), ATanh() /ATgh()/, ACoth() /ACtgh()/ + and to the parser as well + * added: UInt::BitAnd(), UInt::BitOr(), UInt::BitXor(), UInt::BitNot(), + Big::BitAnd(), Big::BitOr(), Big::BitXor() + * added: to the parser: bitand(), bitor(), bitxor() + /band(), bor(), bxor()/ + * changed: the way of parsing operators in the mathematical parser + (the parser is not too much greedy now) + + +Version 0.8.0 (2007.03.28): + * added: into the parser: SetFactorialMax() + * added: DegToDeg(deg, min, sec), DegToRad(deg), DegToRad(deg, min, sec), + RadToDeg(rad), Ceil(x), Floor(x), Sqrt(x), Sinh(x), Cosh(x), + Tanh(x) /Tgh(x)/, Coth(x) /Ctgh(x)/ + * changed: class Objects in ttmathobjects.h has been completely rewritten, + we can change the names of user-defined variables or functions, + and the names are case-sensitive now + * added: class History which is used in functions which take a lot of time + during calculating e.g. Factorial(x) + * added: Tg(x) a wrapper for Tan(x) + * changed: CTan(x) is Cot(x) now + * added: Ctg(x) a wrapper for Cot(x) + * added: ATg(x) a wrapper for ATan(x) + * changed: ACTan(x) is ACot(x) now + * added: ACtg(x) a wrapper for ACot(x) + * added: UInt::PrintTable() (for debugging etc.) + * changed: the methods Big::SetPi() Big::SetE() and Big::SetLn2() have + been rewritten, now they have 128 32bit words (it's about + 1232 valid decimal digits) + * fixed: previous values from Big::SetPi() Big::SetE() and + Big::SetLn2() were not too much accurate (last 2-3 words were wrong) + * added: Big::SetLn10() (128 32bit words as well) + * added: macro TTMATH_BUILTIN_VARIABLES_SIZE which is equal 128u on + 32bit platforms and 64ul on 64bit platforms (128/2=64) + * added: macros TTMATH_PLATFORM32 and TTMATH_PLATFORM64 + * changed: a small optimisation in UInt::Mul2Big() + * added: at the end of ttmath.h: #include "ttmathparser.h" + this is for convenience for a programmer, he can only use #include + with ttmath.h even if he uses the parser + * added: to samples: big.cpp, parser.cpp + * added/changes/fixed: in copy-constructors and operators= in Int, + Uint and Big (more info in the commit log) + * renamed: Big::SetDotOne() into Big::Set05() + * changes: a few small optimisations in Big + * deleted: the word 'virtual' from destructors: UInt, Int, Big + (types in this library are not projected to be base-classes for + another ones derived from them) + * and more small changes (look at the commit log) + + +Version 0.7.2 (2007.03.09): + * added: Big::Mod - the remainder from a division + * added: Big::Sgn - the 'sign' from the value (-1,0,1) + * added: global functions Mod and Sgn too + * added: checking whether a user gives a correct value of a variable or function + (user-defined variables/functions in the mathematical parser) + * added: into the parser: logical operators: > < >= <= == != && || + * added: into the parser: logical functions: and() or() not() if() + * added: ErrorCode::err_unknown_operator when the parser couldn't read an operator + + +Version 0.7.1 (2007.02.27): + * fixed: the error 'overflow during printing' which was caused + by Big::FromInt(Int value) (the sign has to be set at the end) + * fixed: many small errors + * added: ATan (arctan), ACTan (arc ctan) functions + + +Version 0.7.0 (2007.02.24): + * finished: support for 64bit platforms + * added: ASin (arcsin), ACos (arccos) functions + + +Version 0.6.4 (2007.01.29): + * fixed: the problem with a sign in the mathematical parser /-(1) was 1/ + * added: UInt::AddInt and UInt::SubInt + * changed: UInt::AddOne and UInt::SubOne (much faster now) + * added: UInt::SetBitInWord + * changed: UInt::SetBit (much faster now) + UInt::AddTwoUints renamed to UInt::AddTwoInts + UInt::FindLeadingBit32 renamed to UInt::FindLeadingBitInWord + UInt::Mul64 renamed to UInt::MulTwoWords + UInt::Div64 renamed to UInt::DivTwoWords + * added: UInt::SetBitInWord + * and more small changes in UInt type + * start adding support for Amd64 (not finished yet) (added ttmathuint64.h) + + +Version 0.6.3 (2007.01.22): + * changed: position of arguments (x and base) in logarithm functions are swapped + * changed: it's possible to use any multiplication algorithms in the same time + (macros UINT_MUL_VERSION_'X' have gone) + * added: ExceptionInfo, ReferenceError and RuntimeError classes + * changed: the mess in macros has been cleaned up + * added: TTMATH_RELEASE macro + + +Version 0.6.2 (2007.01.10): + * added: New division algorithm (radix b) where b is 2^32 diff --git a/3rd_party/ttmath-0.9.3/COPYRIGHT b/3rd_party/ttmath-0.9.3/COPYRIGHT new file mode 100644 index 00000000..35b688cb --- /dev/null +++ b/3rd_party/ttmath-0.9.3/COPYRIGHT @@ -0,0 +1,28 @@ +Copyright (c) 2006-2012, Tomasz Sowa +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 Tomasz Sowa nor the names of contributors to this + project 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. diff --git a/3rd_party/ttmath-0.9.3/README b/3rd_party/ttmath-0.9.3/README new file mode 100644 index 00000000..dd198802 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/README @@ -0,0 +1,23 @@ +A bignum library for C++ + +TTMath is a small library which allows one to perform arithmetic operations +with big unsigned integer, big signed integer and big floating point numbers. +It provides standard mathematical operations like adding, subtracting, +multiplying, dividing. With the library also goes a mathematical parser to +help you solving mathematical expressions. + +TTMath is developed under the BSD licence which means that it is free for +both personal and commercial use. + +The main goal of the library is to allow one to use big values in the same +way as the standard types like int or float. It does not need to be compiled +first because the whole library is written as the C++ templates. This means +only C++ developers can use this library and one thing they have to do is +to use 'include' directive of the preprocessor. How big the values can be +is set at compile time. + +Author: Tomasz Sowa +WWW: http://www.ttmath.org + +Contributors: +Christian Kaiser diff --git a/3rd_party/ttmath-0.9.3/samples/Makefile b/3rd_party/ttmath-0.9.3/samples/Makefile new file mode 100644 index 00000000..cd2e30d5 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/samples/Makefile @@ -0,0 +1,46 @@ +CC = g++ +CFLAGS = -Wall -pedantic -s -O2 -I.. -DTTMATH_DONT_USE_WCHAR + + +.SUFFIXES: .cpp .o + +.cpp.o: + $(CC) -c $(CFLAGS) $< + + +all: uint int big big2 parser + + +uint: uint.o + $(CC) -o uint $(CFLAGS) uint.o + +int: int.o + $(CC) -o int $(CFLAGS) int.o + +big: big.o + $(CC) -o big $(CFLAGS) big.o + +big2: big2.o + $(CC) -o big2 $(CFLAGS) big2.o + +parser: parser.o + $(CC) -o parser $(CFLAGS) parser.o + + +uint.o: uint.cpp +int.o: int.cpp +big.o: big.cpp +big2.o: big2.cpp +parser.o: parser.cpp + + +clean: + rm -f *.o + rm -f *.s + rm -f uint + rm -f int + rm -f big + rm -f big2 + rm -f parser +# on MS Windows can automatically be added suffixes .exe to the names of output programs + rm -f *.exe diff --git a/3rd_party/ttmath-0.9.3/samples/big.cpp b/3rd_party/ttmath-0.9.3/samples/big.cpp new file mode 100644 index 00000000..fb172036 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/samples/big.cpp @@ -0,0 +1,100 @@ +#include +#include + +// for convenience we're defining MyBig type +// this type has 2 words for its mantissa and 1 word for its exponent +// (on a 32bit platform one word means a word of 32 bits, +// and on a 64bit platform one word means a word of 64 bits) + +// Big +typedef ttmath::Big<1,2> MyBig; + + +void SimpleCalculating(const MyBig & a, const MyBig & b) +{ + std::cout << "Simple calculating" << std::endl; + std::cout << "a = " << a << std::endl; + std::cout << "b = " << b << std::endl; + std::cout << "a + b = " << a+b << std::endl; + std::cout << "a - b = " << a-b << std::endl; + std::cout << "a * b = " << a*b << std::endl; + std::cout << "a / b = " << a/b << std::endl; +} + + +void CalculatingWithCarry(const MyBig & a, const MyBig & b) +{ +MyBig atemp; + + std::cout << "Calculating with a carry" << std::endl; + std::cout << "a = " << a << std::endl; + std::cout << "b = " << b << std::endl; + + atemp = a; + if( !atemp.Add(b) ) + std::cout << "a + b = " << atemp << std::endl; + else + std::cout << "a + b = (carry)" << std::endl; + // it have no sense to print 'atemp' (it's undefined) + + atemp = a; + if( !atemp.Sub(b) ) + std::cout << "a - b = " << atemp << std::endl; + else + std::cout << "a - b = (carry)" << std::endl; + + atemp = a; + if( !atemp.Mul(b) ) + std::cout << "a * b = " << atemp << std::endl; + else + std::cout << "a * b = (carry)" << std::endl; + + + atemp = a; + if( !atemp.Div(b) ) + std::cout << "a / b = " << atemp << std::endl; + else + std::cout << "a / b = (carry or division by zero) " << std::endl; + +} + + +int main() +{ +MyBig a,b; + + // conversion from 'const char *' + a = "123456.543456"; + b = "98767878.124322"; + + SimpleCalculating(a,b); + + // 'a' will have the max value which can be held in this type + a.SetMax(); + + // conversion from double + b = 456.32; + + // Look at the value 'a' and the product from a+b and a-b + // Don't worry this is the nature of floating point numbers + CalculatingWithCarry(a,b); +} + +/* +the result (on 32 bit platform): + +Simple calculating +a = 123456.543456 +b = 98767878.124322 +a + b = 98891334.667778 +a - b = -98644421.580866 +a * b = 12193540837712.27076 +a / b = 0.00124996654580957646 +Calculating with a carry +a = 1.6248012560666408782e+646457012 +b = 456.319999999999993 +a + b = 1.6248012560666408782e+646457012 +a - b = 1.6248012560666408782e+646457012 +a * b = (carry) +a / b = 3.560661939136222174e+646457009 +*/ diff --git a/3rd_party/ttmath-0.9.3/samples/big2.cpp b/3rd_party/ttmath-0.9.3/samples/big2.cpp new file mode 100644 index 00000000..9bd253bb --- /dev/null +++ b/3rd_party/ttmath-0.9.3/samples/big2.cpp @@ -0,0 +1,113 @@ +#include +#include + + +// this is a similar example to big.cpp +// but now we're using TTMATH_BITS() macro +// this macro returns how many words we need to store +// the given number of bits + +// TTMATH_BITS(64) +// on a 32bit platform the macro returns 2 (2*32=64) +// on a 64bit platform the macro returns 1 + +// TTMATH_BITS(128) +// on a 32bit platform the macro returns 4 (4*32=128) +// on a 64bit platform the macro returns 2 (2*64=128) + +// Big +typedef ttmath::Big MyBig; + +// consequently on a 32bit platform we define: Big<2, 4> +// and on a 64bit platform: Big<1, 2> +// and the calculations will be the same on both platforms + + +void SimpleCalculating(const MyBig & a, const MyBig & b) +{ + std::cout << "Simple calculating" << std::endl; + std::cout << "a = " << a << std::endl; + std::cout << "b = " << b << std::endl; + std::cout << "a + b = " << a+b << std::endl; + std::cout << "a - b = " << a-b << std::endl; + std::cout << "a * b = " << a*b << std::endl; + std::cout << "a / b = " << a/b << std::endl; +} + + +void CalculatingWithCarry(const MyBig & a, const MyBig & b) +{ +MyBig atemp; + + std::cout << "Calculating with a carry" << std::endl; + std::cout << "a = " << a << std::endl; + std::cout << "b = " << b << std::endl; + + atemp = a; + if( !atemp.Add(b) ) + std::cout << "a + b = " << atemp << std::endl; + else + std::cout << "a + b = (carry)" << std::endl; + // it have no sense to print 'atemp' (it's undefined) + + atemp = a; + if( !atemp.Sub(b) ) + std::cout << "a - b = " << atemp << std::endl; + else + std::cout << "a - b = (carry)" << std::endl; + + atemp = a; + if( !atemp.Mul(b) ) + std::cout << "a * b = " << atemp << std::endl; + else + std::cout << "a * b = (carry)" << std::endl; + + + atemp = a; + if( !atemp.Div(b) ) + std::cout << "a / b = " << atemp << std::endl; + else + std::cout << "a / b = (carry or division by zero) " << std::endl; + +} + + +int main() +{ +MyBig a,b; + + // conversion from 'const char *' + a = "123456.543456"; + b = "98767878.124322"; + + SimpleCalculating(a,b); + + // 'a' will have the max value which can be held in this type + a.SetMax(); + + // conversion from double + b = 456.32; + + // Look at the value 'a' and the product from a+b and a-b + // Don't worry this is the nature of floating point numbers + CalculatingWithCarry(a,b); +} + +/* +the result (the same on a 32 or 64bit platform): + +Simple calculating +a = 123456.543456 +b = 98767878.124322 +a + b = 98891334.667778 +a - b = -98644421.580866 +a * b = 12193540837712.270763536832 +a / b = 0.0012499665458095764605964485261668609133 +Calculating with a carry +a = 2.34953455457111777368832820909595050034e+2776511644261678604 +b = 456.3199999999999931787897367030382156 +a + b = 2.34953455457111777368832820909595050034e+2776511644261678604 +a - b = 2.34953455457111777368832820909595050034e+2776511644261678604 +a * b = (carry) +a / b = 5.1488748127873374141170361292780486452e+2776511644261678601 +*/ diff --git a/3rd_party/ttmath-0.9.3/samples/int.cpp b/3rd_party/ttmath-0.9.3/samples/int.cpp new file mode 100644 index 00000000..13760d28 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/samples/int.cpp @@ -0,0 +1,92 @@ +#include +#include + + +void SimpleCalculating(const ttmath::Int<2> & a, const ttmath::Int<2> & b) +{ + std::cout << "Simple calculating" << std::endl; + std::cout << "a = " << a << std::endl; + std::cout << "b = " << b << std::endl; + std::cout << "a + b = " << a+b << std::endl; + std::cout << "a - b = " << a-b << std::endl; + std::cout << "a * b = " << a*b << std::endl; + std::cout << "a / b = " << a/b << std::endl; +} + + +void CalculatingWithCarry(const ttmath::Int<2> & a, const ttmath::Int<2> & b) +{ +ttmath::Int<2> atemp; + + std::cout << "Calculating with a carry" << std::endl; + std::cout << "a = " << a << std::endl; + std::cout << "b = " << b << std::endl; + + atemp = a; + if( !atemp.Add(b) ) + std::cout << "a + b = " << atemp << std::endl; + else + std::cout << "a + b = (carry) " << atemp << std::endl; + + atemp = a; + if( !atemp.Sub(b) ) + std::cout << "a - b = " << atemp << std::endl; + else + std::cout << "a - b = (carry) " << atemp << std::endl; + + atemp = a; + if( !atemp.Mul(b) ) + std::cout << "a * b = " << atemp << std::endl; + else + std::cout << "a * b = (carry: the result is too big) " << std::endl; + // it have no sense to print 'atemp' (it's undefined) + + atemp = a; + if( !atemp.Div(b) ) + std::cout << "a / b = " << atemp << std::endl; + else + std::cout << "a / b = (division by zero) " << std::endl; + +} + +int main() +{ +// on 32bit platforms: 'a' and 'b' have 2-words (two 32bit words) +// it means a,b are from <-2^63, 2^63 - 1> +ttmath::Int<2> a,b; + + // conversion from int + a = 123456; + + // conversion from 'const char *' + b = "98767878"; + + SimpleCalculating(a,b); + + // 'a' will have the max value which can be held in this type + a.SetMax(); + + // conversion from 'int' + b = 10; + + CalculatingWithCarry(a,b); +} + +/* +the result (on 32 bit platform): + +Simple calculating +a = 123456 +b = 98767878 +a + b = 98891334 +a - b = -98644422 +a * b = 12193487146368 +a / b = 0 +Calculating with a carry +a = 9223372036854775807 +b = 10 +a + b = (carry) -9223372036854775799 +a - b = 9223372036854775797 +a * b = (carry) the result is too big) +a / b = 922337203685477580 +*/ diff --git a/3rd_party/ttmath-0.9.3/samples/parser.cpp b/3rd_party/ttmath-0.9.3/samples/parser.cpp new file mode 100644 index 00000000..6ee2e021 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/samples/parser.cpp @@ -0,0 +1,39 @@ +#include +#include + + +// for convenience we're defining MyBig type +// this type has 2 words for its mantissa and 1 word for its exponent +// (on a 32bit platform one word means a word of 32 bits, +// and on a 64bit platform one word means a word of 64 bits) +typedef ttmath::Big<1,2> MyBig; + + +int main() +{ +ttmath::Parser parser; + +// the sine function takes its parameter as being in radians, +// the product from the arcus tangent will be in radians as well +const char equation[] = " (34 + 24) * 123 - 34.32 ^ 6 * sin(2.56) - atan(10)"; + + ttmath::ErrorCode err = parser.Parse(equation); + + if( err == ttmath::err_ok ) + std::cout << parser.stack[0].value << std::endl; + else + std::cout << "Error: " + << static_cast(err) + << std::endl; +} + +/* +the result (on 32 bit platform): +-897705014.525731067 +*/ + + +/* +the result (on 64 bit platform): +-897705014.5257310676097719585259773124 +*/ diff --git a/3rd_party/ttmath-0.9.3/samples/uint.cpp b/3rd_party/ttmath-0.9.3/samples/uint.cpp new file mode 100644 index 00000000..f6b0df48 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/samples/uint.cpp @@ -0,0 +1,93 @@ +#include +#include + + +void SimpleCalculating(const ttmath::UInt<2> & a, const ttmath::UInt<2> & b) +{ + std::cout << "Simple calculating" << std::endl; + std::cout << "a = " << a << std::endl; + std::cout << "b = " << b << std::endl; + std::cout << "a + b = " << a+b << std::endl; + std::cout << "a - b = " << a-b << std::endl; + std::cout << "a * b = " << a*b << std::endl; + std::cout << "a / b = " << a/b << std::endl; +} + + +void CalculatingWithCarry(const ttmath::UInt<2> & a, const ttmath::UInt<2> & b) +{ +ttmath::UInt<2> atemp; + + std::cout << "Calculating with a carry" << std::endl; + std::cout << "a = " << a << std::endl; + std::cout << "b = " << b << std::endl; + + atemp = a; + if( !atemp.Add(b) ) + std::cout << "a + b = " << atemp << std::endl; + else + // if there was a carry then atemp.Add(...) would have returned 1 + std::cout << "a + b = (carry: the result is too big) " << atemp << std::endl; + + atemp = a; + if( !atemp.Sub(b) ) + std::cout << "a - b = " << atemp << std::endl; + else + std::cout << "a - b = (carry: 'a' was smaller than 'b') " << atemp << std::endl; + + atemp = a; + if( !atemp.Mul(b) ) + std::cout << "a * b = " << atemp << std::endl; + else + std::cout << "a * b = (carry: the result is too big) " << std::endl; + // it have no sense to print 'atemp' (it's undefined) + + atemp = a; + if( !atemp.Div(b) ) + std::cout << "a / b = " << atemp << std::endl; + else + std::cout << "a / b = (division by zero) " << std::endl; + +} + +int main() +{ +// on 32bit platforms: 'a' and 'b' have 2-words (two 32bit words) +// it means a,b are from <0, 2^64 - 1> +ttmath::UInt<2> a,b; + + // conversion from 'const char *' + a = "123456"; + + // conversion from int + b = 9876; + + SimpleCalculating(a,b); + + // 'a' will have the max value which can be held in this type + a.SetMax(); + + // conversion from 'int' + b = 5; + + CalculatingWithCarry(a,b); +} + +/* +the result (on 32 bit platform): + +Simple calculating +a = 123456 +b = 9876 +a + b = 133332 +a - b = 113580 +a * b = 1219251456 +a / b = 12 +Calculating with a carry +a = 18446744073709551615 +b = 5 +a + b = (carry: the result is too big) 4 +a - b = 18446744073709551610 +a * b = (carry: the result is too big) +a / b = 3689348814741910323 +*/ diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmath.h b/3rd_party/ttmath-0.9.3/ttmath/ttmath.h new file mode 100644 index 00000000..ee40e6ea --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmath.h @@ -0,0 +1,2853 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2012, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + + + +#ifndef headerfilettmathmathtt +#define headerfilettmathmathtt + +/*! + \file ttmath.h + \brief Mathematics functions. +*/ + +#ifdef _MSC_VER +//warning C4127: conditional expression is constant +#pragma warning( disable: 4127 ) +//warning C4702: unreachable code +#pragma warning( disable: 4702 ) +//warning C4800: forcing value to bool 'true' or 'false' (performance warning) +#pragma warning( disable: 4800 ) +#endif + + +#include "ttmathbig.h" +#include "ttmathobjects.h" + + +namespace ttmath +{ + /* + * + * functions defined here are used only with Big<> types + * + * + */ + + + /* + * + * functions for rounding + * + * + */ + + + /*! + this function skips the fraction from x + e.g 2.2 = 2 + 2.7 = 2 + -2.2 = 2 + -2.7 = 2 + */ + template + ValueType SkipFraction(const ValueType & x) + { + ValueType result( x ); + result.SkipFraction(); + + return result; + } + + + /*! + this function rounds to the nearest integer value + e.g 2.2 = 2 + 2.7 = 3 + -2.2 = -2 + -2.7 = -3 + */ + template + ValueType Round(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType result( x ); + uint c = result.Round(); + + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + + /*! + this function returns a value representing the smallest integer + that is greater than or equal to x + + Ceil(-3.7) = -3 + Ceil(-3.1) = -3 + Ceil(-3.0) = -3 + Ceil(4.0) = 4 + Ceil(4.2) = 5 + Ceil(4.8) = 5 + */ + template + ValueType Ceil(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType result(x); + uint c = 0; + + result.SkipFraction(); + + if( result != x ) + { + // x is with fraction + // if x is negative we don't have to do anything + if( !x.IsSign() ) + { + ValueType one; + one.SetOne(); + + c += result.Add(one); + } + } + + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + this function returns a value representing the largest integer + that is less than or equal to x + + Floor(-3.6) = -4 + Floor(-3.1) = -4 + Floor(-3) = -3 + Floor(2) = 2 + Floor(2.3) = 2 + Floor(2.8) = 2 + */ + template + ValueType Floor(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType result(x); + uint c = 0; + + result.SkipFraction(); + + if( result != x ) + { + // x is with fraction + // if x is positive we don't have to do anything + if( x.IsSign() ) + { + ValueType one; + one.SetOne(); + + c += result.Sub(one); + } + } + + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + + /* + * + * logarithms and the exponent + * + * + */ + + + /*! + this function calculates the natural logarithm (logarithm with the base 'e') + */ + template + ValueType Ln(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType result; + uint state = result.Ln(x); + + if( err ) + { + switch( state ) + { + case 0: + *err = err_ok; + break; + case 1: + *err = err_overflow; + break; + case 2: + *err = err_improper_argument; + break; + default: + *err = err_internal_error; + break; + } + } + + + return result; + } + + + /*! + this function calculates the logarithm + */ + template + ValueType Log(const ValueType & x, const ValueType & base, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) *err = err_improper_argument; + return x; + } + + if( base.IsNan() ) + { + if( err ) *err = err_improper_argument; + return base; + } + + ValueType result; + uint state = result.Log(x, base); + + if( err ) + { + switch( state ) + { + case 0: + *err = err_ok; + break; + case 1: + *err = err_overflow; + break; + case 2: + case 3: + *err = err_improper_argument; + break; + default: + *err = err_internal_error; + break; + } + } + + return result; + } + + + /*! + this function calculates the expression e^x + */ + template + ValueType Exp(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType result; + uint c = result.Exp(x); + + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + * + * trigonometric functions + * + */ + + + /* + this namespace consists of auxiliary functions + (something like 'private' in a class) + */ + namespace auxiliaryfunctions + { + + /*! + an auxiliary function for calculating the Sine + (you don't have to call this function) + */ + template + uint PrepareSin(ValueType & x, bool & change_sign) + { + ValueType temp; + + change_sign = false; + + if( x.IsSign() ) + { + // we're using the formula 'sin(-x) = -sin(x)' + change_sign = !change_sign; + x.ChangeSign(); + } + + // we're reducing the period 2*PI + // (for big values there'll always be zero) + temp.Set2Pi(); + + if( x.Mod(temp) ) + return 1; + + + // we're setting 'x' as being in the range of <0, 0.5PI> + + temp.SetPi(); + + if( x > temp ) + { + // x is in (pi, 2*pi> + x.Sub( temp ); + change_sign = !change_sign; + } + + temp.Set05Pi(); + + if( x > temp ) + { + // x is in (0.5pi, pi> + x.Sub( temp ); + x = temp - x; + } + + return 0; + } + + + /*! + an auxiliary function for calculating the Sine + (you don't have to call this function) + + it returns Sin(x) where 'x' is from <0, PI/2> + we're calculating the Sin with using Taylor series in zero or PI/2 + (depending on which point of these two points is nearer to the 'x') + + Taylor series: + sin(x) = sin(a) + cos(a)*(x-a)/(1!) + - sin(a)*((x-a)^2)/(2!) - cos(a)*((x-a)^3)/(3!) + + sin(a)*((x-a)^4)/(4!) + ... + + when a=0 it'll be: + sin(x) = (x)/(1!) - (x^3)/(3!) + (x^5)/(5!) - (x^7)/(7!) + (x^9)/(9!) ... + + and when a=PI/2: + sin(x) = 1 - ((x-PI/2)^2)/(2!) + ((x-PI/2)^4)/(4!) - ((x-PI/2)^6)/(6!) ... + */ + template + ValueType Sin0pi05(const ValueType & x) + { + ValueType result; + ValueType numerator, denominator; + ValueType d_numerator, d_denominator; + ValueType one, temp, old_result; + + // temp = pi/4 + temp.Set05Pi(); + temp.exponent.SubOne(); + + one.SetOne(); + + if( x < temp ) + { + // we're using the Taylor series with a=0 + result = x; + numerator = x; + denominator = one; + + // d_numerator = x^2 + d_numerator = x; + d_numerator.Mul(x); + + d_denominator = 2; + } + else + { + // we're using the Taylor series with a=PI/2 + result = one; + numerator = one; + denominator = one; + + // d_numerator = (x-pi/2)^2 + ValueType pi05; + pi05.Set05Pi(); + + temp = x; + temp.Sub( pi05 ); + d_numerator = temp; + d_numerator.Mul( temp ); + + d_denominator = one; + } + + uint c = 0; + bool addition = false; + + old_result = result; + for(uint i=1 ; i<=TTMATH_ARITHMETIC_MAX_LOOP ; ++i) + { + // we're starting from a second part of the formula + c += numerator. Mul( d_numerator ); + c += denominator. Mul( d_denominator ); + c += d_denominator.Add( one ); + c += denominator. Mul( d_denominator ); + c += d_denominator.Add( one ); + temp = numerator; + c += temp.Div(denominator); + + if( c ) + // Sin is from <-1,1> and cannot make an overflow + // but the carry can be from the Taylor series + // (then we only break our calculations) + break; + + if( addition ) + result.Add( temp ); + else + result.Sub( temp ); + + + addition = !addition; + + // we're testing whether the result has changed after adding + // the next part of the Taylor formula, if not we end the loop + // (it means 'x' is zero or 'x' is PI/2 or this part of the formula + // is too small) + if( result == old_result ) + break; + + old_result = result; + } + + return result; + } + + } // namespace auxiliaryfunctions + + + + /*! + this function calculates the Sine + */ + template + ValueType Sin(ValueType x, ErrorCode * err = 0) + { + using namespace auxiliaryfunctions; + + ValueType one, result; + bool change_sign; + + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; + } + + if( err ) + *err = err_ok; + + if( PrepareSin( x, change_sign ) ) + { + // x is too big, we cannnot reduce the 2*PI period + // prior to version 0.8.5 the result was zero + + // result has NaN flag set by default + + if( err ) + *err = err_overflow; // maybe another error code? err_improper_argument? + + return result; // NaN is set by default + } + + result = Sin0pi05( x ); + + one.SetOne(); + + // after calculations there can be small distortions in the result + if( result > one ) + result = one; + else + if( result.IsSign() ) + // we've calculated the sin from <0, pi/2> and the result + // should be positive + result.SetZero(); + + if( change_sign ) + result.ChangeSign(); + + return result; + } + + + /*! + this function calulates the Cosine + we're using the formula cos(x) = sin(x + PI/2) + */ + template + ValueType Cos(ValueType x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType pi05; + pi05.Set05Pi(); + + uint c = x.Add( pi05 ); + + if( c ) + { + if( err ) + *err = err_overflow; + + return ValueType(); // result is undefined (NaN is set by default) + } + + return Sin(x, err); + } + + + /*! + this function calulates the Tangent + we're using the formula tan(x) = sin(x) / cos(x) + + it takes more time than calculating the Tan directly + from for example Taylor series but should be a bit preciser + because Tan receives its values from -infinity to +infinity + and when we calculate it from any series then we can make + a greater mistake than calculating 'sin/cos' + */ + template + ValueType Tan(const ValueType & x, ErrorCode * err = 0) + { + ValueType result = Cos(x, err); + + if( err && *err != err_ok ) + return result; + + if( result.IsZero() ) + { + if( err ) + *err = err_improper_argument; + + result.SetNan(); + + return result; + } + + return Sin(x, err) / result; + } + + + /*! + this function calulates the Tangent + look at the description of Tan(...) + + (the abbreviation of Tangent can be 'tg' as well) + */ + template + ValueType Tg(const ValueType & x, ErrorCode * err = 0) + { + return Tan(x, err); + } + + + /*! + this function calulates the Cotangent + we're using the formula tan(x) = cos(x) / sin(x) + + (why do we make it in this way? + look at information in Tan() function) + */ + template + ValueType Cot(const ValueType & x, ErrorCode * err = 0) + { + ValueType result = Sin(x, err); + + if( err && *err != err_ok ) + return result; + + if( result.IsZero() ) + { + if( err ) + *err = err_improper_argument; + + result.SetNan(); + + return result; + } + + return Cos(x, err) / result; + } + + + /*! + this function calulates the Cotangent + look at the description of Cot(...) + + (the abbreviation of Cotangent can be 'ctg' as well) + */ + template + ValueType Ctg(const ValueType & x, ErrorCode * err = 0) + { + return Cot(x, err); + } + + + /* + * + * inverse trigonometric functions + * + * + */ + + namespace auxiliaryfunctions + { + + /*! + an auxiliary function for calculating the Arc Sine + + we're calculating asin from the following formula: + asin(x) = x + (1*x^3)/(2*3) + (1*3*x^5)/(2*4*5) + (1*3*5*x^7)/(2*4*6*7) + ... + where abs(x) <= 1 + + we're using this formula when x is from <0, 1/2> + */ + template + ValueType ASin_0(const ValueType & x) + { + ValueType nominator, denominator, nominator_add, nominator_x, denominator_add, denominator_x; + ValueType two, result(x), x2(x); + ValueType nominator_temp, denominator_temp, old_result = result; + uint c = 0; + + x2.Mul(x); + two = 2; + + nominator.SetOne(); + denominator = two; + nominator_add = nominator; + denominator_add = denominator; + nominator_x = x; + denominator_x = 3; + + for(uint i=1 ; i<=TTMATH_ARITHMETIC_MAX_LOOP ; ++i) + { + c += nominator_x.Mul(x2); + nominator_temp = nominator_x; + c += nominator_temp.Mul(nominator); + denominator_temp = denominator; + c += denominator_temp.Mul(denominator_x); + c += nominator_temp.Div(denominator_temp); + + // if there is a carry somewhere we only break the calculating + // the result should be ok -- it's from <-pi/2, pi/2> + if( c ) + break; + + result.Add(nominator_temp); + + if( result == old_result ) + // there's no sense to calculate more + break; + + old_result = result; + + + c += nominator_add.Add(two); + c += denominator_add.Add(two); + c += nominator.Mul(nominator_add); + c += denominator.Mul(denominator_add); + c += denominator_x.Add(two); + } + + return result; + } + + + + /*! + an auxiliary function for calculating the Arc Sine + + we're calculating asin from the following formula: + asin(x) = pi/2 - sqrt(2)*sqrt(1-x) * asin_temp + asin_temp = 1 + (1*(1-x))/((2*3)*(2)) + (1*3*(1-x)^2)/((2*4*5)*(4)) + (1*3*5*(1-x)^3)/((2*4*6*7)*(8)) + ... + + where abs(x) <= 1 + + we're using this formula when x is from (1/2, 1> + */ + template + ValueType ASin_1(const ValueType & x) + { + ValueType nominator, denominator, nominator_add, nominator_x, nominator_x_add, denominator_add, denominator_x; + ValueType denominator2; + ValueType one, two, result; + ValueType nominator_temp, denominator_temp, old_result; + uint c = 0; + + two = 2; + + one.SetOne(); + nominator = one; + result = one; + old_result = result; + denominator = two; + nominator_add = nominator; + denominator_add = denominator; + nominator_x = one; + nominator_x.Sub(x); + nominator_x_add = nominator_x; + denominator_x = 3; + denominator2 = two; + + + for(uint i=1 ; i<=TTMATH_ARITHMETIC_MAX_LOOP ; ++i) + { + nominator_temp = nominator_x; + c += nominator_temp.Mul(nominator); + denominator_temp = denominator; + c += denominator_temp.Mul(denominator_x); + c += denominator_temp.Mul(denominator2); + c += nominator_temp.Div(denominator_temp); + + // if there is a carry somewhere we only break the calculating + // the result should be ok -- it's from <-pi/2, pi/2> + if( c ) + break; + + result.Add(nominator_temp); + + if( result == old_result ) + // there's no sense to calculate more + break; + + old_result = result; + + c += nominator_x.Mul(nominator_x_add); + c += nominator_add.Add(two); + c += denominator_add.Add(two); + c += nominator.Mul(nominator_add); + c += denominator.Mul(denominator_add); + c += denominator_x.Add(two); + c += denominator2.Mul(two); + } + + + nominator_x_add.exponent.AddOne(); // *2 + one.exponent.SubOne(); // =0.5 + nominator_x_add.Pow(one); // =sqrt(nominator_x_add) + result.Mul(nominator_x_add); + + one.Set05Pi(); + one.Sub(result); + + return one; + } + + + } // namespace auxiliaryfunctions + + + /*! + this function calculates the Arc Sine + x is from <-1,1> + */ + template + ValueType ASin(ValueType x, ErrorCode * err = 0) + { + using namespace auxiliaryfunctions; + + ValueType result, one; + one.SetOne(); + bool change_sign = false; + + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; + } + + if( x.GreaterWithoutSignThan(one) ) + { + if( err ) + *err = err_improper_argument; + + return result; // NaN is set by default + } + + if( x.IsSign() ) + { + change_sign = true; + x.Abs(); + } + + one.exponent.SubOne(); // =0.5 + + // asin(-x) = -asin(x) + if( x.GreaterWithoutSignThan(one) ) + result = ASin_1(x); + else + result = ASin_0(x); + + if( change_sign ) + result.ChangeSign(); + + if( err ) + *err = err_ok; + + return result; + } + + + /*! + this function calculates the Arc Cosine + + we're using the formula: + acos(x) = pi/2 - asin(x) + */ + template + ValueType ACos(const ValueType & x, ErrorCode * err = 0) + { + ValueType temp; + + temp.Set05Pi(); + temp.Sub(ASin(x, err)); + + return temp; + } + + + + namespace auxiliaryfunctions + { + + /*! + an auxiliary function for calculating the Arc Tangent + + arc tan (x) where x is in <0; 0.5) + (x can be in (-0.5 ; 0.5) too) + + we're using the Taylor series expanded in zero: + atan(x) = x - (x^3)/3 + (x^5)/5 - (x^7)/7 + ... + */ + template + ValueType ATan0(const ValueType & x) + { + ValueType nominator, denominator, nominator_add, denominator_add, temp; + ValueType result, old_result; + bool adding = false; + uint c = 0; + + result = x; + old_result = result; + nominator = x; + nominator_add = x; + nominator_add.Mul(x); + + denominator.SetOne(); + denominator_add = 2; + + for(uint i=1 ; i<=TTMATH_ARITHMETIC_MAX_LOOP ; ++i) + { + c += nominator.Mul(nominator_add); + c += denominator.Add(denominator_add); + + temp = nominator; + c += temp.Div(denominator); + + if( c ) + // the result should be ok + break; + + if( adding ) + result.Add(temp); + else + result.Sub(temp); + + if( result == old_result ) + // there's no sense to calculate more + break; + + old_result = result; + adding = !adding; + } + + return result; + } + + + /*! + an auxiliary function for calculating the Arc Tangent + + where x is in <0 ; 1> + */ + template + ValueType ATan01(const ValueType & x) + { + ValueType half; + half.Set05(); + + /* + it would be better if we chose about sqrt(2)-1=0.41... instead of 0.5 here + + because as you can see below: + when x = sqrt(2)-1 + abs(x) = abs( (x-1)/(1+x) ) + so when we're calculating values around x + then they will be better converged to each other + + for example if we have x=0.4999 then during calculating ATan0(0.4999) + we have to make about 141 iterations but when we have x=0.5 + then during calculating ATan0( (x-1)/(1+x) ) we have to make + only about 89 iterations (both for Big<3,9>) + + in the future this 0.5 can be changed + */ + if( x.SmallerWithoutSignThan(half) ) + return ATan0(x); + + + /* + x>=0.5 and x<=1 + (x can be even smaller than 0.5) + + y = atac(x) + x = tan(y) + + tan(y-b) = (tan(y)-tab(b)) / (1+tan(y)*tan(b)) + y-b = atan( (tan(y)-tab(b)) / (1+tan(y)*tan(b)) ) + y = b + atan( (x-tab(b)) / (1+x*tan(b)) ) + + let b = pi/4 + tan(b) = tan(pi/4) = 1 + y = pi/4 + atan( (x-1)/(1+x) ) + + so + atac(x) = pi/4 + atan( (x-1)/(1+x) ) + when x->1 (x converges to 1) the (x-1)/(1+x) -> 0 + and we can use ATan0() function here + */ + + ValueType n(x),d(x),one,result; + + one.SetOne(); + n.Sub(one); + d.Add(one); + n.Div(d); + + result = ATan0(n); + + n.Set05Pi(); + n.exponent.SubOne(); // =pi/4 + result.Add(n); + + return result; + } + + + /*! + an auxiliary function for calculating the Arc Tangent + where x > 1 + + we're using the formula: + atan(x) = pi/2 - atan(1/x) for x>0 + */ + template + ValueType ATanGreaterThanPlusOne(const ValueType & x) + { + ValueType temp, atan; + + temp.SetOne(); + + if( temp.Div(x) ) + { + // if there was a carry here that means x is very big + // and atan(1/x) fast converged to 0 + atan.SetZero(); + } + else + atan = ATan01(temp); + + temp.Set05Pi(); + temp.Sub(atan); + + return temp; + } + + } // namespace auxiliaryfunctions + + + /*! + this function calculates the Arc Tangent + */ + template + ValueType ATan(ValueType x) + { + using namespace auxiliaryfunctions; + + ValueType one, result; + one.SetOne(); + bool change_sign = false; + + if( x.IsNan() ) + return x; + + // if x is negative we're using the formula: + // atan(-x) = -atan(x) + if( x.IsSign() ) + { + change_sign = true; + x.Abs(); + } + + if( x.GreaterWithoutSignThan(one) ) + result = ATanGreaterThanPlusOne(x); + else + result = ATan01(x); + + if( change_sign ) + result.ChangeSign(); + + return result; + } + + + /*! + this function calculates the Arc Tangent + look at the description of ATan(...) + + (the abbreviation of Arc Tangent can be 'atg' as well) + */ + template + ValueType ATg(const ValueType & x) + { + return ATan(x); + } + + + /*! + this function calculates the Arc Cotangent + + we're using the formula: + actan(x) = pi/2 - atan(x) + */ + template + ValueType ACot(const ValueType & x) + { + ValueType result; + + result.Set05Pi(); + result.Sub(ATan(x)); + + return result; + } + + + /*! + this function calculates the Arc Cotangent + look at the description of ACot(...) + + (the abbreviation of Arc Cotangent can be 'actg' as well) + */ + template + ValueType ACtg(const ValueType & x) + { + return ACot(x); + } + + + /* + * + * hyperbolic functions + * + * + */ + + + /*! + this function calculates the Hyperbolic Sine + + we're using the formula sinh(x)= ( e^x - e^(-x) ) / 2 + */ + template + ValueType Sinh(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType ex, emx; + uint c = 0; + + c += ex.Exp(x); + c += emx.Exp(-x); + + c += ex.Sub(emx); + c += ex.exponent.SubOne(); + + if( err ) + *err = c ? err_overflow : err_ok; + + return ex; + } + + + /*! + this function calculates the Hyperbolic Cosine + + we're using the formula cosh(x)= ( e^x + e^(-x) ) / 2 + */ + template + ValueType Cosh(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType ex, emx; + uint c = 0; + + c += ex.Exp(x); + c += emx.Exp(-x); + + c += ex.Add(emx); + c += ex.exponent.SubOne(); + + if( err ) + *err = c ? err_overflow : err_ok; + + return ex; + } + + + /*! + this function calculates the Hyperbolic Tangent + + we're using the formula tanh(x)= ( e^x - e^(-x) ) / ( e^x + e^(-x) ) + */ + template + ValueType Tanh(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType ex, emx, nominator, denominator; + uint c = 0; + + c += ex.Exp(x); + c += emx.Exp(-x); + + nominator = ex; + c += nominator.Sub(emx); + denominator = ex; + c += denominator.Add(emx); + + c += nominator.Div(denominator); + + if( err ) + *err = c ? err_overflow : err_ok; + + return nominator; + } + + + /*! + this function calculates the Hyperbolic Tangent + look at the description of Tanh(...) + + (the abbreviation of Hyperbolic Tangent can be 'tgh' as well) + */ + template + ValueType Tgh(const ValueType & x, ErrorCode * err = 0) + { + return Tanh(x, err); + } + + /*! + this function calculates the Hyperbolic Cotangent + + we're using the formula coth(x)= ( e^x + e^(-x) ) / ( e^x - e^(-x) ) + */ + template + ValueType Coth(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + if( x.IsZero() ) + { + if( err ) + *err = err_improper_argument; + + return ValueType(); // NaN is set by default + } + + ValueType ex, emx, nominator, denominator; + uint c = 0; + + c += ex.Exp(x); + c += emx.Exp(-x); + + nominator = ex; + c += nominator.Add(emx); + denominator = ex; + c += denominator.Sub(emx); + + c += nominator.Div(denominator); + + if( err ) + *err = c ? err_overflow : err_ok; + + return nominator; + } + + + /*! + this function calculates the Hyperbolic Cotangent + look at the description of Coth(...) + + (the abbreviation of Hyperbolic Cotangent can be 'ctgh' as well) + */ + template + ValueType Ctgh(const ValueType & x, ErrorCode * err = 0) + { + return Coth(x, err); + } + + + /* + * + * inverse hyperbolic functions + * + * + */ + + + /*! + inverse hyperbolic sine + + asinh(x) = ln( x + sqrt(x^2 + 1) ) + */ + template + ValueType ASinh(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType xx(x), one, result; + uint c = 0; + one.SetOne(); + + c += xx.Mul(x); + c += xx.Add(one); + one.exponent.SubOne(); // one=0.5 + // xx is >= 1 + c += xx.PowFrac(one); // xx=sqrt(xx) + c += xx.Add(x); + c += result.Ln(xx); // xx > 0 + + // here can only be a carry + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + inverse hyperbolic cosine + + acosh(x) = ln( x + sqrt(x^2 - 1) ) x in <1, infinity) + */ + template + ValueType ACosh(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType xx(x), one, result; + uint c = 0; + one.SetOne(); + + if( x < one ) + { + if( err ) + *err = err_improper_argument; + + return result; // NaN is set by default + } + + c += xx.Mul(x); + c += xx.Sub(one); + // xx is >= 0 + // we can't call a PowFrac when the 'x' is zero + // if x is 0 the sqrt(0) is 0 + if( !xx.IsZero() ) + { + one.exponent.SubOne(); // one=0.5 + c += xx.PowFrac(one); // xx=sqrt(xx) + } + c += xx.Add(x); + c += result.Ln(xx); // xx >= 1 + + // here can only be a carry + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + inverse hyperbolic tangent + + atanh(x) = 0.5 * ln( (1+x) / (1-x) ) x in (-1, 1) + */ + template + ValueType ATanh(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType nominator(x), denominator, one, result; + uint c = 0; + one.SetOne(); + + if( !x.SmallerWithoutSignThan(one) ) + { + if( err ) + *err = err_improper_argument; + + return result; // NaN is set by default + } + + c += nominator.Add(one); + denominator = one; + c += denominator.Sub(x); + c += nominator.Div(denominator); + c += result.Ln(nominator); + c += result.exponent.SubOne(); + + // here can only be a carry + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + inverse hyperbolic tantent + */ + template + ValueType ATgh(const ValueType & x, ErrorCode * err = 0) + { + return ATanh(x, err); + } + + + /*! + inverse hyperbolic cotangent + + acoth(x) = 0.5 * ln( (x+1) / (x-1) ) x in (-infinity, -1) or (1, infinity) + */ + template + ValueType ACoth(const ValueType & x, ErrorCode * err = 0) + { + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; // NaN + } + + ValueType nominator(x), denominator(x), one, result; + uint c = 0; + one.SetOne(); + + if( !x.GreaterWithoutSignThan(one) ) + { + if( err ) + *err = err_improper_argument; + + return result; // NaN is set by default + } + + c += nominator.Add(one); + c += denominator.Sub(one); + c += nominator.Div(denominator); + c += result.Ln(nominator); + c += result.exponent.SubOne(); + + // here can only be a carry + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + inverse hyperbolic cotantent + */ + template + ValueType ACtgh(const ValueType & x, ErrorCode * err = 0) + { + return ACoth(x, err); + } + + + + + + /* + * + * functions for converting between degrees, radians and gradians + * + * + */ + + + /*! + this function converts degrees to radians + + it returns: x * pi / 180 + */ + template + ValueType DegToRad(const ValueType & x, ErrorCode * err = 0) + { + ValueType result, temp; + uint c = 0; + + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; + } + + result = x; + + // it is better to make division first and then multiplication + // the result is more accurate especially when x is: 90,180,270 or 360 + temp = 180; + c += result.Div(temp); + + temp.SetPi(); + c += result.Mul(temp); + + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + this function converts radians to degrees + + it returns: x * 180 / pi + */ + template + ValueType RadToDeg(const ValueType & x, ErrorCode * err = 0) + { + ValueType result, delimiter; + uint c = 0; + + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; + } + + result = 180; + c += result.Mul(x); + + delimiter.SetPi(); + c += result.Div(delimiter); + + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + this function converts degrees in the long format into one value + + long format: (degrees, minutes, seconds) + minutes and seconds must be greater than or equal zero + + result: + if d>=0 : result= d + ((s/60)+m)/60 + if d<0 : result= d - ((s/60)+m)/60 + + ((s/60)+m)/60 = (s+60*m)/3600 (second version is faster because + there's only one division) + + for example: + DegToDeg(10, 30, 0) = 10.5 + DegToDeg(10, 24, 35.6)=10.4098(8) + */ + template + ValueType DegToDeg( const ValueType & d, const ValueType & m, const ValueType & s, + ErrorCode * err = 0) + { + ValueType delimiter, multipler; + uint c = 0; + + if( d.IsNan() || m.IsNan() || s.IsNan() || m.IsSign() || s.IsSign() ) + { + if( err ) + *err = err_improper_argument; + + delimiter.SetZeroNan(); // not needed, only to get rid of GCC warning about an uninitialized variable + + return delimiter; + } + + multipler = 60; + delimiter = 3600; + + c += multipler.Mul(m); + c += multipler.Add(s); + c += multipler.Div(delimiter); + + if( d.IsSign() ) + multipler.ChangeSign(); + + c += multipler.Add(d); + + if( err ) + *err = c ? err_overflow : err_ok; + + return multipler; + } + + + /*! + this function converts degrees in the long format to radians + */ + template + ValueType DegToRad( const ValueType & d, const ValueType & m, const ValueType & s, + ErrorCode * err = 0) + { + ValueType temp_deg = DegToDeg(d,m,s,err); + + if( err && *err!=err_ok ) + return temp_deg; + + return DegToRad(temp_deg, err); + } + + + /*! + this function converts gradians to radians + + it returns: x * pi / 200 + */ + template + ValueType GradToRad(const ValueType & x, ErrorCode * err = 0) + { + ValueType result, temp; + uint c = 0; + + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; + } + + result = x; + + // it is better to make division first and then multiplication + // the result is more accurate especially when x is: 100,200,300 or 400 + temp = 200; + c += result.Div(temp); + + temp.SetPi(); + c += result.Mul(temp); + + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + this function converts radians to gradians + + it returns: x * 200 / pi + */ + template + ValueType RadToGrad(const ValueType & x, ErrorCode * err = 0) + { + ValueType result, delimiter; + uint c = 0; + + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; + } + + result = 200; + c += result.Mul(x); + + delimiter.SetPi(); + c += result.Div(delimiter); + + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + this function converts degrees to gradians + + it returns: x * 200 / 180 + */ + template + ValueType DegToGrad(const ValueType & x, ErrorCode * err = 0) + { + ValueType result, temp; + uint c = 0; + + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; + } + + result = x; + + temp = 200; + c += result.Mul(temp); + + temp = 180; + c += result.Div(temp); + + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + /*! + this function converts degrees in the long format to gradians + */ + template + ValueType DegToGrad( const ValueType & d, const ValueType & m, const ValueType & s, + ErrorCode * err = 0) + { + ValueType temp_deg = DegToDeg(d,m,s,err); + + if( err && *err!=err_ok ) + return temp_deg; + + return DegToGrad(temp_deg, err); + } + + + /*! + this function converts degrees to gradians + + it returns: x * 180 / 200 + */ + template + ValueType GradToDeg(const ValueType & x, ErrorCode * err = 0) + { + ValueType result, temp; + uint c = 0; + + if( x.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return x; + } + + result = x; + + temp = 180; + c += result.Mul(temp); + + temp = 200; + c += result.Div(temp); + + if( err ) + *err = c ? err_overflow : err_ok; + + return result; + } + + + + + /* + * + * another functions + * + * + */ + + + /*! + this function calculates the square root + + Sqrt(9) = 3 + */ + template + ValueType Sqrt(ValueType x, ErrorCode * err = 0) + { + if( x.IsNan() || x.IsSign() ) + { + if( err ) + *err = err_improper_argument; + + x.SetNan(); + + return x; + } + + uint c = x.Sqrt(); + + if( err ) + *err = c ? err_overflow : err_ok; + + return x; + } + + + + namespace auxiliaryfunctions + { + + template + bool RootCheckIndexSign(ValueType & x, const ValueType & index, ErrorCode * err) + { + if( index.IsSign() ) + { + // index cannot be negative + if( err ) + *err = err_improper_argument; + + x.SetNan(); + + return true; + } + + return false; + } + + + template + bool RootCheckIndexZero(ValueType & x, const ValueType & index, ErrorCode * err) + { + if( index.IsZero() ) + { + if( x.IsZero() ) + { + // there isn't root(0;0) - we assume it's not defined + if( err ) + *err = err_improper_argument; + + x.SetNan(); + + return true; + } + + // root(x;0) is 1 (if x!=0) + x.SetOne(); + + if( err ) + *err = err_ok; + + return true; + } + + return false; + } + + + template + bool RootCheckIndexOne(const ValueType & index, ErrorCode * err) + { + ValueType one; + one.SetOne(); + + if( index == one ) + { + //root(x;1) is x + // we do it because if we used the PowFrac function + // we would lose the precision + if( err ) + *err = err_ok; + + return true; + } + + return false; + } + + + template + bool RootCheckIndexTwo(ValueType & x, const ValueType & index, ErrorCode * err) + { + if( index == 2 ) + { + x = Sqrt(x, err); + + return true; + } + + return false; + } + + + template + bool RootCheckIndexFrac(ValueType & x, const ValueType & index, ErrorCode * err) + { + if( !index.IsInteger() ) + { + // index must be integer + if( err ) + *err = err_improper_argument; + + x.SetNan(); + + return true; + } + + return false; + } + + + template + bool RootCheckXZero(ValueType & x, ErrorCode * err) + { + if( x.IsZero() ) + { + // root(0;index) is zero (if index!=0) + // RootCheckIndexZero() must be called beforehand + x.SetZero(); + + if( err ) + *err = err_ok; + + return true; + } + + return false; + } + + + template + bool RootCheckIndex(ValueType & x, const ValueType & index, ErrorCode * err, bool * change_sign) + { + *change_sign = false; + + if( index.Mod2() ) + { + // index is odd (1,3,5...) + if( x.IsSign() ) + { + *change_sign = true; + x.Abs(); + } + } + else + { + // index is even + // x cannot be negative + if( x.IsSign() ) + { + if( err ) + *err = err_improper_argument; + + x.SetNan(); + + return true; + } + } + + return false; + } + + + template + uint RootCorrectInteger(ValueType & old_x, ValueType & x, const ValueType & index) + { + if( !old_x.IsInteger() || x.IsInteger() || !index.exponent.IsSign() ) + return 0; + + // old_x is integer, + // x is not integer, + // index is relatively small (index.exponent<0 or index.exponent<=0) + // (because we're using a special powering algorithm Big::PowUInt()) + + uint c = 0; + + ValueType temp(x); + c += temp.Round(); + + ValueType temp_round(temp); + c += temp.PowUInt(index); + + if( temp == old_x ) + x = temp_round; + + return (c==0)? 0 : 1; + } + + + + } // namespace auxiliaryfunctions + + + + /*! + indexth Root of x + index must be integer and not negative <0;1;2;3....) + + if index==0 the result is one + if x==0 the result is zero and we assume root(0;0) is not defined + + if index is even (2;4;6...) the result is x^(1/index) and x>0 + if index is odd (1;2;3;...) the result is either + -(abs(x)^(1/index)) if x<0 or + x^(1/index)) if x>0 + + (for index==1 the result is equal x) + */ + template + ValueType Root(ValueType x, const ValueType & index, ErrorCode * err = 0) + { + using namespace auxiliaryfunctions; + + if( x.IsNan() || index.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + x.SetNan(); + + return x; + } + + if( RootCheckIndexSign(x, index, err) ) return x; + if( RootCheckIndexZero(x, index, err) ) return x; + if( RootCheckIndexOne ( index, err) ) return x; + if( RootCheckIndexTwo (x, index, err) ) return x; + if( RootCheckIndexFrac(x, index, err) ) return x; + if( RootCheckXZero (x, err) ) return x; + + // index integer and index!=0 + // x!=0 + + ValueType old_x(x); + bool change_sign; + + if( RootCheckIndex(x, index, err, &change_sign ) ) return x; + + ValueType temp; + uint c = 0; + + // we're using the formula: root(x ; n) = exp( ln(x) / n ) + c += temp.Ln(x); + c += temp.Div(index); + c += x.Exp(temp); + + if( change_sign ) + { + // x is different from zero + x.SetSign(); + } + + c += RootCorrectInteger(old_x, x, index); + + if( err ) + *err = c ? err_overflow : err_ok; + + return x; + } + + + + /*! + absolute value of x + e.g. -2 = 2 + 2 = 2 + */ + template + ValueType Abs(const ValueType & x) + { + ValueType result( x ); + result.Abs(); + + return result; + } + + + /*! + it returns the sign of the value + e.g. -2 = -1 + 0 = 0 + 10 = 1 + */ + template + ValueType Sgn(ValueType x) + { + x.Sgn(); + + return x; + } + + + /*! + the remainder from a division + + e.g. + mod( 12.6 ; 3) = 0.6 because 12.6 = 3*4 + 0.6 + mod(-12.6 ; 3) = -0.6 bacause -12.6 = 3*(-4) + (-0.6) + mod( 12.6 ; -3) = 0.6 + mod(-12.6 ; -3) = -0.6 + */ + template + ValueType Mod(ValueType a, const ValueType & b, ErrorCode * err = 0) + { + if( a.IsNan() || b.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + a.SetNan(); + + return a; + } + + uint c = a.Mod(b); + + if( err ) + *err = c ? err_overflow : err_ok; + + return a; + } + + + + namespace auxiliaryfunctions + { + + /*! + this function is used to store factorials in a given container + 'more' means how many values should be added at the end + + e.g. + std::vector fact; + SetFactorialSequence(fact, 3); + // now the container has three values: 1 1 2 + + SetFactorialSequence(fact, 2); + // now the container has five values: 1 1 2 6 24 + */ + template + void SetFactorialSequence(std::vector & fact, uint more = 20) + { + if( more == 0 ) + more = 1; + + uint start = static_cast(fact.size()); + fact.resize(fact.size() + more); + + if( start == 0 ) + { + fact[0] = 1; + ++start; + } + + for(uint i=start ; i + ValueType SetBernoulliNumbersSum(CGamma & cgamma, const ValueType & n_, uint m, + const volatile StopCalculating * stop = 0) + { + ValueType k_, temp, temp2, temp3, sum; + + sum.SetZero(); + + for(uint k=0 ; kWasStopSignal() ) + return ValueType(); // NaN + + if( k>1 && (k & 1) == 1 ) // for that k the Bernoulli number is zero + continue; + + k_ = k; + + temp = n_; // n_ is equal 2 + temp.Pow(k_); + // temp = 2^k + + temp2 = cgamma.fact[m]; + temp3 = cgamma.fact[k]; + temp3.Mul(cgamma.fact[m-k]); + temp2.Div(temp3); + // temp2 = (m k) = m! / ( k! * (m-k)! ) + + temp.Mul(temp2); + temp.Mul(cgamma.bern[k]); + + sum.Add(temp); + // sum += 2^k * (m k) * B(k) + + if( sum.IsNan() ) + break; + } + + return sum; + } + + + /*! + an auxiliary function used to calculate Bernoulli numbers + start is >= 2 + + we use the recurrence formula: + B(m) = 1 / (2*(1 - 2^m)) * sum(m) + where sum(m) is calculated by SetBernoulliNumbersSum() + */ + template + bool SetBernoulliNumbersMore(CGamma & cgamma, uint start, const volatile StopCalculating * stop = 0) + { + ValueType denominator, temp, temp2, temp3, m_, sum, sum2, n_, k_; + + const uint n = 2; + n_ = n; + + // start is >= 2 + for(uint m=start ; mWasStopSignal() ) + { + cgamma.bern.resize(m); // valid numbers are in [0, m-1] + return false; + } + + cgamma.bern[m].Div(denominator); + } + } + + return true; + } + + + /*! + this function is used to calculate Bernoulli numbers, + returns false if there was a stop signal, + 'more' means how many values should be added at the end + + e.g. + typedef Big<1,2> MyBig; + CGamma cgamma; + SetBernoulliNumbers(cgamma, 3); + // now we have three first Bernoulli numbers: 1 -0.5 0.16667 + + SetBernoulliNumbers(cgamma, 4); + // now we have 7 Bernoulli numbers: 1 -0.5 0.16667 0 -0.0333 0 0.0238 + */ + template + bool SetBernoulliNumbers(CGamma & cgamma, uint more = 20, const volatile StopCalculating * stop = 0) + { + if( more == 0 ) + more = 1; + + uint start = static_cast(cgamma.bern.size()); + cgamma.bern.resize(cgamma.bern.size() + more); + + if( start == 0 ) + { + cgamma.bern[0].SetOne(); + ++start; + } + + if( cgamma.bern.size() == 1 ) + return true; + + if( start == 1 ) + { + cgamma.bern[1].Set05(); + cgamma.bern[1].ChangeSign(); + ++start; + } + + // we should have sufficient factorials in cgamma.fact + if( cgamma.fact.size() < cgamma.bern.size() ) + SetFactorialSequence(cgamma.fact, static_cast(cgamma.bern.size() - cgamma.fact.size())); + + + return SetBernoulliNumbersMore(cgamma, start, stop); + } + + + /*! + an auxiliary function used to calculate the Gamma() function + + we calculate a sum: + sum(n) = sum_{m=2} { B(m) / ( (m^2 - m) * n^(m-1) ) } = 1/(12*n) - 1/(360*n^3) + 1/(1260*n^5) + ... + B(m) means a mth Bernoulli number + the sum starts from m=2, we calculate as long as the value will not change after adding a next part + */ + template + ValueType GammaFactorialHighSum(const ValueType & n, CGamma & cgamma, ErrorCode & err, + const volatile StopCalculating * stop) + { + ValueType temp, temp2, denominator, sum, oldsum; + + sum.SetZero(); + + for(uint m=2 ; mWasStopSignal() ) + { + err = err_interrupt; + return ValueType(); // NaN + } + + temp = (m-1); + denominator = n; + denominator.Pow(temp); + // denominator = n ^ (m-1) + + temp = m; + temp2 = temp; + temp.Mul(temp2); + temp.Sub(temp2); + // temp = m^2 - m + + denominator.Mul(temp); + // denominator = (m^2 - m) * n ^ (m-1) + + if( m >= cgamma.bern.size() ) + { + if( !SetBernoulliNumbers(cgamma, m - cgamma.bern.size() + 1 + 3, stop) ) // 3 more than needed + { + // there was the stop signal + err = err_interrupt; + return ValueType(); // NaN + } + } + + temp = cgamma.bern[m]; + temp.Div(denominator); + + oldsum = sum; + sum.Add(temp); + + if( sum.IsNan() || oldsum==sum ) + break; + } + + return sum; + } + + + /*! + an auxiliary function used to calculate the Gamma() function + + we calculate a helper function GammaFactorialHigh() by using Stirling's series: + n! = (n/e)^n * sqrt(2*pi*n) * exp( sum(n) ) + where n is a real number (not only an integer) and is sufficient large (greater than TTMATH_GAMMA_BOUNDARY) + and sum(n) is calculated by GammaFactorialHighSum() + */ + template + ValueType GammaFactorialHigh(const ValueType & n, CGamma & cgamma, ErrorCode & err, + const volatile StopCalculating * stop) + { + ValueType temp, temp2, temp3, denominator, sum; + + temp.Set2Pi(); + temp.Mul(n); + temp2 = Sqrt(temp); + // temp2 = sqrt(2*pi*n) + + temp = n; + temp3.SetE(); + temp.Div(temp3); + temp.Pow(n); + // temp = (n/e)^n + + sum = GammaFactorialHighSum(n, cgamma, err, stop); + temp3.Exp(sum); + // temp3 = exp(sum) + + temp.Mul(temp2); + temp.Mul(temp3); + + return temp; + } + + + /*! + an auxiliary function used to calculate the Gamma() function + + Gamma(x) = GammaFactorialHigh(x-1) + */ + template + ValueType GammaPlusHigh(ValueType n, CGamma & cgamma, ErrorCode & err, const volatile StopCalculating * stop) + { + ValueType one; + + one.SetOne(); + n.Sub(one); + + return GammaFactorialHigh(n, cgamma, err, stop); + } + + + /*! + an auxiliary function used to calculate the Gamma() function + + we use this function when n is integer and a small value (from 0 to TTMATH_GAMMA_BOUNDARY] + we use the formula: + gamma(n) = (n-1)! = 1 * 2 * 3 * ... * (n-1) + */ + template + ValueType GammaPlusLowIntegerInt(uint n, CGamma & cgamma) + { + TTMATH_ASSERT( n > 0 ) + + if( n - 1 < static_cast(cgamma.fact.size()) ) + return cgamma.fact[n - 1]; + + ValueType res; + uint start = 2; + + if( cgamma.fact.size() < 2 ) + { + res.SetOne(); + } + else + { + start = static_cast(cgamma.fact.size()); + res = cgamma.fact[start-1]; + } + + for(uint i=start ; i + ValueType GammaPlusLowInteger(const ValueType & n, CGamma & cgamma) + { + sint n_; + + n.ToInt(n_); + + return GammaPlusLowIntegerInt(n_, cgamma); + } + + + /*! + an auxiliary function used to calculate the Gamma() function + + we use this function when n is a small value (from 0 to TTMATH_GAMMA_BOUNDARY] + we use a recurrence formula: + gamma(z+1) = z * gamma(z) + then: gamma(z) = gamma(z+1) / z + + e.g. + gamma(3.89) = gamma(2001.89) / ( 3.89 * 4.89 * 5.89 * ... * 1999.89 * 2000.89 ) + */ + template + ValueType GammaPlusLow(ValueType n, CGamma & cgamma, ErrorCode & err, const volatile StopCalculating * stop) + { + ValueType one, denominator, temp, boundary; + + if( n.IsInteger() ) + return GammaPlusLowInteger(n, cgamma); + + one.SetOne(); + denominator = n; + boundary = TTMATH_GAMMA_BOUNDARY; + + while( n < boundary ) + { + n.Add(one); + denominator.Mul(n); + } + + n.Add(one); + + // now n is sufficient big + temp = GammaPlusHigh(n, cgamma, err, stop); + temp.Div(denominator); + + return temp; + } + + + /*! + an auxiliary function used to calculate the Gamma() function + */ + template + ValueType GammaPlus(const ValueType & n, CGamma & cgamma, ErrorCode & err, const volatile StopCalculating * stop) + { + if( n > TTMATH_GAMMA_BOUNDARY ) + return GammaPlusHigh(n, cgamma, err, stop); + + return GammaPlusLow(n, cgamma, err, stop); + } + + + /*! + an auxiliary function used to calculate the Gamma() function + + this function is used when n is negative + we use the reflection formula: + gamma(1-z) * gamma(z) = pi / sin(pi*z) + then: gamma(z) = pi / (sin(pi*z) * gamma(1-z)) + + */ + template + ValueType GammaMinus(const ValueType & n, CGamma & cgamma, ErrorCode & err, const volatile StopCalculating * stop) + { + ValueType pi, denominator, temp, temp2; + + if( n.IsInteger() ) + { + // gamma function is not defined when n is negative and integer + err = err_improper_argument; + return temp; // NaN + } + + pi.SetPi(); + + temp = pi; + temp.Mul(n); + temp2 = Sin(temp); + // temp2 = sin(pi * n) + + temp.SetOne(); + temp.Sub(n); + temp = GammaPlus(temp, cgamma, err, stop); + // temp = gamma(1 - n) + + temp.Mul(temp2); + pi.Div(temp); + + return pi; + } + + } // namespace auxiliaryfunctions + + + + /*! + this function calculates the Gamma function + + it's multithread safe, you should create a CGamma<> object and use it whenever you call the Gamma() + e.g. + typedef Big<1,2> MyBig; + MyBig x=234, y=345.53; + CGamma cgamma; + std::cout << Gamma(x, cgamma) << std::endl; + std::cout << Gamma(y, cgamma) << std::endl; + in the CGamma<> object the function stores some coefficients (factorials, Bernoulli numbers), + and they will be reused in next calls to the function + + each thread should have its own CGamma<> object, and you can use these objects with Factorial() function too + */ + template + ValueType Gamma(const ValueType & n, CGamma & cgamma, ErrorCode * err = 0, + const volatile StopCalculating * stop = 0) + { + using namespace auxiliaryfunctions; + + ValueType result; + ErrorCode err_tmp; + + if( n.IsNan() ) + { + if( err ) + *err = err_improper_argument; + + return n; + } + + if( cgamma.history.Get(n, result, err_tmp) ) + { + if( err ) + *err = err_tmp; + + return result; + } + + err_tmp = err_ok; + + if( n.IsSign() ) + { + result = GammaMinus(n, cgamma, err_tmp, stop); + } + else + if( n.IsZero() ) + { + err_tmp = err_improper_argument; + result.SetNan(); + } + else + { + result = GammaPlus(n, cgamma, err_tmp, stop); + } + + if( result.IsNan() && err_tmp==err_ok ) + err_tmp = err_overflow; + + if( err ) + *err = err_tmp; + + if( stop && !stop->WasStopSignal() ) + cgamma.history.Add(n, result, err_tmp); + + return result; + } + + + /*! + this function calculates the Gamma function + + note: this function should be used only in a single-thread environment + */ + template + ValueType Gamma(const ValueType & n, ErrorCode * err = 0) + { + // warning: this static object is not thread safe + static CGamma cgamma; + + return Gamma(n, cgamma, err); + } + + + + namespace auxiliaryfunctions + { + + /*! + an auxiliary function for calculating the factorial function + + we use the formula: + x! = gamma(x+1) + */ + template + ValueType Factorial2(ValueType x, + CGamma * cgamma = 0, + ErrorCode * err = 0, + const volatile StopCalculating * stop = 0) + { + ValueType result, one; + + if( x.IsNan() || x.IsSign() || !x.IsInteger() ) + { + if( err ) + *err = err_improper_argument; + + x.SetNan(); + + return x; + } + + one.SetOne(); + x.Add(one); + + if( cgamma ) + return Gamma(x, *cgamma, err, stop); + + return Gamma(x, err); + } + + } // namespace auxiliaryfunctions + + + + /*! + the factorial from given 'x' + e.g. + Factorial(4) = 4! = 1*2*3*4 + + it's multithread safe, you should create a CGamma<> object and use it whenever you call the Factorial() + e.g. + typedef Big<1,2> MyBig; + MyBig x=234, y=54345; + CGamma cgamma; + std::cout << Factorial(x, cgamma) << std::endl; + std::cout << Factorial(y, cgamma) << std::endl; + in the CGamma<> object the function stores some coefficients (factorials, Bernoulli numbers), + and they will be reused in next calls to the function + + each thread should have its own CGamma<> object, and you can use these objects with Gamma() function too + */ + template + ValueType Factorial(const ValueType & x, CGamma & cgamma, ErrorCode * err = 0, + const volatile StopCalculating * stop = 0) + { + return auxiliaryfunctions::Factorial2(x, &cgamma, err, stop); + } + + + /*! + the factorial from given 'x' + e.g. + Factorial(4) = 4! = 1*2*3*4 + + note: this function should be used only in a single-thread environment + */ + template + ValueType Factorial(const ValueType & x, ErrorCode * err = 0) + { + return auxiliaryfunctions::Factorial2(x, (CGamma*)0, err, 0); + } + + + /*! + this method prepares some coefficients: factorials and Bernoulli numbers + stored in 'fact' and 'bern' objects + + we're defining the method here because we're using Gamma() function which + is not available in ttmathobjects.h + + read the doc info in ttmathobjects.h file where CGamma<> struct is declared + */ + template + void CGamma::InitAll() + { + ValueType x = TTMATH_GAMMA_BOUNDARY + 1; + + // history.Remove(x) removes only one object + // we must be sure that there are not others objects with the key 'x' + while( history.Remove(x) ) + { + } + + // the simplest way to initialize is to call the Gamma function with (TTMATH_GAMMA_BOUNDARY + 1) + // when x is larger then fewer coefficients we need + Gamma(x, *this); + } + + + +} // namespace + + +/*! + this is for convenience for the user + he can only use '#include ' +*/ +#include "ttmathparser.h" + +// Dec is not finished yet +//#include "ttmathdec.h" + + + +#ifdef _MSC_VER +//warning C4127: conditional expression is constant +#pragma warning( default: 4127 ) +//warning C4702: unreachable code +#pragma warning( default: 4702 ) +//warning C4800: forcing value to bool 'true' or 'false' (performance warning) +#pragma warning( default: 4800 ) +#endif + +#endif diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathbig.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathbig.h new file mode 100644 index 00000000..45793b41 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathbig.h @@ -0,0 +1,6045 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2012, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + +#ifndef headerfilettmathbig +#define headerfilettmathbig + +/*! + \file ttmathbig.h + \brief A Class for representing floating point numbers +*/ + +#include "ttmathint.h" +#include "ttmaththreads.h" + +#include + +#ifdef TTMATH_MULTITHREADS +#include +#endif + +namespace ttmath +{ + + +/*! + \brief Big implements the floating point numbers +*/ +template +class Big +{ + +/* + value = mantissa * 2^exponent + + exponent - an integer value with a sign + mantissa - an integer value without a sing + + mantissa must be pushed into the left side that is the highest bit from + mantissa must be one (of course if there's another value than zero) -- this job + (pushing bits into the left side) making Standardizing() method + + for example: + if we want to store value one (1) into our Big object we must: + set mantissa to 1 + set exponent to 0 + set info to 0 + and call method Standardizing() +*/ + + +public: + +Int exponent; +UInt mantissa; +unsigned char info; + + +/*! + Sign + the mask of a bit from 'info' which means that there is a sign + (when the bit is set) +*/ +#define TTMATH_BIG_SIGN 128 + + +/*! + Not a number + if this bit is set that there is not a valid number +*/ +#define TTMATH_BIG_NAN 64 + + +/*! + Zero + if this bit is set that there is value zero + mantissa should be zero and exponent should be zero too + (the Standardizing() method does this) +*/ +#define TTMATH_BIG_ZERO 32 + + + /*! + this method sets NaN if there was a carry (and returns 1 in such a case) + + c can be 0, 1 or other value different from zero + */ + uint CheckCarry(uint c) + { + if( c != 0 ) + { + SetNan(); + return 1; + } + + return 0; + } + +public: + + + /*! + returning the string represents the currect type of the library + we have following types: + asm_vc_32 - with asm code designed for Microsoft Visual C++ (32 bits) + asm_gcc_32 - with asm code designed for GCC (32 bits) + asm_vc_64 - with asm for VC (64 bit) + asm_gcc_64 - with asm for GCC (64 bit) + no_asm_32 - pure C++ version (32 bit) - without any asm code + no_asm_64 - pure C++ version (64 bit) - without any asm code + */ + static const char * LibTypeStr() + { + return UInt::LibTypeStr(); + } + + + /*! + returning the currect type of the library + */ + static LibTypeCode LibType() + { + return UInt::LibType(); + } + + + + /*! + this method moves all bits from mantissa into its left side + (suitably changes the exponent) or if the mantissa is zero + it sets the exponent to zero as well + (and clears the sign bit and sets the zero bit) + + it can return a carry + the carry will be when we don't have enough space in the exponent + + you don't have to use this method if you don't change the mantissa + and exponent directly + */ + uint Standardizing() + { + if( mantissa.IsTheHighestBitSet() ) + { + ClearInfoBit(TTMATH_BIG_ZERO); + return 0; + } + + if( CorrectZero() ) + return 0; + + uint comp = mantissa.CompensationToLeft(); + + return exponent.Sub( comp ); + } + + +private: + + /*! + if the mantissa is equal zero this method sets exponent to zero and + info without the sign + + it returns true if there was the correction + */ + bool CorrectZero() + { + if( mantissa.IsZero() ) + { + SetInfoBit(TTMATH_BIG_ZERO); + ClearInfoBit(TTMATH_BIG_SIGN); + exponent.SetZero(); + + return true; + } + else + { + ClearInfoBit(TTMATH_BIG_ZERO); + } + + return false; + } + + +public: + + /*! + this method clears a specific bit in the 'info' variable + + bit is one of: TTMATH_BIG_SIGN, TTMATH_BIG_NAN etc. + */ + void ClearInfoBit(unsigned char bit) + { + info = info & (~bit); + } + + + /*! + this method sets a specific bit in the 'info' variable + + bit is one of: TTMATH_BIG_SIGN, TTMATH_BIG_NAN etc. + + */ + void SetInfoBit(unsigned char bit) + { + info = info | bit; + } + + + /*! + this method returns true if a specific bit in the 'info' variable is set + + bit is one of: TTMATH_BIG_SIGN, TTMATH_BIG_NAN etc. + */ + bool IsInfoBit(unsigned char bit) const + { + return (info & bit) != 0; + } + + + /*! + this method sets zero + */ + void SetZero() + { + info = TTMATH_BIG_ZERO; + exponent.SetZero(); + mantissa.SetZero(); + + /* + we don't have to compensate zero + */ + } + + + /*! + this method sets one + */ + void SetOne() + { + info = 0; + mantissa.SetZero(); + mantissa.table[man-1] = TTMATH_UINT_HIGHEST_BIT; + exponent = -sint(man * TTMATH_BITS_PER_UINT - 1); + + // don't have to Standardize() - the last bit from mantissa is set + } + + + /*! + this method sets value 0.5 + */ + void Set05() + { + SetOne(); + exponent.SubOne(); + } + + + /*! + this method sets NaN flag (Not a Number) + when this flag is set that means there is no a valid number + */ + void SetNan() + { + SetInfoBit(TTMATH_BIG_NAN); + } + + + /*! + this method sets NaN flag (Not a Number) + also clears the mantissa and exponent (similarly as it would be a zero value) + */ + void SetZeroNan() + { + SetZero(); + SetNan(); + } + + + /*! + this method swappes this for an argument + */ + void Swap(Big & ss2) + { + unsigned char info_temp = info; + info = ss2.info; + ss2.info = info_temp; + + exponent.Swap(ss2.exponent); + mantissa.Swap(ss2.mantissa); + } + + +private: + + /*! + this method sets the mantissa of the value of pi + */ + void SetMantissaPi() + { + // this is a static table which represents the value of Pi (mantissa of it) + // (first is the highest word) + // we must define this table as 'unsigned int' because + // both on 32bit and 64bit platforms this table is 32bit + static const unsigned int temp_table[] = { + 0xc90fdaa2, 0x2168c234, 0xc4c6628b, 0x80dc1cd1, 0x29024e08, 0x8a67cc74, 0x020bbea6, 0x3b139b22, + 0x514a0879, 0x8e3404dd, 0xef9519b3, 0xcd3a431b, 0x302b0a6d, 0xf25f1437, 0x4fe1356d, 0x6d51c245, + 0xe485b576, 0x625e7ec6, 0xf44c42e9, 0xa637ed6b, 0x0bff5cb6, 0xf406b7ed, 0xee386bfb, 0x5a899fa5, + 0xae9f2411, 0x7c4b1fe6, 0x49286651, 0xece45b3d, 0xc2007cb8, 0xa163bf05, 0x98da4836, 0x1c55d39a, + 0x69163fa8, 0xfd24cf5f, 0x83655d23, 0xdca3ad96, 0x1c62f356, 0x208552bb, 0x9ed52907, 0x7096966d, + 0x670c354e, 0x4abc9804, 0xf1746c08, 0xca18217c, 0x32905e46, 0x2e36ce3b, 0xe39e772c, 0x180e8603, + 0x9b2783a2, 0xec07a28f, 0xb5c55df0, 0x6f4c52c9, 0xde2bcbf6, 0x95581718, 0x3995497c, 0xea956ae5, + 0x15d22618, 0x98fa0510, 0x15728e5a, 0x8aaac42d, 0xad33170d, 0x04507a33, 0xa85521ab, 0xdf1cba64, + 0xecfb8504, 0x58dbef0a, 0x8aea7157, 0x5d060c7d, 0xb3970f85, 0xa6e1e4c7, 0xabf5ae8c, 0xdb0933d7, + 0x1e8c94e0, 0x4a25619d, 0xcee3d226, 0x1ad2ee6b, 0xf12ffa06, 0xd98a0864, 0xd8760273, 0x3ec86a64, + 0x521f2b18, 0x177b200c, 0xbbe11757, 0x7a615d6c, 0x770988c0, 0xbad946e2, 0x08e24fa0, 0x74e5ab31, + 0x43db5bfc, 0xe0fd108e, 0x4b82d120, 0xa9210801, 0x1a723c12, 0xa787e6d7, 0x88719a10, 0xbdba5b26, + 0x99c32718, 0x6af4e23c, 0x1a946834, 0xb6150bda, 0x2583e9ca, 0x2ad44ce8, 0xdbbbc2db, 0x04de8ef9, + 0x2e8efc14, 0x1fbecaa6, 0x287c5947, 0x4e6bc05d, 0x99b2964f, 0xa090c3a2, 0x233ba186, 0x515be7ed, + 0x1f612970, 0xcee2d7af, 0xb81bdd76, 0x2170481c, 0xd0069127, 0xd5b05aa9, 0x93b4ea98, 0x8d8fddc1, + 0x86ffb7dc, 0x90a6c08f, 0x4df435c9, 0x34028492, 0x36c3fab4, 0xd27c7026, 0xc1d4dcb2, 0x602646de, + 0xc9751e76, 0x3dba37bd, 0xf8ff9406, 0xad9e530e, 0xe5db382f, 0x413001ae, 0xb06a53ed, 0x9027d831, + 0x179727b0, 0x865a8918, 0xda3edbeb, 0xcf9b14ed, 0x44ce6cba, 0xced4bb1b, 0xdb7f1447, 0xe6cc254b, + 0x33205151, 0x2bd7af42, 0x6fb8f401, 0x378cd2bf, 0x5983ca01, 0xc64b92ec, 0xf032ea15, 0xd1721d03, + 0xf482d7ce, 0x6e74fef6, 0xd55e702f, 0x46980c82, 0xb5a84031, 0x900b1c9e, 0x59e7c97f, 0xbec7e8f3, + 0x23a97a7e, 0x36cc88be, 0x0f1d45b7, 0xff585ac5, 0x4bd407b2, 0x2b4154aa, 0xcc8f6d7e, 0xbf48e1d8, + 0x14cc5ed2, 0x0f8037e0, 0xa79715ee, 0xf29be328, 0x06a1d58b, 0xb7c5da76, 0xf550aa3d, 0x8a1fbff0, + 0xeb19ccb1, 0xa313d55c, 0xda56c9ec, 0x2ef29632, 0x387fe8d7, 0x6e3c0468, 0x043e8f66, 0x3f4860ee, + 0x12bf2d5b, 0x0b7474d6, 0xe694f91e, 0x6dbe1159, 0x74a3926f, 0x12fee5e4, 0x38777cb6, 0xa932df8c, + 0xd8bec4d0, 0x73b931ba, 0x3bc832b6, 0x8d9dd300, 0x741fa7bf, 0x8afc47ed, 0x2576f693, 0x6ba42466, + 0x3aab639c, 0x5ae4f568, 0x3423b474, 0x2bf1c978, 0x238f16cb, 0xe39d652d, 0xe3fdb8be, 0xfc848ad9, + 0x22222e04, 0xa4037c07, 0x13eb57a8, 0x1a23f0c7, 0x3473fc64, 0x6cea306b, 0x4bcbc886, 0x2f8385dd, + 0xfa9d4b7f, 0xa2c087e8, 0x79683303, 0xed5bdd3a, 0x062b3cf5, 0xb3a278a6, 0x6d2a13f8, 0x3f44f82d, + 0xdf310ee0, 0x74ab6a36, 0x4597e899, 0xa0255dc1, 0x64f31cc5, 0x0846851d, 0xf9ab4819, 0x5ded7ea1, + 0xb1d510bd, 0x7ee74d73, 0xfaf36bc3, 0x1ecfa268, 0x359046f4, 0xeb879f92, 0x4009438b, 0x481c6cd7, + 0x889a002e, 0xd5ee382b, 0xc9190da6, 0xfc026e47, 0x9558e447, 0x5677e9aa, 0x9e3050e2, 0x765694df, + 0xc81f56e8, 0x80b96e71, 0x60c980dd, 0x98a573ea, 0x4472065a, 0x139cd290, 0x6cd1cb72, 0x9ec52a53 // last one was: 0x9ec52a52 + //0x86d44014, ... + // (the last word 0x9ec52a52 was rounded up because the next one is 0x86d44014 -- first bit is one 0x8..) + // 256 32bit words for the mantissa -- about 2464 valid decimal digits + }; + // the value of PI is comming from the website http://zenwerx.com/pi.php + // 3101 digits were taken from this website + // (later the digits were compared with: + // http://www.eveandersson.com/pi/digits/1000000 and http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html ) + // and they were set into Big<1,400> type (using operator=(const char*) on a 32bit platform) + // and then the first 256 words were taken into this table + // (TTMATH_BUILTIN_VARIABLES_SIZE on 32bit platform should have the value 256, + // and on 64bit platform value 128 (256/2=128)) + + mantissa.SetFromTable(temp_table, sizeof(temp_table) / sizeof(int)); + } + +public: + + + /*! + this method sets the value of pi + */ + void SetPi() + { + SetMantissaPi(); + info = 0; + exponent = -sint(man)*sint(TTMATH_BITS_PER_UINT) + 2; + } + + + /*! + this method sets the value of 0.5 * pi + */ + void Set05Pi() + { + SetMantissaPi(); + info = 0; + exponent = -sint(man)*sint(TTMATH_BITS_PER_UINT) + 1; + } + + + /*! + this method sets the value of 2 * pi + */ + void Set2Pi() + { + SetMantissaPi(); + info = 0; + exponent = -sint(man)*sint(TTMATH_BITS_PER_UINT) + 3; + } + + + /*! + this method sets the value of e + (the base of the natural logarithm) + */ + void SetE() + { + static const unsigned int temp_table[] = { + 0xadf85458, 0xa2bb4a9a, 0xafdc5620, 0x273d3cf1, 0xd8b9c583, 0xce2d3695, 0xa9e13641, 0x146433fb, + 0xcc939dce, 0x249b3ef9, 0x7d2fe363, 0x630c75d8, 0xf681b202, 0xaec4617a, 0xd3df1ed5, 0xd5fd6561, + 0x2433f51f, 0x5f066ed0, 0x85636555, 0x3ded1af3, 0xb557135e, 0x7f57c935, 0x984f0c70, 0xe0e68b77, + 0xe2a689da, 0xf3efe872, 0x1df158a1, 0x36ade735, 0x30acca4f, 0x483a797a, 0xbc0ab182, 0xb324fb61, + 0xd108a94b, 0xb2c8e3fb, 0xb96adab7, 0x60d7f468, 0x1d4f42a3, 0xde394df4, 0xae56ede7, 0x6372bb19, + 0x0b07a7c8, 0xee0a6d70, 0x9e02fce1, 0xcdf7e2ec, 0xc03404cd, 0x28342f61, 0x9172fe9c, 0xe98583ff, + 0x8e4f1232, 0xeef28183, 0xc3fe3b1b, 0x4c6fad73, 0x3bb5fcbc, 0x2ec22005, 0xc58ef183, 0x7d1683b2, + 0xc6f34a26, 0xc1b2effa, 0x886b4238, 0x611fcfdc, 0xde355b3b, 0x6519035b, 0xbc34f4de, 0xf99c0238, + 0x61b46fc9, 0xd6e6c907, 0x7ad91d26, 0x91f7f7ee, 0x598cb0fa, 0xc186d91c, 0xaefe1309, 0x85139270, + 0xb4130c93, 0xbc437944, 0xf4fd4452, 0xe2d74dd3, 0x64f2e21e, 0x71f54bff, 0x5cae82ab, 0x9c9df69e, + 0xe86d2bc5, 0x22363a0d, 0xabc52197, 0x9b0deada, 0x1dbf9a42, 0xd5c4484e, 0x0abcd06b, 0xfa53ddef, + 0x3c1b20ee, 0x3fd59d7c, 0x25e41d2b, 0x669e1ef1, 0x6e6f52c3, 0x164df4fb, 0x7930e9e4, 0xe58857b6, + 0xac7d5f42, 0xd69f6d18, 0x7763cf1d, 0x55034004, 0x87f55ba5, 0x7e31cc7a, 0x7135c886, 0xefb4318a, + 0xed6a1e01, 0x2d9e6832, 0xa907600a, 0x918130c4, 0x6dc778f9, 0x71ad0038, 0x092999a3, 0x33cb8b7a, + 0x1a1db93d, 0x7140003c, 0x2a4ecea9, 0xf98d0acc, 0x0a8291cd, 0xcec97dcf, 0x8ec9b55a, 0x7f88a46b, + 0x4db5a851, 0xf44182e1, 0xc68a007e, 0x5e0dd902, 0x0bfd64b6, 0x45036c7a, 0x4e677d2c, 0x38532a3a, + 0x23ba4442, 0xcaf53ea6, 0x3bb45432, 0x9b7624c8, 0x917bdd64, 0xb1c0fd4c, 0xb38e8c33, 0x4c701c3a, + 0xcdad0657, 0xfccfec71, 0x9b1f5c3e, 0x4e46041f, 0x388147fb, 0x4cfdb477, 0xa52471f7, 0xa9a96910, + 0xb855322e, 0xdb6340d8, 0xa00ef092, 0x350511e3, 0x0abec1ff, 0xf9e3a26e, 0x7fb29f8c, 0x183023c3, + 0x587e38da, 0x0077d9b4, 0x763e4e4b, 0x94b2bbc1, 0x94c6651e, 0x77caf992, 0xeeaac023, 0x2a281bf6, + 0xb3a739c1, 0x22611682, 0x0ae8db58, 0x47a67cbe, 0xf9c9091b, 0x462d538c, 0xd72b0374, 0x6ae77f5e, + 0x62292c31, 0x1562a846, 0x505dc82d, 0xb854338a, 0xe49f5235, 0xc95b9117, 0x8ccf2dd5, 0xcacef403, + 0xec9d1810, 0xc6272b04, 0x5b3b71f9, 0xdc6b80d6, 0x3fdd4a8e, 0x9adb1e69, 0x62a69526, 0xd43161c1, + 0xa41d570d, 0x7938dad4, 0xa40e329c, 0xcff46aaa, 0x36ad004c, 0xf600c838, 0x1e425a31, 0xd951ae64, + 0xfdb23fce, 0xc9509d43, 0x687feb69, 0xedd1cc5e, 0x0b8cc3bd, 0xf64b10ef, 0x86b63142, 0xa3ab8829, + 0x555b2f74, 0x7c932665, 0xcb2c0f1c, 0xc01bd702, 0x29388839, 0xd2af05e4, 0x54504ac7, 0x8b758282, + 0x2846c0ba, 0x35c35f5c, 0x59160cc0, 0x46fd8251, 0x541fc68c, 0x9c86b022, 0xbb709987, 0x6a460e74, + 0x51a8a931, 0x09703fee, 0x1c217e6c, 0x3826e52c, 0x51aa691e, 0x0e423cfc, 0x99e9e316, 0x50c1217b, + 0x624816cd, 0xad9a95f9, 0xd5b80194, 0x88d9c0a0, 0xa1fe3075, 0xa577e231, 0x83f81d4a, 0x3f2fa457, + 0x1efc8ce0, 0xba8a4fe8, 0xb6855dfe, 0x72b0a66e, 0xded2fbab, 0xfbe58a30, 0xfafabe1c, 0x5d71a87e, + 0x2f741ef8, 0xc1fe86fe, 0xa6bbfde5, 0x30677f0d, 0x97d11d49, 0xf7a8443d, 0x0822e506, 0xa9f4614e, + 0x011e2a94, 0x838ff88c, 0xd68c8bb7, 0xc51eef6d, 0x49ea8ab4, 0xf2c3df5b, 0xb4e0735a, 0xb0d68749 + // 0x2fe26dd4, ... + // 256 32bit words for the mantissa -- about 2464 valid decimal digits + }; + + // above value was calculated using Big<1,400> type on a 32bit platform + // and then the first 256 words were taken, + // the calculating was made by using ExpSurrounding0(1) method + // which took 1420 iterations + // (the result was compared with e taken from http://antwrp.gsfc.nasa.gov/htmltest/gifcity/e.2mil) + // (TTMATH_BUILTIN_VARIABLES_SIZE on 32bit platform should have the value 256, + // and on 64bit platform value 128 (256/2=128)) + + mantissa.SetFromTable(temp_table, sizeof(temp_table) / sizeof(int)); + exponent = -sint(man)*sint(TTMATH_BITS_PER_UINT) + 2; + info = 0; + } + + + /*! + this method sets the value of ln(2) + the natural logarithm from 2 + */ + void SetLn2() + { + static const unsigned int temp_table[] = { + 0xb17217f7, 0xd1cf79ab, 0xc9e3b398, 0x03f2f6af, 0x40f34326, 0x7298b62d, 0x8a0d175b, 0x8baafa2b, + 0xe7b87620, 0x6debac98, 0x559552fb, 0x4afa1b10, 0xed2eae35, 0xc1382144, 0x27573b29, 0x1169b825, + 0x3e96ca16, 0x224ae8c5, 0x1acbda11, 0x317c387e, 0xb9ea9bc3, 0xb136603b, 0x256fa0ec, 0x7657f74b, + 0x72ce87b1, 0x9d6548ca, 0xf5dfa6bd, 0x38303248, 0x655fa187, 0x2f20e3a2, 0xda2d97c5, 0x0f3fd5c6, + 0x07f4ca11, 0xfb5bfb90, 0x610d30f8, 0x8fe551a2, 0xee569d6d, 0xfc1efa15, 0x7d2e23de, 0x1400b396, + 0x17460775, 0xdb8990e5, 0xc943e732, 0xb479cd33, 0xcccc4e65, 0x9393514c, 0x4c1a1e0b, 0xd1d6095d, + 0x25669b33, 0x3564a337, 0x6a9c7f8a, 0x5e148e82, 0x074db601, 0x5cfe7aa3, 0x0c480a54, 0x17350d2c, + 0x955d5179, 0xb1e17b9d, 0xae313cdb, 0x6c606cb1, 0x078f735d, 0x1b2db31b, 0x5f50b518, 0x5064c18b, + 0x4d162db3, 0xb365853d, 0x7598a195, 0x1ae273ee, 0x5570b6c6, 0x8f969834, 0x96d4e6d3, 0x30af889b, + 0x44a02554, 0x731cdc8e, 0xa17293d1, 0x228a4ef9, 0x8d6f5177, 0xfbcf0755, 0x268a5c1f, 0x9538b982, + 0x61affd44, 0x6b1ca3cf, 0x5e9222b8, 0x8c66d3c5, 0x422183ed, 0xc9942109, 0x0bbb16fa, 0xf3d949f2, + 0x36e02b20, 0xcee886b9, 0x05c128d5, 0x3d0bd2f9, 0x62136319, 0x6af50302, 0x0060e499, 0x08391a0c, + 0x57339ba2, 0xbeba7d05, 0x2ac5b61c, 0xc4e9207c, 0xef2f0ce2, 0xd7373958, 0xd7622658, 0x901e646a, + 0x95184460, 0xdc4e7487, 0x156e0c29, 0x2413d5e3, 0x61c1696d, 0xd24aaebd, 0x473826fd, 0xa0c238b9, + 0x0ab111bb, 0xbd67c724, 0x972cd18b, 0xfbbd9d42, 0x6c472096, 0xe76115c0, 0x5f6f7ceb, 0xac9f45ae, + 0xcecb72f1, 0x9c38339d, 0x8f682625, 0x0dea891e, 0xf07afff3, 0xa892374e, 0x175eb4af, 0xc8daadd8, + 0x85db6ab0, 0x3a49bd0d, 0xc0b1b31d, 0x8a0e23fa, 0xc5e5767d, 0xf95884e0, 0x6425a415, 0x26fac51c, + 0x3ea8449f, 0xe8f70edd, 0x062b1a63, 0xa6c4c60c, 0x52ab3316, 0x1e238438, 0x897a39ce, 0x78b63c9f, + 0x364f5b8a, 0xef22ec2f, 0xee6e0850, 0xeca42d06, 0xfb0c75df, 0x5497e00c, 0x554b03d7, 0xd2874a00, + 0x0ca8f58d, 0x94f0341c, 0xbe2ec921, 0x56c9f949, 0xdb4a9316, 0xf281501e, 0x53daec3f, 0x64f1b783, + 0x154c6032, 0x0e2ff793, 0x33ce3573, 0xfacc5fdc, 0xf1178590, 0x3155bbd9, 0x0f023b22, 0x0224fcd8, + 0x471bf4f4, 0x45f0a88a, 0x14f0cd97, 0x6ea354bb, 0x20cdb5cc, 0xb3db2392, 0x88d58655, 0x4e2a0e8a, + 0x6fe51a8c, 0xfaa72ef2, 0xad8a43dc, 0x4212b210, 0xb779dfe4, 0x9d7307cc, 0x846532e4, 0xb9694eda, + 0xd162af05, 0x3b1751f3, 0xa3d091f6, 0x56658154, 0x12b5e8c2, 0x02461069, 0xac14b958, 0x784934b8, + 0xd6cce1da, 0xa5053701, 0x1aa4fb42, 0xb9a3def4, 0x1bda1f85, 0xef6fdbf2, 0xf2d89d2a, 0x4b183527, + 0x8fd94057, 0x89f45681, 0x2b552879, 0xa6168695, 0xc12963b0, 0xff01eaab, 0x73e5b5c1, 0x585318e7, + 0x624f14a5, 0x1a4a026b, 0x68082920, 0x57fd99b6, 0x6dc085a9, 0x8ac8d8ca, 0xf9eeeea9, 0x8a2400ca, + 0xc95f260f, 0xd10036f9, 0xf91096ac, 0x3195220a, 0x1a356b2a, 0x73b7eaad, 0xaf6d6058, 0x71ef7afb, + 0x80bc4234, 0x33562e94, 0xb12dfab4, 0x14451579, 0xdf59eae0, 0x51707062, 0x4012a829, 0x62c59cab, + 0x347f8304, 0xd889659e, 0x5a9139db, 0x14efcc30, 0x852be3e8, 0xfc99f14d, 0x1d822dd6, 0xe2f76797, + 0xe30219c8, 0xaa9ce884, 0x8a886eb3, 0xc87b7295, 0x988012e8, 0x314186ed, 0xbaf86856, 0xccd3c3b6, + 0xee94e62f, 0x110a6783, 0xd2aae89c, 0xcc3b76fc, 0x435a0ce1, 0x34c2838f, 0xd571ec6c, 0x1366a993 // last one was: 0x1366a992 + //0xcbb9ac40, ... + // (the last word 0x1366a992 was rounded up because the next one is 0xcbb9ac40 -- first bit is one 0xc..) + // 256 32bit words for the mantissa -- about 2464 valid decimal digits + }; + + // above value was calculated using Big<1,400> type on a 32bit platform + // and then the first 256 words were taken, + // the calculating was made by using LnSurrounding1(2) method + // which took 4035 iterations + // (the result was compared with ln(2) taken from http://ja0hxv.calico.jp/pai/estart.html) + // (TTMATH_BUILTIN_VARIABLES_SIZE on 32bit platform should have the value 256, + // and on 64bit platform value 128 (256/2=128)) + + mantissa.SetFromTable(temp_table, sizeof(temp_table) / sizeof(int)); + exponent = -sint(man)*sint(TTMATH_BITS_PER_UINT); + info = 0; + } + + + /*! + this method sets the value of ln(10) + the natural logarithm from 10 + + I introduced this constant especially to make the conversion ToString() + being faster. In fact the method ToString() is keeping values of logarithms + it has calculated but it must calculate the logarithm at least once. + If a program, which uses this library, is running for a long time this + would be ok, but for programs which are running shorter, for example for + CGI applications which only once are printing values, this would be much + inconvenience. Then if we're printing with base (radix) 10 and the mantissa + of our value is smaller than or equal to TTMATH_BUILTIN_VARIABLES_SIZE + we don't calculate the logarithm but take it from this constant. + */ + void SetLn10() + { + static const unsigned int temp_table[] = { + 0x935d8ddd, 0xaaa8ac16, 0xea56d62b, 0x82d30a28, 0xe28fecf9, 0xda5df90e, 0x83c61e82, 0x01f02d72, + 0x962f02d7, 0xb1a8105c, 0xcc70cbc0, 0x2c5f0d68, 0x2c622418, 0x410be2da, 0xfb8f7884, 0x02e516d6, + 0x782cf8a2, 0x8a8c911e, 0x765aa6c3, 0xb0d831fb, 0xef66ceb0, 0x4ab3c6fa, 0x5161bb49, 0xd219c7bb, + 0xca67b35b, 0x23605085, 0x8e93368d, 0x44789c4f, 0x5b08b057, 0xd5ede20f, 0x469ea58e, 0x9305e981, + 0xe2478fca, 0xad3aee98, 0x9cd5b42e, 0x6a271619, 0xa47ecb26, 0x978c5d4f, 0xdb1d28ea, 0x57d4fdc0, + 0xe40bf3cc, 0x1e14126a, 0x45765cde, 0x268339db, 0xf47fa96d, 0xeb271060, 0xaf88486e, 0xa9b7401e, + 0x3dfd3c51, 0x748e6d6e, 0x3848c8d2, 0x5faf1bca, 0xe88047f1, 0x7b0d9b50, 0xa949eaaa, 0xdf69e8a5, + 0xf77e3760, 0x4e943960, 0xe38a5700, 0xffde2db1, 0xad6bfbff, 0xd821ba0a, 0x4cb0466d, 0x61ba648e, + 0xef99c8e5, 0xf6974f36, 0x3982a78c, 0xa45ddfc8, 0x09426178, 0x19127a6e, 0x3b70fcda, 0x2d732d47, + 0xb5e4b1c8, 0xc0e5a10a, 0xaa6604a5, 0x324ec3dc, 0xbc64ea80, 0x6e198566, 0x1f1d366c, 0x20663834, + 0x4d5e843f, 0x20642b97, 0x0a62d18e, 0x478f7bd5, 0x8fcd0832, 0x4a7b32a6, 0xdef85a05, 0xeb56323a, + 0x421ef5e0, 0xb00410a0, 0xa0d9c260, 0x794a976f, 0xf6ff363d, 0xb00b6b33, 0xf42c58de, 0xf8a3c52d, + 0xed69b13d, 0xc1a03730, 0xb6524dc1, 0x8c167e86, 0x99d6d20e, 0xa2defd2b, 0xd006f8b4, 0xbe145a2a, + 0xdf3ccbb3, 0x189da49d, 0xbc1261c8, 0xb3e4daad, 0x6a36cecc, 0xb2d5ae5b, 0x89bf752f, 0xb5dfb353, + 0xff3065c4, 0x0cfceec8, 0x1be5a9a9, 0x67fddc57, 0xc4b83301, 0x006bf062, 0x4b40ed7a, 0x56c6cdcd, + 0xa2d6fe91, 0x388e9e3e, 0x48a93f5f, 0x5e3b6eb4, 0xb81c4a5b, 0x53d49ea6, 0x8e668aea, 0xba83c7f8, + 0xfb5f06c3, 0x58ac8f70, 0xfa9d8c59, 0x8c574502, 0xbaf54c96, 0xc84911f0, 0x0482d095, 0x1a0af022, + 0xabbab080, 0xec97efd3, 0x671e4e0e, 0x52f166b6, 0xcd5cd226, 0x0dc67795, 0x2e1e34a3, 0xf799677f, + 0x2c1d48f1, 0x2944b6c5, 0x2ba1307e, 0x704d67f9, 0x1c1035e4, 0x4e927c63, 0x03cf12bf, 0xe2cd2e31, + 0xf8ee4843, 0x344d51b0, 0xf37da42b, 0x9f0b0fd9, 0x134fb2d9, 0xf815e490, 0xd966283f, 0x23962766, + 0xeceab1e4, 0xf3b5fc86, 0x468127e2, 0xb606d10d, 0x3a45f4b6, 0xb776102d, 0x2fdbb420, 0x80c8fa84, + 0xd0ff9f45, 0xc58aef38, 0xdb2410fd, 0x1f1cebad, 0x733b2281, 0x52ca5f36, 0xddf29daa, 0x544334b8, + 0xdeeaf659, 0x4e462713, 0x1ed485b4, 0x6a0822e1, 0x28db471c, 0xa53938a8, 0x44c3bef7, 0xf35215c8, + 0xb382bc4e, 0x3e4c6f15, 0x6285f54c, 0x17ab408e, 0xccbf7f5e, 0xd16ab3f6, 0xced2846d, 0xf457e14f, + 0xbb45d9c5, 0x646ad497, 0xac697494, 0x145de32e, 0x93907128, 0xd263d521, 0x79efb424, 0xd64651d6, + 0xebc0c9f0, 0xbb583a44, 0xc6412c84, 0x85bb29a6, 0x4d31a2cd, 0x92954469, 0xa32b1abd, 0xf7f5202c, + 0xa4aa6c93, 0x2e9b53cf, 0x385ab136, 0x2741f356, 0x5de9c065, 0x6009901c, 0x88abbdd8, 0x74efcf73, + 0x3f761ad4, 0x35f3c083, 0xfd6b8ee0, 0x0bef11c7, 0xc552a89d, 0x58ce4a21, 0xd71e54f2, 0x4157f6c7, + 0xd4622316, 0xe98956d7, 0x450027de, 0xcbd398d8, 0x4b98b36a, 0x0724c25c, 0xdb237760, 0xe9324b68, + 0x7523e506, 0x8edad933, 0x92197f00, 0xb853a326, 0xb330c444, 0x65129296, 0x34bc0670, 0xe177806d, + 0xe338dac4, 0x5537492a, 0xe19add83, 0xcf45000f, 0x5b423bce, 0x6497d209, 0xe30e18a1, 0x3cbf0687, + 0x67973103, 0xd9485366, 0x81506bba, 0x2e93a9a4, 0x7dd59d3f, 0xf17cd746, 0x8c2075be, 0x552a4348 // last one was: 0x552a4347 + // 0xb4a638ef, ... + //(the last word 0x552a4347 was rounded up because the next one is 0xb4a638ef -- first bit is one 0xb..) + // 256 32bit words for the mantissa -- about 2464 valid digits (decimal) + }; + + // above value was calculated using Big<1,400> type on a 32bit platform + // and then the first 256 32bit words were taken, + // the calculating was made by using LnSurrounding1(10) method + // which took 22080 iterations + // (the result was compared with ln(10) taken from http://ja0hxv.calico.jp/pai/estart.html) + // (the formula used in LnSurrounding1(x) converges badly when + // the x is greater than one but in fact we can use it, only the + // number of iterations will be greater) + // (TTMATH_BUILTIN_VARIABLES_SIZE on 32bit platform should have the value 256, + // and on 64bit platform value 128 (256/2=128)) + + mantissa.SetFromTable(temp_table, sizeof(temp_table) / sizeof(int)); + exponent = -sint(man)*sint(TTMATH_BITS_PER_UINT) + 2; + info = 0; + } + + + /*! + this method sets the maximum value which can be held in this type + */ + void SetMax() + { + info = 0; + mantissa.SetMax(); + exponent.SetMax(); + + // we don't have to use 'Standardizing()' because the last bit from + // the mantissa is set + } + + + /*! + this method sets the minimum value which can be held in this type + */ + void SetMin() + { + info = 0; + + mantissa.SetMax(); + exponent.SetMax(); + SetSign(); + + // we don't have to use 'Standardizing()' because the last bit from + // the mantissa is set + } + + + /*! + testing whether there is a value zero or not + */ + bool IsZero() const + { + return IsInfoBit(TTMATH_BIG_ZERO); + } + + + /*! + this method returns true when there's the sign set + also we don't check the NaN flag + */ + bool IsSign() const + { + return IsInfoBit(TTMATH_BIG_SIGN); + } + + + /*! + this method returns true when there is not a valid number + */ + bool IsNan() const + { + return IsInfoBit(TTMATH_BIG_NAN); + } + + + + /*! + this method clears the sign + (there'll be an absolute value) + + e.g. + -1 -> 1 + 2 -> 2 + */ + void Abs() + { + ClearInfoBit(TTMATH_BIG_SIGN); + } + + + /*! + this method remains the 'sign' of the value + e.g. -2 = -1 + 0 = 0 + 10 = 1 + */ + void Sgn() + { + // we have to check the NaN flag, because the next SetOne() method would clear it + if( IsNan() ) + return; + + if( IsSign() ) + { + SetOne(); + SetSign(); + } + else + if( IsZero() ) + SetZero(); // !! is nedeed here? + else + SetOne(); + } + + + + /*! + this method sets the sign + + e.g. + -1 -> -1 + 2 -> -2 + + we do not check whether there is a zero or not, if you're using this method + you must be sure that the value is (or will be afterwards) different from zero + */ + void SetSign() + { + SetInfoBit(TTMATH_BIG_SIGN); + } + + + /*! + this method changes the sign + when there is a value of zero then the sign is not changed + + e.g. + -1 -> 1 + 2 -> -2 + */ + void ChangeSign() + { + // we don't have to check the NaN flag here + + if( IsZero() ) + return; + + if( IsSign() ) + ClearInfoBit(TTMATH_BIG_SIGN); + else + SetInfoBit(TTMATH_BIG_SIGN); + } + + + +private: + + /*! + this method does the half-to-even rounding (banker's rounding) + + if is_half is: + true - that means the rest was equal the half (0.5 decimal) + false - that means the rest was greater than a half (greater than 0.5 decimal) + + if the rest was less than a half then don't call this method + (the rounding should does nothing then) + */ + uint RoundHalfToEven(bool is_half, bool rounding_up = true) + { + uint c = 0; + + if( !is_half || mantissa.IsTheLowestBitSet() ) + { + if( rounding_up ) + { + if( mantissa.AddOne() ) + { + mantissa.Rcr(1, 1); + c = exponent.AddOne(); + } + } + else + { + #ifdef TTMATH_DEBUG + uint c_from_zero = + #endif + mantissa.SubOne(); + + // we're using rounding_up=false in Add() when the mantissas have different signs + // mantissa can be zero only when previous mantissa was equal to ss2.mantissa + // but in such a case 'last_bit_set' will not be set and consequently 'do_rounding' will be false + TTMATH_ASSERT( c_from_zero == 0 ) + } + } + + return c; + } + + + + + + /*! + * + * basic mathematic functions + * + */ + + + /*! + this method adds one to the existing value + */ + uint AddOne() + { + Big one; + + one.SetOne(); + + return Add(one); + } + + + /*! + this method subtracts one from the existing value + */ + uint SubOne() + { + Big one; + + one.SetOne(); + + return Sub(one); + } + + +private: + + + /*! + an auxiliary method for adding + */ + void AddCheckExponents( Big & ss2, + Int & exp_offset, + bool & last_bit_set, + bool & rest_zero, + bool & do_adding, + bool & do_rounding) + { + Int mantissa_size_in_bits( man * TTMATH_BITS_PER_UINT ); + + if( exp_offset == mantissa_size_in_bits ) + { + last_bit_set = ss2.mantissa.IsTheHighestBitSet(); + rest_zero = ss2.mantissa.AreFirstBitsZero(man*TTMATH_BITS_PER_UINT - 1); + do_rounding = true; // we'are only rounding + } + else + if( exp_offset < mantissa_size_in_bits ) + { + uint moved = exp_offset.ToInt(); // how many times we must move ss2.mantissa + rest_zero = true; + + if( moved > 0 ) + { + last_bit_set = static_cast( ss2.mantissa.GetBit(moved-1) ); + + if( moved > 1 ) + rest_zero = ss2.mantissa.AreFirstBitsZero(moved - 1); + + // (2) moving 'exp_offset' times + ss2.mantissa.Rcr(moved, 0); + } + + do_adding = true; + do_rounding = true; + } + + // if exp_offset is greater than mantissa_size_in_bits then we do nothing + // ss2 is too small for taking into consideration in the sum + } + + + /*! + an auxiliary method for adding + */ + uint AddMantissas( Big & ss2, + bool & last_bit_set, + bool & rest_zero) + { + uint c = 0; + + if( IsSign() == ss2.IsSign() ) + { + // values have the same signs + if( mantissa.Add(ss2.mantissa) ) + { + // we have one bit more from addition (carry) + // now rest_zero means the old rest_zero with the old last_bit_set + rest_zero = (!last_bit_set && rest_zero); + last_bit_set = mantissa.Rcr(1,1); + c += exponent.AddOne(); + } + } + else + { + // values have different signs + // there shouldn't be a carry here because + // (1) (2) guarantee that the mantissa of this + // is greater than or equal to the mantissa of the ss2 + + #ifdef TTMATH_DEBUG + uint c_temp = + #endif + mantissa.Sub(ss2.mantissa); + + TTMATH_ASSERT( c_temp == 0 ) + } + + return c; + } + + +public: + + + /*! + Addition this = this + ss2 + + it returns carry if the sum is too big + */ + uint Add(Big ss2, bool round = true, bool adding = true) + { + bool last_bit_set, rest_zero, do_adding, do_rounding, rounding_up; + Int exp_offset( exponent ); + uint c = 0; + + if( IsNan() || ss2.IsNan() ) + return CheckCarry(1); + + if( !adding ) + ss2.ChangeSign(); // subtracting + + exp_offset.Sub( ss2.exponent ); + exp_offset.Abs(); + + // (1) abs(this) will be >= abs(ss2) + if( SmallerWithoutSignThan(ss2) ) + Swap(ss2); + + if( ss2.IsZero() ) + return 0; + + last_bit_set = rest_zero = do_adding = do_rounding = false; + rounding_up = (IsSign() == ss2.IsSign()); + + AddCheckExponents(ss2, exp_offset, last_bit_set, rest_zero, do_adding, do_rounding); + + if( do_adding ) + c += AddMantissas(ss2, last_bit_set, rest_zero); + + if( !round || !last_bit_set ) + do_rounding = false; + + if( do_rounding ) + c += RoundHalfToEven(rest_zero, rounding_up); + + if( do_adding || do_rounding ) + c += Standardizing(); + + return CheckCarry(c); + } + + + /*! + Subtraction this = this - ss2 + + it returns carry if the result is too big + */ + uint Sub(const Big & ss2, bool round = true) + { + return Add(ss2, round, false); + } + + + /*! + bitwise AND + + this and ss2 must be >= 0 + return values: + 0 - ok + 1 - carry + 2 - this or ss2 was negative + */ + uint BitAnd(Big ss2) + { + if( IsNan() || ss2.IsNan() ) + return CheckCarry(1); + + if( IsSign() || ss2.IsSign() ) + { + SetNan(); + return 2; + } + + if( IsZero() ) + return 0; + + if( ss2.IsZero() ) + { + SetZero(); + return 0; + } + + Int exp_offset( exponent ); + Int mantissa_size_in_bits( man * TTMATH_BITS_PER_UINT ); + + uint c = 0; + + exp_offset.Sub( ss2.exponent ); + exp_offset.Abs(); + + // abs(this) will be >= abs(ss2) + if( SmallerWithoutSignThan(ss2) ) + Swap(ss2); + + if( exp_offset >= mantissa_size_in_bits ) + { + // the second value is too small + SetZero(); + return 0; + } + + // exp_offset < mantissa_size_in_bits, moving 'exp_offset' times + ss2.mantissa.Rcr( exp_offset.ToInt(), 0 ); + mantissa.BitAnd(ss2.mantissa); + + c += Standardizing(); + + return CheckCarry(c); + } + + + /*! + bitwise OR + + this and ss2 must be >= 0 + return values: + 0 - ok + 1 - carry + 2 - this or ss2 was negative + */ + uint BitOr(Big ss2) + { + if( IsNan() || ss2.IsNan() ) + return CheckCarry(1); + + if( IsSign() || ss2.IsSign() ) + { + SetNan(); + return 2; + } + + if( IsZero() ) + { + *this = ss2; + return 0; + } + + if( ss2.IsZero() ) + return 0; + + Int exp_offset( exponent ); + Int mantissa_size_in_bits( man * TTMATH_BITS_PER_UINT ); + + uint c = 0; + + exp_offset.Sub( ss2.exponent ); + exp_offset.Abs(); + + // abs(this) will be >= abs(ss2) + if( SmallerWithoutSignThan(ss2) ) + Swap(ss2); + + if( exp_offset >= mantissa_size_in_bits ) + // the second value is too small + return 0; + + // exp_offset < mantissa_size_in_bits, moving 'exp_offset' times + ss2.mantissa.Rcr( exp_offset.ToInt(), 0 ); + mantissa.BitOr(ss2.mantissa); + + c += Standardizing(); + + return CheckCarry(c); + } + + + /*! + bitwise XOR + + this and ss2 must be >= 0 + return values: + 0 - ok + 1 - carry + 2 - this or ss2 was negative + */ + uint BitXor(Big ss2) + { + if( IsNan() || ss2.IsNan() ) + return CheckCarry(1); + + if( IsSign() || ss2.IsSign() ) + { + SetNan(); + return 2; + } + + if( ss2.IsZero() ) + return 0; + + if( IsZero() ) + { + *this = ss2; + return 0; + } + + Int exp_offset( exponent ); + Int mantissa_size_in_bits( man * TTMATH_BITS_PER_UINT ); + + uint c = 0; + + exp_offset.Sub( ss2.exponent ); + exp_offset.Abs(); + + // abs(this) will be >= abs(ss2) + if( SmallerWithoutSignThan(ss2) ) + Swap(ss2); + + if( exp_offset >= mantissa_size_in_bits ) + // the second value is too small + return 0; + + // exp_offset < mantissa_size_in_bits, moving 'exp_offset' times + ss2.mantissa.Rcr( exp_offset.ToInt(), 0 ); + mantissa.BitXor(ss2.mantissa); + + c += Standardizing(); + + return CheckCarry(c); + } + + + + /*! + Multiplication this = this * ss2 (ss2 is uint) + + ss2 without a sign + */ + uint MulUInt(uint ss2) + { + UInt man_result; + uint i,c = 0; + + if( IsNan() ) + return 1; + + if( IsZero() ) + return 0; + + if( ss2 == 0 ) + { + SetZero(); + return 0; + } + + // man_result = mantissa * ss2.mantissa + mantissa.MulInt(ss2, man_result); + + sint bit = UInt::FindLeadingBitInWord(man_result.table[man]); // man - last word + + if( bit!=-1 && uint(bit) > (TTMATH_BITS_PER_UINT/2) ) + { + // 'i' will be from 0 to TTMATH_BITS_PER_UINT + i = man_result.CompensationToLeft(); + c = exponent.Add( TTMATH_BITS_PER_UINT - i ); + + for(i=0 ; i0 && (tab[len-1] & TTMATH_UINT_HIGHEST_BIT)!=0 ) + + for(i=0 ; i & ss2, bool round = true) + { + TTMATH_REFERENCE_ASSERT( ss2 ) + + UInt man_result; + uint c = 0; + uint i; + + if( IsNan() || ss2.IsNan() ) + return CheckCarry(1); + + if( IsZero() ) + return 0; + + if( ss2.IsZero() ) + { + SetZero(); + return 0; + } + + // man_result = mantissa * ss2.mantissa + mantissa.MulBig(ss2.mantissa, man_result); + + // 'i' will be from 0 to man*TTMATH_BITS_PER_UINT + // because mantissa and ss2.mantissa are standardized + // (the highest bit in man_result is set to 1 or + // if there is a zero value in man_result the method CompensationToLeft() + // returns 0 but we'll correct this at the end in Standardizing() method) + i = man_result.CompensationToLeft(); + uint exp_add = man * TTMATH_BITS_PER_UINT - i; + + if( exp_add ) + c += exponent.Add( exp_add ); + + c += exponent.Add( ss2.exponent ); + + for(i=0 ; i & ss2, bool round = true) + { + if( this == &ss2 ) + { + Big copy_ss2(ss2); + return MulRef(copy_ss2, round); + } + else + { + return MulRef(ss2, round); + } + } + + +private: + + /*! + division this = this / ss2 + + return value: + 0 - ok + 1 - carry (in a division carry can be as well) + 2 - improper argument (ss2 is zero) + */ + uint DivRef(const Big & ss2, bool round = true) + { + TTMATH_REFERENCE_ASSERT( ss2 ) + + UInt man1; + UInt man2; + uint i,c = 0; + + if( IsNan() || ss2.IsNan() ) + return CheckCarry(1); + + if( ss2.IsZero() ) + { + SetNan(); + return 2; + } + + if( IsZero() ) + return 0; + + // !! this two loops can be joined together + + for(i=0 ; i & ss2, bool round = true) + { + if( this == &ss2 ) + { + Big copy_ss2(ss2); + return DivRef(copy_ss2, round); + } + else + { + return DivRef(ss2, round); + } + } + + +private: + + /*! + the remainder from a division + */ + uint ModRef(const Big & ss2) + { + TTMATH_REFERENCE_ASSERT( ss2 ) + + uint c = 0; + + if( IsNan() || ss2.IsNan() ) + return CheckCarry(1); + + if( ss2.IsZero() ) + { + SetNan(); + return 2; + } + + if( !SmallerWithoutSignThan(ss2) ) + { + Big temp(*this); + + c = temp.Div(ss2); + temp.SkipFraction(); + c += temp.Mul(ss2); + c += Sub(temp); + + if( !SmallerWithoutSignThan( ss2 ) ) + c += 1; + } + + return CheckCarry(c); + } + + +public: + + /*! + the remainder from a division + + e.g. + 12.6 mod 3 = 0.6 because 12.6 = 3*4 + 0.6 + -12.6 mod 3 = -0.6 bacause -12.6 = 3*(-4) + (-0.6) + 12.6 mod -3 = 0.6 + -12.6 mod -3 = -0.6 + + it means: + in other words: this(old) = ss2 * q + this(new) + + return value: + 0 - ok + 1 - carry + 2 - improper argument (ss2 is zero) + */ + uint Mod(const Big & ss2) + { + if( this == &ss2 ) + { + Big copy_ss2(ss2); + return ModRef(copy_ss2); + } + else + { + return ModRef(ss2); + } + } + + + /*! + this method returns: 'this' mod 2 + (either zero or one) + + this method is much faster than using Mod( object_with_value_two ) + */ + uint Mod2() const + { + if( exponent>sint(0) || exponent<=-sint(man*TTMATH_BITS_PER_UINT) ) + return 0; + + sint exp_int = exponent.ToInt(); + // 'exp_int' is negative (or zero), we set it as positive + exp_int = -exp_int; + + return mantissa.GetBit(exp_int); + } + + + /*! + power this = this ^ pow + (pow without a sign) + + binary algorithm (r-to-l) + + return values: + 0 - ok + 1 - carry + 2 - incorrect arguments (0^0) + */ + template + uint Pow(UInt pow) + { + if( IsNan() ) + return 1; + + if( IsZero() ) + { + if( pow.IsZero() ) + { + // we don't define zero^zero + SetNan(); + return 2; + } + + // 0^(+something) is zero + return 0; + } + + Big start(*this); + Big result; + result.SetOne(); + uint c = 0; + + while( !c ) + { + if( pow.table[0] & 1 ) + c += result.Mul(start); + + pow.Rcr(1); + + if( pow.IsZero() ) + break; + + c += start.Mul(start); + } + + *this = result; + + return CheckCarry(c); + } + + + /*! + power this = this ^ pow + p can be negative + + return values: + 0 - ok + 1 - carry + 2 - incorrect arguments 0^0 or 0^(-something) + */ + template + uint Pow(Int pow) + { + if( IsNan() ) + return 1; + + if( !pow.IsSign() ) + return Pow( UInt(pow) ); + + if( IsZero() ) + { + // if 'p' is negative then + // 'this' must be different from zero + SetNan(); + return 2; + } + + uint c = pow.ChangeSign(); + + Big t(*this); + c += t.Pow( UInt(pow) ); // here can only be a carry (return:1) + + SetOne(); + c += Div(t); + + return CheckCarry(c); + } + + + /*! + power this = this ^ abs([pow]) + pow is treated as a value without a sign and without a fraction + if pow has a sign then the method pow.Abs() is used + if pow has a fraction the fraction is skipped (not used in calculation) + + return values: + 0 - ok + 1 - carry + 2 - incorrect arguments (0^0) + */ + uint PowUInt(Big pow) + { + if( IsNan() || pow.IsNan() ) + return CheckCarry(1); + + if( IsZero() ) + { + if( pow.IsZero() ) + { + SetNan(); + return 2; + } + + // 0^(+something) is zero + return 0; + } + + if( pow.IsSign() ) + pow.Abs(); + + Big start(*this); + Big result; + Big one; + uint c = 0; + one.SetOne(); + result = one; + + while( !c ) + { + if( pow.Mod2() ) + c += result.Mul(start); + + c += pow.exponent.SubOne(); + + if( pow < one ) + break; + + c += start.Mul(start); + } + + *this = result; + + return CheckCarry(c); + } + + + /*! + power this = this ^ [pow] + pow is treated as a value without a fraction + pow can be negative + + return values: + 0 - ok + 1 - carry + 2 - incorrect arguments 0^0 or 0^(-something) + */ + uint PowInt(const Big & pow) + { + if( IsNan() || pow.IsNan() ) + return CheckCarry(1); + + if( !pow.IsSign() ) + return PowUInt(pow); + + if( IsZero() ) + { + // if 'pow' is negative then + // 'this' must be different from zero + SetNan(); + return 2; + } + + Big temp(*this); + uint c = temp.PowUInt(pow); // here can only be a carry (result:1) + + SetOne(); + c += Div(temp); + + return CheckCarry(c); + } + + + /*! + power this = this ^ pow + this must be greater than zero (this > 0) + pow can be negative and with fraction + + return values: + 0 - ok + 1 - carry + 2 - incorrect argument ('this' <= 0) + */ + uint PowFrac(const Big & pow) + { + if( IsNan() || pow.IsNan() ) + return CheckCarry(1); + + Big temp; + uint c = temp.Ln(*this); + + if( c != 0 ) // can be 2 from Ln() + { + SetNan(); + return c; + } + + c += temp.Mul(pow); + c += Exp(temp); + + return CheckCarry(c); + } + + + /*! + power this = this ^ pow + pow can be negative and with fraction + + return values: + 0 - ok + 1 - carry + 2 - incorrect argument ('this' or 'pow') + */ + uint Pow(const Big & pow) + { + if( IsNan() || pow.IsNan() ) + return CheckCarry(1); + + if( IsZero() ) + { + // 0^pow will be 0 only for pow>0 + if( pow.IsSign() || pow.IsZero() ) + { + SetNan(); + return 2; + } + + SetZero(); + + return 0; + } + + if( pow.exponent>-sint(man*TTMATH_BITS_PER_UINT) && pow.exponent<=0 ) + { + if( pow.IsInteger() ) + return PowInt( pow ); + } + + return PowFrac(pow); + } + + + /*! + this function calculates the square root + e.g. let this=9 then this.Sqrt() gives 3 + + return: 0 - ok + 1 - carry + 2 - improper argument (this<0 or NaN) + */ + uint Sqrt() + { + if( IsNan() || IsSign() ) + { + SetNan(); + return 2; + } + + if( IsZero() ) + return 0; + + Big old(*this); + Big ln; + uint c = 0; + + // we're using the formula: sqrt(x) = e ^ (ln(x) / 2) + c += ln.Ln(*this); + c += ln.exponent.SubOne(); // ln = ln / 2 + c += Exp(ln); + + // above formula doesn't give accurate results for some integers + // e.g. Sqrt(81) would not be 9 but a value very closed to 9 + // we're rounding the result, calculating result*result and comparing + // with the old value, if they are equal then the result is an integer too + + if( !c && old.IsInteger() && !IsInteger() ) + { + Big temp(*this); + c += temp.Round(); + + Big temp2(temp); + c += temp.Mul(temp2); + + if( temp == old ) + *this = temp2; + } + + return CheckCarry(c); + } + + +private: + +#ifdef TTMATH_CONSTANTSGENERATOR +public: +#endif + + /*! + Exponent this = exp(x) = e^x where x is in (-1,1) + + we're using the formula exp(x) = 1 + (x)/(1!) + (x^2)/(2!) + (x^3)/(3!) + ... + */ + void ExpSurrounding0(const Big & x, uint * steps = 0) + { + TTMATH_REFERENCE_ASSERT( x ) + + Big denominator, denominator_i; + Big one, old_value, next_part; + Big numerator = x; + + SetOne(); + one.SetOne(); + denominator.SetOne(); + denominator_i.SetOne(); + + uint i; + old_value = *this; + + // we begin from 1 in order to not test at the beginning + #ifdef TTMATH_CONSTANTSGENERATOR + for(i=1 ; true ; ++i) + #else + for(i=1 ; i<=TTMATH_ARITHMETIC_MAX_LOOP ; ++i) + #endif + { + bool testing = ((i & 3) == 0); // it means '(i % 4) == 0' + + next_part = numerator; + + if( next_part.Div( denominator ) ) + // if there is a carry here we only break the loop + // however the result we return as good + // it means there are too many parts of the formula + break; + + // there shouldn't be a carry here + Add( next_part ); + + if( testing ) + { + if( old_value == *this ) + // we've added next few parts of the formula but the result + // is still the same then we break the loop + break; + else + old_value = *this; + } + + // we set the denominator and the numerator for a next part of the formula + if( denominator_i.Add(one) ) + // if there is a carry here the result we return as good + break; + + if( denominator.Mul(denominator_i) ) + break; + + if( numerator.Mul(x) ) + break; + } + + if( steps ) + *steps = i; + } + +public: + + + /*! + Exponent this = exp(x) = e^x + + we're using the fact that our value is stored in form of: + x = mantissa * 2^exponent + then + e^x = e^(mantissa* 2^exponent) or + e^x = (e^mantissa)^(2^exponent) + + 'Exp' returns a carry if we can't count the result ('x' is too big) + */ + uint Exp(const Big & x) + { + uint c = 0; + + if( x.IsNan() ) + return CheckCarry(1); + + if( x.IsZero() ) + { + SetOne(); + return 0; + } + + // m will be the value of the mantissa in range (-1,1) + Big m(x); + m.exponent = -sint(man*TTMATH_BITS_PER_UINT); + + // 'e_' will be the value of '2^exponent' + // e_.mantissa.table[man-1] = TTMATH_UINT_HIGHEST_BIT; and + // e_.exponent.Add(1) mean: + // e_.mantissa.table[0] = 1; + // e_.Standardizing(); + // e_.exponent.Add(man*TTMATH_BITS_PER_UINT) + // (we must add 'man*TTMATH_BITS_PER_UINT' because we've taken it from the mantissa) + Big e_(x); + e_.mantissa.SetZero(); + e_.mantissa.table[man-1] = TTMATH_UINT_HIGHEST_BIT; + c += e_.exponent.Add(1); + e_.Abs(); + + /* + now we've got: + m - the value of the mantissa in range (-1,1) + e_ - 2^exponent + + e_ can be as: + ...2^-2, 2^-1, 2^0, 2^1, 2^2 ... + ...1/4 , 1/2 , 1 , 2 , 4 ... + + above one e_ is integer + + if e_ is greater than 1 we calculate the exponent as: + e^(m * e_) = ExpSurrounding0(m) ^ e_ + and if e_ is smaller or equal one we calculate the exponent in this way: + e^(m * e_) = ExpSurrounding0(m* e_) + because if e_ is smaller or equal 1 then the product of m*e_ is smaller or equal m + */ + + if( e_ <= 1 ) + { + m.Mul(e_); + ExpSurrounding0(m); + } + else + { + ExpSurrounding0(m); + c += PowUInt(e_); + } + + return CheckCarry(c); + } + + + + +private: + +#ifdef TTMATH_CONSTANTSGENERATOR +public: +#endif + + /*! + Natural logarithm this = ln(x) where x in range <1,2) + + we're using the formula: + ln x = 2 * [ (x-1)/(x+1) + (1/3)((x-1)/(x+1))^3 + (1/5)((x-1)/(x+1))^5 + ... ] + */ + void LnSurrounding1(const Big & x, uint * steps = 0) + { + Big old_value, next_part, denominator, one, two, x1(x), x2(x); + + one.SetOne(); + + if( x == one ) + { + // LnSurrounding1(1) is 0 + SetZero(); + return; + } + + two = 2; + + x1.Sub(one); + x2.Add(one); + + x1.Div(x2); + x2 = x1; + x2.Mul(x1); + + denominator.SetOne(); + SetZero(); + + old_value = *this; + uint i; + + + #ifdef TTMATH_CONSTANTSGENERATOR + for(i=1 ; true ; ++i) + #else + // we begin from 1 in order to not test at the beginning + for(i=1 ; i<=TTMATH_ARITHMETIC_MAX_LOOP ; ++i) + #endif + { + bool testing = ((i & 3) == 0); // it means '(i % 4) == 0' + + next_part = x1; + + if( next_part.Div(denominator) ) + // if there is a carry here we only break the loop + // however the result we return as good + // it means there are too many parts of the formula + break; + + // there shouldn't be a carry here + Add(next_part); + + if( testing ) + { + if( old_value == *this ) + // we've added next (step_test) parts of the formula but the result + // is still the same then we break the loop + break; + else + old_value = *this; + } + + if( x1.Mul(x2) ) + // if there is a carry here the result we return as good + break; + + if( denominator.Add(two) ) + break; + } + + // this = this * 2 + // ( there can't be a carry here because we calculate the logarithm between <1,2) ) + exponent.AddOne(); + + if( steps ) + *steps = i; + } + + + + +public: + + + /*! + Natural logarithm this = ln(x) + (a logarithm with the base equal 'e') + + we're using the fact that our value is stored in form of: + x = mantissa * 2^exponent + then + ln(x) = ln (mantissa * 2^exponent) = ln (mantissa) + (exponent * ln (2)) + + the mantissa we'll show as a value from range <1,2) because the logarithm + is decreasing too fast when 'x' is going to 0 + + return values: + 0 - ok + 1 - overflow (carry) + 2 - incorrect argument (x<=0) + */ + uint Ln(const Big & x) + { + if( x.IsNan() ) + return CheckCarry(1); + + if( x.IsSign() || x.IsZero() ) + { + SetNan(); + return 2; + } + + Big exponent_temp; + exponent_temp.FromInt( x.exponent ); + + // m will be the value of the mantissa in range <1,2) + Big m(x); + m.exponent = -sint(man*TTMATH_BITS_PER_UINT - 1); + + // we must add 'man*TTMATH_BITS_PER_UINT-1' because we've taken it from the mantissa + uint c = exponent_temp.Add(man*TTMATH_BITS_PER_UINT-1); + + LnSurrounding1(m); + + Big ln2; + ln2.SetLn2(); + c += exponent_temp.Mul(ln2); + c += Add(exponent_temp); + + return CheckCarry(c); + } + + + /*! + Logarithm from 'x' with a 'base' + + we're using the formula: + Log(x) with 'base' = ln(x) / ln(base) + + return values: + 0 - ok + 1 - overflow + 2 - incorrect argument (x<=0) + 3 - incorrect base (a<=0 lub a=1) + */ + uint Log(const Big & x, const Big & base) + { + if( x.IsNan() || base.IsNan() ) + return CheckCarry(1); + + if( x.IsSign() || x.IsZero() ) + { + SetNan(); + return 2; + } + + Big denominator;; + denominator.SetOne(); + + if( base.IsSign() || base.IsZero() || base==denominator ) + { + SetNan(); + return 3; + } + + if( x == denominator ) // (this is: if x == 1) + { + // log(1) is 0 + SetZero(); + return 0; + } + + // another error values we've tested at the beginning + // there can only be a carry + uint c = Ln(x); + + c += denominator.Ln(base); + c += Div(denominator); + + return CheckCarry(c); + } + + + + + /*! + * + * converting methods + * + */ + + + /*! + converting from another type of a Big object + */ + template + uint FromBig(const Big & another) + { + info = another.info; + + if( IsNan() ) + return 1; + + if( exponent.FromInt(another.exponent) ) + { + SetNan(); + return 1; + } + + uint man_len_min = (man < another_man)? man : another_man; + uint i; + uint c = 0; + + for( i = 0 ; i another_man )' and 'if( man < another_man )' and there'll be no such situation here + #ifdef _MSC_VER + #pragma warning( disable: 4307 ) + #endif + + if( man > another_man ) + { + uint man_diff = (man - another_man) * TTMATH_BITS_PER_UINT; + c += exponent.SubInt(man_diff, 0); + } + else + if( man < another_man ) + { + uint man_diff = (another_man - man) * TTMATH_BITS_PER_UINT; + c += exponent.AddInt(man_diff, 0); + } + + #ifdef _MSC_VER + #pragma warning( default: 4307 ) + #endif + + // mantissa doesn't have to be standardized (either the highest bit is set or all bits are equal zero) + CorrectZero(); + + return CheckCarry(c); + } + + +private: + + /*! + an auxiliary method for converting 'this' into 'result' + if the value is too big this method returns a carry (1) + */ + uint ToUIntOrInt(uint & result) const + { + result = 0; + + if( IsZero() ) + return 0; + + sint maxbit = -sint(man*TTMATH_BITS_PER_UINT); + + if( exponent > maxbit + sint(TTMATH_BITS_PER_UINT) ) + // if exponent > (maxbit + sint(TTMATH_BITS_PER_UINT)) the value can't be passed + // into the 'sint' type (it's too big) + return 1; + + if( exponent <= maxbit ) + // our value is from the range of (-1,1) and we return zero + return 0; + + // exponent is from a range of (maxbit, maxbit + sint(TTMATH_BITS_PER_UINT) > + // and [maxbit + sint(TTMATH_BITS_PER_UINT] <= 0 + sint how_many_bits = exponent.ToInt(); + + // how_many_bits is negative, we'll make it positive + how_many_bits = -how_many_bits; + + result = (mantissa.table[man-1] >> (how_many_bits % TTMATH_BITS_PER_UINT)); + + return 0; + } + + +public: + + /*! + this method converts 'this' into uint + */ + uint ToUInt() const + { + uint result; + + ToUInt(result); + + return result; + } + + + /*! + this method converts 'this' into 'result' + + if the value is too big this method returns a carry (1) + */ + uint ToUInt(uint & result) const + { + if( ToUIntOrInt(result) ) + return 1; + + if( IsSign() ) + return 1; + + return 0; + } + + + /*! + this method converts 'this' into sint + */ + sint ToInt() const + { + sint result; + + ToInt(result); + + return result; + } + + + /*! + this method converts 'this' into 'result' + + if the value is too big this method returns a carry (1) + */ + uint ToInt(uint & result) const + { + return ToUInt(result); + } + + + /*! + this method converts 'this' into 'result' + + if the value is too big this method returns a carry (1) + */ + uint ToInt(sint & result) const + { + uint result_uint; + + uint c = ToUIntOrInt(result_uint); + result = sint(result_uint); + + if( c ) + return 1; + + uint mask = 0; + + if( IsSign() ) + { + mask = TTMATH_UINT_MAX_VALUE; + result = -result; + } + + return ((result & TTMATH_UINT_HIGHEST_BIT) == (mask & TTMATH_UINT_HIGHEST_BIT)) ? 0 : 1; + } + + +private: + + /*! + an auxiliary method for converting 'this' into 'result' + + if the value is too big this method returns a carry (1) + */ + template + uint ToUIntOrInt(UInt & result) const + { + result.SetZero(); + + if( IsZero() ) + return 0; + + sint maxbit = -sint(man*TTMATH_BITS_PER_UINT); + + if( exponent > maxbit + sint(int_size*TTMATH_BITS_PER_UINT) ) + // if exponent > (maxbit + sint(int_size*TTMATH_BITS_PER_UINT)) the value can't be passed + // into the 'UInt' type (it's too big) + return 1; + + if( exponent <= maxbit ) + // our value is from range (-1,1) and we return zero + return 0; + + sint how_many_bits = exponent.ToInt(); + + if( how_many_bits < 0 ) + { + how_many_bits = -how_many_bits; + uint index = how_many_bits / TTMATH_BITS_PER_UINT; + + UInt mantissa_temp(mantissa); + mantissa_temp.Rcr( how_many_bits % TTMATH_BITS_PER_UINT, 0 ); + + for(uint i=index, a=0 ; i maxbit + sint(int_size*TTMATH_BITS_PER_UINT) )" + // but gcc doesn't understand our types - exponent is Int<> + + for(uint i=0 ; i + uint ToUInt(UInt & result) const + { + uint c = ToUIntOrInt(result); + + if( c ) + return 1; + + if( IsSign() ) + return 1; + + return 0; + } + + + /*! + this method converts 'this' into 'result' + + if the value is too big this method returns a carry (1) + */ + template + uint ToInt(UInt & result) const + { + return ToUInt(result); + } + + + /*! + this method converts 'this' into 'result' + + if the value is too big this method returns a carry (1) + */ + template + uint ToInt(Int & result) const + { + uint c = ToUIntOrInt(result); + + if( c ) + return 1; + + uint mask = 0; + + if( IsSign() ) + { + result.ChangeSign(); + mask = TTMATH_UINT_MAX_VALUE; + } + + return ((result.table[int_size-1] & TTMATH_UINT_HIGHEST_BIT) == (mask & TTMATH_UINT_HIGHEST_BIT))? 0 : 1; + } + + + /*! + a method for converting 'uint' to this class + */ + uint FromUInt(uint value) + { + if( value == 0 ) + { + SetZero(); + return 0; + } + + info = 0; + + for(uint i=0 ; i> 20; + uint m1 = ((temp.u[1] & 0xFFFFFu) << 11) | (temp.u[0] >> 21); + uint m2 = temp.u[0] << 11; + + if( e == 2047 ) + { + // If E=2047 and F is nonzero, then V=NaN ("Not a number") + // If E=2047 and F is zero and S is 1, then V=-Infinity + // If E=2047 and F is zero and S is 0, then V=Infinity + + // we do not support -Infinity and +Infinity + // we assume that there is always NaN + + SetNan(); + } + else + if( e > 0 ) + { + // If 0 m; + m.table[1] = m1; + m.table[0] = m2; + uint moved = m.CompensationToLeft(); + + FromDouble_SetExpAndMan((temp.u[1] & 0x80000000u) != 0, + e - 1022 - man*TTMATH_BITS_PER_UINT + 1 - moved, 0, + m.table[1], m.table[0]); + } + else + { + // If E=0 and F is zero and S is 1, then V=-0 + // If E=0 and F is zero and S is 0, then V=0 + + // we do not support -0 or 0, only is one 0 + SetZero(); + } + } + + return 0; // never be a carry + } + + +private: + + void FromDouble_SetExpAndMan(bool is_sign, int e, uint mhighest, uint m1, uint m2) + { + exponent = e; + + if( man > 1 ) + { + mantissa.table[man-1] = m1 | mhighest; + mantissa.table[sint(man-2)] = m2; + // although man>1 we're using casting into sint + // to get rid from a warning which generates Microsoft Visual: + // warning C4307: '*' : integral constant overflow + + for(uint i=0 ; i> 52; + uint m = (temp.u & 0xFFFFFFFFFFFFFul) << 11; + + if( e == 2047 ) + { + // If E=2047 and F is nonzero, then V=NaN ("Not a number") + // If E=2047 and F is zero and S is 1, then V=-Infinity + // If E=2047 and F is zero and S is 0, then V=Infinity + + // we do not support -Infinity and +Infinity + // we assume that there is always NaN + + SetNan(); + } + else + if( e > 0 ) + { + // If 0> 23) & 0xff) == 0xff ) + { + if( (temp.u & 0x7FFFFF) == 0 ) + return true; // +/- infinity + } + + return false; + } + + +public: + + /*! + this method converts from this class into the 'float' + + if the value is too big: + 'result' will be +/-infinity (depending on the sign) + if the value is too small: + 'result' will be 0 + */ + float ToFloat() const + { + float result; + + ToFloat(result); + + return result; + } + + + /*! + this method converts from this class into the 'float' + + if the value is too big: + 'result' will be +/-infinity (depending on the sign) + and the method returns 1 + if the value is too small: + 'result' will be 0 + and the method returns 1 + */ + uint ToFloat(float & result) const + { + double result_double; + + uint c = ToDouble(result_double); + result = float(result_double); + + if( result == -0.0f ) + result = 0.0f; + + if( c ) + return 1; + + // although the result_double can have a correct value + // but after converting to float there can be infinity + + if( IsInf(result) ) + return 1; + + if( result == 0.0f && result_double != 0.0 ) + // result_double was too small for float + return 1; + + return 0; + } + + + /*! + this method converts from this class into the 'double' + + if the value is too big: + 'result' will be +/-infinity (depending on the sign) + and the method returns 1 + if the value is too small: + 'result' will be 0 + and the method returns 1 + */ + uint ToDouble(double & result) const + { + if( IsZero() ) + { + result = 0.0; + return 0; + } + + if( IsNan() ) + { + result = ToDouble_SetDouble( false, 2047, 0, false, true); + + return 0; + } + + sint e_correction = sint(man*TTMATH_BITS_PER_UINT) - 1; + + if( exponent >= 1024 - e_correction ) + { + // +/- infinity + result = ToDouble_SetDouble( IsSign(), 2047, 0, true); + + return 1; + } + else + if( exponent <= -1023 - 52 - e_correction ) + { + // too small value - we assume that there'll be a zero + result = 0; + + // and return a carry + return 1; + } + + sint e = exponent.ToInt() + e_correction; + + if( e <= -1023 ) + { + // -1023-52 < e <= -1023 (unnormalized value) + result = ToDouble_SetDouble( IsSign(), 0, -(e + 1023)); + } + else + { + // -1023 < e < 1024 + result = ToDouble_SetDouble( IsSign(), e + 1023, -1); + } + + return 0; + } + +private: + +#ifdef TTMATH_PLATFORM32 + + // 32bit platforms + double ToDouble_SetDouble(bool is_sign, uint e, sint move, bool infinity = false, bool nan = false) const + { + union + { + double d; + uint u[2]; // two 32bit words + } temp; + + temp.u[0] = temp.u[1] = 0; + + if( is_sign ) + temp.u[1] |= 0x80000000u; + + temp.u[1] |= (e << 20) & 0x7FF00000u; + + if( nan ) + { + temp.u[0] |= 1; + return temp.d; + } + + if( infinity ) + return temp.d; + + UInt<2> m; + m.table[1] = mantissa.table[man-1]; + m.table[0] = ( man > 1 ) ? mantissa.table[sint(man-2)] : 0; + // although man>1 we're using casting into sint + // to get rid from a warning which generates Microsoft Visual: + // warning C4307: '*' : integral constant overflow + + m.Rcr( 12 + move ); + m.table[1] &= 0xFFFFFu; // cutting the 20 bit (when 'move' was -1) + + temp.u[1] |= m.table[1]; + temp.u[0] |= m.table[0]; + + return temp.d; + } + +#else + + // 64bit platforms + double ToDouble_SetDouble(bool is_sign, uint e, sint move, bool infinity = false, bool nan = false) const + { + union + { + double d; + uint u; // 64bit word + } temp; + + temp.u = 0; + + if( is_sign ) + temp.u |= 0x8000000000000000ul; + + temp.u |= (e << 52) & 0x7FF0000000000000ul; + + if( nan ) + { + temp.u |= 1; + return temp.d; + } + + if( infinity ) + return temp.d; + + uint m = mantissa.table[man-1]; + + m >>= ( 12 + move ); + m &= 0xFFFFFFFFFFFFFul; // cutting the 20 bit (when 'move' was -1) + temp.u |= m; + + return temp.d; + } + +#endif + + +public: + + + /*! + an operator= for converting 'sint' to this class + */ + Big & operator=(sint value) + { + FromInt(value); + + return *this; + } + + + /*! + an operator= for converting 'uint' to this class + */ + Big & operator=(uint value) + { + FromUInt(value); + + return *this; + } + + + /*! + an operator= for converting 'float' to this class + */ + Big & operator=(float value) + { + FromFloat(value); + + return *this; + } + + + /*! + an operator= for converting 'double' to this class + */ + Big & operator=(double value) + { + FromDouble(value); + + return *this; + } + + + /*! + a constructor for converting 'sint' to this class + */ + Big(sint value) + { + FromInt(value); + } + + /*! + a constructor for converting 'uint' to this class + */ + Big(uint value) + { + FromUInt(value); + } + + + /*! + a constructor for converting 'double' to this class + */ + Big(double value) + { + FromDouble(value); + } + + + /*! + a constructor for converting 'float' to this class + */ + Big(float value) + { + FromFloat(value); + } + + +#ifdef TTMATH_PLATFORM32 + + /*! + this method converts 'this' into 'result' (64 bit unsigned integer) + if the value is too big this method returns a carry (1) + */ + uint ToUInt(ulint & result) const + { + UInt<2> temp; // 64 bits container + + uint c = ToUInt(temp); + temp.ToUInt(result); + + return c; + } + + + /*! + this method converts 'this' into 'result' (64 bit unsigned integer) + if the value is too big this method returns a carry (1) + */ + uint ToInt(ulint & result) const + { + return ToUInt(result); + } + + + /*! + this method converts 'this' into 'result' (64 bit unsigned integer) + if the value is too big this method returns a carry (1) + */ + uint ToInt(slint & result) const + { + Int<2> temp; // 64 bits container + + uint c = ToInt(temp); + temp.ToInt(result); + + return c; + } + + + /*! + a method for converting 'ulint' (64bit unsigned integer) to this class + */ + uint FromUInt(ulint value) + { + if( value == 0 ) + { + SetZero(); + return 0; + } + + info = 0; + + if( man == 1 ) + { + sint bit = mantissa.FindLeadingBitInWord(uint(value >> TTMATH_BITS_PER_UINT)); + + if( bit != -1 ) + { + // the highest word from value is different from zero + bit += 1; + value >>= bit; + exponent = bit; + } + else + { + exponent.SetZero(); + } + + mantissa.table[0] = uint(value); + } + else + { + #ifdef _MSC_VER + //warning C4307: '*' : integral constant overflow + #pragma warning( disable: 4307 ) + #endif + + // man >= 2 + mantissa.table[man-1] = uint(value >> TTMATH_BITS_PER_UINT); + mantissa.table[man-2] = uint(value); + + #ifdef _MSC_VER + //warning C4307: '*' : integral constant overflow + #pragma warning( default: 4307 ) + #endif + + exponent = -sint(man-2) * sint(TTMATH_BITS_PER_UINT); + + for(uint i=0 ; i & operator=(ulint value) + { + FromUInt(value); + + return *this; + } + + + /*! + a constructor for converting 'slint' (64bit signed integer) to this class + */ + Big(slint value) + { + FromInt(value); + } + + + /*! + an operator for converting 'slint' (64bit signed integer) to this class + */ + Big & operator=(slint value) + { + FromInt(value); + + return *this; + } + +#endif + + + +#ifdef TTMATH_PLATFORM64 + + + /*! + this method converts 'this' into 'result' (32 bit unsigned integer) + ***this method is created only on a 64bit platform*** + if the value is too big this method returns a carry (1) + */ + uint ToUInt(unsigned int & result) const + { + uint result_uint; + + uint c = ToUInt(result_uint); + result = (unsigned int)result_uint; + + if( c || result_uint != uint(result) ) + return 1; + + return 0; + } + + + /*! + this method converts 'this' into 'result' (32 bit unsigned integer) + ***this method is created only on a 64bit platform*** + if the value is too big this method returns a carry (1) + */ + uint ToInt(unsigned int & result) const + { + return ToUInt(result); + } + + + /*! + this method converts 'this' into 'result' (32 bit signed integer) + ***this method is created only on a 64bit platform*** + if the value is too big this method returns a carry (1) + */ + uint ToInt(signed int & result) const + { + sint result_sint; + + uint c = ToInt(result_sint); + result = (signed int)result_sint; + + if( c || result_sint != sint(result) ) + return 1; + + return 0; + } + + + /* + this method converts 32 bit unsigned int to this class + ***this method is created only on a 64bit platform*** + */ + uint FromUInt(unsigned int value) + { + return FromUInt(uint(value)); + } + + + /* + this method converts 32 bit unsigned int to this class + ***this method is created only on a 64bit platform*** + */ + uint FromInt(unsigned int value) + { + return FromUInt(uint(value)); + } + + + /* + this method converts 32 bit signed int to this class + ***this method is created only on a 64bit platform*** + */ + uint FromInt(signed int value) + { + return FromInt(sint(value)); + } + + + /*! + an operator= for converting 32 bit unsigned int to this class + ***this operator is created only on a 64bit platform*** + */ + Big & operator=(unsigned int value) + { + FromUInt(value); + + return *this; + } + + + /*! + a constructor for converting 32 bit unsigned int to this class + ***this constructor is created only on a 64bit platform*** + */ + Big(unsigned int value) + { + FromUInt(value); + } + + + /*! + an operator for converting 32 bit signed int to this class + ***this operator is created only on a 64bit platform*** + */ + Big & operator=(signed int value) + { + FromInt(value); + + return *this; + } + + + /*! + a constructor for converting 32 bit signed int to this class + ***this constructor is created only on a 64bit platform*** + */ + Big(signed int value) + { + FromInt(value); + } + +#endif + + +private: + + /*! + an auxiliary method for converting from UInt and Int + + we assume that there'll never be a carry here + (we have an exponent and the value in Big can be bigger than + that one from the UInt) + */ + template + uint FromUIntOrInt(const UInt & value, sint compensation) + { + uint minimum_size = (int_size < man)? int_size : man; + exponent = (sint(int_size)-sint(man)) * sint(TTMATH_BITS_PER_UINT) - compensation; + + // copying the highest words + uint i; + for(i=1 ; i<=minimum_size ; ++i) + mantissa.table[man-i] = value.table[int_size-i]; + + // setting the rest of mantissa.table into zero (if some has left) + for( ; i<=man ; ++i) + mantissa.table[man-i] = 0; + + // the highest bit is either one or zero (when the whole mantissa is zero) + // we can only call CorrectZero() + CorrectZero(); + + return 0; + } + + +public: + + /*! + a method for converting from 'UInt' to this class + */ + template + uint FromUInt(UInt value) + { + info = 0; + sint compensation = (sint)value.CompensationToLeft(); + + return FromUIntOrInt(value, compensation); + } + + + /*! + a method for converting from 'UInt' to this class + */ + template + uint FromInt(const UInt & value) + { + return FromUInt(value); + } + + + /*! + a method for converting from 'Int' to this class + */ + template + uint FromInt(Int value) + { + info = 0; + bool is_sign = false; + + if( value.IsSign() ) + { + value.ChangeSign(); + is_sign = true; + } + + sint compensation = (sint)value.CompensationToLeft(); + FromUIntOrInt(value, compensation); + + if( is_sign ) + SetSign(); + + return 0; + } + + + /*! + an operator= for converting from 'Int' to this class + */ + template + Big & operator=(const Int & value) + { + FromInt(value); + + return *this; + } + + + /*! + a constructor for converting from 'Int' to this class + */ + template + Big(const Int & value) + { + FromInt(value); + } + + + /*! + an operator= for converting from 'UInt' to this class + */ + template + Big & operator=(const UInt & value) + { + FromUInt(value); + + return *this; + } + + + /*! + a constructor for converting from 'UInt' to this class + */ + template + Big(const UInt & value) + { + FromUInt(value); + } + + + /*! + an operator= for converting from 'Big' to this class + */ + template + Big & operator=(const Big & value) + { + FromBig(value); + + return *this; + } + + + /*! + a constructor for converting from 'Big' to this class + */ + template + Big(const Big & value) + { + FromBig(value); + } + + + /*! + a default constructor + + by default we don't set any of the members to zero + only NaN flag is set + + if you want the mantissa and exponent to be set to zero + define TTMATH_BIG_DEFAULT_CLEAR macro + (useful for debug purposes) + */ + Big() + { + #ifdef TTMATH_BIG_DEFAULT_CLEAR + + SetZeroNan(); + + #else + + info = TTMATH_BIG_NAN; + // we're directly setting 'info' (instead of calling SetNan()) + // in order to get rid of a warning saying that 'info' is uninitialized + + #endif + } + + + /*! + a destructor + */ + ~Big() + { + } + + + /*! + the default assignment operator + */ + Big & operator=(const Big & value) + { + info = value.info; + exponent = value.exponent; + mantissa = value.mantissa; + + return *this; + } + + + /*! + a constructor for copying from another object of this class + */ + + Big(const Big & value) + { + operator=(value); + } + + + + /*! + a method for converting into a string + struct Conv is defined in ttmathtypes.h, look there for more information about parameters + + output: + return value: + 0 - ok and 'result' will be an object of type std::string (or std::wstring) which holds the value + 1 - if there is a carry (it shoudn't be in a normal situation - if it is that means there + is somewhere an error in the library) + */ + uint ToString( std::string & result, + uint base = 10, + bool scient = false, + sint scient_from = 15, + sint round = -1, + bool trim_zeroes = true, + char comma = '.' ) const + { + Conv conv; + + conv.base = base; + conv.scient = scient; + conv.scient_from = scient_from; + conv.round = round; + conv.trim_zeroes = trim_zeroes; + conv.comma = static_cast(comma); + + return ToStringBase(result, conv); + } + + + /*! + a method for converting into a string + struct Conv is defined in ttmathtypes.h, look there for more information about parameters + */ + uint ToString(std::string & result, const Conv & conv) const + { + return ToStringBase(result, conv); + } + + + /*! + a method for converting into a string + struct Conv is defined in ttmathtypes.h, look there for more information about parameters + */ + std::string ToString(const Conv & conv) const + { + std::string result; + ToStringBase(result, conv); + + return result; + } + + + /*! + a method for converting into a string + struct Conv is defined in ttmathtypes.h, look there for more information about parameters + */ + std::string ToString(uint base = 10) const + { + Conv conv; + conv.base = base; + + return ToString(conv); + } + + + +#ifndef TTMATH_DONT_USE_WCHAR + + + /*! + a method for converting into a string + struct Conv is defined in ttmathtypes.h, look there for more information about parameters + */ + uint ToString( std::wstring & result, + uint base = 10, + bool scient = false, + sint scient_from = 15, + sint round = -1, + bool trim_zeroes = true, + wchar_t comma = '.' ) const + { + Conv conv; + + conv.base = base; + conv.scient = scient; + conv.scient_from = scient_from; + conv.round = round; + conv.trim_zeroes = trim_zeroes; + conv.comma = static_cast(comma); + + return ToStringBase(result, conv); + } + + + /*! + a method for converting into a string + struct Conv is defined in ttmathtypes.h, look there for more information about parameters + */ + uint ToString(std::wstring & result, const Conv & conv) const + { + return ToStringBase(result, conv); + } + + + /*! + a method for converting into a string + struct Conv is defined in ttmathtypes.h, look there for more information about parameters + */ + std::wstring ToWString(const Conv & conv) const + { + std::wstring result; + ToStringBase(result, conv); + + return result; + } + + + /*! + a method for converting into a string + struct Conv is defined in ttmathtypes.h, look there for more information about parameters + */ + std::wstring ToWString(uint base = 10) const + { + Conv conv; + conv.base = base; + + return ToWString(conv); + } + +#endif + + + +private: + + + /*! + an auxiliary method for converting into the string + */ + template + uint ToStringBase(string_type & result, const Conv & conv) const + { + static char error_overflow_msg[] = "overflow"; + static char error_nan_msg[] = "NaN"; + result.erase(); + + if( IsNan() ) + { + Misc::AssignString(result, error_nan_msg); + return 0; + } + + if( conv.base<2 || conv.base>16 ) + { + Misc::AssignString(result, error_overflow_msg); + return 1; + } + + if( IsZero() ) + { + result = '0'; + + return 0; + } + + /* + since 'base' is greater or equal 2 that 'new_exp' of type 'Int' should + hold the new value of exponent but we're using 'Int' because + if the value for example would be 'max()' then we couldn't show it + + max() -> 11111111 * 2 ^ 11111111111 (bin)(the mantissa and exponent have all bits set) + if we were using 'Int' we couldn't show it in this format: + 1,1111111 * 2 ^ 11111111111 (bin) + because we have to add something to the mantissa and because + mantissa is full we can't do it and it'll be a carry + (look at ToString_SetCommaAndExponent(...)) + + when the base would be greater than two (for example 10) + we could use 'Int' here + */ + Int new_exp; + + if( ToString_CreateNewMantissaAndExponent(result, conv, new_exp) ) + { + Misc::AssignString(result, error_overflow_msg); + return 1; + } + + + if( ToString_SetCommaAndExponent(result, conv, new_exp) ) + { + Misc::AssignString(result, error_overflow_msg); + return 1; + } + + if( IsSign() ) + result.insert(result.begin(), '-'); + + + // converted successfully + return 0; + } + + + + /*! + in the method 'ToString_CreateNewMantissaAndExponent()' we're using + type 'Big' and we should have the ability to use some + necessary methods from that class (methods which are private here) + */ + friend class Big; + + + /*! + an auxiliary method for converting into the string + + input: + base - the base in range <2,16> + + output: + return values: + 0 - ok + 1 - if there was a carry + new_man - the new mantissa for 'base' + new_exp - the new exponent for 'base' + + mathematic part: + + the value is stored as: + value = mantissa * 2^exponent + we want to show 'value' as: + value = new_man * base^new_exp + + then 'new_man' we'll print using the standard method from UInt<> type for printing + and 'new_exp' is the offset of the comma operator in a system of a base 'base' + + value = mantissa * 2^exponent + value = mantissa * 2^exponent * (base^new_exp / base^new_exp) + value = mantissa * (2^exponent / base^new_exp) * base^new_exp + + look at the part (2^exponent / base^new_exp), there'll be good if we take + a 'new_exp' equal that value when the (2^exponent / base^new_exp) will be equal one + + on account of the 'base' is not as power of 2 (can be from 2 to 16), + this formula will not be true for integer 'new_exp' then in our case we take + 'base^new_exp' _greater_ than '2^exponent' + + if 'base^new_exp' were smaller than '2^exponent' the new mantissa could be + greater than the max value of the container UInt + + value = mantissa * (2^exponent / base^new_exp) * base^new_exp + let M = mantissa * (2^exponent / base^new_exp) then + value = M * base^new_exp + + in our calculation we treat M as floating value showing it as: + M = mm * 2^ee where ee will be <= 0 + + next we'll move all bits of mm into the right when ee is equal zero + abs(ee) must not be too big that only few bits from mm we can leave + + then we'll have: + M = mmm * 2^0 + 'mmm' is the new_man which we're looking for + + + new_exp we calculate in this way: + 2^exponent <= base^new_exp + new_exp >= log base (2^exponent) <- logarithm with the base 'base' from (2^exponent) + + but we need new_exp as integer then we test: + if new_exp is greater than zero and with fraction we add one to new_exp + new_exp = new_exp + 1 (if new_exp>0 and with fraction) + and at the end we take the integer part: + new_exp = int(new_exp) + */ + template + uint ToString_CreateNewMantissaAndExponent( string_type & new_man, const Conv & conv, + Int & new_exp) const + { + uint c = 0; + + if( conv.base<2 || conv.base>16 ) + return 1; + + // special method for base equal 2 + if( conv.base == 2 ) + return ToString_CreateNewMantissaAndExponent_Base2(new_man, new_exp); + + // special method for base equal 4 + if( conv.base == 4 ) + return ToString_CreateNewMantissaAndExponent_BasePow2(new_man, new_exp, 2); + + // special method for base equal 8 + if( conv.base == 8 ) + return ToString_CreateNewMantissaAndExponent_BasePow2(new_man, new_exp, 3); + + // special method for base equal 16 + if( conv.base == 16 ) + return ToString_CreateNewMantissaAndExponent_BasePow2(new_man, new_exp, 4); + + + // this = mantissa * 2^exponent + + // temp = +1 * 2^exponent + // we're using a bigger type than 'big' (look below) + Big temp; + temp.info = 0; + temp.exponent = exponent; + temp.mantissa.SetOne(); + c += temp.Standardizing(); + + // new_exp_ = log base (2^exponent) + // if new_exp_ is positive and with fraction then we add one + Big new_exp_; + c += new_exp_.ToString_Log(temp, conv.base); // this logarithm isn't very complicated + + // rounding up to the nearest integer + if( !new_exp_.IsInteger() ) + { + if( !new_exp_.IsSign() ) + c += new_exp_.AddOne(); // new_exp_ > 0 and with fraction + + new_exp_.SkipFraction(); + } + + if( ToString_CreateNewMantissaTryExponent(new_man, conv, new_exp_, new_exp) ) + { + // in very rare cases there can be an overflow from ToString_CreateNewMantissaTryExponent + // it means that new_exp_ was too small (the problem comes from floating point numbers precision) + // so we increse new_exp_ and try again + new_exp_.AddOne(); + c += ToString_CreateNewMantissaTryExponent(new_man, conv, new_exp_, new_exp); + } + + return (c==0)? 0 : 1; + } + + + + /*! + an auxiliary method for converting into the string + + trying to calculate new_man for given exponent (new_exp_) + if there is a carry it can mean that new_exp_ is too small + */ + template + uint ToString_CreateNewMantissaTryExponent( string_type & new_man, const Conv & conv, + const Big & new_exp_, Int & new_exp) const + { + uint c = 0; + + // because 'base^new_exp' is >= '2^exponent' then + // because base is >= 2 then we've got: + // 'new_exp_' must be smaller or equal 'new_exp' + // and we can pass it into the Int type + // (in fact we're using a greater type then it'll be ok) + c += new_exp_.ToInt(new_exp); + + // base_ = base + Big base_(conv.base); + + // base_ = base_ ^ new_exp_ + c += base_.Pow( new_exp_ ); // use new_exp_ so Pow(Big<> &) version will be used + // if we hadn't used a bigger type than 'Big' then the result + // of this formula 'Pow(...)' would have been with an overflow + + // temp = mantissa * 2^exponent / base_^new_exp_ + Big temp; + temp.info = 0; + temp.mantissa = mantissa; + temp.exponent = exponent; + c += temp.Div(base_); + + // moving all bits of the mantissa into the right + // (how many times to move depend on the exponent) + c += temp.ToString_MoveMantissaIntoRight(); + + // because we took 'new_exp' as small as it was + // possible ([log base (2^exponent)] + 1) that after the division + // (temp.Div( base_ )) the value of exponent should be equal zero or + // minimum smaller than zero then we've got the mantissa which has + // maximum valid bits + temp.mantissa.ToString(new_man, conv.base); + + if( IsInteger() ) + { + // making sure the new mantissa will be without fraction (integer) + ToString_CheckMantissaInteger(new_man, new_exp); + } + else + if( conv.base_round ) + { + c += ToString_BaseRound(new_man, conv, new_exp); + } + + return (c==0)? 0 : 1; + } + + + /*! + this method calculates the logarithm + it is used by ToString_CreateNewMantissaAndExponent() method + + it's not too complicated + because x=+1*2^exponent (mantissa is one) then during the calculation + the Ln(x) will not be making the long formula from LnSurrounding1() + and only we have to calculate 'Ln(base)' but it'll be calculated + only once, the next time we will get it from the 'history' + + x is greater than 0 + base is in <2,16> range + */ + uint ToString_Log(const Big & x, uint base) + { + TTMATH_REFERENCE_ASSERT( x ) + TTMATH_ASSERT( base>=2 && base<=16 ) + + Big temp; + temp.SetOne(); + + if( x == temp ) + { + // log(1) is 0 + SetZero(); + + return 0; + } + + // there can be only a carry + // because the 'x' is in '1+2*exponent' form then + // the long formula from LnSurrounding1() will not be calculated + // (LnSurrounding1() will return one immediately) + uint c = Ln(x); + + if( base==10 && man<=TTMATH_BUILTIN_VARIABLES_SIZE ) + { + // for the base equal 10 we're using SetLn10() instead of calculating it + // (only if we have the constant sufficient big) + temp.SetLn10(); + } + else + { + c += ToString_LogBase(base, temp); + } + + c += Div( temp ); + + return (c==0)? 0 : 1; + } + + +#ifndef TTMATH_MULTITHREADS + + /*! + this method calculates the logarithm of 'base' + it's used in single thread environment + */ + uint ToString_LogBase(uint base, Big & result) + { + TTMATH_ASSERT( base>=2 && base<=16 ) + + // this guardians are initialized before the program runs (static POD types) + static int guardians[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + static Big log_history[15]; + uint index = base - 2; + uint c = 0; + + if( guardians[index] == 0 ) + { + Big base_(base); + c += log_history[index].Ln(base_); + guardians[index] = 1; + } + + result = log_history[index]; + + return (c==0)? 0 : 1; + } + +#else + + /*! + this method calculates the logarithm of 'base' + it's used in multi-thread environment + */ + uint ToString_LogBase(uint base, Big & result) + { + TTMATH_ASSERT( base>=2 && base<=16 ) + + // this guardians are initialized before the program runs (static POD types) + volatile static sig_atomic_t guardians[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + static Big * plog_history; + uint index = base - 2; + uint c = 0; + + // double-checked locking + if( guardians[index] == 0 ) + { + ThreadLock thread_lock; + + // locking + if( thread_lock.Lock() ) + { + static Big log_history[15]; + + if( guardians[index] == 0 ) + { + plog_history = log_history; + + Big base_(base); + c += log_history[index].Ln(base_); + guardians[index] = 1; + } + } + else + { + // there was a problem with locking, we store the result directly in 'result' object + Big base_(base); + c += result.Ln(base_); + + return (c==0)? 0 : 1; + } + + // automatically unlocking + } + + result = plog_history[index]; + + return (c==0)? 0 : 1; + } + +#endif + + /*! + an auxiliary method for converting into the string (private) + + this method moving all bits from mantissa into the right side + the exponent tell us how many times moving (the exponent is <=0) + */ + uint ToString_MoveMantissaIntoRight() + { + if( exponent.IsZero() ) + return 0; + + // exponent can't be greater than zero + // because we would cat the highest bits of the mantissa + if( !exponent.IsSign() ) + return 1; + + + if( exponent <= -sint(man*TTMATH_BITS_PER_UINT) ) + // if 'exponent' is <= than '-sint(man*TTMATH_BITS_PER_UINT)' + // it means that we must cut the whole mantissa + // (there'll not be any of the valid bits) + return 1; + + // e will be from (-man*TTMATH_BITS_PER_UINT, 0> + sint e = -( exponent.ToInt() ); + mantissa.Rcr(e,0); + + return 0; + } + + + /*! + a special method similar to the 'ToString_CreateNewMantissaAndExponent' + when the 'base' is equal 2 + + we use it because if base is equal 2 we don't have to make those + complicated calculations and the output is directly from the source + (there will not be any small distortions) + */ + template + uint ToString_CreateNewMantissaAndExponent_Base2( string_type & new_man, + Int & new_exp ) const + { + for( sint i=man-1 ; i>=0 ; --i ) + { + uint value = mantissa.table[i]; + + for( uint bit=0 ; bit + uint ToString_CreateNewMantissaAndExponent_BasePow2( string_type & new_man, + Int & new_exp, + uint bits) const + { + sint move; // how many times move the mantissa + UInt man_temp(mantissa); // man+1 for moving + new_exp = exponent; + new_exp.DivInt((sint)bits, move); + + if( move != 0 ) + { + // we're moving the man_temp to left-hand side + if( move < 0 ) + { + move = sint(bits) + move; + new_exp.SubOne(); // when move is < than 0 then new_exp is < 0 too + } + + man_temp.Rcl(move); + } + + + if( bits == 3 ) + { + // base 8 + // now 'move' is greater than or equal 0 + uint len = man*TTMATH_BITS_PER_UINT + move; + return ToString_CreateNewMantissaAndExponent_Base8(new_man, man_temp, len, bits); + } + else + { + // base 4 or 16 + return ToString_CreateNewMantissaAndExponent_Base4or16(new_man, man_temp, bits); + } + } + + + /*! + a special method used to calculate the new mantissa + when the 'base' is equal 8 + + bits is always 3 + + we can use this algorithm when the base is 4 or 16 too + but we have a faster method ToString_CreateNewMantissaAndExponent_Base4or16() + */ + template + uint ToString_CreateNewMantissaAndExponent_Base8( string_type & new_man, + UInt & man_temp, + uint len, + uint bits) const + { + uint shift = TTMATH_BITS_PER_UINT - bits; + uint mask = TTMATH_UINT_MAX_VALUE >> shift; + uint i; + + for( i=0 ; i(Misc::DigitToChar(digit))); + + man_temp.Rcr(bits); + } + + TTMATH_ASSERT( man_temp.IsZero() ) + + return 0; + } + + + /*! + a special method used to calculate the new mantissa + when the 'base' is equal 4 or 16 + + when the base is equal 4 or 16 the bits is 2 or 4 + and because TTMATH_BITS_PER_UINT (32 or 64) is divisible by 2 (or 4) + then we can get digits from the end of our mantissa + */ + template + uint ToString_CreateNewMantissaAndExponent_Base4or16( string_type & new_man, + UInt & man_temp, + uint bits) const + { + TTMATH_ASSERT( TTMATH_BITS_PER_UINT % 2 == 0 ) + TTMATH_ASSERT( TTMATH_BITS_PER_UINT % 4 == 0 ) + + uint shift = TTMATH_BITS_PER_UINT - bits; + uint mask = TTMATH_UINT_MAX_VALUE << shift; + uint digit; + + // table[man] - last word - is different from zero if we moved man_temp + digit = man_temp.table[man]; + + if( digit != 0 ) + new_man += static_cast(Misc::DigitToChar(digit)); + + + for( int i=man-1 ; i>=0 ; --i ) + { + uint shift_local = shift; + uint mask_local = mask; + + while( mask_local != 0 ) + { + digit = man_temp.table[i] & mask_local; + + if( shift_local != 0 ) + digit = digit >> shift_local; + + new_man += static_cast(Misc::DigitToChar(digit)); + mask_local = mask_local >> bits; + shift_local = shift_local - bits; + } + } + + return 0; + } + + + /*! + an auxiliary method for converting into the string + */ + template + bool ToString_RoundMantissaWouldBeInteger(string_type & new_man, const Conv & conv, Int & new_exp) const + { + // if new_exp is greater or equal to zero then we have an integer value, + // if new_exp is equal -1 then we have only one digit after the comma + // and after rounding it would be an integer value + if( !new_exp.IsSign() || new_exp == -1 ) + return true; + + if( new_man.size() >= TTMATH_UINT_HIGHEST_BIT || new_man.size() < 2 ) + return true; // oops, the mantissa is too large for calculating (or too small) - we are not doing the base rounding + + uint i = 0; + char_type digit; + + if( new_exp >= -sint(new_man.size()) ) + { + uint new_exp_abs = -new_exp.ToInt(); + i = new_man.size() - new_exp_abs; // start from the first digit after the comma operator + } + + if( Misc::CharToDigit(new_man[new_man.size()-1]) >= conv.base/2 ) + { + if( new_exp < -sint(new_man.size()) ) + { + // there are some zeroes after the comma operator + // (between the comma and the first digit from the mantissa) + // and the result value will never be an integer + return false; + } + + digit = static_cast( Misc::DigitToChar(conv.base-1) ); + } + else + { + digit = '0'; + } + + for( ; i < new_man.size()-1 ; ++i) + if( new_man[i] != digit ) + return false; // it will not be an integer + + return true; // it will be integer after rounding + } + + + /*! + an auxiliary method for converting into the string + (when this is integer) + + after floating point calculating the new mantissa can consist of some fraction + so if our value is integer we should check the new mantissa + (after the decimal point there should be only zeroes) + + often this is a last digit different from zero + ToString_BaseRound would not get rid of it because the method make a test against + an integer value (ToString_RoundMantissaWouldBeInteger) and returns immediately + */ + template + void ToString_CheckMantissaInteger(string_type & new_man, const Int & new_exp) const + { + if( !new_exp.IsSign() ) + return; // return if new_exp >= 0 + + uint i = 0; + uint man_size = new_man.size(); + + if( man_size >= TTMATH_UINT_HIGHEST_BIT ) + return; // ops, the mantissa is too long + + sint sman_size = -sint(man_size); + + if( new_exp >= sman_size ) + { + sint e = new_exp.ToInt(); + e = -e; + // now e means how many last digits from the mantissa should be equal zero + + i = man_size - uint(e); + } + + for( ; i + uint ToString_BaseRound(string_type & new_man, const Conv & conv, Int & new_exp) const + { + // we must have minimum two characters + if( new_man.size() < 2 ) + return 0; + + // assert that there will not be an integer after rounding + if( ToString_RoundMantissaWouldBeInteger(new_man, conv, new_exp) ) + return 0; + + typename string_type::size_type i = new_man.length() - 1; + + // we're erasing the last character + uint digit = Misc::CharToDigit( new_man[i] ); + new_man.erase(i, 1); + uint c = new_exp.AddOne(); + + // if the last character is greater or equal 'base/2' + // we are adding one into the new mantissa + if( digit >= conv.base / 2 ) + ToString_RoundMantissa_AddOneIntoMantissa(new_man, conv); + + return c; + } + + + /*! + an auxiliary method for converting into the string + + this method addes one into the new mantissa + */ + template + void ToString_RoundMantissa_AddOneIntoMantissa(string_type & new_man, const Conv & conv) const + { + if( new_man.empty() ) + return; + + sint i = sint( new_man.length() ) - 1; + bool was_carry = true; + + for( ; i>=0 && was_carry ; --i ) + { + // we can have the comma as well because + // we're using this method later in ToString_CorrectDigitsAfterComma_Round() + // (we're only ignoring it) + if( new_man[i] == static_cast(conv.comma) ) + continue; + + // we're adding one + uint digit = Misc::CharToDigit( new_man[i] ) + 1; + + if( digit == conv.base ) + digit = 0; + else + was_carry = false; + + new_man[i] = static_cast( Misc::DigitToChar(digit) ); + } + + if( i<0 && was_carry ) + new_man.insert( new_man.begin() , '1' ); + } + + + + /*! + an auxiliary method for converting into the string + + this method sets the comma operator and/or puts the exponent + into the string + */ + template + uint ToString_SetCommaAndExponent(string_type & new_man, const Conv & conv, Int & new_exp) const + { + uint carry = 0; + + if( new_man.empty() ) + return carry; + + Int scientific_exp( new_exp ); + + // 'new_exp' depends on the 'new_man' which is stored like this e.g: + // 32342343234 (the comma is at the end) + // we'd like to show it in this way: + // 3.2342343234 (the 'scientific_exp' is connected with this example) + + sint offset = sint( new_man.length() ) - 1; + carry += scientific_exp.Add( offset ); + // there shouldn't have been a carry because we're using + // a greater type -- 'Int' instead of 'Int' + + bool print_scientific = conv.scient; + + if( !print_scientific ) + { + if( scientific_exp > conv.scient_from || scientific_exp < -sint(conv.scient_from) ) + print_scientific = true; + } + + if( !print_scientific ) + ToString_SetCommaAndExponent_Normal(new_man, conv, new_exp); + else + // we're passing the 'scientific_exp' instead of 'new_exp' here + ToString_SetCommaAndExponent_Scientific(new_man, conv, scientific_exp); + + return (carry==0)? 0 : 1; + } + + + /*! + an auxiliary method for converting into the string + */ + template + void ToString_SetCommaAndExponent_Normal(string_type & new_man, const Conv & conv, Int & new_exp ) const + { + if( !new_exp.IsSign() ) // it means: if( new_exp >= 0 ) + ToString_SetCommaAndExponent_Normal_AddingZero(new_man, new_exp); + else + ToString_SetCommaAndExponent_Normal_SetCommaInside(new_man, conv, new_exp); + + + ToString_Group_man(new_man, conv); + } + + + /*! + an auxiliary method for converting into the string + */ + template + void ToString_SetCommaAndExponent_Normal_AddingZero(string_type & new_man, + Int & new_exp) const + { + // we're adding zero characters at the end + // 'i' will be smaller than 'when_scientific' (or equal) + uint i = new_exp.ToInt(); + + if( new_man.length() + i > new_man.capacity() ) + // about 6 characters more (we'll need it for the comma or something) + new_man.reserve( new_man.length() + i + 6 ); + + for( ; i>0 ; --i) + new_man += '0'; + } + + + /*! + an auxiliary method for converting into the string + */ + template + void ToString_SetCommaAndExponent_Normal_SetCommaInside( + string_type & new_man, + const Conv & conv, + Int & new_exp ) const + { + // new_exp is < 0 + + sint new_man_len = sint(new_man.length()); // 'new_man_len' with a sign + sint e = -( new_exp.ToInt() ); // 'e' will be positive + + if( new_exp > -new_man_len ) + { + // we're setting the comma within the mantissa + + sint index = new_man_len - e; + new_man.insert( new_man.begin() + index, static_cast(conv.comma)); + } + else + { + // we're adding zero characters before the mantissa + + uint how_many = e - new_man_len; + string_type man_temp(how_many+1, '0'); + + man_temp.insert( man_temp.begin()+1, static_cast(conv.comma)); + new_man.insert(0, man_temp); + } + + ToString_CorrectDigitsAfterComma(new_man, conv); + } + + + /*! + an auxiliary method for converting into the string + */ + template + void ToString_SetCommaAndExponent_Scientific( string_type & new_man, + const Conv & conv, + Int & scientific_exp ) const + { + if( new_man.empty() ) + return; + + if( new_man.size() > 1 ) + { + new_man.insert( new_man.begin()+1, static_cast(conv.comma) ); + ToString_CorrectDigitsAfterComma(new_man, conv); + } + + ToString_Group_man(new_man, conv); + + if( conv.base == 10 ) + { + new_man += 'e'; + + if( !scientific_exp.IsSign() ) + new_man += '+'; + } + else + { + // the 10 here is meant as the base 'base' + // (no matter which 'base' we're using there'll always be 10 here) + Misc::AddString(new_man, "*10^"); + } + + string_type temp_exp; + scientific_exp.ToString( temp_exp, conv.base ); + + new_man += temp_exp; + } + + + /*! + an auxiliary method for converting into the string + */ + template + void ToString_Group_man(string_type & new_man, const Conv & conv) const + { + typedef typename string_type::size_type StrSize; + + if( conv.group == 0 ) + return; + + // first we're looking for the comma operator + StrSize index = new_man.find(static_cast(conv.comma), 0); + + if( index == string_type::npos ) + index = new_man.size(); + + ToString_Group_man_before_comma(new_man, conv, index); + ToString_Group_man_after_comma(new_man, conv, index+1); + } + + + + /*! + an auxiliary method for converting into the string + */ + template + void ToString_Group_man_before_comma( string_type & new_man, const Conv & conv, + typename string_type::size_type & index) const + { + typedef typename string_type::size_type StrSize; + + uint group = 0; + StrSize i = index; + uint group_digits = conv.group_digits; + + if( group_digits < 1 ) + group_digits = 1; + + // adding group characters before the comma operator + // i>0 because on the first position we don't put any additional grouping characters + for( ; i>0 ; --i, ++group) + { + if( group >= group_digits ) + { + group = 0; + new_man.insert(i, 1, static_cast(conv.group)); + ++index; + } + } + } + + + /*! + an auxiliary method for converting into the string + */ + template + void ToString_Group_man_after_comma(string_type & new_man, const Conv & conv, + typename string_type::size_type index) const + { + uint group = 0; + uint group_digits = conv.group_digits; + + if( group_digits < 1 ) + group_digits = 1; + + for( ; index= group_digits ) + { + group = 0; + new_man.insert(index, 1, static_cast(conv.group)); + ++index; + } + } + } + + + /*! + an auxiliary method for converting into the string + */ + template + void ToString_CorrectDigitsAfterComma( string_type & new_man, + const Conv & conv ) const + { + if( conv.round >= 0 ) + ToString_CorrectDigitsAfterComma_Round(new_man, conv); + + if( conv.trim_zeroes ) + ToString_CorrectDigitsAfterComma_CutOffZeroCharacters(new_man, conv); + } + + + /*! + an auxiliary method for converting into the string + */ + template + void ToString_CorrectDigitsAfterComma_CutOffZeroCharacters( + string_type & new_man, + const Conv & conv) const + { + // minimum two characters + if( new_man.length() < 2 ) + return; + + // we're looking for the index of the last character which is not zero + uint i = uint( new_man.length() ) - 1; + for( ; i>0 && new_man[i]=='0' ; --i ); + + // if there is another character than zero at the end + // we're finishing + if( i == new_man.length() - 1 ) + return; + + // we must have a comma + // (the comma can be removed by ToString_CorrectDigitsAfterComma_Round + // which is called before) + if( new_man.find_last_of(static_cast(conv.comma), i) == string_type::npos ) + return; + + // if directly before the first zero is the comma operator + // we're cutting it as well + if( i>0 && new_man[i]==static_cast(conv.comma) ) + --i; + + new_man.erase(i+1, new_man.length()-i-1); + } + + + /*! + an auxiliary method for converting into the string + */ + template + void ToString_CorrectDigitsAfterComma_Round( + string_type & new_man, + const Conv & conv ) const + { + typedef typename string_type::size_type StrSize; + + // first we're looking for the comma operator + StrSize index = new_man.find(static_cast(conv.comma), 0); + + if( index == string_type::npos ) + // nothing was found (actually there can't be this situation) + return; + + // we're calculating how many digits there are at the end (after the comma) + // 'after_comma' will be greater than zero because at the end + // we have at least one digit + StrSize after_comma = new_man.length() - index - 1; + + // if 'max_digit_after_comma' is greater than 'after_comma' (or equal) + // we don't have anything for cutting + if( static_cast(conv.round) >= after_comma ) + return; + + uint last_digit = Misc::CharToDigit( new_man[ index + conv.round + 1 ], conv.base ); + + // we're cutting the rest of the string + new_man.erase(index + conv.round + 1, after_comma - conv.round); + + if( conv.round == 0 ) + { + // we're cutting the comma operator as well + // (it's not needed now because we've cut the whole rest after the comma) + new_man.erase(index, 1); + } + + if( last_digit >= conv.base / 2 ) + // we must round here + ToString_RoundMantissa_AddOneIntoMantissa(new_man, conv); + } + + + +public: + + /*! + a method for converting a string into its value + + it returns 1 if the value is too big -- we cannot pass it into the range + of our class Big (or if the base is incorrect) + + that means only digits before the comma operator can make this value too big, + all digits after the comma we can ignore + + 'source' - pointer to the string for parsing + + if 'after_source' is set that when this method finishes + it sets the pointer to the new first character after parsed value + + 'value_read' - if the pointer is provided that means the value_read will be true + only when a value has been actually read, there can be situation where only such + a string '-' or '+' will be parsed -- 'after_source' will be different from 'source' but + no value has been read (there are no digits) + on other words if 'value_read' is true -- there is at least one digit in the string + */ + uint FromString(const char * source, uint base = 10, const char ** after_source = 0, bool * value_read = 0) + { + Conv conv; + conv.base = base; + + return FromStringBase(source, conv, after_source, value_read); + } + + + /*! + a method for converting a string into its value + */ + uint FromString(const char * source, const Conv & conv, const char ** after_source = 0, bool * value_read = 0) + { + return FromStringBase(source, conv, after_source, value_read); + } + + + /*! + a method for converting a string into its value + */ + uint FromString(const std::string & string, uint base = 10, const char ** after_source = 0, bool * value_read = 0) + { + return FromString(string.c_str(), base, after_source, value_read); + } + + + /*! + a method for converting a string into its value + */ + uint FromString(const std::string & string, const Conv & conv, const char ** after_source = 0, bool * value_read = 0) + { + return FromString(string.c_str(), conv, after_source, value_read); + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + a method for converting a string into its value + */ + uint FromString(const wchar_t * source, uint base = 10, const wchar_t ** after_source = 0, bool * value_read = 0) + { + Conv conv; + conv.base = base; + + return FromStringBase(source, conv, after_source, value_read); + } + + + /*! + a method for converting a string into its value + */ + uint FromString(const wchar_t * source, const Conv & conv, const wchar_t ** after_source = 0, bool * value_read = 0) + { + return FromStringBase(source, conv, after_source, value_read); + } + + + /*! + a method for converting a string into its value + */ + uint FromString(const std::wstring & string, uint base = 10, const wchar_t ** after_source = 0, bool * value_read = 0) + { + return FromString(string.c_str(), base, after_source, value_read); + } + + + /*! + a method for converting a string into its value + */ + uint FromString(const std::wstring & string, const Conv & conv, const wchar_t ** after_source = 0, bool * value_read = 0) + { + return FromString(string.c_str(), conv, after_source, value_read); + } + +#endif + + +private: + + + /*! + an auxiliary method for converting from a string + */ + template + uint FromStringBase(const char_type * source, const Conv & conv, const char_type ** after_source = 0, bool * value_read = 0) + { + bool is_sign; + bool value_read_temp = false; + + if( conv.base<2 || conv.base>16 ) + { + SetNan(); + + if( after_source ) + *after_source = source; + + if( value_read ) + *value_read = value_read_temp; + + return 1; + } + + SetZero(); + FromString_TestSign( source, is_sign ); + + uint c = FromString_ReadPartBeforeComma( source, conv, value_read_temp ); + + if( FromString_TestCommaOperator(source, conv) ) + c += FromString_ReadPartAfterComma( source, conv, value_read_temp ); + + if( value_read_temp && conv.base == 10 ) + c += FromString_ReadScientificIfExists( source ); + + if( is_sign && !IsZero() ) + ChangeSign(); + + if( after_source ) + *after_source = source; + + if( value_read ) + *value_read = value_read_temp; + + return CheckCarry(c); + } + + + /*! + we're testing whether the value is with the sign + + (this method is used from 'FromString_ReadPartScientific' too) + */ + template + void FromString_TestSign( const char_type * & source, bool & is_sign ) + { + Misc::SkipWhiteCharacters(source); + + is_sign = false; + + if( *source == '-' ) + { + is_sign = true; + ++source; + } + else + if( *source == '+' ) + { + ++source; + } + } + + + /*! + we're testing whether there's a comma operator + */ + template + bool FromString_TestCommaOperator(const char_type * & source, const Conv & conv) + { + if( (*source == static_cast(conv.comma)) || + (*source == static_cast(conv.comma2) && conv.comma2 != 0 ) ) + { + ++source; + + return true; + } + + return false; + } + + + /*! + this method reads the first part of a string + (before the comma operator) + */ + template + uint FromString_ReadPartBeforeComma( const char_type * & source, const Conv & conv, bool & value_read ) + { + sint character; + Big temp; + Big base_( conv.base ); + + Misc::SkipWhiteCharacters( source ); + + for( ; true ; ++source ) + { + if( conv.group!=0 && *source==static_cast(conv.group) ) + continue; + + character = Misc::CharToDigit(*source, conv.base); + + if( character == -1 ) + break; + + value_read = true; + temp = character; + + if( Mul(base_) ) + return 1; + + if( Add(temp) ) + return 1; + } + + return 0; + } + + + /*! + this method reads the second part of a string + (after the comma operator) + */ + template + uint FromString_ReadPartAfterComma( const char_type * & source, const Conv & conv, bool & value_read ) + { + sint character; + uint c = 0, power = 0; + UInt<1> power_; + Big sum, base_(conv.base); + + // we don't remove any white characters here + sum.SetZero(); + + for( ; sum.exponent.IsSign() || sum.exponent.IsZero() ; ++source ) + { + if( conv.group!=0 && *source==static_cast(conv.group) ) + continue; + + character = Misc::CharToDigit(*source, conv.base); + + if( character == -1 ) + break; + + value_read = true; + + // there actually shouldn't be a carry here + c += sum.Mul(base_); + c += sum.Add(character); + power += 1; + + if( power == 0 ) + c += 1; + } + + // we could break the parsing somewhere in the middle of the string, + // but the result (value) still can be good + // we should set a correct value of 'source' now + for( ; Misc::CharToDigit(*source, conv.base) != -1 ; ++source ); + + power_ = power; + c += base_.Pow(power_); + c += sum.Div(base_); + c += Add(sum); + + return (c==0)? 0 : 1; + } + + + /*! + this method checks whether there is a scientific part: [e|E][-|+]value + + it is called when the base is 10 and some digits were read before + */ + template + uint FromString_ReadScientificIfExists(const char_type * & source) + { + uint c = 0; + + bool scientific_read = false; + const char_type * before_scientific = source; + + if( FromString_TestScientific(source) ) + c += FromString_ReadPartScientific( source, scientific_read ); + + if( !scientific_read ) + source = before_scientific; + + return (c==0)? 0 : 1; + } + + + + /*! + we're testing whether is there the character 'e' + + this character is only allowed when we're using the base equals 10 + */ + template + bool FromString_TestScientific(const char_type * & source) + { + Misc::SkipWhiteCharacters(source); + + if( *source=='e' || *source=='E' ) + { + ++source; + + return true; + } + + return false; + } + + + /*! + this method reads the exponent (after 'e' character) when there's a scientific + format of value and only when we're using the base equals 10 + */ + template + uint FromString_ReadPartScientific( const char_type * & source, bool & scientific_read ) + { + uint c = 0; + Big new_exponent, temp; + bool was_sign = false; + + FromString_TestSign( source, was_sign ); + c += FromString_ReadPartScientific_ReadExponent( source, new_exponent, scientific_read ); + + if( scientific_read ) + { + if( was_sign ) + new_exponent.ChangeSign(); + + temp = 10; + c += temp.Pow( new_exponent ); + c += Mul(temp); + } + + return (c==0)? 0 : 1; + } + + + /*! + this method reads the value of the extra exponent when scientific format is used + (only when base == 10) + */ + template + uint FromString_ReadPartScientific_ReadExponent( const char_type * & source, Big & new_exponent, bool & scientific_read ) + { + sint character; + Big base, temp; + + Misc::SkipWhiteCharacters(source); + + new_exponent.SetZero(); + base = 10; + + for( ; (character=Misc::CharToDigit(*source, 10)) != -1 ; ++source ) + { + scientific_read = true; + + temp = character; + + if( new_exponent.Mul(base) ) + return 1; + + if( new_exponent.Add(temp) ) + return 1; + } + + return 0; + } + + +public: + + + /*! + a constructor for converting a string into this class + */ + Big(const char * string) + { + FromString( string ); + } + + + /*! + a constructor for converting a string into this class + */ + Big(const std::string & string) + { + FromString( string.c_str() ); + } + + + /*! + an operator= for converting a string into its value + */ + Big & operator=(const char * string) + { + FromString( string ); + + return *this; + } + + + /*! + an operator= for converting a string into its value + */ + Big & operator=(const std::string & string) + { + FromString( string.c_str() ); + + return *this; + } + + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + a constructor for converting a string into this class + */ + Big(const wchar_t * string) + { + FromString( string ); + } + + + /*! + a constructor for converting a string into this class + */ + Big(const std::wstring & string) + { + FromString( string.c_str() ); + } + + + /*! + an operator= for converting a string into its value + */ + Big & operator=(const wchar_t * string) + { + FromString( string ); + + return *this; + } + + + /*! + an operator= for converting a string into its value + */ + Big & operator=(const std::wstring & string) + { + FromString( string.c_str() ); + + return *this; + } + + +#endif + + + + /*! + * + * methods for comparing + * + */ + + + /*! + this method performs the formula 'abs(this) < abs(ss2)' + and returns the result + + (in other words it treats 'this' and 'ss2' as values without a sign) + we don't check the NaN flag + */ + bool SmallerWithoutSignThan(const Big & ss2) const + { + if( IsZero() ) + { + if( ss2.IsZero() ) + // we've got two zeroes + return false; + else + // this==0 and ss2!=0 + return true; + } + + if( ss2.IsZero() ) + // this!=0 and ss2==0 + return false; + + // we're using the fact that all bits in mantissa are pushed + // into the left side -- Standardizing() + if( exponent == ss2.exponent ) + return mantissa < ss2.mantissa; + + return exponent < ss2.exponent; + } + + + /*! + this method performs the formula 'abs(this) > abs(ss2)' + and returns the result + + (in other words it treats 'this' and 'ss2' as values without a sign) + we don't check the NaN flag + */ + bool GreaterWithoutSignThan(const Big & ss2) const + { + if( IsZero() ) + { + if( ss2.IsZero() ) + // we've got two zeroes + return false; + else + // this==0 and ss2!=0 + return false; + } + + if( ss2.IsZero() ) + // this!=0 and ss2==0 + return true; + + // we're using the fact that all bits in mantissa are pushed + // into the left side -- Standardizing() + if( exponent == ss2.exponent ) + return mantissa > ss2.mantissa; + + return exponent > ss2.exponent; + } + + + /*! + this method performs the formula 'abs(this) == abs(ss2)' + and returns the result + + (in other words it treats 'this' and 'ss2' as values without a sign) + we don't check the NaN flag + */ + bool EqualWithoutSign(const Big & ss2) const + { + if( IsZero() ) + { + if( ss2.IsZero() ) + // we've got two zeroes + return true; + else + // this==0 and ss2!=0 + return false; + } + + if( ss2.IsZero() ) + // this!=0 and ss2==0 + return false; + + if( exponent==ss2.exponent && mantissa==ss2.mantissa ) + return true; + + return false; + } + + + bool operator<(const Big & ss2) const + { + if( IsSign() && !ss2.IsSign() ) + // this<0 and ss2>=0 + return true; + + if( !IsSign() && ss2.IsSign() ) + // this>=0 and ss2<0 + return false; + + // both signs are the same + + if( IsSign() ) + return ss2.SmallerWithoutSignThan( *this ); + + return SmallerWithoutSignThan( ss2 ); + } + + + bool operator==(const Big & ss2) const + { + if( IsSign() != ss2.IsSign() ) + return false; + + return EqualWithoutSign( ss2 ); + } + + + bool operator>(const Big & ss2) const + { + if( IsSign() && !ss2.IsSign() ) + // this<0 and ss2>=0 + return false; + + if( !IsSign() && ss2.IsSign() ) + // this>=0 and ss2<0 + return true; + + // both signs are the same + + if( IsSign() ) + return ss2.GreaterWithoutSignThan( *this ); + + return GreaterWithoutSignThan( ss2 ); + } + + + bool operator>=(const Big & ss2) const + { + return !operator<( ss2 ); + } + + + bool operator<=(const Big & ss2) const + { + return !operator>( ss2 ); + } + + + bool operator!=(const Big & ss2) const + { + return !operator==(ss2); + } + + + + + + /*! + * + * standard mathematical operators + * + */ + + + /*! + an operator for changing the sign + + this method is not changing 'this' but the changed value is returned + */ + Big operator-() const + { + Big temp(*this); + + temp.ChangeSign(); + + return temp; + } + + + Big operator-(const Big & ss2) const + { + Big temp(*this); + + temp.Sub(ss2); + + return temp; + } + + Big & operator-=(const Big & ss2) + { + Sub(ss2); + + return *this; + } + + + Big operator+(const Big & ss2) const + { + Big temp(*this); + + temp.Add(ss2); + + return temp; + } + + + Big & operator+=(const Big & ss2) + { + Add(ss2); + + return *this; + } + + + Big operator*(const Big & ss2) const + { + Big temp(*this); + + temp.Mul(ss2); + + return temp; + } + + + Big & operator*=(const Big & ss2) + { + Mul(ss2); + + return *this; + } + + + Big operator/(const Big & ss2) const + { + Big temp(*this); + + temp.Div(ss2); + + return temp; + } + + + Big & operator/=(const Big & ss2) + { + Div(ss2); + + return *this; + } + + + /*! + Prefix operator e.g ++variable + */ + Big & operator++() + { + AddOne(); + + return *this; + } + + + /*! + Postfix operator e.g variable++ + */ + Big operator++(int) + { + Big temp( *this ); + + AddOne(); + + return temp; + } + + + Big & operator--() + { + SubOne(); + + return *this; + } + + + Big operator--(int) + { + Big temp( *this ); + + SubOne(); + + return temp; + } + + + + /*! + * + * bitwise operators + * (we do not define bitwise not) + */ + + + Big operator&(const Big & p2) const + { + Big temp( *this ); + + temp.BitAnd(p2); + + return temp; + } + + + Big & operator&=(const Big & p2) + { + BitAnd(p2); + + return *this; + } + + + Big operator|(const Big & p2) const + { + Big temp( *this ); + + temp.BitOr(p2); + + return temp; + } + + + Big & operator|=(const Big & p2) + { + BitOr(p2); + + return *this; + } + + + Big operator^(const Big & p2) const + { + Big temp( *this ); + + temp.BitXor(p2); + + return temp; + } + + + Big & operator^=(const Big & p2) + { + BitXor(p2); + + return *this; + } + + + + + + + /*! + this method makes an integer value by skipping any fractions + + for example: + 10.7 will be 10 + 12.1 -- 12 + -20.2 -- 20 + -20.9 -- 20 + -0.7 -- 0 + 0.8 -- 0 + */ + void SkipFraction() + { + if( IsNan() || IsZero() ) + return; + + if( !exponent.IsSign() ) + // exponent >=0 -- the value don't have any fractions + return; + + if( exponent <= -sint(man*TTMATH_BITS_PER_UINT) ) + { + // the value is from (-1,1), we return zero + SetZero(); + return; + } + + // exponent is in range (-man*TTMATH_BITS_PER_UINT, 0) + sint e = exponent.ToInt(); + + mantissa.ClearFirstBits( -e ); + + // we don't have to standardize 'Standardizing()' the value because + // there's at least one bit in the mantissa + // (the highest bit which we didn't touch) + } + + + /*! + this method remains only a fraction from the value + + for example: + 30.56 will be 0.56 + -12.67 -- -0.67 + */ + void RemainFraction() + { + if( IsNan() || IsZero() ) + return; + + if( !exponent.IsSign() ) + { + // exponent >= 0 -- the value doesn't have any fractions + // we return zero + SetZero(); + return; + } + + if( exponent <= -sint(man*TTMATH_BITS_PER_UINT) ) + { + // the value is from (-1,1) + // we don't make anything with the value + return; + } + + // e will be from (-man*TTMATH_BITS_PER_UINT, 0) + sint e = exponent.ToInt(); + + sint how_many_bits_leave = sint(man*TTMATH_BITS_PER_UINT) + e; // there'll be a subtraction -- e is negative + mantissa.Rcl( how_many_bits_leave, 0); + + // there'll not be a carry because the exponent is too small + exponent.Sub( how_many_bits_leave ); + + // we must call Standardizing() here + Standardizing(); + } + + + + /*! + this method returns true if the value is integer + (there is no a fraction) + + (we don't check nan) + */ + bool IsInteger() const + { + if( IsZero() ) + return true; + + if( !exponent.IsSign() ) + // exponent >=0 -- the value don't have any fractions + return true; + + if( exponent <= -sint(man*TTMATH_BITS_PER_UINT) ) + // the value is from (-1,1) + return false; + + // exponent is in range (-man*TTMATH_BITS_PER_UINT, 0) + sint e = exponent.ToInt(); + e = -e; // e means how many bits we must check + + uint len = e / TTMATH_BITS_PER_UINT; + uint rest = e % TTMATH_BITS_PER_UINT; + uint i = 0; + + for( ; i 0 ) + { + uint rest_mask = TTMATH_UINT_MAX_VALUE >> (TTMATH_BITS_PER_UINT - rest); + if( (mantissa.table[i] & rest_mask) != 0 ) + return false; + } + + return true; + } + + + /*! + this method rounds to the nearest integer value + (it returns a carry if it was) + + for example: + 2.3 = 2 + 2.8 = 3 + + -2.3 = -2 + -2.8 = 3 + */ + uint Round() + { + Big half; + uint c; + + if( IsNan() ) + return 1; + + if( IsZero() ) + return 0; + + half.Set05(); + + if( IsSign() ) + { + // 'this' is < 0 + c = Sub( half ); + } + else + { + // 'this' is > 0 + c = Add( half ); + } + + SkipFraction(); + + return CheckCarry(c); + } + + + + /*! + * + * input/output operators for standard streams + * + */ + +private: + + /*! + an auxiliary method for outputing to standard streams + */ + template + static ostream_type & OutputToStream(ostream_type & s, const Big & l) + { + string_type ss; + + l.ToString(ss); + s << ss; + + return s; + } + + +public: + + + /*! + output to standard streams + */ + friend std::ostream & operator<<(std::ostream & s, const Big & l) + { + return OutputToStream(s, l); + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + output to standard streams + */ + friend std::wostream & operator<<(std::wostream & s, const Big & l) + { + return OutputToStream(s, l); + } + +#endif + + + +private: + + /*! + an auxiliary method for converting from a string + */ + template + static istream_type & InputFromStream(istream_type & s, Big & l) + { + string_type ss; + + // char or wchar_t for operator>> + char_type z, old_z; + bool was_comma = false; + bool was_e = false; + + + // operator>> omits white characters if they're set for ommiting + s >> z; + + if( z=='-' || z=='+' ) + { + ss += z; + s >> z; // we're reading a next character (white characters can be ommited) + } + + old_z = 0; + + // we're reading only digits (base=10) and only one comma operator + for( ; s.good() ; z=static_cast(s.get()) ) + { + if( z=='.' || z==',' ) + { + if( was_comma || was_e ) + // second comma operator or comma operator after 'e' character + break; + + was_comma = true; + } + else + if( z == 'e' || z == 'E' ) + { + if( was_e ) + // second 'e' character + break; + + was_e = true; + } + else + if( z == '+' || z == '-' ) + { + if( old_z != 'e' && old_z != 'E' ) + // '+' or '-' is allowed only after 'e' character + break; + } + else + if( Misc::CharToDigit(z, 10) < 0 ) + break; + + + ss += z; + old_z = z; + } + + // we're leaving the last read character + // (it's not belonging to the value) + s.unget(); + + l.FromString( ss ); + + return s; + } + + + +public: + + /*! + input from standard streams + */ + friend std::istream & operator>>(std::istream & s, Big & l) + { + return InputFromStream(s, l); + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + input from standard streams + */ + friend std::wistream & operator>>(std::wistream & s, Big & l) + { + return InputFromStream(s, l); + } + +#endif + +}; + + +} // namespace + +#endif diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathdec.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathdec.h new file mode 100644 index 00000000..92d3e398 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathdec.h @@ -0,0 +1,419 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2012, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + +#ifndef headerfilettmathdec +#define headerfilettmathdec + +#include "ttmathtypes.h" +#include "ttmaththreads.h" +#include "ttmathuint.h" + + + +namespace ttmath +{ + +template +class Dec +{ +public: + + UInt value; + unsigned char info; + + + /*! + Sign + the mask of a bit from 'info' which means that there is a sign + (when the bit is set) + */ + #define TTMATH_DEC_SIGN 128 + + + /*! + Not a number + if this bit is set that there is not a valid number + */ + #define TTMATH_DEC_NAN 64 + + + + + Dec() + { + info = TTMATH_DEC_NAN; + } + + + Dec(const char * s) + { + info = TTMATH_DEC_NAN; + FromString(s); + } + + + Dec & operator=(const char * s) + { + FromString(s); + + return *this; + } + + + uint FromString(const char * s, const char ** after_source = 0, bool * value_read = 0) + { + return FromStringBase(s, after_source, value_read); + } + + + void ToString(std::string & result) const + { + ToStringBase(result); + } + + + /*! + this method clears a specific bit in the 'info' variable + + bit is one of: + */ + void ClearInfoBit(unsigned char bit) + { + info = info & (~bit); + } + + + /*! + this method sets a specific bit in the 'info' variable + + bit is one of: + + */ + void SetInfoBit(unsigned char bit) + { + info = info | bit; + } + + + /*! + this method returns true if a specific bit in the 'info' variable is set + + bit is one of: + */ + bool IsInfoBit(unsigned char bit) const + { + return (info & bit) != 0; + } + + + bool IsNan() const + { + return IsInfoBit(TTMATH_DEC_NAN); + } + + + bool IsSign() const + { + return IsInfoBit(TTMATH_DEC_SIGN); + } + + + /*! + this method sets the sign + + e.g. + -1 -> -1 + 2 -> -2 + + we do not check whether there is a zero or not, if you're using this method + you must be sure that the value is (or will be afterwards) different from zero + */ + void SetSign() + { + SetInfoBit(TTMATH_DEC_SIGN); + } + + + void SetNaN() + { + SetInfoBit(TTMATH_DEC_NAN); + } + + + void Abs() + { + ClearInfoBit(TTMATH_DEC_SIGN); + } + + + + uint Add(const Dec & arg) + { + uint c = 0; + + if( IsSign() == arg.IsSign() ) + { + c += value.Add(arg.value); + } + else + { + bool is_sign; + + if( value > arg.value ) + { + is_sign = IsSign(); + value.Sub(arg.value); + } + else + { + is_sign = arg.IsSign(); + UInt temp(this->value); + value = arg.value; + value.Sub(temp); + } + + is_sign ? SetSign() : Abs(); + } + + if( c ) + SetNaN(); + + return (c==0)? 0 : 1; + } + +/* + uint Sub(const Dec & arg) + { + } +*/ + +private: + + + + + + +#ifndef TTMATH_MULTITHREADS + + /*! + */ + void SetMultipler(UInt & result) + { + // this guardian is initialized before the program runs (static POD type) + static int guardian = 0; + static UInt multipler; + + if( guardian == 0 ) + { + multipler = 10; + multipler.Pow(dec_digits); + guardian = 1; + } + + result = multipler; + } + +#else + + /*! + */ + void SetMultipler(UInt & result) + { + // this guardian is initialized before the program runs (static POD type) + volatile static sig_atomic_t guardian = 0; + static UInt * pmultipler; + + // double-checked locking + if( guardian == 0 ) + { + ThreadLock thread_lock; + + // locking + if( thread_lock.Lock() ) + { + static UInt multipler; + + if( guardian == 0 ) + { + pmultipler = &multipler; + multipler = 10; + multipler.Pow(dec_digits); + guardian = 1; + } + } + else + { + // there was a problem with locking, we store the result directly in 'result' object + result = 10; + result.Pow(dec_digits); + + return; + } + + // automatically unlocking + } + + result = *pmultipler; + } + +#endif + + + + /*! + an auxiliary method for converting from a string + */ + template + uint FromStringBase(const char_type * s, const char_type ** after_source = 0, bool * value_read = 0) + { + UInt multipler; + const char_type * after; + uint c = 0; + info = 0; + + Misc::SkipWhiteCharacters(s); + + if( *s == '-' ) + { + s += 1; + SetSign(); + } + else + if( *s == '+' ) + { + s += 1; + } + + c += value.FromString(s, 10, &after, value_read); + + if( after_source ) + *after_source = after; + + SetMultipler(multipler); + c += value.Mul(multipler); + + if( *after == '.' ) + c += FromStringBaseAfterComma(after+1, after_source); + + if( c ) + SetInfoBit(TTMATH_DEC_NAN); + + return (c==0)? 0 : 1; + } + + + template + uint FromStringBaseAfterComma(const char_type * s, const char_type ** after_source = 0, bool * value_read = 0) + { + UInt temp; + UInt multipler; + sint z; + uint c = 0; + size_t i = dec_digits; + + SetMultipler(multipler); + + for( ; i>0 && (z=Misc::CharToDigit(*s, 10)) != -1 ; --i, ++s ) + { + multipler.DivInt(10); + temp.SetZero(); + + if( value_read ) + *value_read = true; + + if( c == 0 ) + { + temp.table[0] = z; + c += temp.Mul(multipler); + c += value.Add(temp); + } + } + + if( i == 0 && (z=Misc::CharToDigit(*s, 10)) != -1 && z >= 5 ) + c += value.AddOne(); + + if( after_source ) + { + while( (z=Misc::CharToDigit(*s, 10)) != -1 ) + s += 1; + + *after_source = s; + } + + return c; + } + + + + template + void ToStringBase(string_type & result) const + { + if( IsNan() ) + { + result = "NaN"; + return; + } + + value.ToStringBase(result, 10, IsSign()); + + if( dec_digits > 0 ) + { + size_t size = result.size(); + + if( IsSign() && size > 0 ) + size -= 1; + + if( dec_digits >= size ) + { + size_t zeroes = dec_digits - size + 1; + size_t start = IsSign() ? 1 : 0; + result.insert(start, zeroes, '0'); + } + + result.insert(result.end() - dec_digits, '.'); + } + } + + + +}; + + +} // namespace + +#endif diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathint.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathint.h new file mode 100644 index 00000000..ad306f01 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathint.h @@ -0,0 +1,1922 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2011, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + + + +#ifndef headerfilettmathint +#define headerfilettmathint + +/*! + \file ttmathint.h + \brief template class Int +*/ + +#include "ttmathuint.h" + +namespace ttmath +{ + + +/*! + \brief Int implements a big integer value with a sign + + value_size - how many bytes specify our value + on 32bit platforms: value_size=1 -> 4 bytes -> 32 bits + on 64bit platforms: value_size=1 -> 8 bytes -> 64 bits + value_size = 1,2,3,4,5,6.... +*/ +template +class Int : public UInt +{ +public: + + /*! + this method sets the max value which this class can hold + (all bits will be one besides the last one) + */ + void SetMax() + { + UInt::SetMax(); + UInt::table[value_size-1] = ~ TTMATH_UINT_HIGHEST_BIT; + } + + + /*! + this method sets the min value which this class can hold + (all bits will be zero besides the last one which is one) + */ + void SetMin() + { + UInt::SetZero(); + UInt::table[value_size-1] = TTMATH_UINT_HIGHEST_BIT; + } + + + /*! + this method sets -1 as the value + (-1 is equal the max value in an unsigned type) + */ + void SetSignOne() + { + UInt::SetMax(); + } + + + /*! + we change the sign of the value + + if it isn't possible to change the sign this method returns 1 + else return 0 and changing the sign + */ + uint ChangeSign() + { + /* + if the value is equal that one which has been returned from SetMin + (only the highest bit is set) that means we can't change sign + because the value is too big (bigger about one) + + e.g. when value_size = 1 and value is -2147483648 we can't change it to the + 2147483648 because the max value which can be held is 2147483647 + + we don't change the value and we're using this fact somewhere in some methods + (if we look on our value without the sign we get the correct value + eg. -2147483648 in Int<1> will be 2147483648 on the UInt<1> type) + */ + if( UInt::IsOnlyTheHighestBitSet() ) + return 1; + + UInt temp(*this); + UInt::SetZero(); + UInt::Sub(temp); + + return 0; + } + + + + /*! + this method sets the sign + + e.g. 1 -> -1 + -2 -> -2 + + from a positive value we make a negative value, + if the value is negative we do nothing + */ + void SetSign() + { + if( IsSign() ) + return; + + ChangeSign(); + } + + + + /*! + this method returns true if there's the sign + + (the highest bit will be converted to the bool) + */ + bool IsSign() const + { + return UInt::IsTheHighestBitSet(); + } + + + + /*! + it sets an absolute value + + it can return carry (1) (look on ChangeSign() for details) + */ + uint Abs() + { + if( !IsSign() ) + return 0; + + return ChangeSign(); + } + + + + + /*! + * + * basic mathematic functions + * + */ + +private: + + uint CorrectCarryAfterAdding(bool p1_is_sign, bool p2_is_sign) + { + if( !p1_is_sign && !p2_is_sign ) + { + if( UInt::IsTheHighestBitSet() ) + return 1; + } + + if( p1_is_sign && p2_is_sign ) + { + if( ! UInt::IsTheHighestBitSet() ) + return 1; + } + + return 0; + } + + +public: + + /*! + this method adds two value with a sign and returns a carry + + we're using methods from the base class because values are stored with U2 + we must only make the carry correction + + this = p1(=this) + p2 + + when p1>=0 i p2>=0 carry is set when the highest bit of value is set + when p1<0 i p2<0 carry is set when the highest bit of value is clear + when p1>=0 i p2<0 carry will never be set + when p1<0 i p2>=0 carry will never be set + */ + uint Add(const Int & ss2) + { + bool p1_is_sign = IsSign(); + bool p2_is_sign = ss2.IsSign(); + + UInt::Add(ss2); + + return CorrectCarryAfterAdding(p1_is_sign, p2_is_sign); + } + + + /*! + this method adds one *unsigned* word (at a specific position) + and returns a carry (if it was) + + look at a description in UInt<>::AddInt(...) + */ + uint AddInt(uint value, uint index = 0) + { + bool p1_is_sign = IsSign(); + + UInt::AddInt(value, index); + + return CorrectCarryAfterAdding(p1_is_sign, false); + } + + + /*! + this method adds two *unsigned* words to the existing value + and these words begin on the 'index' position + + index should be equal or smaller than value_size-2 (index <= value_size-2) + x1 - lower word, x2 - higher word + + look at a description in UInt<>::AddTwoInts(...) + */ + uint AddTwoInts(uint x2, uint x1, uint index) + { + bool p1_is_sign = IsSign(); + + UInt::AddTwoInts(x2, x1, index); + + return CorrectCarryAfterAdding(p1_is_sign, false); + } + +private: + + uint CorrectCarryAfterSubtracting(bool p1_is_sign, bool p2_is_sign) + { + if( !p1_is_sign && p2_is_sign ) + { + if( UInt::IsTheHighestBitSet() ) + return 1; + } + + if( p1_is_sign && !p2_is_sign ) + { + if( ! UInt::IsTheHighestBitSet() ) + return 1; + } + + return 0; + } + +public: + + /*! + this method subtracts two values with a sign + + we don't use the previous Add because the method ChangeSign can + sometimes return carry + + this = p1(=this) - p2 + + when p1>=0 i p2>=0 carry will never be set + when p1<0 i p2<0 carry will never be set + when p1>=0 i p2<0 carry is set when the highest bit of value is set + when p1<0 i p2>=0 carry is set when the highest bit of value is clear + */ + uint Sub(const Int & ss2) + { + bool p1_is_sign = IsSign(); + bool p2_is_sign = ss2.IsSign(); + + UInt::Sub(ss2); + + return CorrectCarryAfterSubtracting(p1_is_sign, p2_is_sign); + } + + + /*! + this method subtracts one *unsigned* word (at a specific position) + and returns a carry (if it was) + */ + uint SubInt(uint value, uint index = 0) + { + bool p1_is_sign = IsSign(); + + UInt::SubInt(value, index); + + return CorrectCarryAfterSubtracting(p1_is_sign, false); + } + + + /*! + this method adds one to the value and returns carry + */ + uint AddOne() + { + bool p1_is_sign = IsSign(); + + UInt::AddOne(); + + return CorrectCarryAfterAdding(p1_is_sign, false); + } + + + /*! + this method subtracts one from the value and returns carry + */ + uint SubOne() + { + bool p1_is_sign = IsSign(); + + UInt::SubOne(); + + return CorrectCarryAfterSubtracting(p1_is_sign, false); + } + + +private: + + + uint CheckMinCarry(bool ss1_is_sign, bool ss2_is_sign) + { + /* + we have to examine the sign of the result now + but if the result is with the sign then: + 1. if the signs were the same that means the result is too big + (the result must be without a sign) + 2. if the signs were different that means if the result + is different from that one which has been returned from SetMin() + that is carry (result too big) but if the result is equal SetMin() + there'll be ok (and the next SetSign will has no effect because + the value is actually negative -- look at description of that case + in ChangeSign()) + */ + if( IsSign() ) + { + if( ss1_is_sign != ss2_is_sign ) + { + /* + there can be one case where signs are different and + the result will be equal the value from SetMin() (only the highest bit is set) + (this situation is ok) + */ + if( !UInt::IsOnlyTheHighestBitSet() ) + return 1; + } + else + { + // signs were the same + return 1; + } + } + + return 0; + } + + +public: + + + /*! + multiplication: this = this * ss2 + + it can return a carry + */ + uint MulInt(sint ss2) + { + bool ss1_is_sign, ss2_is_sign; + uint c; + + ss1_is_sign = IsSign(); + + /* + we don't have to check the carry from Abs (values will be correct + because next we're using the method MulInt from the base class UInt + which is without a sign) + */ + Abs(); + + if( ss2 < 0 ) + { + ss2 = -ss2; + ss2_is_sign = true; + } + else + { + ss2_is_sign = false; + } + + c = UInt::MulInt((uint)ss2); + c += CheckMinCarry(ss1_is_sign, ss2_is_sign); + + if( ss1_is_sign != ss2_is_sign ) + SetSign(); + + return c; + } + + + + /*! + multiplication this = this * ss2 + + it returns carry if the result is too big + (we're using the method from the base class but we have to make + one correction in account of signs) + */ + uint Mul(Int ss2) + { + bool ss1_is_sign, ss2_is_sign; + uint c; + + ss1_is_sign = IsSign(); + ss2_is_sign = ss2.IsSign(); + + /* + we don't have to check the carry from Abs (values will be correct + because next we're using the method Mul from the base class UInt + which is without a sign) + */ + Abs(); + ss2.Abs(); + + c = UInt::Mul(ss2); + c += CheckMinCarry(ss1_is_sign, ss2_is_sign); + + if( ss1_is_sign != ss2_is_sign ) + SetSign(); + + return c; + } + + + /*! + division this = this / ss2 + returned values: + 0 - ok + 1 - division by zero + + for example: (result means 'this') + 20 / 3 --> result: 6 remainder: 2 + -20 / 3 --> result: -6 remainder: -2 + 20 / -3 --> result: -6 remainder: 2 + -20 / -3 --> result: 6 remainder: -2 + + in other words: this(old) = ss2 * this(new)(result) + remainder + */ + uint Div(Int ss2, Int * remainder = 0) + { + bool ss1_is_sign, ss2_is_sign; + + ss1_is_sign = IsSign(); + ss2_is_sign = ss2.IsSign(); + + /* + we don't have to test the carry from Abs as well as in Mul + */ + Abs(); + ss2.Abs(); + + uint c = UInt::Div(ss2, remainder); + + if( ss1_is_sign != ss2_is_sign ) + SetSign(); + + if( ss1_is_sign && remainder ) + remainder->SetSign(); + + return c; + } + + uint Div(const Int & ss2, Int & remainder) + { + return Div(ss2, &remainder); + } + + + /*! + division this = this / ss2 (ss2 is int) + returned values: + 0 - ok + 1 - division by zero + + for example: (result means 'this') + 20 / 3 --> result: 6 remainder: 2 + -20 / 3 --> result: -6 remainder: -2 + 20 / -3 --> result: -6 remainder: 2 + -20 / -3 --> result: 6 remainder: -2 + + in other words: this(old) = ss2 * this(new)(result) + remainder + */ + uint DivInt(sint ss2, sint * remainder = 0) + { + bool ss1_is_sign, ss2_is_sign; + + ss1_is_sign = IsSign(); + + /* + we don't have to test the carry from Abs as well as in Mul + */ + Abs(); + + if( ss2 < 0 ) + { + ss2 = -ss2; + ss2_is_sign = true; + } + else + { + ss2_is_sign = false; + } + + uint rem; + uint c = UInt::DivInt((uint)ss2, &rem); + + if( ss1_is_sign != ss2_is_sign ) + SetSign(); + + if( remainder ) + { + if( ss1_is_sign ) + *remainder = -sint(rem); + else + *remainder = sint(rem); + } + + return c; + } + + + uint DivInt(sint ss2, sint & remainder) + { + return DivInt(ss2, &remainder); + } + + +private: + + + /*! + power this = this ^ pow + this can be negative + pow is >= 0 + */ + uint Pow2(const Int & pow) + { + bool was_sign = IsSign(); + uint c = 0; + + if( was_sign ) + c += Abs(); + + uint c_temp = UInt::Pow(pow); + if( c_temp > 0 ) + return c_temp; // c_temp can be: 0, 1 or 2 + + if( was_sign && (pow.table[0] & 1) == 1 ) + // negative value to the power of odd number is negative + c += ChangeSign(); + + return (c==0)? 0 : 1; + } + + +public: + + + /*! + power this = this ^ pow + + return values: + 0 - ok + 1 - carry + 2 - incorrect arguments 0^0 or 0^(-something) + */ + uint Pow(Int pow) + { + if( !pow.IsSign() ) + return Pow2(pow); + + if( UInt::IsZero() ) + // if 'pow' is negative then + // 'this' must be different from zero + return 2; + + if( pow.ChangeSign() ) + return 1; + + Int t(*this); + uint c_temp = t.Pow2(pow); + if( c_temp > 0 ) + return c_temp; + + UInt::SetOne(); + if( Div(t) ) + return 1; + + return 0; + } + + + + /*! + * + * convertion methods + * + */ +private: + + + /*! + an auxiliary method for converting both from UInt and Int + */ + template + uint FromUIntOrInt(const UInt & p, bool UInt_type) + { + uint min_size = (value_size < argument_size)? value_size : argument_size; + uint i; + + for(i=0 ; i::table[i] = p.table[i]; + + + if( value_size > argument_size ) + { + uint fill; + + if( UInt_type ) + fill = 0; + else + fill = (p.table[argument_size-1] & TTMATH_UINT_HIGHEST_BIT)? + TTMATH_UINT_MAX_VALUE : 0; + + // 'this' is longer than 'p' + for( ; i::table[i] = fill; + } + else + { + uint test = (UInt::table[value_size-1] & TTMATH_UINT_HIGHEST_BIT)? + TTMATH_UINT_MAX_VALUE : 0; + + if( UInt_type && test!=0 ) + return 1; + + for( ; i type into this class + + this operation has mainly sense if the value from p + can be held in this type + + it returns a carry if the value 'p' is too big + */ + template + uint FromInt(const Int & p) + { + return FromUIntOrInt(p, false); + } + + + /*! + this method converts the sint type into this class + */ + uint FromInt(sint value) + { + uint fill = ( value<0 ) ? TTMATH_UINT_MAX_VALUE : 0; + + for(uint i=1 ; i::table[i] = fill; + + UInt::table[0] = uint(value); + + // there'll never be a carry here + return 0; + } + + + /*! + this method converts UInt into this class + */ + template + uint FromUInt(const UInt & p) + { + return FromUIntOrInt(p, true); + } + + + /*! + this method converts UInt into this class + */ + template + uint FromInt(const UInt & p) + { + return FromUIntOrInt(p, true); + } + + + /*! + this method converts the uint type into this class + */ + uint FromUInt(uint value) + { + for(uint i=1 ; i::table[i] = 0; + + UInt::table[0] = value; + + // there can be a carry here when the size of this value is equal one word + // and the 'value' has the highest bit set + if( value_size==1 && (value & TTMATH_UINT_HIGHEST_BIT)!=0 ) + return 1; + + return 0; + } + + + /*! + this method converts the uint type into this class + */ + uint FromInt(uint value) + { + return FromUInt(value); + } + + + /*! + the default assignment operator + */ + Int & operator=(const Int & p) + { + FromInt(p); + + return *this; + } + + + /*! + this operator converts an Int type to this class + + it doesn't return a carry + */ + template + Int & operator=(const Int & p) + { + FromInt(p); + + return *this; + } + + + /*! + this method converts the sint type to this class + */ + Int & operator=(sint i) + { + FromInt(i); + + return *this; + } + + + /*! + a constructor for converting the uint to this class + */ + Int(sint i) + { + FromInt(i); + } + + + /*! + a copy constructor + */ + Int(const Int & u) + { + FromInt(u); + } + + + /*! + a constructor for copying from another types + */ + template + Int(const Int & u) + { + // look that 'size' we still set as 'value_size' and not as u.value_size + FromInt(u); + } + + + + /*! + this operator converts an UInt type to this class + + it doesn't return a carry + */ + template + Int & operator=(const UInt & p) + { + FromUInt(p); + + return *this; + } + + + /*! + this method converts the Uint type to this class + */ + Int & operator=(uint i) + { + FromUInt(i); + + return *this; + } + + + /*! + a constructor for converting the uint to this class + */ + Int(uint i) + { + FromUInt(i); + } + + + /*! + a constructor for copying from another types + */ + template + Int(const UInt & u) + { + // look that 'size' we still set as 'value_size' and not as u.value_size + FromUInt(u); + } + + + +#ifdef TTMATH_PLATFORM32 + + + /*! + this method converts unsigned 64 bit int type to this class + ***this method is created only on a 32bit platform*** + */ + uint FromUInt(ulint n) + { + uint c = UInt::FromUInt(n); + + if( c ) + return 1; + + if( value_size == 1 ) + return ((UInt::table[0] & TTMATH_UINT_HIGHEST_BIT) == 0) ? 0 : 1; + + if( value_size == 2 ) + return ((UInt::table[1] & TTMATH_UINT_HIGHEST_BIT) == 0) ? 0 : 1; + + return 0; + } + + + /*! + this method converts unsigned 64 bit int type to this class + ***this method is created only on a 32bit platform*** + */ + uint FromInt(ulint n) + { + return FromUInt(n); + } + + + /*! + this method converts signed 64 bit int type to this class + ***this method is created only on a 32bit platform*** + */ + uint FromInt(slint n) + { + uint mask = (n < 0) ? TTMATH_UINT_MAX_VALUE : 0; + + UInt::table[0] = (uint)(ulint)n; + + if( value_size == 1 ) + { + if( uint(ulint(n) >> 32) != mask ) + return 1; + + return ((UInt::table[0] & TTMATH_UINT_HIGHEST_BIT) == (mask & TTMATH_UINT_HIGHEST_BIT)) ? 0 : 1; + } + + UInt::table[1] = (uint)(ulint(n) >> 32); + + for(uint i=2 ; i::table[i] = mask; + + return 0; + } + + + /*! + this operator converts unsigned 64 bit int type to this class + ***this operator is created only on a 32bit platform*** + */ + Int & operator=(ulint n) + { + FromUInt(n); + + return *this; + } + + + /*! + a constructor for converting unsigned 64 bit int to this class + ***this constructor is created only on a 32bit platform*** + */ + Int(ulint n) + { + FromUInt(n); + } + + + /*! + this operator converts signed 64 bit int type to this class + ***this operator is created only on a 32bit platform*** + */ + Int & operator=(slint n) + { + FromInt(n); + + return *this; + } + + + /*! + a constructor for converting signed 64 bit int to this class + ***this constructor is created only on a 32bit platform*** + */ + Int(slint n) + { + FromInt(n); + } + +#endif + + + + +#ifdef TTMATH_PLATFORM64 + + /*! + this method converts 32 bit unsigned int type to this class + ***this operator is created only on a 64bit platform*** + */ + uint FromUInt(unsigned int i) + { + return FromUInt(uint(i)); + } + + + /*! + this method converts 32 bit unsigned int type to this class + ***this operator is created only on a 64bit platform*** + */ + uint FromInt(unsigned int i) + { + return FromUInt(i); + } + + + /*! + this method converts 32 bit signed int type to this class + ***this operator is created only on a 64bit platform*** + */ + uint FromInt(signed int i) + { + return FromInt(sint(i)); + } + + + /*! + this method converts 32 bit unsigned int type to this class + ***this operator is created only on a 64bit platform*** + */ + Int & operator=(unsigned int i) + { + FromUInt(i); + + return *this; + } + + + /*! + a constructor for converting 32 bit unsigned int to this class + ***this constructor is created only on a 64bit platform*** + */ + Int(unsigned int i) + { + FromUInt(i); + } + + + /*! + this operator converts 32 bit signed int type to this class + ***this operator is created only on a 64bit platform*** + */ + Int & operator=(signed int i) + { + FromInt(i); + + return *this; + } + + + /*! + a constructor for converting 32 bit signed int to this class + ***this constructor is created only on a 64bit platform*** + */ + Int(signed int i) + { + FromInt(i); + } + +#endif + + + + /*! + a constructor for converting string to this class (with the base=10) + */ + Int(const char * s) + { + FromString(s); + } + + + /*! + a constructor for converting a string to this class (with the base=10) + */ + Int(const std::string & s) + { + FromString( s.c_str() ); + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + a constructor for converting string to this class (with the base=10) + */ + Int(const wchar_t * s) + { + FromString(s); + } + + + /*! + a constructor for converting a string to this class (with the base=10) + */ + Int(const std::wstring & s) + { + FromString( s.c_str() ); + } + +#endif + + + /*! + a default constructor + + we don't clear table etc. + */ + Int() + { + } + + + /*! + the destructor + */ + ~Int() + { + } + + + /*! + this method returns the lowest value from table with a sign + + we must be sure when we using this method whether the value + will hold in an sint type or not (the rest value from table must be zero or -1) + */ + sint ToInt() const + { + return sint( UInt::table[0] ); + } + + + /*! + this method converts the value to uint type + can return a carry if the value is too long to store it in uint type + */ + uint ToUInt(uint & result) const + { + uint c = UInt::ToUInt(result); + + if( value_size == 1 ) + return (result & TTMATH_UINT_HIGHEST_BIT) == 0 ? 0 : 1; + + return c; + } + + + /*! + this method converts the value to uint type + can return a carry if the value is too long to store it in uint type + */ + uint ToInt(uint & result) const + { + return ToUInt(result); + } + + + /*! + this method converts the value to sint type + can return a carry if the value is too long to store it in sint type + */ + uint ToInt(sint & result) const + { + result = sint( UInt::table[0] ); + uint mask = IsSign() ? TTMATH_UINT_MAX_VALUE : 0; + + if( (result & TTMATH_UINT_HIGHEST_BIT) != (mask & TTMATH_UINT_HIGHEST_BIT) ) + return 1; + + for(uint i=1 ; i::table[i] != mask ) + return 1; + + return 0; + } + + +#ifdef TTMATH_PLATFORM32 + + /*! + this method converts the value to ulint type (64 bit unsigned integer) + can return a carry if the value is too long to store it in ulint type + *** this method is created only on a 32 bit platform *** + */ + uint ToUInt(ulint & result) const + { + uint c = UInt::ToUInt(result); + + if( value_size == 1 ) + return (UInt::table[0] & TTMATH_UINT_HIGHEST_BIT) == 0 ? 0 : 1; + + if( value_size == 2 ) + return (UInt::table[1] & TTMATH_UINT_HIGHEST_BIT) == 0 ? 0 : 1; + + return c; + } + + + /*! + this method converts the value to ulint type (64 bit unsigned integer) + can return a carry if the value is too long to store it in ulint type + *** this method is created only on a 32 bit platform *** + */ + uint ToInt(ulint & result) const + { + return ToUInt(result); + } + + + /*! + this method converts the value to slint type (64 bit signed integer) + can return a carry if the value is too long to store it in slint type + *** this method is created only on a 32 bit platform *** + */ + uint ToInt(slint & result) const + { + if( value_size == 1 ) + { + result = slint(sint(UInt::table[0])); + } + else + { + uint low = UInt::table[0]; + uint high = UInt::table[1]; + + result = low; + result |= (ulint(high) << TTMATH_BITS_PER_UINT); + + uint mask = IsSign() ? TTMATH_UINT_MAX_VALUE : 0; + + if( (high & TTMATH_UINT_HIGHEST_BIT) != (mask & TTMATH_UINT_HIGHEST_BIT) ) + return 1; + + for(uint i=2 ; i::table[i] != mask ) + return 1; + } + + return 0; + } + +#endif + + + +#ifdef TTMATH_PLATFORM64 + + /*! + this method converts the value to a 32 bit unsigned integer + can return a carry if the value is too long to store it in this type + *** this method is created only on a 64 bit platform *** + */ + uint ToUInt(unsigned int & result) const + { + uint c = UInt::ToUInt(result); + + if( c || IsSign() ) + return 1; + + return 0; + } + + + /*! + this method converts the value to a 32 bit unsigned integer + can return a carry if the value is too long to store it in this type + *** this method is created only on a 64 bit platform *** + */ + uint ToInt(unsigned int & result) const + { + return ToUInt(result); + } + + + /*! + this method converts the value to a 32 bit signed integer + can return a carry if the value is too long to store it in this type + *** this method is created only on a 64 bit platform *** + */ + uint ToInt(int & result) const + { + uint first = UInt::table[0]; + + result = int(first); + uint mask = IsSign() ? TTMATH_UINT_MAX_VALUE : 0; + + if( (first >> 31) != (mask >> 31) ) + return 1; + + for(uint i=1 ; i::table[i] != mask ) + return 1; + + return 0; + } + +#endif + + + + +private: + + /*! + an auxiliary method for converting to a string + */ + template + void ToStringBase(string_type & result, uint b = 10) const + { + if( IsSign() ) + { + Int temp(*this); + temp.Abs(); + temp.UInt::ToStringBase(result, b, true); + } + else + { + UInt::ToStringBase(result, b, false); + } + } + +public: + + /*! + this method converts the value to a string with a base equal 'b' + */ + void ToString(std::string & result, uint b = 10) const + { + return ToStringBase(result, b); + } + + + /*! + this method converts the value to a string with a base equal 'b' + */ + std::string ToString(uint b = 10) const + { + std::string result; + ToStringBase(result, b); + + return result; + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + this method converts the value to a string with a base equal 'b' + */ + void ToString(std::wstring & result, uint b = 10) const + { + return ToStringBase(result, b); + } + + + /*! + this method converts the value to a string with a base equal 'b' + */ + std::wstring ToWString(uint b = 10) const + { + std::wstring result; + ToStringBase(result, b); + + return result; + } + +#endif + + + +private: + + /*! + an auxiliary method for converting from a string + */ + template + uint FromStringBase(const char_type * s, uint b = 10, const char_type ** after_source = 0, bool * value_read = 0) + { + bool is_sign = false; + + Misc::SkipWhiteCharacters(s); + + if( *s == '-' ) + { + is_sign = true; + Misc::SkipWhiteCharacters(++s); + } + else + if( *s == '+' ) + { + Misc::SkipWhiteCharacters(++s); + } + + if( UInt::FromString(s,b,after_source,value_read) ) + return 1; + + if( is_sign ) + { + Int mmin; + + mmin.SetMin(); + + /* + the reference to mmin will be automatically converted to the reference + to UInt type + (this value can be equal mmin -- look at a description in ChangeSign()) + */ + if( UInt::operator>( mmin ) ) + return 1; + + /* + if the value is equal mmin the method ChangeSign() does nothing (only returns 1 but we ignore it) + */ + ChangeSign(); + } + else + { + Int mmax; + + mmax.SetMax(); + + if( UInt::operator>( mmax ) ) + return 1; + } + + return 0; + } + + +public: + + /*! + this method converts a string into its value + it returns carry=1 if the value will be too big or an incorrect base 'b' is given + + string is ended with a non-digit value, for example: + "-12" will be translated to -12 + as well as: + "- 12foo" will be translated to -12 too + + existing first white characters will be ommited + (between '-' and a first digit can be white characters too) + + after_source (if exists) is pointing at the end of the parsed string + + value_read (if exists) tells whether something has actually been read (at least one digit) + */ + uint FromString(const char * s, uint b = 10, const char ** after_source = 0, bool * value_read = 0) + { + return FromStringBase(s, b, after_source, value_read); + } + + + /*! + this method converts a string into its value + */ + uint FromString(const wchar_t * s, uint b = 10, const wchar_t ** after_source = 0, bool * value_read = 0) + { + return FromStringBase(s, b, after_source, value_read); + } + + + /*! + this method converts a string into its value + it returns carry=1 if the value will be too big or an incorrect base 'b' is given + */ + uint FromString(const std::string & s, uint b = 10) + { + return FromString( s.c_str(), b ); + } + + + /*! + this operator converts a string into its value (with base = 10) + */ + Int & operator=(const char * s) + { + FromString(s); + + return *this; + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + + /*! + this method converts a string into its value + it returns carry=1 if the value will be too big or an incorrect base 'b' is given + */ + uint FromString(const std::wstring & s, uint b = 10) + { + return FromString( s.c_str(), b ); + } + + + /*! + this operator converts a string into its value (with base = 10) + */ + Int & operator=(const wchar_t * s) + { + FromString(s); + + return *this; + } + + + /*! + this operator converts a string into its value (with base = 10) + */ + Int & operator=(const std::wstring & s) + { + FromString( s.c_str() ); + + return *this; + } + +#endif + + + /*! + this operator converts a string into its value (with base = 10) + */ + Int & operator=(const std::string & s) + { + FromString( s.c_str() ); + + return *this; + } + + + + /*! + * + * methods for comparing + * + * + */ + + bool operator==(const Int & l) const + { + return UInt::operator==(l); + } + + bool operator!=(const Int & l) const + { + return UInt::operator!=(l); + } + + bool operator<(const Int & l) const + { + sint i=value_size-1; + + sint a1 = sint(UInt::table[i]); + sint a2 = sint(l.table[i]); + + if( a1 != a2 ) + return a1 < a2; + + + for(--i ; i>=0 ; --i) + { + if( UInt::table[i] != l.table[i] ) + // comparison as unsigned int + return UInt::table[i] < l.table[i]; + } + + // they're equal + return false; + } + + + bool operator>(const Int & l) const + { + sint i=value_size-1; + + sint a1 = sint(UInt::table[i]); + sint a2 = sint(l.table[i]); + + if( a1 != a2 ) + return a1 > a2; + + + for(--i ; i>=0 ; --i) + { + if( UInt::table[i] != l.table[i] ) + // comparison as unsigned int + return UInt::table[i] > l.table[i]; + } + + // they're equal + return false; + } + + + bool operator<=(const Int & l) const + { + sint i=value_size-1; + + sint a1 = sint(UInt::table[i]); + sint a2 = sint(l.table[i]); + + if( a1 != a2 ) + return a1 < a2; + + + for(--i ; i>=0 ; --i) + { + if( UInt::table[i] != l.table[i] ) + // comparison as unsigned int + return UInt::table[i] < l.table[i]; + } + + // they're equal + return true; + } + + + bool operator>=(const Int & l) const + { + sint i=value_size-1; + + sint a1 = sint(UInt::table[i]); + sint a2 = sint(l.table[i]); + + if( a1 != a2 ) + return a1 > a2; + + + for(--i ; i>=0 ; --i) + { + if( UInt::table[i] != l.table[i] ) + // comparison as unsigned int + return UInt::table[i] > l.table[i]; + } + + // they're equal + return true; + } + + + + /*! + * + * standard mathematical operators + * + */ + + + /*! + an operator for changing the sign + + it's not changing 'this' but the changed value will be returned + */ + Int operator-() const + { + Int temp(*this); + + temp.ChangeSign(); + + return temp; + } + + + Int operator-(const Int & p2) const + { + Int temp(*this); + + temp.Sub(p2); + + return temp; + } + + + Int & operator-=(const Int & p2) + { + Sub(p2); + + return *this; + } + + + Int operator+(const Int & p2) const + { + Int temp(*this); + + temp.Add(p2); + + return temp; + } + + + Int & operator+=(const Int & p2) + { + Add(p2); + + return *this; + } + + + Int operator*(const Int & p2) const + { + Int temp(*this); + + temp.Mul(p2); + + return temp; + } + + + Int & operator*=(const Int & p2) + { + Mul(p2); + + return *this; + } + + + Int operator/(const Int & p2) const + { + Int temp(*this); + + temp.Div(p2); + + return temp; + } + + + Int & operator/=(const Int & p2) + { + Div(p2); + + return *this; + } + + + Int operator%(const Int & p2) const + { + Int temp(*this); + Int remainder; + + temp.Div(p2, remainder); + + return remainder; + } + + + Int & operator%=(const Int & p2) + { + Int remainder; + + Div(p2, remainder); + operator=(remainder); + + return *this; + } + + + /*! + Prefix operator e.g. ++variable + */ + UInt & operator++() + { + AddOne(); + + return *this; + } + + + /*! + Postfix operator e.g. variable++ + */ + UInt operator++(int) + { + UInt temp( *this ); + + AddOne(); + + return temp; + } + + + UInt & operator--() + { + SubOne(); + + return *this; + } + + + UInt operator--(int) + { + UInt temp( *this ); + + SubOne(); + + return temp; + } + + + + /*! + * + * input/output operators for standard streams + * + */ + +private: + + /*! + an auxiliary method for outputing to standard streams + */ + template + static ostream_type & OutputToStream(ostream_type & s, const Int & l) + { + string_type ss; + + l.ToString(ss); + s << ss; + + return s; + } + + + +public: + + + /*! + output to standard streams + */ + friend std::ostream & operator<<(std::ostream & s, const Int & l) + { + return OutputToStream(s, l); + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + output to standard streams + */ + friend std::wostream & operator<<(std::wostream & s, const Int & l) + { + return OutputToStream(s, l); + } + +#endif + + + +private: + + /*! + an auxiliary method for converting from a string + */ + template + static istream_type & InputFromStream(istream_type & s, Int & l) + { + string_type ss; + + // char or wchar_t for operator>> + char_type z; + + // operator>> omits white characters if they're set for ommiting + s >> z; + + if( z=='-' || z=='+' ) + { + ss += z; + s >> z; // we're reading a next character (white characters can be ommited) + } + + // we're reading only digits (base=10) + while( s.good() && Misc::CharToDigit(z, 10)>=0 ) + { + ss += z; + z = static_cast(s.get()); + } + + // we're leaving the last readed character + // (it's not belonging to the value) + s.unget(); + + l.FromString(ss); + + return s; + } + + +public: + + /*! + input from standard streams + */ + friend std::istream & operator>>(std::istream & s, Int & l) + { + return InputFromStream(s, l); + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + input from standard streams + */ + friend std::wistream & operator>>(std::wistream & s, Int & l) + { + return InputFromStream(s, l); + } +#endif + + +}; + +} // namespace + +#endif diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathmisc.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathmisc.h new file mode 100644 index 00000000..330a43a4 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathmisc.h @@ -0,0 +1,250 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2010, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + +#ifndef headerfilettmathmisc +#define headerfilettmathmisc + + +/*! + \file ttmathmisc.h + \brief some helpful functions +*/ + + +#include + + +namespace ttmath +{ + +/*! + some helpful functions +*/ +class Misc +{ +public: + + +/* + * + * AssignString(result, str) + * result = str + * + */ + +/*! + result = str +*/ +static void AssignString(std::string & result, const char * str) +{ + result = str; +} + + +#ifndef TTMATH_DONT_USE_WCHAR + +/*! + result = str +*/ +static void AssignString(std::wstring & result, const char * str) +{ + result.clear(); + + for( ; *str ; ++str ) + result += *str; +} + + +/*! + result = str +*/ +static void AssignString(std::wstring & result, const std::string & str) +{ + return AssignString(result, str.c_str()); +} + + +/*! + result = str +*/ +static void AssignString(std::string & result, const wchar_t * str) +{ + result.clear(); + + for( ; *str ; ++str ) + result += static_cast(*str); +} + + +/*! + result = str +*/ +static void AssignString(std::string & result, const std::wstring & str) +{ + return AssignString(result, str.c_str()); +} + +#endif + + +/* + * + * AddString(result, str) + * result += str + * + */ + + +/*! + result += str +*/ +static void AddString(std::string & result, const char * str) +{ + result += str; +} + + +#ifndef TTMATH_DONT_USE_WCHAR + +/*! + result += str +*/ +static void AddString(std::wstring & result, const char * str) +{ + for( ; *str ; ++str ) + result += *str; +} + +#endif + + +/* + this method omits any white characters from the string + char_type is char or wchar_t +*/ +template +static void SkipWhiteCharacters(const char_type * & c) +{ + // 13 is at the end in a DOS text file (\r\n) + while( (*c==' ' ) || (*c=='\t') || (*c==13 ) || (*c=='\n') ) + ++c; +} + + + + +/*! + this static method converts one character into its value + + for example: + 1 -> 1 + 8 -> 8 + A -> 10 + f -> 15 + + this method don't check whether c is correct or not +*/ +static uint CharToDigit(uint c) +{ + if(c>='0' && c<='9') + return c-'0'; + + if(c>='a' && c<='z') + return c-'a'+10; + +return c-'A'+10; +} + + +/*! + this method changes a character 'c' into its value + (if there can't be a correct value it returns -1) + + for example: + c=2, base=10 -> function returns 2 + c=A, base=10 -> function returns -1 + c=A, base=16 -> function returns 10 +*/ +static sint CharToDigit(uint c, uint base) +{ + if( c>='0' && c<='9' ) + c=c-'0'; + else + if( c>='a' && c<='z' ) + c=c-'a'+10; + else + if( c>='A' && c<='Z' ) + c=c-'A'+10; + else + return -1; + + + if( c >= base ) + return -1; + + +return sint(c); +} + + + +/*! + this method converts a digit into a char + digit should be from <0,F> + (we don't have to get a base) + + for example: + 1 -> 1 + 8 -> 8 + 10 -> A + 15 -> F +*/ +static uint DigitToChar(uint digit) +{ + if( digit < 10 ) + return digit + '0'; + +return digit - 10 + 'A'; +} + + +}; // struct Misc + +} + + +#endif diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathobjects.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathobjects.h new file mode 100644 index 00000000..6e204fee --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathobjects.h @@ -0,0 +1,809 @@ +/* + * This file is a part of TTMath Mathematical Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2010, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + + +#ifndef headerfilettmathobject +#define headerfilettmathobject + +/*! + \file ttmathobjects.h + \brief Mathematic functions. +*/ + +#include +#include +#include +#include + +#include "ttmathtypes.h" +#include "ttmathmisc.h" + + +namespace ttmath +{ + +/*! + objects of this class are used with the mathematical parser + they hold variables or functions defined by a user + + each object has its own table in which we're keeping variables or functions +*/ +class Objects +{ +public: + + + /*! + one item (variable or function) + 'items' will be on the table + */ + struct Item + { + // name of a variable of a function + // internally we store variables and funcions as std::string (not std::wstring even when wide characters are used) + std::string value; + + // number of parameters required by the function + // (if there's a variable this 'param' is ignored) + int param; + + Item() {} + Item(const std::string & v, int p) : value(v), param(p) {} + }; + + // 'Table' is the type of our table + typedef std::map Table; + typedef Table::iterator Iterator; + typedef Table::const_iterator CIterator; + + + + /*! + this method returns true if a character 'c' is a character + which can be in a name + + if 'can_be_digit' is true that means when the 'c' is a digit this + method returns true otherwise it returns false + */ + static bool CorrectCharacter(int c, bool can_be_digit) + { + if( (c>='a' && c<='z') || (c>='A' && c<='Z') ) + return true; + + if( can_be_digit && ((c>='0' && c<='9') || c=='_') ) + return true; + + return false; + } + + + /*! + this method returns true if the name can be as a name of an object + */ + template + static bool IsNameCorrect(const string_type & name) + { + if( name.empty() ) + return false; + + if( !CorrectCharacter(name[0], false) ) + return false; + + typename string_type::const_iterator i = name.begin(); + + for(++i ; i!=name.end() ; ++i) + if( !CorrectCharacter(*i, true) ) + return false; + + return true; + } + + + /*! + this method returns true if such an object is defined (name exists) + */ + bool IsDefined(const std::string & name) + { + Iterator i = table.find(name); + + if( i != table.end() ) + // we have this object in our table + return true; + + return false; + } + + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + this method returns true if such an object is defined (name exists) + */ + bool IsDefined(const std::wstring & name) + { + // we should check whether the name (in wide characters) are correct + // before calling AssignString() function + if( !IsNameCorrect(name) ) + return false; + + Misc::AssignString(str_tmp1, name); + + return IsDefined(str_tmp1); + } + +#endif + + + /*! + this method adds one object (variable of function) into the table + */ + ErrorCode Add(const std::string & name, const std::string & value, int param = 0) + { + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + Iterator i = table.find(name); + + if( i != table.end() ) + // we have this object in our table + return err_object_exists; + + table.insert( std::make_pair(name, Item(value, param)) ); + + return err_ok; + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + this method adds one object (variable of function) into the table + */ + ErrorCode Add(const std::wstring & name, const std::wstring & value, int param = 0) + { + // we should check whether the name (in wide characters) are correct + // before calling AssignString() function + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + Misc::AssignString(str_tmp1, name); + Misc::AssignString(str_tmp2, value); + + return Add(str_tmp1, str_tmp2, param); + } + +#endif + + + /*! + this method returns 'true' if the table is empty + */ + bool Empty() const + { + return table.empty(); + } + + + /*! + this method clears the table + */ + void Clear() + { + return table.clear(); + } + + + /*! + this method returns 'const_iterator' on the first item on the table + */ + CIterator Begin() const + { + return table.begin(); + } + + + /*! + this method returns 'const_iterator' pointing at the space after last item + (returns table.end()) + */ + CIterator End() const + { + return table.end(); + } + + + /*! + this method changes the value and the number of parameters for a specific object + */ + ErrorCode EditValue(const std::string & name, const std::string & value, int param = 0) + { + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + Iterator i = table.find(name); + + if( i == table.end() ) + return err_unknown_object; + + i->second.value = value; + i->second.param = param; + + return err_ok; + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + + /*! + this method changes the value and the number of parameters for a specific object + */ + ErrorCode EditValue(const std::wstring & name, const std::wstring & value, int param = 0) + { + // we should check whether the name (in wide characters) are correct + // before calling AssignString() function + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + Misc::AssignString(str_tmp1, name); + Misc::AssignString(str_tmp2, value); + + return EditValue(str_tmp1, str_tmp2, param); + } + +#endif + + + /*! + this method changes the name of a specific object + */ + ErrorCode EditName(const std::string & old_name, const std::string & new_name) + { + if( !IsNameCorrect(old_name) || !IsNameCorrect(new_name) ) + return err_incorrect_name; + + Iterator old_i = table.find(old_name); + if( old_i == table.end() ) + return err_unknown_object; + + if( old_name == new_name ) + // the new name is the same as the old one + // we treat it as a normal situation + return err_ok; + + ErrorCode err = Add(new_name, old_i->second.value, old_i->second.param); + + if( err == err_ok ) + { + old_i = table.find(old_name); + TTMATH_ASSERT( old_i != table.end() ) + + table.erase(old_i); + } + + return err; + } + + + +#ifndef TTMATH_DONT_USE_WCHAR + + + /*! + this method changes the name of a specific object + */ + ErrorCode EditName(const std::wstring & old_name, const std::wstring & new_name) + { + // we should check whether the name (in wide characters) are correct + // before calling AssignString() function + if( !IsNameCorrect(old_name) || !IsNameCorrect(new_name) ) + return err_incorrect_name; + + Misc::AssignString(str_tmp1, old_name); + Misc::AssignString(str_tmp2, new_name); + + return EditName(str_tmp1, str_tmp2); + } + +#endif + + + /*! + this method deletes an object + */ + ErrorCode Delete(const std::string & name) + { + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + Iterator i = table.find(name); + + if( i == table.end() ) + return err_unknown_object; + + table.erase( i ); + + return err_ok; + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + + /*! + this method deletes an object + */ + ErrorCode Delete(const std::wstring & name) + { + // we should check whether the name (in wide characters) are correct + // before calling AssignString() function + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + Misc::AssignString(str_tmp1, name); + + return Delete(str_tmp1); + } + +#endif + + + /*! + this method gets the value of a specific object + */ + ErrorCode GetValue(const std::string & name, std::string & value) const + { + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + CIterator i = table.find(name); + + if( i == table.end() ) + { + value.clear(); + return err_unknown_object; + } + + value = i->second.value; + + return err_ok; + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + this method gets the value of a specific object + */ + ErrorCode GetValue(const std::wstring & name, std::wstring & value) + { + // we should check whether the name (in wide characters) are correct + // before calling AssignString() function + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + Misc::AssignString(str_tmp1, name); + ErrorCode err = GetValue(str_tmp1, str_tmp2); + Misc::AssignString(value, str_tmp2); + + return err; + } + +#endif + + + /*! + this method gets the value of a specific object + (this version is used for not copying the whole string) + */ + ErrorCode GetValue(const std::string & name, const char ** value) const + { + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + CIterator i = table.find(name); + + if( i == table.end() ) + { + *value = 0; + return err_unknown_object; + } + + *value = i->second.value.c_str(); + + return err_ok; + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + this method gets the value of a specific object + (this version is used for not copying the whole string) + */ + ErrorCode GetValue(const std::wstring & name, const char ** value) + { + // we should check whether the name (in wide characters) are correct + // before calling AssignString() function + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + Misc::AssignString(str_tmp1, name); + + return GetValue(str_tmp1, value); + } + +#endif + + + /*! + this method gets the value and the number of parameters + of a specific object + */ + ErrorCode GetValueAndParam(const std::string & name, std::string & value, int * param) const + { + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + CIterator i = table.find(name); + + if( i == table.end() ) + { + value = ""; + *param = 0; + return err_unknown_object; + } + + value = i->second.value; + *param = i->second.param; + + return err_ok; + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + this method gets the value and the number of parameters + of a specific object + */ + ErrorCode GetValueAndParam(const std::wstring & name, std::wstring & value, int * param) + { + // we should check whether the name (in wide characters) are correct + // before calling AssignString() function + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + Misc::AssignString(str_tmp1, name); + ErrorCode err = GetValueAndParam(str_tmp1, str_tmp2, param); + Misc::AssignString(value, str_tmp2); + + return err; + } + +#endif + + + /*! + this method sets the value and the number of parameters + of a specific object + (this version is used for not copying the whole string) + */ + ErrorCode GetValueAndParam(const std::string & name, const char ** value, int * param) const + { + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + CIterator i = table.find(name); + + if( i == table.end() ) + { + *value = 0; + *param = 0; + return err_unknown_object; + } + + *value = i->second.value.c_str(); + *param = i->second.param; + + return err_ok; + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + + /*! + this method sets the value and the number of parameters + of a specific object + (this version is used for not copying the whole string + but in fact we make one copying during AssignString()) + */ + ErrorCode GetValueAndParam(const std::wstring & name, const char ** value, int * param) + { + // we should check whether the name (in wide characters) are correct + // before calling AssignString() function + if( !IsNameCorrect(name) ) + return err_incorrect_name; + + Misc::AssignString(str_tmp1, name); + + return GetValueAndParam(str_tmp1, value, param); + } + + +#endif + + + /*! + this method returns a pointer into the table + */ + Table * GetTable() + { + return &table; + } + + +private: + + Table table; + std::string str_tmp1, str_tmp2; + +}; // end of class Objects + + + + + + + +/*! + objects of the class History are used to keep values in functions + which take a lot of time during calculating, for instance in the + function Factorial(x) + + it means that when we're calculating e.g. Factorial(1000) and the + Factorial finds that we have calculated it before, the value (result) + is taken from the history +*/ +template +class History +{ + /*! + one item in the History's object holds a key, a value for the key + and a corresponding error code + */ + struct Item + { + ValueType key, value; + ErrorCode err; + }; + + + /*! + we use std::list for simply deleting the first item + but because we're searching through the whole container + (in the method Get) the container should not be too big + (linear time of searching) + */ + typedef std::list buffer_type; + buffer_type buffer; + typename buffer_type::size_type buffer_max_size; + +public: + + /*! + default constructor + default max size of the History's container is 15 items + */ + History() + { + buffer_max_size = 15; + } + + + /*! + a constructor which takes another value of the max size + of the History's container + */ + History(typename buffer_type::size_type new_size) + { + buffer_max_size = new_size; + } + + + /*! + this method adds one item into the History + if the size of the container is greater than buffer_max_size + the first item will be removed + */ + void Add(const ValueType & key, const ValueType & value, ErrorCode err) + { + Item item; + item.key = key; + item.value = value; + item.err = err; + + buffer.insert( buffer.end(), item ); + + if( buffer.size() > buffer_max_size ) + buffer.erase(buffer.begin()); + } + + + /*! + this method checks whether we have an item which has the key equal 'key' + + if there's such item the method sets the 'value' and the 'err' + and returns true otherwise it returns false and 'value' and 'err' + remain unchanged + */ + bool Get(const ValueType & key, ValueType & value, ErrorCode & err) + { + typename buffer_type::iterator i = buffer.begin(); + + for( ; i != buffer.end() ; ++i ) + { + if( i->key == key ) + { + value = i->value; + err = i->err; + return true; + } + } + + return false; + } + + + /*! + this methods deletes an item + + we assume that there is only one item with the 'key' + (this methods removes the first one) + */ + bool Remove(const ValueType & key) + { + typename buffer_type::iterator i = buffer.begin(); + + for( ; i != buffer.end() ; ++i ) + { + if( i->key == key ) + { + buffer.erase(i); + return true; + } + } + + return false; + } + + +}; // end of class History + + + +/*! + this is an auxiliary class used when calculating Gamma() or Factorial() + + in multithreaded environment you can provide an object of this class to + the Gamma() or Factorial() function, e.g; + typedef Big<1, 3> MyBig; + MyBig x = 123456; + CGamma cgamma; + std::cout << Gamma(x, cgamma); + each thread should have its own CGamma<> object + + in a single-thread environment a CGamma<> object is a static variable + in a second version of Gamma() and you don't have to explicitly use it, e.g. + typedef Big<1, 3> MyBig; + MyBig x = 123456; + std::cout << Gamma(x); +*/ +template +struct CGamma +{ + /*! + this table holds factorials + 1 + 1 + 2 + 6 + 24 + 120 + 720 + ....... + */ + std::vector fact; + + + /*! + this table holds Bernoulli numbers + 1 + -0.5 + 0.166666666666666666666666667 + 0 + -0.0333333333333333333333333333 + 0 + 0.0238095238095238095238095238 + 0 + -0.0333333333333333333333333333 + 0 + 0.075757575757575757575757576 + ..... + */ + std::vector bern; + + + /*! + here we store some calculated values + (this is for speeding up, if the next argument of Gamma() or Factorial() + is in the 'history' then the result we are not calculating but simply + return from the 'history' object) + */ + History history; + + + /*! + this method prepares some coefficients: factorials and Bernoulli numbers + stored in 'fact' and 'bern' objects + + how many values should be depends on the size of the mantissa - if + the mantissa is larger then we must calculate more values + for a mantissa which consists of 256 bits (8 words on a 32bit platform) + we have to calculate about 30 values (the size of fact and bern will be 30), + and for a 2048 bits mantissa we have to calculate 306 coefficients + + you don't have to call this method, these coefficients will be automatically calculated + when they are needed + + you must note that calculating these coefficients is a little time-consuming operation, + (especially when the mantissa is large) and first call to Gamma() or Factorial() + can take more time than next calls, and in the end this is the point when InitAll() + comes in handy: you can call this method somewhere at the beginning of your program + */ + void InitAll(); + // definition is in ttmath.h +}; + + + + +} // namespace + +#endif diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathparser.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathparser.h new file mode 100644 index 00000000..ce07120f --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathparser.h @@ -0,0 +1,2777 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2010, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + + + +#ifndef headerfilettmathparser +#define headerfilettmathparser + +/*! + \file ttmathparser.h + \brief A mathematical parser +*/ + +#include +#include +#include +#include + +#include "ttmath.h" +#include "ttmathobjects.h" +#include "ttmathmisc.h" + + + +namespace ttmath +{ + +/*! + \brief Mathematical parser + + let x will be an input string meaning an expression for converting: + + x = [+|-]Value[operator[+|-]Value][operator[+|-]Value]... + where: + an operator can be: + ^ (pow) (the heighest priority) + + * (mul) (or multiplication without an operator -- short mul) + / (div) (* and / have the same priority) + + + (add) + - (sub) (+ and - have the same priority) + + < (lower than) + > (greater than) + <= (lower or equal than) + >= (greater or equal than) + == (equal) + != (not equal) (all above logical operators have the same priority) + + && (logical and) + + || (logical or) (the lowest priority) + + short mul: + if the second Value (Var below) is either a variable or function there might not be + an operator between them, e.g. + "[+|-]Value Var" is treated as "[+|-]Value * Var" and the multiplication + has the same priority as a normal multiplication: + 4x = 4 * x + 2^3m = (2^3)* m + 6h^3 = 6 * (h^3) + 2sin(pi) = 2 * sin(pi) + etc. + + Value can be: + constant e.g. 100, can be preceded by operators for changing the base (radix): [#|&] + # - hex + & - bin + sample: #10 = 16 + &10 = 2 + variable e.g. pi + another expression between brackets e.g (x) + function e.g. sin(x) + + for example a correct input string can be: + "1" + "2.1234" + "2,1234" (they are the same, by default we can either use a comma or a dot) + "1 + 2" + "(1 + 2) * 3" + "pi" + "sin(pi)" + "(1+2)*(2+3)" + "log(2;1234)" there's a semicolon here (not a comma), we use it in functions + for separating parameters + "1 < 2" (the result will be: 1) + "4 < 3" (the result will be: 0) + "2+x" (of course if the variable 'x' is defined) + "4x+10" + "#20+10" = 32 + 10 = 42 + "10 ^ -&101" = 10 ^ -5 = 0.00001 + "8 * -&10" = 8 * -2 = -16 + etc. + + we can also use a semicolon for separating any 'x' input strings + for example: + "1+2;4+5" + the result will be on the stack as follows: + stack[0].value=3 + stack[1].value=9 +*/ +template +class Parser +{ +private: + +/*! + there are 5 mathematical operators as follows (with their standard priorities): + add (+) + sub (-) + mul (*) + div (/) + pow (^) + and 'shortmul' used when there is no any operators between + a first parameter and a variable or function + (the 'shortmul' has the same priority as the normal multiplication ) +*/ + class MatOperator + { + public: + + enum Type + { + none,add,sub,mul,div,pow,lt,gt,let,get,eq,neq,lor,land,shortmul + }; + + enum Assoc + { + right, // right-associative + non_right // associative or left-associative + }; + + Type GetType() const { return type; } + int GetPriority() const { return priority; } + Assoc GetAssoc() const { return assoc; } + + void SetType(Type t) + { + type = t; + assoc = non_right; + + switch( type ) + { + case lor: + priority = 4; + break; + + case land: + priority = 5; + break; + + case eq: + case neq: + case lt: + case gt: + case let: + case get: + priority = 7; + break; + + case add: + case sub: + priority = 10; + break; + + case mul: + case shortmul: + case div: + priority = 12; + break; + + case pow: + priority = 14; + assoc = right; + break; + + default: + Error( err_internal_error ); + break; + } + } + + MatOperator(): type(none), priority(0), assoc(non_right) + { + } + + private: + + Type type; + int priority; + Assoc assoc; + }; // end of MatOperator class + + + +public: + + + + /*! + Objects of type 'Item' we are keeping on our stack + */ + struct Item + { + enum Type + { + none, numerical_value, mat_operator, first_bracket, + last_bracket, variable, semicolon + }; + + // The kind of type which we're keeping + Type type; + + // if type == numerical_value + ValueType value; + + // if type == mat_operator + MatOperator moperator; + + /* + if type == first_bracket + + if 'function' is set to true it means that the first recognized bracket + was the bracket from function in other words we must call a function when + we'll find the 'last' bracket + */ + bool function; + + // if function is true + std::string function_name; + + /* + the sign of value + + it can be for type==numerical_value or type==first_bracket + when it's true it means e.g. that value is equal -value + */ + bool sign; + + Item(): type(none), function(false), sign(false) + { + } + + }; // end of Item struct + + +/*! + stack on which we're keeping the Items + + at the end of parsing we'll have the result here + the result don't have to be one value, it can be + more than one if we have used a semicolon in the global space + e.g. such input string "1+2;3+4" will generate a result: + stack[0].value=3 + stack[1].value=7 + + you should check if the stack is not empty, because if there was + a syntax error in the input string then we do not have any results + on the stack +*/ +std::vector stack; + + +private: + + +/*! + size of the stack when we're starting parsing of the string + + if it's to small while parsing the stack will be automatically resized +*/ +const int default_stack_size; + + + +/*! + index of an object in our stack + it's pointing on the place behind the last element + for example at the beginning of parsing its value is zero +*/ +unsigned int stack_index; + + +/*! + code of the last error +*/ +ErrorCode error; + + +/*! + pointer to the currently reading char + when an error has occured it may be used to count the index of the wrong character +*/ +const char * pstring; + + +/*! + the base (radix) of the mathematic system (for example it may be '10') +*/ +int base; + + +/*! + the unit of angles used in: sin,cos,tan,cot,asin,acos,atan,acot + 0 - deg + 1 - rad (default) + 2 - grad +*/ +int deg_rad_grad; + + + +/*! + a pointer to an object which tell us whether we should stop calculating or not +*/ +const volatile StopCalculating * pstop_calculating; + + + +/*! + a pointer to the user-defined variables' table +*/ +const Objects * puser_variables; + +/*! + a pointer to the user-defined functions' table +*/ +const Objects * puser_functions; + + +typedef std::map FunctionLocalVariables; + +/*! + a pointer to the local variables of a function +*/ +const FunctionLocalVariables * pfunction_local_variables; + + +/*! + a temporary set using during parsing user defined variables +*/ +std::set visited_variables; + + +/*! + a temporary set using during parsing user defined functions +*/ +std::set visited_functions; + + + + +/*! + pfunction is the type of pointer to a mathematic function + + these mathematic functions are private members of this class, + they are the wrappers for standard mathematics function + + 'pstack' is the pointer to the first argument on our stack + 'amount_of_arg' tell us how many argument there are in our stack + 'result' is the reference for result of function +*/ +typedef void (Parser::*pfunction)(int pstack, int amount_of_arg, ValueType & result); + + +/*! + pfunction is the type of pointer to a method which returns value of variable +*/ +typedef void (ValueType::*pfunction_var)(); + + +/*! + table of mathematic functions + + this map consists of: + std::string - function's name + pfunction - pointer to specific function +*/ +typedef std::map FunctionsTable; +FunctionsTable functions_table; + + +/*! + table of mathematic operators + + this map consists of: + std::string - operators's name + MatOperator::Type - type of the operator +*/ +typedef std::map OperatorsTable; +OperatorsTable operators_table; + + +/*! + table of mathematic variables + + this map consists of: + std::string - variable's name + pfunction_var - pointer to specific function which returns value of variable +*/ +typedef std::map VariablesTable; +VariablesTable variables_table; + + +/*! + some coefficients used when calculating the gamma (or factorial) function +*/ +CGamma cgamma; + + +/*! + temporary object for a whole string when Parse(std::wstring) is used +*/ +std::string wide_to_ansi; + + +/*! + group character (used when parsing) + default zero (not used) +*/ +int group; + + +/*! + characters used as a comma + default: '.' and ',' + comma2 can be zero (it means it is not used) +*/ +int comma, comma2; + + +/*! + an additional character used as a separator between function parameters + (semicolon is used always) +*/ +int param_sep; + + +/*! + true if something was calculated (at least one mathematical operator was used or a function or a variable) +*/ +bool calculated; + + + +/*! + we're using this method for reporting an error +*/ +static void Error(ErrorCode code) +{ + throw code; +} + + +/*! + this method skips the white character from the string + + it's moving the 'pstring' to the first no-white character +*/ +void SkipWhiteCharacters() +{ + while( (*pstring==' ' ) || (*pstring=='\t') ) + ++pstring; +} + + +/*! + an auxiliary method for RecurrenceParsingVariablesOrFunction(...) +*/ +void RecurrenceParsingVariablesOrFunction_CheckStopCondition(bool variable, const std::string & name) +{ + if( variable ) + { + if( visited_variables.find(name) != visited_variables.end() ) + Error( err_variable_loop ); + } + else + { + if( visited_functions.find(name) != visited_functions.end() ) + Error( err_functions_loop ); + } +} + + +/*! + an auxiliary method for RecurrenceParsingVariablesOrFunction(...) +*/ +void RecurrenceParsingVariablesOrFunction_AddName(bool variable, const std::string & name) +{ + if( variable ) + visited_variables.insert( name ); + else + visited_functions.insert( name ); +} + + +/*! + an auxiliary method for RecurrenceParsingVariablesOrFunction(...) +*/ +void RecurrenceParsingVariablesOrFunction_DeleteName(bool variable, const std::string & name) +{ + if( variable ) + visited_variables.erase( name ); + else + visited_functions.erase( name ); +} + + +/*! + this method returns the value of a variable or function + by creating a new instance of the mathematical parser + and making the standard parsing algorithm on the given string + + this method is used only during parsing user defined variables or functions + + (there can be a recurrence here therefore we're using 'visited_variables' + and 'visited_functions' sets to make a stop condition) +*/ +ValueType RecurrenceParsingVariablesOrFunction(bool variable, const std::string & name, const char * new_string, + FunctionLocalVariables * local_variables = 0) +{ + RecurrenceParsingVariablesOrFunction_CheckStopCondition(variable, name); + RecurrenceParsingVariablesOrFunction_AddName(variable, name); + + Parser NewParser(*this); + ErrorCode err; + + NewParser.pfunction_local_variables = local_variables; + + try + { + err = NewParser.Parse(new_string); + } + catch(...) + { + RecurrenceParsingVariablesOrFunction_DeleteName(variable, name); + + throw; + } + + RecurrenceParsingVariablesOrFunction_DeleteName(variable, name); + + if( err != err_ok ) + Error( err ); + + if( NewParser.stack.size() != 1 ) + Error( err_must_be_only_one_value ); + + if( NewParser.stack[0].type != Item::numerical_value ) + // I think there shouldn't be this error here + Error( err_incorrect_value ); + +return NewParser.stack[0].value; +} + + +public: + + +/*! + this method returns the user-defined value of a variable +*/ +bool GetValueOfUserDefinedVariable(const std::string & variable_name,ValueType & result) +{ + if( !puser_variables ) + return false; + + const char * string_value; + + if( puser_variables->GetValue(variable_name, &string_value) != err_ok ) + return false; + + result = RecurrenceParsingVariablesOrFunction(true, variable_name, string_value); + calculated = true; + +return true; +} + + +/*! + this method returns the value of a local variable of a function +*/ +bool GetValueOfFunctionLocalVariable(const std::string & variable_name, ValueType & result) +{ + if( !pfunction_local_variables ) + return false; + + typename FunctionLocalVariables::const_iterator i = pfunction_local_variables->find(variable_name); + + if( i == pfunction_local_variables->end() ) + return false; + + result = i->second; + +return true; +} + + +/*! + this method returns the value of a variable from variables' table + + we make an object of type ValueType then call a method which + sets the correct value in it and finally we'll return the object +*/ +ValueType GetValueOfVariable(const std::string & variable_name) +{ +ValueType result; + + if( GetValueOfFunctionLocalVariable(variable_name, result) ) + return result; + + if( GetValueOfUserDefinedVariable(variable_name, result) ) + return result; + + + typename std::map::iterator i = + variables_table.find(variable_name); + + if( i == variables_table.end() ) + Error( err_unknown_variable ); + + (result.*(i->second))(); + calculated = true; + +return result; +} + + +private: + +/*! + wrappers for mathematic functions + + 'sindex' is pointing on the first argument on our stack + (the second argument has 'sindex+2' + because 'sindex+1' is guaranted for the 'semicolon' operator) + the third artument has of course 'sindex+4' etc. + + 'result' will be the result of the function + + (we're using exceptions here for example when function gets an improper argument) +*/ + + +/*! + used by: sin,cos,tan,cot +*/ +ValueType ConvertAngleToRad(const ValueType & input) +{ + if( deg_rad_grad == 1 ) // rad + return input; + + ValueType result; + ErrorCode err; + + if( deg_rad_grad == 0 ) // deg + result = ttmath::DegToRad(input, &err); + else // grad + result = ttmath::GradToRad(input, &err); + + if( err != err_ok ) + Error( err ); + +return result; +} + + +/*! + used by: asin,acos,atan,acot +*/ +ValueType ConvertRadToAngle(const ValueType & input) +{ + if( deg_rad_grad == 1 ) // rad + return input; + + ValueType result; + ErrorCode err; + + if( deg_rad_grad == 0 ) // deg + result = ttmath::RadToDeg(input, &err); + else // grad + result = ttmath::RadToGrad(input, &err); + + if( err != err_ok ) + Error( err ); + +return result; +} + + +void Gamma(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + + result = ttmath::Gamma(stack[sindex].value, cgamma, &err, pstop_calculating); + + if(err != err_ok) + Error( err ); +} + + +/*! + factorial + result = 1 * 2 * 3 * 4 * .... * x +*/ +void Factorial(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + + result = ttmath::Factorial(stack[sindex].value, cgamma, &err, pstop_calculating); + + if(err != err_ok) + Error( err ); +} + + +void Abs(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + result = ttmath::Abs(stack[sindex].value); +} + +void Sin(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + result = ttmath::Sin( ConvertAngleToRad(stack[sindex].value), &err ); + + if(err != err_ok) + Error( err ); +} + +void Cos(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + result = ttmath::Cos( ConvertAngleToRad(stack[sindex].value), &err ); + + if(err != err_ok) + Error( err ); +} + +void Tan(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + result = ttmath::Tan(ConvertAngleToRad(stack[sindex].value), &err); + + if(err != err_ok) + Error( err ); +} + +void Cot(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + result = ttmath::Cot(ConvertAngleToRad(stack[sindex].value), &err); + + if(err != err_ok) + Error( err ); +} + +void Int(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + result = ttmath::SkipFraction(stack[sindex].value); +} + + +void Round(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + result = stack[sindex].value; + + if( result.Round() ) + Error( err_overflow ); +} + + +void Ln(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + result = ttmath::Ln(stack[sindex].value, &err); + + if(err != err_ok) + Error( err ); +} + +void Log(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 2 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + result = ttmath::Log(stack[sindex].value, stack[sindex+2].value, &err); + + if(err != err_ok) + Error( err ); +} + +void Exp(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + result = ttmath::Exp(stack[sindex].value, &err); + + if(err != err_ok) + Error( err ); +} + + +void Max(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args == 0 ) + { + result.SetMax(); + + return; + } + + result = stack[sindex].value; + + for(int i=1 ; i stack[sindex + i*2].value ) + result = stack[sindex + i*2].value; + } +} + + +void ASin(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + ValueType temp = ttmath::ASin(stack[sindex].value, &err); + + if(err != err_ok) + Error( err ); + + result = ConvertRadToAngle(temp); +} + + +void ACos(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + ErrorCode err; + ValueType temp = ttmath::ACos(stack[sindex].value, &err); + + if(err != err_ok) + Error( err ); + + result = ConvertRadToAngle(temp); +} + + +void ATan(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + result = ConvertRadToAngle(ttmath::ATan(stack[sindex].value)); +} + + +void ACot(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + result = ConvertRadToAngle(ttmath::ACot(stack[sindex].value)); +} + + +void Sgn(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 1 ) + Error( err_improper_amount_of_arguments ); + + result = ttmath::Sgn(stack[sindex].value); +} + + +void Mod(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 2 ) + Error( err_improper_amount_of_arguments ); + + if( stack[sindex+2].value.IsZero() ) + Error( err_improper_argument ); + + result = stack[sindex].value; + uint c = result.Mod(stack[sindex+2].value); + + if( c ) + Error( err_overflow ); +} + + +void If(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args != 3 ) + Error( err_improper_amount_of_arguments ); + + + if( !stack[sindex].value.IsZero() ) + result = stack[sindex+2].value; + else + result = stack[sindex+4].value; +} + + +void Or(int sindex, int amount_of_args, ValueType & result) +{ + if( amount_of_args < 2 ) + Error( err_improper_amount_of_arguments ); + + for(int i=0 ; iGetValueAndParam(function_name, &string_value, ¶m) != err_ok ) + return false; + + if( param != amount_of_args ) + Error( err_improper_amount_of_arguments ); + + + FunctionLocalVariables local_variables; + + if( amount_of_args > 0 ) + { + char buffer[30]; + + // x = x1 + buffer[0] = 'x'; + buffer[1] = 0; + local_variables.insert( std::make_pair(buffer, stack[sindex].value) ); + + for(int i=0 ; i*(i->second))(sindex, amount_of_args, stack[sindex-1].value); + calculated = true; +} + + + + + +/*! + inserting a function to the functions' table + + function_name - name of the function + pf - pointer to the function (to the wrapper) +*/ +void InsertFunctionToTable(const char * function_name, pfunction pf) +{ + std::string str; + Misc::AssignString(str, function_name); + + functions_table.insert( std::make_pair(str, pf) ); +} + + + +/*! + inserting a function to the variables' table + (this function returns value of variable) + + variable_name - name of the function + pf - pointer to the function +*/ +void InsertVariableToTable(const char * variable_name, pfunction_var pf) +{ + std::string str; + Misc::AssignString(str, variable_name); + + variables_table.insert( std::make_pair(str, pf) ); +} + + +/*! + this method creates the table of functions +*/ +void CreateFunctionsTable() +{ + InsertFunctionToTable("gamma", &Parser::Gamma); + InsertFunctionToTable("factorial", &Parser::Factorial); + InsertFunctionToTable("abs", &Parser::Abs); + InsertFunctionToTable("sin", &Parser::Sin); + InsertFunctionToTable("cos", &Parser::Cos); + InsertFunctionToTable("tan", &Parser::Tan); + InsertFunctionToTable("tg", &Parser::Tan); + InsertFunctionToTable("cot", &Parser::Cot); + InsertFunctionToTable("ctg", &Parser::Cot); + InsertFunctionToTable("int", &Parser::Int); + InsertFunctionToTable("round", &Parser::Round); + InsertFunctionToTable("ln", &Parser::Ln); + InsertFunctionToTable("log", &Parser::Log); + InsertFunctionToTable("exp", &Parser::Exp); + InsertFunctionToTable("max", &Parser::Max); + InsertFunctionToTable("min", &Parser::Min); + InsertFunctionToTable("asin", &Parser::ASin); + InsertFunctionToTable("acos", &Parser::ACos); + InsertFunctionToTable("atan", &Parser::ATan); + InsertFunctionToTable("atg", &Parser::ATan); + InsertFunctionToTable("acot", &Parser::ACot); + InsertFunctionToTable("actg", &Parser::ACot); + InsertFunctionToTable("sgn", &Parser::Sgn); + InsertFunctionToTable("mod", &Parser::Mod); + InsertFunctionToTable("if", &Parser::If); + InsertFunctionToTable("or", &Parser::Or); + InsertFunctionToTable("and", &Parser::And); + InsertFunctionToTable("not", &Parser::Not); + InsertFunctionToTable("degtorad", &Parser::DegToRad); + InsertFunctionToTable("radtodeg", &Parser::RadToDeg); + InsertFunctionToTable("degtodeg", &Parser::DegToDeg); + InsertFunctionToTable("gradtorad", &Parser::GradToRad); + InsertFunctionToTable("radtograd", &Parser::RadToGrad); + InsertFunctionToTable("degtograd", &Parser::DegToGrad); + InsertFunctionToTable("gradtodeg", &Parser::GradToDeg); + InsertFunctionToTable("ceil", &Parser::Ceil); + InsertFunctionToTable("floor", &Parser::Floor); + InsertFunctionToTable("sqrt", &Parser::Sqrt); + InsertFunctionToTable("sinh", &Parser::Sinh); + InsertFunctionToTable("cosh", &Parser::Cosh); + InsertFunctionToTable("tanh", &Parser::Tanh); + InsertFunctionToTable("tgh", &Parser::Tanh); + InsertFunctionToTable("coth", &Parser::Coth); + InsertFunctionToTable("ctgh", &Parser::Coth); + InsertFunctionToTable("root", &Parser::Root); + InsertFunctionToTable("asinh", &Parser::ASinh); + InsertFunctionToTable("acosh", &Parser::ACosh); + InsertFunctionToTable("atanh", &Parser::ATanh); + InsertFunctionToTable("atgh", &Parser::ATanh); + InsertFunctionToTable("acoth", &Parser::ACoth); + InsertFunctionToTable("actgh", &Parser::ACoth); + InsertFunctionToTable("bitand", &Parser::BitAnd); + InsertFunctionToTable("bitor", &Parser::BitOr); + InsertFunctionToTable("bitxor", &Parser::BitXor); + InsertFunctionToTable("band", &Parser::BitAnd); + InsertFunctionToTable("bor", &Parser::BitOr); + InsertFunctionToTable("bxor", &Parser::BitXor); + InsertFunctionToTable("sum", &Parser::Sum); + InsertFunctionToTable("avg", &Parser::Avg); + InsertFunctionToTable("frac", &Parser::Frac); +} + + +/*! + this method creates the table of variables +*/ +void CreateVariablesTable() +{ + InsertVariableToTable("pi", &ValueType::SetPi); + InsertVariableToTable("e", &ValueType::SetE); +} + + +/*! + converting from a big letter to a small one +*/ +int ToLowerCase(int c) +{ + if( c>='A' && c<='Z' ) + return c - 'A' + 'a'; + +return c; +} + + +/*! + this method read the name of a variable or a function + + 'result' will be the name of a variable or a function + function return 'false' if this name is the name of a variable + or function return 'true' if this name is the name of a function + + what should be returned is tested just by a '(' character that means if there's + a '(' character after a name that function returns 'true' +*/ +bool ReadName(std::string & result) +{ +int character; + + + result.erase(); + character = *pstring; + + /* + the first letter must be from range 'a' - 'z' or 'A' - 'Z' + */ + if( ! (( character>='a' && character<='z' ) || ( character>='A' && character<='Z' )) ) + Error( err_unknown_character ); + + + do + { + result += static_cast( character ); + character = * ++pstring; + } + while( (character>='a' && character<='z') || + (character>='A' && character<='Z') || + (character>='0' && character<='9') || + character=='_' ); + + + SkipWhiteCharacters(); + + + /* + if there's a character '(' that means this name is a name of a function + */ + if( *pstring == '(' ) + { + ++pstring; + return true; + } + + +return false; +} + + +/*! + we're checking whether the first character is '-' or '+' + if it is we'll return 'true' and if it is equally '-' we'll set the 'sign' member of 'result' +*/ +bool TestSign(Item & result) +{ + SkipWhiteCharacters(); + result.sign = false; + + if( *pstring == '-' || *pstring == '+' ) + { + if( *pstring == '-' ) + result.sign = true; + + ++pstring; + + return true; + } + +return false; +} + + +/*! + we're reading the name of a variable or a function + if is there a function we'll return 'true' +*/ +bool ReadVariableOrFunction(Item & result) +{ +std::string name; +bool is_it_name_of_function = ReadName(name); + + if( is_it_name_of_function ) + { + /* + we've read the name of a function + */ + result.function_name = name; + result.type = Item::first_bracket; + result.function = true; + } + else + { + /* + we've read the name of a variable and we're getting its value now + */ + result.value = GetValueOfVariable( name ); + } + +return is_it_name_of_function; +} + + + + +/*! + we're reading a numerical value directly from the string +*/ +void ReadValue(Item & result, int reading_base) +{ +const char * new_stack_pointer; +bool value_read; +Conv conv; + + conv.base = reading_base; + conv.comma = comma; + conv.comma2 = comma2; + conv.group = group; + + uint carry = result.value.FromString(pstring, conv, &new_stack_pointer, &value_read); + pstring = new_stack_pointer; + + if( carry ) + Error( err_overflow ); + + if( !value_read ) + Error( err_unknown_character ); +} + + +/*! + this method returns true if 'character' is a proper first digit for the value (or a comma -- can be first too) +*/ +bool ValueStarts(int character, int base) +{ + if( character == comma ) + return true; + + if( comma2!=0 && character==comma2 ) + return true; + + if( Misc::CharToDigit(character, base) != -1 ) + return true; + +return false; +} + + +/*! + we're reading the item + + return values: + 0 - all ok, the item is successfully read + 1 - the end of the string (the item is not read) + 2 - the final bracket ')' +*/ +int ReadValueVariableOrFunction(Item & result) +{ +bool it_was_sign = false; +int character; + + + if( TestSign(result) ) + // 'result.sign' was set as well + it_was_sign = true; + + SkipWhiteCharacters(); + character = ToLowerCase( *pstring ); + + + if( character == 0 ) + { + if( it_was_sign ) + // at the end of the string a character like '-' or '+' has left + Error( err_unexpected_end ); + + // there's the end of the string here + return 1; + } + else + if( character == '(' ) + { + // we've got a normal bracket (not a function) + result.type = Item::first_bracket; + result.function = false; + ++pstring; + + return 0; + } + else + if( character == ')' ) + { + // we've got a final bracket + // (in this place we can find a final bracket only when there are empty brackets + // without any values inside or with a sign '-' or '+' inside) + + if( it_was_sign ) + Error( err_unexpected_final_bracket ); + + result.type = Item::last_bracket; + + // we don't increment 'pstring', this final bracket will be read next by the + // 'ReadOperatorAndCheckFinalBracket(...)' method + + return 2; + } + else + if( character == '#' ) + { + ++pstring; + SkipWhiteCharacters(); + + // after '#' character we do not allow '-' or '+' (can be white characters) + if( ValueStarts(*pstring, 16) ) + ReadValue( result, 16 ); + else + Error( err_unknown_character ); + } + else + if( character == '&' ) + { + ++pstring; + SkipWhiteCharacters(); + + // after '&' character we do not allow '-' or '+' (can be white characters) + if( ValueStarts(*pstring, 2) ) + ReadValue( result, 2 ); + else + Error( err_unknown_character ); + } + else + if( ValueStarts(character, base) ) + { + ReadValue( result, base ); + } + else + if( character>='a' && character<='z' ) + { + if( ReadVariableOrFunction(result) ) + // we've read the name of a function + return 0; + } + else + Error( err_unknown_character ); + + + + /* + we've got a value in the 'result' + this value is from a variable or directly from the string + */ + result.type = Item::numerical_value; + + if( result.sign ) + { + result.value.ChangeSign(); + result.sign = false; + } + + +return 0; +} + + +void InsertOperatorToTable(const char * name, typename MatOperator::Type type) +{ + operators_table.insert( std::make_pair(std::string(name), type) ); +} + + +/*! + this method creates the table of operators +*/ +void CreateMathematicalOperatorsTable() +{ + InsertOperatorToTable("||", MatOperator::lor); + InsertOperatorToTable("&&", MatOperator::land); + InsertOperatorToTable("!=", MatOperator::neq); + InsertOperatorToTable("==", MatOperator::eq); + InsertOperatorToTable(">=", MatOperator::get); + InsertOperatorToTable("<=", MatOperator::let); + InsertOperatorToTable(">", MatOperator::gt); + InsertOperatorToTable("<", MatOperator::lt); + InsertOperatorToTable("-", MatOperator::sub); + InsertOperatorToTable("+", MatOperator::add); + InsertOperatorToTable("/", MatOperator::div); + InsertOperatorToTable("*", MatOperator::mul); + InsertOperatorToTable("^", MatOperator::pow); +} + + +/*! + returns true if 'str2' is the substring of str1 + + e.g. + true when str1="test" and str2="te" +*/ +bool IsSubstring(const std::string & str1, const std::string & str2) +{ + if( str2.length() > str1.length() ) + return false; + + for(typename std::string::size_type i=0 ; ifirst, oper) ) + { + oper.erase( --oper.end() ); // we've got mininum one element + + if( iter_old != operators_table.end() && iter_old->first == oper ) + { + result.type = Item::mat_operator; + result.moperator.SetType( iter_old->second ); + break; + } + + Error( err_unknown_operator ); + } + + iter_old = iter_new; + } +} + + +/*! + this method makes a calculation for the percentage operator + e.g. + 1000-50% = 1000-(1000*0,5) = 500 +*/ +void OperatorPercentage() +{ + if( stack_index < 3 || + stack[stack_index-1].type != Item::numerical_value || + stack[stack_index-2].type != Item::mat_operator || + stack[stack_index-3].type != Item::numerical_value ) + Error(err_percent_from); + + ++pstring; + SkipWhiteCharacters(); + + uint c = 0; + c += stack[stack_index-1].value.Div(100); + c += stack[stack_index-1].value.Mul(stack[stack_index-3].value); + + if( c ) + Error(err_overflow); +} + + +/*! + this method reads a mathematic operators + or the final bracket or the semicolon operator + + return values: + 0 - ok + 1 - the string is finished +*/ +int ReadOperator(Item & result) +{ + SkipWhiteCharacters(); + + if( *pstring == '%' ) + OperatorPercentage(); + + + if( *pstring == 0 ) + return 1; + else + if( *pstring == ')' ) + { + result.type = Item::last_bracket; + ++pstring; + } + else + if( *pstring == ';' || (param_sep!=0 && *pstring==param_sep) ) + { + result.type = Item::semicolon; + ++pstring; + } + else + if( (*pstring>='a' && *pstring<='z') || (*pstring>='A' && *pstring<='Z') ) + { + // short mul (without any operators) + + result.type = Item::mat_operator; + result.moperator.SetType( MatOperator::shortmul ); + } + else + ReadMathematicalOperator(result); + +return 0; +} + + + +/*! + this method is making the standard mathematic operation like '-' '+' '*' '/' and '^' + + the operation is made between 'value1' and 'value2' + the result of this operation is stored in the 'value1' +*/ +void MakeStandardMathematicOperation(ValueType & value1, typename MatOperator::Type mat_operator, + const ValueType & value2) +{ +uint res; + + calculated = true; + + switch( mat_operator ) + { + case MatOperator::land: + (!value1.IsZero() && !value2.IsZero()) ? value1.SetOne() : value1.SetZero(); + break; + + case MatOperator::lor: + (!value1.IsZero() || !value2.IsZero()) ? value1.SetOne() : value1.SetZero(); + break; + + case MatOperator::eq: + (value1 == value2) ? value1.SetOne() : value1.SetZero(); + break; + + case MatOperator::neq: + (value1 != value2) ? value1.SetOne() : value1.SetZero(); + break; + + case MatOperator::lt: + (value1 < value2) ? value1.SetOne() : value1.SetZero(); + break; + + case MatOperator::gt: + (value1 > value2) ? value1.SetOne() : value1.SetZero(); + break; + + case MatOperator::let: + (value1 <= value2) ? value1.SetOne() : value1.SetZero(); + break; + + case MatOperator::get: + (value1 >= value2) ? value1.SetOne() : value1.SetZero(); + break; + + case MatOperator::sub: + if( value1.Sub(value2) ) Error( err_overflow ); + break; + + case MatOperator::add: + if( value1.Add(value2) ) Error( err_overflow ); + break; + + case MatOperator::mul: + case MatOperator::shortmul: + if( value1.Mul(value2) ) Error( err_overflow ); + break; + + case MatOperator::div: + if( value2.IsZero() ) Error( err_division_by_zero ); + if( value1.Div(value2) ) Error( err_overflow ); + break; + + case MatOperator::pow: + res = value1.Pow( value2 ); + + if( res == 1 ) Error( err_overflow ); + else + if( res == 2 ) Error( err_improper_argument ); + + break; + + default: + /* + on the stack left an unknown operator but we had to recognize its before + that means there's an error in our algorithm + */ + Error( err_internal_error ); + } +} + + + + +/*! + this method is trying to roll the stack up with the operator's priority + + for example if there are: + "1 - 2 +" + we can subtract "1-2" and the result store on the place where is '1' and copy the last + operator '+', that means there'll be '-1+' on our stack + + but if there are: + "1 - 2 *" + we can't roll the stack up because the operator '*' has greater priority than '-' +*/ +void TryRollingUpStackWithOperatorPriority() +{ + while( stack_index>=4 && + stack[stack_index-4].type == Item::numerical_value && + stack[stack_index-3].type == Item::mat_operator && + stack[stack_index-2].type == Item::numerical_value && + stack[stack_index-1].type == Item::mat_operator && + ( + ( + // the first operator has greater priority + stack[stack_index-3].moperator.GetPriority() > stack[stack_index-1].moperator.GetPriority() + ) || + ( + // or both operators have the same priority and the first operator is not right associative + stack[stack_index-3].moperator.GetPriority() == stack[stack_index-1].moperator.GetPriority() && + stack[stack_index-3].moperator.GetAssoc() == MatOperator::non_right + ) + ) + ) + { + MakeStandardMathematicOperation(stack[stack_index-4].value, + stack[stack_index-3].moperator.GetType(), + stack[stack_index-2].value); + + + /* + copying the last operator and setting the stack pointer to the correct value + */ + stack[stack_index-3] = stack[stack_index-1]; + stack_index -= 2; + } +} + + +/*! + this method is trying to roll the stack up without testing any operators + + for example if there are: + "1 - 2" + there'll be "-1" on our stack +*/ +void TryRollingUpStack() +{ + while( stack_index >= 3 && + stack[stack_index-3].type == Item::numerical_value && + stack[stack_index-2].type == Item::mat_operator && + stack[stack_index-1].type == Item::numerical_value ) + { + MakeStandardMathematicOperation( stack[stack_index-3].value, + stack[stack_index-2].moperator.GetType(), + stack[stack_index-1].value ); + + stack_index -= 2; + } +} + + +/*! + this method is reading a value or a variable or a function + (the normal first bracket as well) and push it into the stack +*/ +int ReadValueVariableOrFunctionAndPushItIntoStack(Item & temp) +{ +int code = ReadValueVariableOrFunction( temp ); + + if( code == 0 ) + { + if( stack_index < stack.size() ) + stack[stack_index] = temp; + else + stack.push_back( temp ); + + ++stack_index; + } + + if( code == 2 ) + // there was a final bracket, we didn't push it into the stack + // (it'll be read by the 'ReadOperatorAndCheckFinalBracket' method next) + code = 0; + + +return code; +} + + + +/*! + this method calculate how many parameters there are on the stack + and the index of the first parameter + + if there aren't any parameters on the stack this method returns + 'size' equals zero and 'index' pointing after the first bracket + (on non-existend element) +*/ +void HowManyParameters(int & size, int & index) +{ + size = 0; + index = stack_index; + + if( index == 0 ) + // we haven't put a first bracket on the stack + Error( err_unexpected_final_bracket ); + + + if( stack[index-1].type == Item::first_bracket ) + // empty brackets + return; + + for( --index ; index>=1 ; index-=2 ) + { + if( stack[index].type != Item::numerical_value ) + { + /* + this element must be 'numerical_value', if not that means + there's an error in our algorithm + */ + Error( err_internal_error ); + } + + ++size; + + if( stack[index-1].type != Item::semicolon ) + break; + } + + if( index<1 || stack[index-1].type != Item::first_bracket ) + { + /* + we haven't put a first bracket on the stack + */ + Error( err_unexpected_final_bracket ); + } +} + + +/*! + this method is being called when the final bracket ')' is being found + + this method's rolling the stack up, counting how many parameters there are + on the stack and if there was a function it's calling the function +*/ +void RollingUpFinalBracket() +{ +int amount_of_parameters; +int index; + + + if( stack_index<1 || + (stack[stack_index-1].type != Item::numerical_value && + stack[stack_index-1].type != Item::first_bracket) + ) + Error( err_unexpected_final_bracket ); + + + TryRollingUpStack(); + HowManyParameters(amount_of_parameters, index); + + // 'index' will be greater than zero + // 'amount_of_parameters' can be zero + + + if( amount_of_parameters==0 && !stack[index-1].function ) + Error( err_unexpected_final_bracket ); + + + bool was_sign = stack[index-1].sign; + + + if( stack[index-1].function ) + { + // the result of a function will be on 'stack[index-1]' + // and then at the end we'll set the correct type (numerical value) of this element + CallFunction(stack[index-1].function_name, amount_of_parameters, index); + } + else + { + /* + there was a normal bracket (not a funcion) + */ + if( amount_of_parameters != 1 ) + Error( err_unexpected_semicolon_operator ); + + + /* + in the place where is the bracket we put the result + */ + stack[index-1] = stack[index]; + } + + + /* + if there was a '-' character before the first bracket + we change the sign of the expression + */ + stack[index-1].sign = false; + + if( was_sign ) + stack[index-1].value.ChangeSign(); + + stack[index-1].type = Item::numerical_value; + + + /* + the pointer of the stack will be pointing on the next (non-existing now) element + */ + stack_index = index; +} + + +/*! + this method is putting the operator on the stack +*/ + +void PushOperatorIntoStack(Item & temp) +{ + if( stack_index < stack.size() ) + stack[stack_index] = temp; + else + stack.push_back( temp ); + + ++stack_index; +} + + + +/*! + this method is reading a operator and if it's a final bracket + it's calling RollingUpFinalBracket() and reading a operator again +*/ +int ReadOperatorAndCheckFinalBracket(Item & temp) +{ + do + { + if( ReadOperator(temp) == 1 ) + { + /* + the string is finished + */ + return 1; + } + + if( temp.type == Item::last_bracket ) + RollingUpFinalBracket(); + + } + while( temp.type == Item::last_bracket ); + +return 0; +} + + +/*! + we check wheter there are only numerical value's or 'semicolon' operators on the stack +*/ +void CheckIntegrityOfStack() +{ + for(unsigned int i=0 ; iWasStopSignal() ) + Error( err_interrupt ); + + result_code = ReadValueVariableOrFunctionAndPushItIntoStack( item ); + + if( result_code == 0 ) + { + if( item.type == Item::first_bracket ) + continue; + + result_code = ReadOperatorAndCheckFinalBracket( item ); + } + + + if( result_code==1 || item.type==Item::semicolon ) + { + /* + the string is finished or the 'semicolon' operator has appeared + */ + + if( stack_index == 0 ) + Error( err_nothing_has_read ); + + TryRollingUpStack(); + + if( result_code == 1 ) + { + CheckIntegrityOfStack(); + + return; + } + } + + + PushOperatorIntoStack( item ); + TryRollingUpStackWithOperatorPriority(); + } +} + +/*! + this method is called at the end of the parsing process + + on our stack we can have another value than 'numerical_values' for example + when someone use the operator ';' in the global scope or there was an error during + parsing and the parser hasn't finished its job + + if there was an error the stack is cleaned up now + otherwise we resize stack and leave on it only 'numerical_value' items +*/ +void NormalizeStack() +{ + if( error!=err_ok || stack_index==0 ) + { + stack.clear(); + return; + } + + + /* + 'stack_index' tell us how many elements there are on the stack, + we must resize the stack now because 'stack_index' is using only for parsing + and stack has more (or equal) elements than value of 'stack_index' + */ + stack.resize( stack_index ); + + for(uint i=stack_index-1 ; i!=uint(-1) ; --i) + { + if( stack[i].type != Item::numerical_value ) + stack.erase( stack.begin() + i ); + } +} + + +public: + + +/*! + the default constructor +*/ +Parser(): default_stack_size(100) +{ + pstop_calculating = 0; + puser_variables = 0; + puser_functions = 0; + pfunction_local_variables = 0; + base = 10; + deg_rad_grad = 1; + error = err_ok; + group = 0; + comma = '.'; + comma2 = ','; + param_sep = 0; + + CreateFunctionsTable(); + CreateVariablesTable(); + CreateMathematicalOperatorsTable(); +} + + +/*! + the assignment operator +*/ +Parser & operator=(const Parser & p) +{ + pstop_calculating = p.pstop_calculating; + puser_variables = p.puser_variables; + puser_functions = p.puser_functions; + pfunction_local_variables = 0; + base = p.base; + deg_rad_grad = p.deg_rad_grad; + error = p.error; + group = p.group; + comma = p.comma; + comma2 = p.comma2; + param_sep = p.param_sep; + + /* + we don't have to call 'CreateFunctionsTable()' etc. + we can only copy these tables + */ + functions_table = p.functions_table; + variables_table = p.variables_table; + operators_table = p.operators_table; + + visited_variables = p.visited_variables; + visited_functions = p.visited_functions; + +return *this; +} + + +/*! + the copying constructor +*/ +Parser(const Parser & p): default_stack_size(p.default_stack_size) +{ + operator=(p); +} + + +/*! + the new base of mathematic system + default is 10 +*/ +void SetBase(int b) +{ + if( b>=2 && b<=16 ) + base = b; +} + + +/*! + the unit of angles used in: sin,cos,tan,cot,asin,acos,atan,acot + 0 - deg + 1 - rad (default) + 2 - grad +*/ +void SetDegRadGrad(int angle) +{ + if( angle >= 0 || angle <= 2 ) + deg_rad_grad = angle; +} + +/*! + this method sets a pointer to the object which tell us whether we should stop + calculations +*/ +void SetStopObject(const volatile StopCalculating * ps) +{ + pstop_calculating = ps; +} + + +/*! + this method sets the new table of user-defined variables + if you don't want any other variables just put zero value into the 'puser_variables' variable + + (you can have only one table at the same time) +*/ +void SetVariables(const Objects * pv) +{ + puser_variables = pv; +} + + +/*! + this method sets the new table of user-defined functions + if you don't want any other functions just put zero value into the 'puser_functions' variable + + (you can have only one table at the same time) +*/ +void SetFunctions(const Objects * pf) +{ + puser_functions = pf; +} + + +/*! + setting the group character + default zero (not used) +*/ +void SetGroup(int g) +{ + group = g; +} + + +/*! + setting the main comma operator and the additional comma operator + the additional operator can be zero (which means it is not used) + default are: '.' and ',' +*/ +void SetComma(int c, int c2 = 0) +{ + comma = c; + comma2 = c2; +} + + +/*! + setting an additional character which is used as a parameters separator + the main parameters separator is a semicolon (is used always) + + this character is used also as a global separator +*/ +void SetParamSep(int s) +{ + param_sep = s; +} + + +/*! + the main method using for parsing string +*/ +ErrorCode Parse(const char * str) +{ + stack_index = 0; + pstring = str; + error = err_ok; + calculated = false; + + stack.resize( default_stack_size ); + + try + { + Parse(); + } + catch(ErrorCode c) + { + error = c; + calculated = false; + } + + NormalizeStack(); + +return error; +} + + +/*! + the main method using for parsing string +*/ +ErrorCode Parse(const std::string & str) +{ + return Parse(str.c_str()); +} + + +#ifndef TTMATH_DONT_USE_WCHAR + +/*! + the main method using for parsing string +*/ +ErrorCode Parse(const wchar_t * str) +{ + Misc::AssignString(wide_to_ansi, str); + +return Parse(wide_to_ansi.c_str()); + + // !! wide_to_ansi clearing can be added here +} + + +/*! + the main method using for parsing string +*/ +ErrorCode Parse(const std::wstring & str) +{ + return Parse(str.c_str()); +} + +#endif + + +/*! + this method returns true is something was calculated + (at least one mathematical operator was used or a function or variable) + e.g. true if the string to Parse() looked like this: + "1+1" + "2*3" + "sin(5)" + + if the string was e.g. "678" the result is false +*/ +bool Calculated() +{ + return calculated; +} + + +/*! + initializing coefficients used when calculating the gamma (or factorial) function + this speed up the next calculations + you don't have to call this method explicitly + these coefficients will be calculated when needed +*/ +void InitCGamma() +{ + cgamma.InitAll(); +} + + +}; + + + +} // namespace + + +#endif diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmaththreads.h b/3rd_party/ttmath-0.9.3/ttmath/ttmaththreads.h new file mode 100644 index 00000000..586227f2 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmaththreads.h @@ -0,0 +1,250 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2009, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + + + +#ifndef headerfilettmaththreads +#define headerfilettmaththreads + +#include "ttmathtypes.h" + +#ifdef TTMATH_WIN32_THREADS +#include +#include +#endif + +#ifdef TTMATH_POSIX_THREADS +#include +#endif + + + +/*! + \file ttmaththreads.h + \brief Some objects used in multithreads environment +*/ + + +/* + this is a simple skeleton of a program in multithreads environment: + + #define TTMATH_MULTITHREADS + #include + + TTMATH_MULTITHREADS_HELPER + + int main() + { + [...] + } + + make sure that macro TTMATH_MULTITHREADS is defined and (somewhere in *.cpp file) + use TTMATH_MULTITHREADS_HELPER macro (outside of any classes/functions/namespaces scope) +*/ + + +namespace ttmath +{ + + +#ifdef TTMATH_WIN32_THREADS + + /* + we use win32 threads + */ + + + /*! + in multithreads environment you should use TTMATH_MULTITHREADS_HELPER macro + somewhere in *.cpp file + + (at the moment in win32 this macro does nothing) + */ + #define TTMATH_MULTITHREADS_HELPER + + + /*! + objects of this class are used to synchronize + */ + class ThreadLock + { + HANDLE mutex_handle; + + + void CreateName(char * buffer) const + { + #ifdef _MSC_VER + #pragma warning (disable : 4996) + // warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. + #endif + + sprintf(buffer, "TTMATH_LOCK_%ul", (unsigned long)GetCurrentProcessId()); + + #ifdef _MSC_VER + #pragma warning (default : 4996) + #endif + } + + + public: + + bool Lock() + { + char buffer[50]; + + CreateName(buffer); + mutex_handle = CreateMutexA(0, false, buffer); + + if( mutex_handle == 0 ) + return false; + + WaitForSingleObject(mutex_handle, INFINITE); + + return true; + } + + + ThreadLock() + { + mutex_handle = 0; + } + + + ~ThreadLock() + { + if( mutex_handle != 0 ) + { + ReleaseMutex(mutex_handle); + CloseHandle(mutex_handle); + } + } + }; + +#endif // #ifdef TTMATH_WIN32_THREADS + + + + + +#ifdef TTMATH_POSIX_THREADS + + /* + we use posix threads + */ + + + /*! + in multithreads environment you should use TTMATH_MULTITHREADS_HELPER macro + somewhere in *.cpp file + (this macro defines a pthread_mutex_t object used by TTMath library) + */ + #define TTMATH_MULTITHREADS_HELPER \ + namespace ttmath \ + { \ + pthread_mutex_t ttmath_mutex = PTHREAD_MUTEX_INITIALIZER; \ + } + + + /*! + ttmath_mutex will be defined by TTMATH_MULTITHREADS_HELPER macro + */ + extern pthread_mutex_t ttmath_mutex; + + + /*! + objects of this class are used to synchronize + */ + class ThreadLock + { + public: + + bool Lock() + { + if( pthread_mutex_lock(&ttmath_mutex) != 0 ) + return false; + + return true; + } + + + ~ThreadLock() + { + pthread_mutex_unlock(&ttmath_mutex); + } + }; + +#endif // #ifdef TTMATH_POSIX_THREADS + + + + +#if !defined(TTMATH_POSIX_THREADS) && !defined(TTMATH_WIN32_THREADS) + + /*! + we don't use win32 and pthreads + */ + + /*! + */ + #define TTMATH_MULTITHREADS_HELPER + + + /*! + objects of this class are used to synchronize + actually we don't synchronize, the method Lock() returns always 'false' + */ + class ThreadLock + { + public: + + bool Lock() + { + return false; + } + }; + + +#endif // #if !defined(TTMATH_POSIX_THREADS) && !defined(TTMATH_WIN32_THREADS) + + + + + +} // namespace + +#endif + diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathtypes.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathtypes.h new file mode 100644 index 00000000..3d9ddbe7 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathtypes.h @@ -0,0 +1,676 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2012, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + + +#ifndef headerfilettmathtypes +#define headerfilettmathtypes + +/*! + \file ttmathtypes.h + \brief constants used in the library + + As our library is written in header files (templates) we cannot use + constants like 'const int' etc. because we should have some source files + *.cpp to define this variables. Only what we can have are constants + defined by #define preprocessor macros. + + All macros are preceded by TTMATH_ prefix +*/ + + +#include +#include +#include + +#ifndef _MSC_VER +#include +// for uint64_t and int64_t on a 32 bit platform +#endif + + + +/*! + the version of the library + + TTMATH_PRERELEASE_VER is either zero or one + zero means that this is the release version of the library + (one means something like beta) +*/ +#define TTMATH_MAJOR_VER 0 +#define TTMATH_MINOR_VER 9 +#define TTMATH_REVISION_VER 3 + +#define TTMATH_PRERELEASE_VER 0 + + + +/*! + you can define a platform explicitly by defining either + TTMATH_PLATFORM32 or TTMATH_PLATFORM64 macro +*/ +#if !defined TTMATH_PLATFORM32 && !defined TTMATH_PLATFORM64 + + #if !defined _M_X64 && !defined __x86_64__ + + /* + other platforms than x86 and amd64 are not recognized at the moment + so you should set TTMATH_PLATFORMxx manually + */ + + // we're using a 32bit platform + #define TTMATH_PLATFORM32 + + #else + + // we're using a 64bit platform + #define TTMATH_PLATFORM64 + + #endif + +#endif + + +/*! + asm version of the library is available by default only for: + x86 and amd64 platforms and for Microsoft Visual and GCC compilers + + but you can force using asm version (the same asm as for Microsoft Visual) + by defining TTMATH_FORCEASM macro + you have to be sure that your compiler accept such an asm format +*/ +#ifndef TTMATH_FORCEASM + + #if !defined __i386__ && !defined _X86_ && !defined _M_IX86 && !defined __x86_64__ && !defined _M_X64 + /*! + x86 architecture: + __i386__ defined by GNU C + _X86_ defined by MinGW32 + _M_IX86 defined by Visual Studio, Intel C/C++, Digital Mars and Watcom C/C++ + + amd64 architecture: + __x86_64__ defined by GNU C, CLANG (LLVM) and Sun Studio + _M_X64 defined by Visual Studio + + asm version is available only for x86 or amd64 platforms + */ + #define TTMATH_NOASM + #endif + + + + #if !defined _MSC_VER && !defined __GNUC__ + /*! + another compilers than MS VC or GCC or CLANG (LLVM) by default use no asm version + (CLANG defines __GNUC__ too) + */ + #define TTMATH_NOASM + #endif + +#endif + + +namespace ttmath +{ + + +#ifdef TTMATH_PLATFORM32 + + /*! + on 32bit platforms one word (uint, sint) will be equal 32bits + */ + typedef unsigned int uint; + typedef signed int sint; + + /*! + on 32 bit platform ulint and slint will be equal 64 bits + */ + #ifdef _MSC_VER + // long long on MS Windows (Visual and GCC mingw compilers) have 64 bits + // stdint.h is not available on Visual Studio prior to VS 2010 version + typedef unsigned long long int ulint; + typedef signed long long int slint; + #else + // we do not use 'long' here because there is a difference in unix and windows + // environments: in unix 'long' has 64 bits but in windows it has only 32 bits + typedef uint64_t ulint; + typedef int64_t slint; + #endif + + /*! + how many bits there are in the uint type + */ + #define TTMATH_BITS_PER_UINT 32u + + /*! + the mask for the highest bit in the unsigned 32bit word (2^31) + */ + #define TTMATH_UINT_HIGHEST_BIT 2147483648u + + /*! + the max value of the unsigned 32bit word (2^32 - 1) + (all bits equal one) + */ + #define TTMATH_UINT_MAX_VALUE 4294967295u + + /*! + the number of words (32bit words on 32bit platform) + which are kept in built-in variables for a Big<> type + (these variables are defined in ttmathbig.h) + */ + #define TTMATH_BUILTIN_VARIABLES_SIZE 256u + + /*! + this macro returns the number of machine words + capable to hold min_bits bits + e.g. TTMATH_BITS(128) returns 4 + */ + #define TTMATH_BITS(min_bits) ((min_bits-1)/32 + 1) + +#else + + /*! + on 64bit platforms one word (uint, sint) will be equal 64bits + */ + #ifdef _MSC_VER + /* in VC 'long' type has 32 bits, __int64 is VC extension */ + typedef unsigned __int64 uint; + typedef signed __int64 sint; + #else + typedef unsigned long uint; + typedef signed long sint; + #endif + + /*! + on 64bit platforms we do not define ulint and slint + */ + + /*! + how many bits there are in the uint type + */ + #define TTMATH_BITS_PER_UINT 64ul + + /*! + the mask for the highest bit in the unsigned 64bit word (2^63) + */ + #define TTMATH_UINT_HIGHEST_BIT 9223372036854775808ul + + /*! + the max value of the unsigned 64bit word (2^64 - 1) + (all bits equal one) + */ + #define TTMATH_UINT_MAX_VALUE 18446744073709551615ul + + /*! + the number of words (64bit words on 64bit platforms) + which are kept in built-in variables for a Big<> type + (these variables are defined in ttmathbig.h) + */ + #define TTMATH_BUILTIN_VARIABLES_SIZE 128ul + + /*! + this macro returns the number of machine words + capable to hold min_bits bits + e.g. TTMATH_BITS(128) returns 2 + */ + #define TTMATH_BITS(min_bits) ((min_bits-1)/64 + 1) + +#endif +} + + +#if defined(TTMATH_MULTITHREADS) && !defined(TTMATH_MULTITHREADS_NOSYNC) + #if !defined(TTMATH_POSIX_THREADS) && !defined(TTMATH_WIN32_THREADS) + + #if defined(_WIN32) + #define TTMATH_WIN32_THREADS + #elif defined(unix) || defined(__unix__) || defined(__unix) + #define TTMATH_POSIX_THREADS + #endif + + #endif +#endif + + + +/*! + this variable defines how many iterations are performed + during some kind of calculating when we're making any long formulas + (for example Taylor series) + + it's used in ExpSurrounding0(...), LnSurrounding1(...), Sin0pi05(...), etc. + + note! there'll not be so many iterations, iterations are stopped when + there is no sense to continue calculating (for example when the result + still remains unchanged after adding next series and we know that the next + series are smaller than previous ones) +*/ +#define TTMATH_ARITHMETIC_MAX_LOOP 10000 + + + +/*! + this is a limit when calculating Karatsuba multiplication + if the size of a vector is smaller than TTMATH_USE_KARATSUBA_MULTIPLICATION_FROM_SIZE + the Karatsuba algorithm will use standard schoolbook multiplication +*/ +#ifdef TTMATH_DEBUG_LOG + // if TTMATH_DEBUG_LOG is defined then we should use the same size regardless of the compiler + #define TTMATH_USE_KARATSUBA_MULTIPLICATION_FROM_SIZE 3 +#else + #ifdef __GNUC__ + #define TTMATH_USE_KARATSUBA_MULTIPLICATION_FROM_SIZE 3 + #else + #define TTMATH_USE_KARATSUBA_MULTIPLICATION_FROM_SIZE 5 + #endif +#endif + + +/*! + this is a special value used when calculating the Gamma(x) function + if x is greater than this value then the Gamma(x) will be calculated using + some kind of series + + don't use smaller values than about 100 +*/ +#define TTMATH_GAMMA_BOUNDARY 2000 + + + + + +namespace ttmath +{ + + /*! + lib type codes: + asm_vc_32 - with asm code designed for Microsoft Visual C++ (32 bits) + asm_gcc_32 - with asm code designed for GCC (32 bits) + asm_vc_64 - with asm for VC (64 bit) + asm_gcc_64 - with asm for GCC (64 bit) + no_asm_32 - pure C++ version (32 bit) - without any asm code + no_asm_64 - pure C++ version (64 bit) - without any asm code + */ + enum LibTypeCode + { + asm_vc_32 = 0, + asm_gcc_32, + asm_vc_64, + asm_gcc_64, + no_asm_32, + no_asm_64 + }; + + + /*! + error codes + */ + enum ErrorCode + { + err_ok = 0, + err_nothing_has_read, + err_unknown_character, + err_unexpected_final_bracket, + err_stack_not_clear, + err_unknown_variable, + err_division_by_zero, + err_interrupt, + err_overflow, + err_unknown_function, + err_unknown_operator, + err_unexpected_semicolon_operator, + err_improper_amount_of_arguments, + err_improper_argument, + err_unexpected_end, + err_internal_error, + err_incorrect_name, + err_incorrect_value, + err_variable_exists, + err_variable_loop, + err_functions_loop, + err_must_be_only_one_value, + err_object_exists, + err_unknown_object, + err_still_calculating, + err_in_short_form_used_function, + err_percent_from + }; + + + /*! + this struct is used when converting to/from a string + /temporarily only in Big::ToString() and Big::FromString()/ + */ + struct Conv + { + /*! + base (radix) on which the value will be shown (or read) + default: 10 + */ + uint base; + + + /*! + used only in Big::ToString() + if true the value will be always shown in the scientific mode, e.g: 123e+30 + default: false + */ + bool scient; + + + /*! + used only in Big::ToString() + if scient is false then the value will be printed in the scientific mode + only if the exponent is greater than scien_from + default: 15 + */ + sint scient_from; + + + /*! + if 'base_round' is true and 'base' is different from 2, 4, 8, or 16 + and the result value is not an integer then we make an additional rounding + (after converting the last digit from the result is skipped) + default: true + + e.g. + Conv c; + c.base_round = false; + Big<1, 1> a = "0.1"; // decimal input + std::cout << a.ToString(c) << std::endl; // the result is: 0.099999999 + */ + bool base_round; + + + /*! + used only in Big::ToString() + tells how many digits after comma are possible + default: -1 which means all digits are printed + + set it to zero if you want integer value only + + for example when the value is: + 12.345678 and 'round' is 4 + then the result will be + 12.3457 (the last digit was rounded) + */ + sint round; + + + /*! + if true that not mattered digits in the mantissa will be cut off + (zero characters at the end -- after the comma operator) + e.g. 1234,78000 will be: 1234,78 + default: true + */ + bool trim_zeroes; + + + /*! + the main comma operator (used when reading and writing) + default is a dot '.' + */ + uint comma; + + + /*! + additional comma operator (used only when reading) + if you don't want it just set it to zero + default is a comma ',' + + this allowes you to convert from a value: + 123.45 as well as from 123,45 + */ + uint comma2; + + + /*! + it sets the character which is used for grouping + if group=' ' then: 1234,56789 will be printed as: 1 234,567 89 + + if you don't want grouping just set it to zero (which is default) + */ + uint group; + + + /*! + how many digits should be grouped (it is used if 'group' is non zero) + default: 3 + */ + uint group_digits; + + + /*! + */ + uint group_exp; // not implemented yet + + + + + Conv() + { + // default values + base = 10; + scient = false; + scient_from = 15; + base_round = true; + round = -1; + trim_zeroes = true; + comma = '.'; + comma2 = ','; + group = 0; + group_digits = 3; + group_exp = 0; + } + }; + + + + /*! + this simple class can be used in multithreading model + (you can write your own class derived from this one) + + for example: in some functions like Factorial() + /at the moment only Factorial/ you can give a pointer to + the 'stop object', if the method WasStopSignal() of this + object returns true that means we should break the calculating + and return + */ + class StopCalculating + { + public: + virtual bool WasStopSignal() const volatile { return false; } + virtual ~StopCalculating(){} + }; + + + /*! + a small class which is useful when compiling with gcc + + object of this type holds the name and the line of a file + in which the macro TTMATH_ASSERT or TTMATH_REFERENCE_ASSERT was used + */ + class ExceptionInfo + { + const char * file; + int line; + + public: + ExceptionInfo() : file(0), line(0) {} + ExceptionInfo(const char * f, int l) : file(f), line(l) {} + + std::string Where() const + { + if( !file ) + return "unknown"; + + std::ostringstream result; + result << file << ":" << line; + + return result.str(); + } + }; + + + /*! + A small class used for reporting 'reference' errors + + In the library is used macro TTMATH_REFERENCE_ASSERT which + can throw an exception of this type + + ** from version 0.9.2 this macro is removed from all methods + in public interface so you don't have to worry about it ** + + If you compile with gcc you can get a small benefit + from using method Where() (it returns std::string) with + the name and the line of a file where the macro TTMATH_REFERENCE_ASSERT + was used) + */ + class ReferenceError : public std::logic_error, public ExceptionInfo + { + public: + + ReferenceError() : std::logic_error("reference error") + { + } + + ReferenceError(const char * f, int l) : + std::logic_error("reference error"), ExceptionInfo(f,l) + { + } + + std::string Where() const + { + return ExceptionInfo::Where(); + } + }; + + + /*! + a small class used for reporting errors + + in the library is used macro TTMATH_ASSERT which + (if the condition in it is false) throw an exception + of this type + + if you compile with gcc you can get a small benefit + from using method Where() (it returns std::string) with + the name and the line of a file where the macro TTMATH_ASSERT + was used) + */ + class RuntimeError : public std::runtime_error, public ExceptionInfo + { + public: + + RuntimeError() : std::runtime_error("internal error") + { + } + + RuntimeError(const char * f, int l) : + std::runtime_error("internal error"), ExceptionInfo(f,l) + { + } + + std::string Where() const + { + return ExceptionInfo::Where(); + } + }; + + + + /*! + TTMATH_DEBUG + this macro enables further testing during writing your code + you don't have to define it in a release mode + + if this macro is set then macros TTMATH_ASSERT and TTMATH_REFERENCE_ASSERT + are set as well and these macros can throw an exception if a condition in it + is not fulfilled (look at the definition of TTMATH_ASSERT and TTMATH_REFERENCE_ASSERT) + + TTMATH_DEBUG is set automatically if DEBUG or _DEBUG are defined + */ + #if defined DEBUG || defined _DEBUG + #define TTMATH_DEBUG + #endif + + + #ifdef TTMATH_DEBUG + + #if defined(__FILE__) && defined(__LINE__) + + #define TTMATH_REFERENCE_ASSERT(expression) \ + if( &(expression) == this ) throw ttmath::ReferenceError(__FILE__, __LINE__); + + #define TTMATH_ASSERT(expression) \ + if( !(expression) ) throw ttmath::RuntimeError(__FILE__, __LINE__); + + #else + + #define TTMATH_REFERENCE_ASSERT(expression) \ + if( &(expression) == this ) throw ReferenceError(); + + #define TTMATH_ASSERT(expression) \ + if( !(expression) ) throw RuntimeError(); + #endif + + #else + #define TTMATH_REFERENCE_ASSERT(expression) + #define TTMATH_ASSERT(expression) + #endif + + + + #ifdef TTMATH_DEBUG_LOG + #define TTMATH_LOG(msg) PrintLog(msg, std::cout); + #define TTMATH_LOGC(msg, carry) PrintLog(msg, carry, std::cout); + #define TTMATH_VECTOR_LOG(msg, vector, len) PrintVectorLog(msg, std::cout, vector, len); + #define TTMATH_VECTOR_LOGC(msg, carry, vector, len) PrintVectorLog(msg, carry, std::cout, vector, len); + #else + #define TTMATH_LOG(msg) + #define TTMATH_LOGC(msg, carry) + #define TTMATH_VECTOR_LOG(msg, vector, len) + #define TTMATH_VECTOR_LOGC(msg, carry, vector, len) + #endif + + + + +} // namespace + + +#endif + diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathuint.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathuint.h new file mode 100644 index 00000000..63dc6394 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathuint.h @@ -0,0 +1,4165 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2011, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + + + +#ifndef headerfilettmathuint +#define headerfilettmathuint + + +/*! + \file ttmathuint.h + \brief template class UInt +*/ + +#include +#include + + +#include "ttmathtypes.h" +#include "ttmathmisc.h" + + + +/*! + \brief a namespace for the TTMath library +*/ +namespace ttmath +{ + +/*! + \brief UInt implements a big integer value without a sign + + value_size - how many bytes specify our value + on 32bit platforms: value_size=1 -> 4 bytes -> 32 bits + on 64bit platforms: value_size=1 -> 8 bytes -> 64 bits + value_size = 1,2,3,4,5,6.... +*/ +template +class UInt +{ +public: + + /*! + buffer for the integer value + table[0] - the lowest word of the value + */ + uint table[value_size]; + + + + /*! + some methods used for debugging purposes + */ + + + /*! + this method is only for debugging purposes or when we want to make + a table of a variable (constant) in ttmathbig.h + + it prints the table in a nice form of several columns + */ + template + void PrintTable(ostream_type & output) const + { + // how many columns there'll be + const int columns = 8; + + int c = 1; + for(int i=value_size-1 ; i>=0 ; --i) + { + output << "0x" << std::setfill('0'); + + #ifdef TTMATH_PLATFORM32 + output << std::setw(8); + #else + output << std::setw(16); + #endif + + output << std::hex << table[i]; + + if( i>0 ) + { + output << ", "; + + if( ++c > columns ) + { + output << std::endl; + c = 1; + } + } + } + + output << std::dec << std::endl; + } + + + /*! + this method is used when macro TTMATH_DEBUG_LOG is defined + */ + template + static void PrintVectorLog(const char_type * msg, ostream_type & output, const uint * vector, uint vector_len) + { + output << msg << std::endl; + + for(uint i=0 ; i + static void PrintVectorLog(const char_type * msg, uint carry, ostream_type & output, const uint * vector, uint vector_len) + { + PrintVectorLog(msg, output, vector, vector_len); + output << " carry: " << carry << std::endl; + } + + + /*! + this method is used when macro TTMATH_DEBUG_LOG is defined + */ + template + void PrintLog(const char_type * msg, ostream_type & output) const + { + PrintVectorLog(msg, output, table, value_size); + } + + + /*! + this method is used when macro TTMATH_DEBUG_LOG is defined + */ + template + void PrintLog(const char_type * msg, uint carry, ostream_type & output) const + { + PrintVectorLog(msg, output, table, value_size); + output << " carry: " << carry << std::endl; + } + + + /*! + this method returns the size of the table + */ + uint Size() const + { + return value_size; + } + + + /*! + this method sets zero + */ + void SetZero() + { + // in the future here can be 'memset' + + for(uint i=0 ; i & ss2) + { + for(uint i=0 ; i=0 && temp_table_index=0 ; --i) + table[i] = 0; + + + TTMATH_LOG("UInt::SetFromTable") + } + +#endif + + +#ifdef TTMATH_PLATFORM64 + /*! + this method copies the value stored in an another table + (warning: first values in temp_table are the highest words -- it's different + from our table) + + ***this method is created only on a 64bit platform*** + + we copy as many words as it is possible + + if temp_table_len is bigger than value_size we'll try to round + the lowest word from table depending on the last not used bit in temp_table + (this rounding isn't a perfect rounding -- look at the description below) + + and if temp_table_len is smaller than value_size we'll clear the rest words + in the table + + warning: we're using 'temp_table' as a pointer at 32bit words + */ + void SetFromTable(const unsigned int * temp_table, uint temp_table_len) + { + uint temp_table_index = 0; + sint i; // 'i' with a sign + + for(i=value_size-1 ; i>=0 && temp_table_index= 0 ; --i) + table[i] = 0; + + TTMATH_LOG("UInt::SetFromTable") + } + +#endif + + + + + + /*! + * + * basic mathematic functions + * + */ + + + + + /*! + this method adds one to the existing value + */ + uint AddOne() + { + return AddInt(1); + } + + + /*! + this method subtracts one from the existing value + */ + uint SubOne() + { + return SubInt(1); + } + + +private: + + + /*! + an auxiliary method for moving bits into the left hand side + + this method moves only words + */ + void RclMoveAllWords(uint & rest_bits, uint & last_c, uint bits, uint c) + { + rest_bits = bits % TTMATH_BITS_PER_UINT; + uint all_words = bits / TTMATH_BITS_PER_UINT; + uint mask = ( c ) ? TTMATH_UINT_MAX_VALUE : 0; + + + if( all_words >= value_size ) + { + if( all_words == value_size && rest_bits == 0 ) + last_c = table[0] & 1; + // else: last_c is default set to 0 + + // clearing + for(uint i = 0 ; i 0 ) + { + // 0 < all_words < value_size + + sint first, second; + last_c = table[value_size - all_words] & 1; // all_words is greater than 0 + + // copying the first part of the value + for(first = value_size-1, second=first-all_words ; second>=0 ; --first, --second) + table[first] = table[second]; + + // setting the rest to 'c' + for( ; first>=0 ; --first ) + table[first] = mask; + } + + TTMATH_LOG("UInt::RclMoveAllWords") + } + +public: + + /*! + moving all bits into the left side 'bits' times + return value <- this <- C + + bits is from a range of <0, man * TTMATH_BITS_PER_UINT> + or it can be even bigger then all bits will be set to 'c' + + the value c will be set into the lowest bits + and the method returns state of the last moved bit + */ + uint Rcl(uint bits, uint c=0) + { + uint last_c = 0; + uint rest_bits = bits; + + if( bits == 0 ) + return 0; + + if( bits >= TTMATH_BITS_PER_UINT ) + RclMoveAllWords(rest_bits, last_c, bits, c); + + if( rest_bits == 0 ) + { + TTMATH_LOG("UInt::Rcl") + return last_c; + } + + // rest_bits is from 1 to TTMATH_BITS_PER_UINT-1 now + if( rest_bits == 1 ) + { + last_c = Rcl2_one(c); + } + else if( rest_bits == 2 ) + { + // performance tests showed that for rest_bits==2 it's better to use Rcl2_one twice instead of Rcl2(2,c) + Rcl2_one(c); + last_c = Rcl2_one(c); + } + else + { + last_c = Rcl2(rest_bits, c); + } + + TTMATH_LOGC("UInt::Rcl", last_c) + + return last_c; + } + +private: + + /*! + an auxiliary method for moving bits into the right hand side + + this method moves only words + */ + void RcrMoveAllWords(uint & rest_bits, uint & last_c, uint bits, uint c) + { + rest_bits = bits % TTMATH_BITS_PER_UINT; + uint all_words = bits / TTMATH_BITS_PER_UINT; + uint mask = ( c ) ? TTMATH_UINT_MAX_VALUE : 0; + + + if( all_words >= value_size ) + { + if( all_words == value_size && rest_bits == 0 ) + last_c = (table[value_size-1] & TTMATH_UINT_HIGHEST_BIT) ? 1 : 0; + // else: last_c is default set to 0 + + // clearing + for(uint i = 0 ; i 0 ) + { + // 0 < all_words < value_size + + uint first, second; + last_c = (table[all_words - 1] & TTMATH_UINT_HIGHEST_BIT) ? 1 : 0; // all_words is > 0 + + // copying the first part of the value + for(first=0, second=all_words ; second this -> return value + + bits is from a range of <0, man * TTMATH_BITS_PER_UINT> + or it can be even bigger then all bits will be set to 'c' + + the value c will be set into the highest bits + and the method returns state of the last moved bit + */ + uint Rcr(uint bits, uint c=0) + { + uint last_c = 0; + uint rest_bits = bits; + + if( bits == 0 ) + return 0; + + if( bits >= TTMATH_BITS_PER_UINT ) + RcrMoveAllWords(rest_bits, last_c, bits, c); + + if( rest_bits == 0 ) + { + TTMATH_LOG("UInt::Rcr") + return last_c; + } + + // rest_bits is from 1 to TTMATH_BITS_PER_UINT-1 now + if( rest_bits == 1 ) + { + last_c = Rcr2_one(c); + } + else if( rest_bits == 2 ) + { + // performance tests showed that for rest_bits==2 it's better to use Rcr2_one twice instead of Rcr2(2,c) + Rcr2_one(c); + last_c = Rcr2_one(c); + } + else + { + last_c = Rcr2(rest_bits, c); + } + + TTMATH_LOGC("UInt::Rcr", last_c) + + return last_c; + } + + + /*! + this method moves all bits into the left side + (it returns value how many bits have been moved) + */ + uint CompensationToLeft() + { + uint moving = 0; + + // a - index a last word which is different from zero + sint a; + for(a=value_size-1 ; a>=0 && table[a]==0 ; --a); + + if( a < 0 ) + return moving; // all words in table have zero + + if( a != value_size-1 ) + { + moving += ( value_size-1 - a ) * TTMATH_BITS_PER_UINT; + + // moving all words + sint i; + for(i=value_size-1 ; a>=0 ; --i, --a) + table[i] = table[a]; + + // setting the rest word to zero + for(; i>=0 ; --i) + table[i] = 0; + } + + uint moving2 = FindLeadingBitInWord( table[value_size-1] ); + // moving2 is different from -1 because the value table[value_size-1] + // is not zero + + moving2 = TTMATH_BITS_PER_UINT - moving2 - 1; + Rcl(moving2); + + TTMATH_LOG("UInt::CompensationToLeft") + + return moving + moving2; + } + + + /*! + this method looks for the highest set bit + + result: + if 'this' is not zero: + return value - true + 'table_id' - the index of a word <0..value_size-1> + 'index' - the index of this set bit in the word <0..TTMATH_BITS_PER_UINT) + + if 'this' is zero: + return value - false + both 'table_id' and 'index' are zero + */ + bool FindLeadingBit(uint & table_id, uint & index) const + { + for(table_id=value_size-1 ; table_id!=0 && table[table_id]==0 ; --table_id); + + if( table_id==0 && table[table_id]==0 ) + { + // is zero + index = 0; + + return false; + } + + // table[table_id] is different from 0 + index = FindLeadingBitInWord( table[table_id] ); + + return true; + } + + + /*! + this method looks for the smallest set bit + + result: + if 'this' is not zero: + return value - true + 'table_id' - the index of a word <0..value_size-1> + 'index' - the index of this set bit in the word <0..TTMATH_BITS_PER_UINT) + + if 'this' is zero: + return value - false + both 'table_id' and 'index' are zero + */ + bool FindLowestBit(uint & table_id, uint & index) const + { + for(table_id=0 ; table_id= value_size ) + { + // is zero + index = 0; + table_id = 0; + + return false; + } + + // table[table_id] is different from 0 + index = FindLowestBitInWord( table[table_id] ); + + return true; + } + + + /*! + getting the 'bit_index' bit + + bit_index bigger or equal zero + */ + uint GetBit(uint bit_index) const + { + TTMATH_ASSERT( bit_index < value_size * TTMATH_BITS_PER_UINT ) + + uint index = bit_index / TTMATH_BITS_PER_UINT; + uint bit = bit_index % TTMATH_BITS_PER_UINT; + + uint temp = table[index]; + uint res = SetBitInWord(temp, bit); + + return res; + } + + + /*! + setting the 'bit_index' bit + and returning the last state of the bit + + bit_index bigger or equal zero + */ + uint SetBit(uint bit_index) + { + TTMATH_ASSERT( bit_index < value_size * TTMATH_BITS_PER_UINT ) + + uint index = bit_index / TTMATH_BITS_PER_UINT; + uint bit = bit_index % TTMATH_BITS_PER_UINT; + uint res = SetBitInWord(table[index], bit); + + TTMATH_LOG("UInt::SetBit") + + return res; + } + + + /*! + this method performs a bitwise operation AND + */ + void BitAnd(const UInt & ss2) + { + for(uint x=0 ; x & ss2) + { + for(uint x=0 ; x & ss2) + { + for(uint x=0 ; x + + for example: + BitNot2(8) = BitNot2( 1000(bin) ) = 111(bin) = 7 + */ + void BitNot2() + { + uint table_id, index; + + if( FindLeadingBit(table_id, index) ) + { + for(uint x=0 ; x>= shift; + + table[table_id] ^= mask; + } + else + table[0] = 1; + + + TTMATH_LOG("UInt::BitNot2") + } + + + + /*! + * + * Multiplication + * + * + */ + +public: + + /*! + multiplication: this = this * ss2 + + it can return a carry + */ + uint MulInt(uint ss2) + { + uint r1, r2, x1; + uint c = 0; + + UInt u(*this); + SetZero(); + + if( ss2 == 0 ) + { + TTMATH_LOGC("UInt::MulInt(uint)", 0) + return 0; + } + + for(x1=0 ; x1 + void MulInt(uint ss2, UInt & result) const + { + TTMATH_ASSERT( result_size > value_size ) + + uint r2,r1; + uint x1size=value_size; + uint x1start=0; + + result.SetZero(); + + if( ss2 == 0 ) + { + TTMATH_VECTOR_LOG("UInt::MulInt(uint, UInt<>)", result.table, result_size) + return; + } + + if( value_size > 2 ) + { + // if the value_size is smaller than or equal to 2 + // there is no sense to set x1size and x1start to another values + + for(x1size=value_size ; x1size>0 && table[x1size-1]==0 ; --x1size); + + if( x1size == 0 ) + { + TTMATH_VECTOR_LOG("UInt::MulInt(uint, UInt<>)", result.table, result_size) + return; + } + + for(x1start=0 ; x1start)", result.table, result_size) + + return; + } + + + + /*! + the multiplication 'this' = 'this' * ss2 + + algorithm: 100 - means automatically choose the fastest algorithm + */ + uint Mul(const UInt & ss2, uint algorithm = 100) + { + switch( algorithm ) + { + case 1: + return Mul1(ss2); + + case 2: + return Mul2(ss2); + + case 3: + return Mul3(ss2); + + case 100: + default: + return MulFastest(ss2); + } + } + + + /*! + the multiplication 'result' = 'this' * ss2 + + since the 'result' is twice bigger than 'this' and 'ss2' + this method never returns a carry + + algorithm: 100 - means automatically choose the fastest algorithm + */ + void MulBig(const UInt & ss2, + UInt & result, + uint algorithm = 100) + { + switch( algorithm ) + { + case 1: + return Mul1Big(ss2, result); + + case 2: + return Mul2Big(ss2, result); + + case 3: + return Mul3Big(ss2, result); + + case 100: + default: + return MulFastestBig(ss2, result); + } + } + + + + /*! + the first version of the multiplication algorithm + */ + +private: + + /*! + multiplication: this = this * ss2 + + it returns carry if it has been + */ + uint Mul1Ref(const UInt & ss2) + { + TTMATH_REFERENCE_ASSERT( ss2 ) + + UInt ss1( *this ); + SetZero(); + + for(uint i=0; i < value_size*TTMATH_BITS_PER_UINT ; ++i) + { + if( Add(*this) ) + { + TTMATH_LOGC("UInt::Mul1", 1) + return 1; + } + + if( ss1.Rcl(1) ) + if( Add(ss2) ) + { + TTMATH_LOGC("UInt::Mul1", 1) + return 1; + } + } + + TTMATH_LOGC("UInt::Mul1", 0) + + return 0; + } + + +public: + + /*! + multiplication: this = this * ss2 + can return carry + */ + uint Mul1(const UInt & ss2) + { + if( this == &ss2 ) + { + UInt copy_ss2(ss2); + return Mul1Ref(copy_ss2); + } + else + { + return Mul1Ref(ss2); + } + } + + + /*! + multiplication: result = this * ss2 + + result is twice bigger than 'this' and 'ss2' + this method never returns carry + */ + void Mul1Big(const UInt & ss2_, UInt & result) + { + UInt ss2; + uint i; + + // copying *this into result and ss2_ into ss2 + for(i=0 ; i & ss2) + { + UInt result; + uint i, c = 0; + + Mul2Big(ss2, result); + + // copying result + for(i=0 ; i & ss2, UInt & result) + { + Mul2Big2(table, ss2.table, result); + + TTMATH_LOG("UInt::Mul2Big") + } + + +private: + + /*! + an auxiliary method for calculating the multiplication + + arguments we're taking as pointers (this is to improve the Mul3Big2()- avoiding + unnecessary copying objects), the result should be taken as a pointer too, + but at the moment there is no method AddTwoInts() which can operate on pointers + */ + template + void Mul2Big2(const uint * ss1, const uint * ss2, UInt & result) + { + uint x1size = ss_size, x2size = ss_size; + uint x1start = 0, x2start = 0; + + if( ss_size > 2 ) + { + // if the ss_size is smaller than or equal to 2 + // there is no sense to set x1size (and others) to another values + + for(x1size=ss_size ; x1size>0 && ss1[x1size-1]==0 ; --x1size); + for(x2size=ss_size ; x2size>0 && ss2[x2size-1]==0 ; --x2size); + + for(x1start=0 ; x1start(ss1, ss2, result, x1start, x1size, x2start, x2size); + } + + + + /*! + an auxiliary method for calculating the multiplication + */ + template + void Mul2Big3(const uint * ss1, const uint * ss2, UInt & result, uint x1start, uint x1size, uint x2start, uint x2size) + { + uint r2, r1; + + result.SetZero(); + + if( x1size==0 || x2size==0 ) + return; + + for(uint x1=x1start ; x1 & ss2) + { + UInt result; + uint i, c = 0; + + Mul3Big(ss2, result); + + // copying result + for(i=0 ; i & ss2, UInt & result) + { + Mul3Big2(table, ss2.table, result.table); + + TTMATH_LOG("UInt::Mul3Big") + } + + + +private: + + /*! + an auxiliary method for calculating the Karatsuba multiplication + + result_size is equal ss_size*2 + */ + template + void Mul3Big2(const uint * ss1, const uint * ss2, uint * result) + { + const uint * x1, * x0, * y1, * y0; + + + if( ss_size>1 && ss_size res; + Mul2Big2(ss1, ss2, res); + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wtautological-compare" +#endif + + for(uint i=0 ; i(x1, x0, y1, y0, result); + } + else + { + // ss_size is even + x0 = ss1; + y0 = ss2; + x1 = ss1 + ss_size / 2; + y1 = ss2 + ss_size / 2; + + // all four vectors (x0 x1 y0 y1) are equal in size + Mul3Big3(x1, x0, y1, y0, result); + } + } + + + +#ifdef _MSC_VER +#pragma warning (disable : 4717) +//warning C4717: recursive on all control paths, function will cause runtime stack overflow +//we have the stop point in Mul3Big2() method +#endif + + + /*! + an auxiliary method for calculating the Karatsuba multiplication + + x = x1*B^m + x0 + y = y1*B^m + y0 + + first_size - is the size of vectors: x0 and y0 + second_size - is the size of vectors: x1 and y1 (can be either equal first_size or smaller about one from first_size) + + x*y = (x1*B^m + x0)(y1*B^m + y0) = z2*B^(2m) + z1*B^m + z0 + where + z0 = x0*y0 + z2 = x1*y1 + z1 = (x1 + x0)*(y1 + y0) - z2 - z0 + */ + template + void Mul3Big3(const uint * x1, const uint * x0, const uint * y1, const uint * y0, uint * result) + { + uint i, c, xc, yc; + + UInt temp, temp2; + UInt z1; + + // z0 and z2 we store directly in the result (we don't use any temporary variables) + Mul3Big2(x0, y0, result); // z0 + Mul3Big2(x1, y1, result+first_size*2); // z2 + + // now we calculate z1 + // temp = (x0 + x1) + // temp2 = (y0 + y1) + // we're using temp and temp2 with UInt, although there can be a carry but + // we simple remember it in xc and yc (xc and yc can be either 0 or 1), + // and (x0 + x1)*(y0 + y1) we calculate in this way (schoolbook algorithm): + // + // xc | temp + // yc | temp2 + // -------------------- + // (temp * temp2) + // xc*temp2 | + // yc*temp | + // xc*yc | + // ---------- z1 -------- + // + // and the result is never larger in size than 3*first_size + + xc = AddVector(x0, x1, first_size, second_size, temp.table); + yc = AddVector(y0, y1, first_size, second_size, temp2.table); + + Mul3Big2(temp.table, temp2.table, z1.table); + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wtautological-compare" +#endif + + // clearing the rest of z1 + for(i=first_size*2 ; i second_size ) + { + uint z1_size = result_size - first_size; + TTMATH_ASSERT( z1_size <= first_size*3 ) + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wtautological-compare" +#endif + + for(i=z1_size ; i & ss2) + { + UInt result; + uint i, c = 0; + + MulFastestBig(ss2, result); + + // copying result + for(i=0 ; i & ss2, UInt & result) + { + if( value_size < TTMATH_USE_KARATSUBA_MULTIPLICATION_FROM_SIZE ) + return Mul2Big(ss2, result); + + uint x1size = value_size, x2size = value_size; + uint x1start = 0, x2start = 0; + + for(x1size=value_size ; x1size>0 && table[x1size-1]==0 ; --x1size); + for(x2size=value_size ; x2size>0 && ss2.table[x2size-1]==0 ; --x2size); + + if( x1size==0 || x2size==0 ) + { + // either 'this' or 'ss2' is equal zero - the result is zero too + result.SetZero(); + return; + } + + for(x1start=0 ; x1start(table, ss2.table, result, x1start, x1size, x2start, x2size); + + + // Karatsuba multiplication + Mul3Big(ss2, result); + + TTMATH_LOG("UInt::MulFastestBig") + } + + + /*! + * + * Division + * + * + */ + +public: + + + /*! + division by one unsigned word + + returns 1 when divisor is zero + */ + uint DivInt(uint divisor, uint * remainder = 0) + { + if( divisor == 0 ) + { + if( remainder ) + *remainder = 0; // this is for convenience, without it the compiler can report that 'remainder' is uninitialized + + TTMATH_LOG("UInt::DivInt") + + return 1; + } + + if( divisor == 1 ) + { + if( remainder ) + *remainder = 0; + + TTMATH_LOG("UInt::DivInt") + + return 0; + } + + UInt dividend(*this); + SetZero(); + + sint i; // i must be with a sign + uint r = 0; + + // we're looking for the last word in ss1 + for(i=value_size-1 ; i>0 && dividend.table[i]==0 ; --i); + + for( ; i>=0 ; --i) + DivTwoWords(r, dividend.table[i], divisor, &table[i], &r); + + if( remainder ) + *remainder = r; + + TTMATH_LOG("UInt::DivInt") + + return 0; + } + + uint DivInt(uint divisor, uint & remainder) + { + return DivInt(divisor, &remainder); + } + + + + /*! + division this = this / ss2 + + return values: + 0 - ok + 1 - division by zero + 'this' will be the quotient + 'remainder' - remainder + */ + uint Div( const UInt & divisor, + UInt * remainder = 0, + uint algorithm = 3) + { + switch( algorithm ) + { + case 1: + return Div1(divisor, remainder); + + case 2: + return Div2(divisor, remainder); + + case 3: + default: + return Div3(divisor, remainder); + } + } + + uint Div(const UInt & divisor, UInt & remainder, uint algorithm = 3) + { + return Div(divisor, &remainder, algorithm); + } + + + +private: + + /*! + return values: + 0 - none has to be done + 1 - division by zero + 2 - division should be made + */ + uint Div_StandardTest( const UInt & v, + uint & m, uint & n, + UInt * remainder = 0) + { + switch( Div_CalculatingSize(v, m, n) ) + { + case 4: // 'this' is equal v + if( remainder ) + remainder->SetZero(); + + SetOne(); + TTMATH_LOG("UInt::Div_StandardTest") + return 0; + + case 3: // 'this' is smaller than v + if( remainder ) + *remainder = *this; + + SetZero(); + TTMATH_LOG("UInt::Div_StandardTest") + return 0; + + case 2: // 'this' is zero + if( remainder ) + remainder->SetZero(); + + SetZero(); + TTMATH_LOG("UInt::Div_StandardTest") + return 0; + + case 1: // v is zero + TTMATH_LOG("UInt::Div_StandardTest") + return 1; + } + + TTMATH_LOG("UInt::Div_StandardTest") + + return 2; + } + + + + /*! + return values: + 0 - ok + 'm' - is the index (from 0) of last non-zero word in table ('this') + 'n' - is the index (from 0) of last non-zero word in v.table + 1 - v is zero + 2 - 'this' is zero + 3 - 'this' is smaller than v + 4 - 'this' is equal v + + if the return value is different than zero the 'm' and 'n' are undefined + */ + uint Div_CalculatingSize(const UInt & v, uint & m, uint & n) + { + m = n = value_size-1; + + for( ; n!=0 && v.table[n]==0 ; --n); + + if( n==0 && v.table[n]==0 ) + return 1; + + for( ; m!=0 && table[m]==0 ; --m); + + if( m==0 && table[m]==0 ) + return 2; + + if( m < n ) + return 3; + else + if( m == n ) + { + uint i; + for(i = n ; i!=0 && table[i]==v.table[i] ; --i); + + if( table[i] < v.table[i] ) + return 3; + else + if (table[i] == v.table[i] ) + return 4; + } + + return 0; + } + + +public: + + /*! + the first division algorithm + radix 2 + */ + uint Div1(const UInt & divisor, UInt * remainder = 0) + { + uint m,n, test; + + test = Div_StandardTest(divisor, m, n, remainder); + if( test < 2 ) + return test; + + if( !remainder ) + { + UInt rem; + + return Div1_Calculate(divisor, rem); + } + + return Div1_Calculate(divisor, *remainder); + } + + + /*! + the first division algorithm + radix 2 + */ + uint Div1(const UInt & divisor, UInt & remainder) + { + return Div1(divisor, &remainder); + } + + +private: + + uint Div1_Calculate(const UInt & divisor, UInt & rest) + { + if( this == &divisor ) + { + UInt divisor_copy(divisor); + return Div1_CalculateRef(divisor_copy, rest); + } + else + { + return Div1_CalculateRef(divisor, rest); + } + } + + + uint Div1_CalculateRef(const UInt & divisor, UInt & rest) + { + TTMATH_REFERENCE_ASSERT( divisor ) + + sint loop; + sint c; + + rest.SetZero(); + loop = value_size * TTMATH_BITS_PER_UINT; + c = 0; + + + div_a: + c = Rcl(1, c); + c = rest.Add(rest,c); + c = rest.Sub(divisor,c); + + c = !c; + + if(!c) + goto div_d; + + + div_b: + --loop; + if(loop) + goto div_a; + + c = Rcl(1, c); + TTMATH_LOG("UInt::Div1_Calculate") + return 0; + + + div_c: + c = Rcl(1, c); + c = rest.Add(rest,c); + c = rest.Add(divisor); + + if(c) + goto div_b; + + + div_d: + --loop; + if(loop) + goto div_c; + + c = Rcl(1, c); + c = rest.Add(divisor); + + TTMATH_LOG("UInt::Div1_Calculate") + + return 0; + } + + +public: + + /*! + the second division algorithm + + return values: + 0 - ok + 1 - division by zero + */ + uint Div2(const UInt & divisor, UInt * remainder = 0) + { + if( this == &divisor ) + { + UInt divisor_copy(divisor); + return Div2Ref(divisor_copy, remainder); + } + else + { + return Div2Ref(divisor, remainder); + } + } + + + /*! + the second division algorithm + + return values: + 0 - ok + 1 - division by zero + */ + uint Div2(const UInt & divisor, UInt & remainder) + { + return Div2(divisor, &remainder); + } + + +private: + + /*! + the second division algorithm + + return values: + 0 - ok + 1 - division by zero + */ + uint Div2Ref(const UInt & divisor, UInt * remainder = 0) + { + uint bits_diff; + uint status = Div2_Calculate(divisor, remainder, bits_diff); + if( status < 2 ) + return status; + + if( CmpBiggerEqual(divisor) ) + { + Div2(divisor, remainder); + SetBit(bits_diff); + } + else + { + if( remainder ) + *remainder = *this; + + SetZero(); + SetBit(bits_diff); + } + + TTMATH_LOG("UInt::Div2") + + return 0; + } + + + /*! + return values: + 0 - we've calculated the division + 1 - division by zero + 2 - we have to still calculate + + */ + uint Div2_Calculate(const UInt & divisor, UInt * remainder, + uint & bits_diff) + { + uint table_id, index; + uint divisor_table_id, divisor_index; + + uint status = Div2_FindLeadingBitsAndCheck( divisor, remainder, + table_id, index, + divisor_table_id, divisor_index); + + if( status < 2 ) + { + TTMATH_LOG("UInt::Div2_Calculate") + return status; + } + + // here we know that 'this' is greater than divisor + // then 'index' is greater or equal 'divisor_index' + bits_diff = index - divisor_index; + + UInt divisor_copy(divisor); + divisor_copy.Rcl(bits_diff, 0); + + if( CmpSmaller(divisor_copy, table_id) ) + { + divisor_copy.Rcr(1); + --bits_diff; + } + + Sub(divisor_copy, 0); + + TTMATH_LOG("UInt::Div2_Calculate") + + return 2; + } + + + /*! + return values: + 0 - we've calculated the division + 1 - division by zero + 2 - we have to still calculate + */ + uint Div2_FindLeadingBitsAndCheck( const UInt & divisor, + UInt * remainder, + uint & table_id, uint & index, + uint & divisor_table_id, uint & divisor_index) + { + if( !divisor.FindLeadingBit(divisor_table_id, divisor_index) ) + { + // division by zero + TTMATH_LOG("UInt::Div2_FindLeadingBitsAndCheck") + return 1; + } + + if( !FindLeadingBit(table_id, index) ) + { + // zero is divided by something + + SetZero(); + + if( remainder ) + remainder->SetZero(); + + TTMATH_LOG("UInt::Div2_FindLeadingBitsAndCheck") + + return 0; + } + + divisor_index += divisor_table_id * TTMATH_BITS_PER_UINT; + index += table_id * TTMATH_BITS_PER_UINT; + + if( divisor_table_id == 0 ) + { + // dividor has only one 32-bit word + + uint r; + DivInt(divisor.table[0], &r); + + if( remainder ) + { + remainder->SetZero(); + remainder->table[0] = r; + } + + TTMATH_LOG("UInt::Div2_FindLeadingBitsAndCheck") + + return 0; + } + + + if( Div2_DivisorGreaterOrEqual( divisor, remainder, + table_id, index, + divisor_index) ) + { + TTMATH_LOG("UInt::Div2_FindLeadingBitsAndCheck") + return 0; + } + + + TTMATH_LOG("UInt::Div2_FindLeadingBitsAndCheck") + + return 2; + } + + + /*! + return values: + true if divisor is equal or greater than 'this' + */ + bool Div2_DivisorGreaterOrEqual( const UInt & divisor, + UInt * remainder, + uint table_id, uint index, + uint divisor_index ) + { + if( divisor_index > index ) + { + // divisor is greater than this + + if( remainder ) + *remainder = *this; + + SetZero(); + + TTMATH_LOG("UInt::Div2_DivisorGreaterOrEqual") + + return true; + } + + if( divisor_index == index ) + { + // table_id == divisor_table_id as well + + uint i; + for(i = table_id ; i!=0 && table[i]==divisor.table[i] ; --i); + + if( table[i] < divisor.table[i] ) + { + // divisor is greater than 'this' + + if( remainder ) + *remainder = *this; + + SetZero(); + + TTMATH_LOG("UInt::Div2_DivisorGreaterOrEqual") + + return true; + } + else + if( table[i] == divisor.table[i] ) + { + // divisor is equal 'this' + + if( remainder ) + remainder->SetZero(); + + SetOne(); + + TTMATH_LOG("UInt::Div2_DivisorGreaterOrEqual") + + return true; + } + } + + TTMATH_LOG("UInt::Div2_DivisorGreaterOrEqual") + + return false; + } + + +public: + + /*! + the third division algorithm + */ + uint Div3(const UInt & ss2, UInt * remainder = 0) + { + if( this == &ss2 ) + { + UInt copy_ss2(ss2); + return Div3Ref(copy_ss2, remainder); + } + else + { + return Div3Ref(ss2, remainder); + } + } + + + /*! + the third division algorithm + */ + uint Div3(const UInt & ss2, UInt & remainder) + { + return Div3(ss2, &remainder); + } + + +private: + + /*! + the third division algorithm + + this algorithm is described in the following book: + "The art of computer programming 2" (4.3.1 page 272) + Donald E. Knuth + !! give the description here (from the book) + */ + uint Div3Ref(const UInt & v, UInt * remainder = 0) + { + uint m,n, test; + + test = Div_StandardTest(v, m, n, remainder); + if( test < 2 ) + return test; + + if( n == 0 ) + { + uint r; + DivInt( v.table[0], &r ); + + if( remainder ) + { + remainder->SetZero(); + remainder->table[0] = r; + } + + TTMATH_LOG("UInt::Div3") + + return 0; + } + + + // we can only use the third division algorithm when + // the divisor is greater or equal 2^32 (has more than one 32-bit word) + ++m; + ++n; + m = m - n; + Div3_Division(v, remainder, m, n); + + TTMATH_LOG("UInt::Div3") + + return 0; + } + + + +private: + + + void Div3_Division(UInt v, UInt * remainder, uint m, uint n) + { + TTMATH_ASSERT( n>=2 ) + + UInt uu, vv; + UInt q; + uint d, u_value_size, u0, u1, u2, v1, v0, j=m; + + u_value_size = Div3_Normalize(v, n, d); + + if( j+n == value_size ) + u2 = u_value_size; + else + u2 = table[j+n]; + + Div3_MakeBiggerV(v, vv); + + for(uint i = j+1 ; i & uu, uint j, uint n, uint u_max) + { + uint i; + + for(i=0 ; i so and 'i' is from <0..value_size> + // then table[i] is always correct (look at the declaration of 'uu') + uu.table[i] = u_max; + + for( ++i ; i & uu, uint j, uint n) + { + uint i; + + for(i=0 ; i & v, UInt & vv) + { + for(uint i=0 ; i & v, uint n, uint & d) + { + // v.table[n-1] is != 0 + + uint bit = (uint)FindLeadingBitInWord(v.table[n-1]); + uint move = (TTMATH_BITS_PER_UINT - bit - 1); + uint res = table[value_size-1]; + d = move; + + if( move > 0 ) + { + v.Rcl(move, 0); + Rcl(move, 0); + res = res >> (bit + 1); + } + else + { + res = 0; + } + + TTMATH_LOG("UInt::Div3_Normalize") + + return res; + } + + + void Div3_Unnormalize(UInt * remainder, uint n, uint d) + { + for(uint i=n ; i u_temp; + uint rp; + bool next_test; + + TTMATH_ASSERT( v1 != 0 ) + + u_temp.table[1] = u2; + u_temp.table[0] = u1; + u_temp.DivInt(v1, &rp); + + TTMATH_ASSERT( u_temp.table[1]==0 || u_temp.table[1]==1 ) + + do + { + bool decrease = false; + + if( u_temp.table[1] == 1 ) + decrease = true; + else + { + UInt<2> temp1, temp2; + + UInt<2>::MulTwoWords(u_temp.table[0], v0, temp1.table+1, temp1.table); + temp2.table[1] = rp; + temp2.table[0] = u0; + + if( temp1 > temp2 ) + decrease = true; + } + + next_test = false; + + if( decrease ) + { + u_temp.SubOne(); + + rp += v1; + + if( rp >= v1 ) // it means that there wasn't a carry (r & uu, + const UInt & vv, uint & qp) + { + // D4 (in the book) + + UInt vv_temp(vv); + vv_temp.MulInt(qp); + + if( uu.Sub(vv_temp) ) + { + // there was a carry + + // + // !!! this part of code was not tested + // + + --qp; + uu.Add(vv); + + // can be a carry from this additions but it should be ignored + // because it cancels with the borrow from uu.Sub(vv_temp) + } + + TTMATH_LOG("UInt::Div3_MultiplySubtract") + } + + + + + + +public: + + + /*! + power this = this ^ pow + binary algorithm (r-to-l) + + return values: + 0 - ok + 1 - carry + 2 - incorrect argument (0^0) + */ + uint Pow(UInt pow) + { + if(pow.IsZero() && IsZero()) + // we don't define zero^zero + return 2; + + UInt start(*this); + UInt result; + result.SetOne(); + uint c = 0; + + while( !c ) + { + if( pow.table[0] & 1 ) + c += result.Mul(start); + + pow.Rcr2_one(0); + if( pow.IsZero() ) + break; + + c += start.Mul(start); + } + + *this = result; + + TTMATH_LOGC("UInt::Pow(UInt<>)", c) + + return (c==0)? 0 : 1; + } + + + /*! + square root + e.g. Sqrt(9) = 3 + ('digit-by-digit' algorithm) + */ + void Sqrt() + { + UInt bit, temp; + + if( IsZero() ) + return; + + UInt value(*this); + + SetZero(); + bit.SetZero(); + bit.table[value_size-1] = (TTMATH_UINT_HIGHEST_BIT >> 1); + + while( bit > value ) + bit.Rcr(2); + + while( !bit.IsZero() ) + { + temp = *this; + temp.Add(bit); + + if( value >= temp ) + { + value.Sub(temp); + Rcr(1); + Add(bit); + } + else + { + Rcr(1); + } + + bit.Rcr(2); + } + + TTMATH_LOG("UInt::Sqrt") + } + + + + /*! + this method sets n first bits to value zero + + For example: + let n=2 then if there's a value 111 (bin) there'll be '100' (bin) + */ + void ClearFirstBits(uint n) + { + if( n >= value_size*TTMATH_BITS_PER_UINT ) + { + SetZero(); + TTMATH_LOG("UInt::ClearFirstBits") + return; + } + + uint * p = table; + + // first we're clearing the whole words + while( n >= TTMATH_BITS_PER_UINT ) + { + *p++ = 0; + n -= TTMATH_BITS_PER_UINT; + } + + if( n == 0 ) + { + TTMATH_LOG("UInt::ClearFirstBits") + return; + } + + // and then we're clearing one word which has left + // mask -- all bits are set to one + uint mask = TTMATH_UINT_MAX_VALUE; + + mask = mask << n; + + (*p) &= mask; + + TTMATH_LOG("UInt::ClearFirstBits") + } + + + /*! + this method returns true if the highest bit of the value is set + */ + bool IsTheHighestBitSet() const + { + return (table[value_size-1] & TTMATH_UINT_HIGHEST_BIT) != 0; + } + + + /*! + this method returns true if the lowest bit of the value is set + */ + bool IsTheLowestBitSet() const + { + return (*table & 1) != 0; + } + + + /*! + returning true if only the highest bit is set + */ + bool IsOnlyTheHighestBitSet() const + { +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wtautological-compare" +#endif + + for(uint i=0 ; i> (TTMATH_BITS_PER_UINT - rest); + + return (table[i] & mask) == 0; + } + + + + /*! + * + * conversion methods + * + */ + + + + /*! + this method converts an UInt type to this class + + this operation has mainly sense if the value from p is + equal or smaller than that one which is returned from UInt::SetMax() + + it returns a carry if the value 'p' is too big + */ + template + uint FromUInt(const UInt & p) + { + uint min_size = (value_size < argument_size)? value_size : argument_size; + uint i; + + for(i=0 ; i argument_size ) + { + // 'this' is longer than 'p' + + for( ; i)", 1) + return 1; + } + } + + TTMATH_LOGC("UInt::FromUInt(UInt<>)", 0) + + return 0; + } + + + /*! + this method converts an UInt type to this class + + this operation has mainly sense if the value from p is + equal or smaller than that one which is returned from UInt::SetMax() + + it returns a carry if the value 'p' is too big + */ + template + uint FromInt(const UInt & p) + { + return FromUInt(p); + } + + + /*! + this method converts the uint type to this class + */ + uint FromUInt(uint value) + { + for(uint i=1 ; i type to this class + + it doesn't return a carry + */ + template + UInt & operator=(const UInt & p) + { + FromUInt(p); + + return *this; + } + + + /*! + the assignment operator + */ + UInt & operator=(const UInt & p) + { + for(uint i=0 ; i)") + + return *this; + } + + + /*! + this method converts the uint type to this class + */ + UInt & operator=(uint i) + { + FromUInt(i); + + return *this; + } + + + /*! + a constructor for converting the uint to this class + */ + UInt(uint i) + { + FromUInt(i); + } + + + /*! + this method converts the sint type to this class + */ + UInt & operator=(sint i) + { + FromInt(i); + + return *this; + } + + + /*! + a constructor for converting the sint to this class + + look at the description of UInt::operator=(sint) + */ + UInt(sint i) + { + FromInt(i); + } + + +#ifdef TTMATH_PLATFORM32 + + + /*! + this method converts unsigned 64 bit int type to this class + ***this method is created only on a 32bit platform*** + */ + uint FromUInt(ulint n) + { + table[0] = (uint)n; + + if( value_size == 1 ) + { + uint c = ((n >> TTMATH_BITS_PER_UINT) == 0) ? 0 : 1; + + TTMATH_LOGC("UInt::FromUInt(ulint)", c) + return c; + } + + table[1] = (uint)(n >> TTMATH_BITS_PER_UINT); + + for(uint i=2 ; i & operator=(ulint n) + { + FromUInt(n); + + return *this; + } + + + /*! + a constructor for converting unsigned 64 bit int to this class + ***this constructor is created only on a 32bit platform*** + */ + UInt(ulint n) + { + FromUInt(n); + } + + + /*! + this operator converts signed 64 bit int type to this class + ***this operator is created only on a 32bit platform*** + */ + UInt & operator=(slint n) + { + FromInt(n); + + return *this; + } + + + /*! + a constructor for converting signed 64 bit int to this class + ***this constructor is created only on a 32bit platform*** + */ + UInt(slint n) + { + FromInt(n); + } + +#endif + + + +#ifdef TTMATH_PLATFORM64 + + + /*! + this method converts 32 bit unsigned int type to this class + ***this operator is created only on a 64bit platform*** + */ + uint FromUInt(unsigned int i) + { + return FromUInt(uint(i)); + } + + /*! + this method converts 32 bit unsigned int type to this class + ***this operator is created only on a 64bit platform*** + */ + uint FromInt(unsigned int i) + { + return FromUInt(uint(i)); + } + + + /*! + this method converts 32 bit signed int type to this class + ***this operator is created only on a 64bit platform*** + */ + uint FromInt(signed int i) + { + return FromInt(sint(i)); + } + + + /*! + this operator converts 32 bit unsigned int type to this class + ***this operator is created only on a 64bit platform*** + */ + UInt & operator=(unsigned int i) + { + FromUInt(i); + + return *this; + } + + + /*! + a constructor for converting 32 bit unsigned int to this class + ***this constructor is created only on a 64bit platform*** + */ + UInt(unsigned int i) + { + FromUInt(i); + } + + + /*! + an operator for converting 32 bit signed int to this class + ***this constructor is created only on a 64bit platform*** + */ + UInt & operator=(signed int i) + { + FromInt(i); + + return *this; + } + + + /*! + a constructor for converting 32 bit signed int to this class + ***this constructor is created only on a 64bit platform*** + */ + UInt(signed int i) + { + FromInt(i); + } + + +#endif + + + + + + /*! + a constructor for converting a string to this class (with the base=10) + */ + UInt(const char * s) + { + FromString(s); + } + + + /*! + a constructor for converting a string to this class (with the base=10) + */ + UInt(const std::string & s) + { + FromString( s.c_str() ); + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + a constructor for converting a string to this class (with the base=10) + */ + UInt(const wchar_t * s) + { + FromString(s); + } + + + /*! + a constructor for converting a string to this class (with the base=10) + */ + UInt(const std::wstring & s) + { + FromString( s.c_str() ); + } + +#endif + + + + + /*! + a default constructor + + we don't clear the table + */ + UInt() + { + // when macro TTMATH_DEBUG_LOG is defined + // we set special values to the table + // in order to be everywhere the same value of the UInt object + // without this it would be difficult to analyse the log file + #ifdef TTMATH_DEBUG_LOG + #ifdef TTMATH_PLATFORM32 + for(uint i=0 ; i & u) + { + for(uint i=0 ; i)") + } + + + + /*! + a template for producting constructors for copying from another types + */ + template + UInt(const UInt & u) + { + // look that 'size' we still set as 'value_size' and not as u.value_size + FromUInt(u); + } + + + + + /*! + a destructor + */ + ~UInt() + { + } + + + /*! + this method returns the lowest value from table + + we must be sure when we using this method whether the value + will hold in an uint type or not (the rest value from the table must be zero) + */ + uint ToUInt() const + { + return table[0]; + } + + + /*! + this method converts the value to uint type + can return a carry if the value is too long to store it in uint type + */ + uint ToUInt(uint & result) const + { + result = table[0]; + + for(uint i=1 ; i> 32) != 0 ) + return 1; + + for(uint i=1 ; i + */ + double ToStringLog2(uint x) const + { + static double log_tab[] = { + 1.000000000000000000, + 0.630929753571457437, + 0.500000000000000000, + 0.430676558073393050, + 0.386852807234541586, + 0.356207187108022176, + 0.333333333333333333, + 0.315464876785728718, + 0.301029995663981195, + 0.289064826317887859, + 0.278942945651129843, + 0.270238154427319741, + 0.262649535037193547, + 0.255958024809815489, + 0.250000000000000000 + }; + + if( x<2 || x>16 ) + return 0; + + return log_tab[x-2]; + } + + +public: + + + /*! + an auxiliary method for converting to a string + it's used from Int::ToString() too (negative is set true then) + */ + template + void ToStringBase(string_type & result, uint b = 10, bool negative = false) const + { + UInt temp(*this); + uint rest, table_id, index, digits; + double digits_d; + char character; + + result.clear(); + + if( b<2 || b>16 ) + return; + + if( !FindLeadingBit(table_id, index) ) + { + result = '0'; + return; + } + + if( negative ) + result = '-'; + + digits_d = static_cast(table_id); // for not making an overflow in uint type + digits_d *= TTMATH_BITS_PER_UINT; + digits_d += index + 1; + digits_d *= ToStringLog2(b); + digits = static_cast(digits_d) + 3; // plus some epsilon + + if( result.capacity() < digits ) + result.reserve(digits); + + do + { + temp.DivInt(b, &rest); + character = static_cast(Misc::DigitToChar(rest)); + result.insert(result.end(), character); + } + while( !temp.IsZero() ); + + size_t i1 = negative ? 1 : 0; // the first is a hyphen (when negative is true) + size_t i2 = result.size() - 1; + + for( ; i1 < i2 ; ++i1, --i2 ) + { + char tempc = static_cast(result[i1]); + result[i1] = result[i2]; + result[i2] = tempc; + } + } + + + + /*! + this method converts the value to a string with a base equal 'b' + */ + void ToString(std::string & result, uint b = 10) const + { + return ToStringBase(result, b); + } + + + std::string ToString(uint b = 10) const + { + std::string result; + ToStringBase(result, b); + + return result; + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + void ToString(std::wstring & result, uint b = 10) const + { + return ToStringBase(result, b); + } + + std::wstring ToWString(uint b = 10) const + { + std::wstring result; + ToStringBase(result, b); + + return result; + } + +#endif + + + +private: + + /*! + an auxiliary method for converting from a string + */ + template + uint FromStringBase(const char_type * s, uint b = 10, const char_type ** after_source = 0, bool * value_read = 0) + { + UInt base( b ); + UInt temp; + sint z; + uint c = 0; + + SetZero(); + temp.SetZero(); + Misc::SkipWhiteCharacters(s); + + if( after_source ) + *after_source = s; + + if( value_read ) + *value_read = false; + + if( b<2 || b>16 ) + return 1; + + + for( ; (z=Misc::CharToDigit(*s, b)) != -1 ; ++s) + { + if( value_read ) + *value_read = true; + + if( c == 0 ) + { + temp.table[0] = z; + + c += Mul(base); // !! IMPROVE ME: there can be used MulInt here + c += Add(temp); + } + } + + if( after_source ) + *after_source = s; + + TTMATH_LOGC("UInt::FromString", c) + + return (c==0)? 0 : 1; + } + + +public: + + + /*! + this method converts a string into its value + it returns carry=1 if the value will be too big or an incorrect base 'b' is given + + string is ended with a non-digit value, for example: + "12" will be translated to 12 + as well as: + "12foo" will be translated to 12 too + + existing first white characters will be ommited + + if the value from s is too large the rest digits will be skipped + + after_source (if exists) is pointing at the end of the parsed string + + value_read (if exists) tells whether something has actually been read (at least one digit) + */ + uint FromString(const char * s, uint b = 10, const char ** after_source = 0, bool * value_read = 0) + { + return FromStringBase(s, b, after_source, value_read); + } + + + /*! + this method converts a string into its value + + (it returns carry=1 if the value will be too big or an incorrect base 'b' is given) + */ + uint FromString(const std::string & s, uint b = 10) + { + return FromString( s.c_str(), b ); + } + + + /*! + this operator converts a string into its value (with base = 10) + */ + UInt & operator=(const char * s) + { + FromString(s); + + return *this; + } + + + /*! + this operator converts a string into its value (with base = 10) + */ + UInt & operator=(const std::string & s) + { + FromString( s.c_str() ); + + return *this; + } + + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + this method converts a string into its value + */ + uint FromString(const wchar_t * s, uint b = 10, const wchar_t ** after_source = 0, bool * value_read = 0) + { + return FromStringBase(s, b, after_source, value_read); + } + + + /*! + this method converts a string into its value + + (it returns carry=1 if the value will be too big or an incorrect base 'b' is given) + */ + uint FromString(const std::wstring & s, uint b = 10) + { + return FromString( s.c_str(), b ); + } + + + /*! + this operator converts a string into its value (with base = 10) + */ + UInt & operator=(const wchar_t * s) + { + FromString(s); + + return *this; + } + + + /*! + this operator converts a string into its value (with base = 10) + */ + UInt & operator=(const std::wstring & s) + { + FromString( s.c_str() ); + + return *this; + } + +#endif + + + /*! + * + * methods for comparing + * + */ + + + /*! + this method returns true if 'this' is smaller than 'l' + + 'index' is an index of the first word from will be the comparison performed + (note: we start the comparison from back - from the last word, when index is -1 /default/ + it is automatically set into the last word) + I introduced it for some kind of optimization made in the second division algorithm (Div2) + */ + bool CmpSmaller(const UInt & l, sint index = -1) const + { + sint i; + + if( index==-1 || index>=sint(value_size) ) + i = value_size - 1; + else + i = index; + + + for( ; i>=0 ; --i) + { + if( table[i] != l.table[i] ) + return table[i] < l.table[i]; + } + + // they're equal + return false; + } + + + + /*! + this method returns true if 'this' is bigger than 'l' + + 'index' is an index of the first word from will be the comparison performed + (note: we start the comparison from back - from the last word, when index is -1 /default/ + it is automatically set into the last word) + + I introduced it for some kind of optimization made in the second division algorithm (Div2) + */ + bool CmpBigger(const UInt & l, sint index = -1) const + { + sint i; + + if( index==-1 || index>=sint(value_size) ) + i = value_size - 1; + else + i = index; + + + for( ; i>=0 ; --i) + { + if( table[i] != l.table[i] ) + return table[i] > l.table[i]; + } + + // they're equal + return false; + } + + + /*! + this method returns true if 'this' is equal 'l' + + 'index' is an index of the first word from will be the comparison performed + (note: we start the comparison from back - from the last word, when index is -1 /default/ + it is automatically set into the last word) + */ + bool CmpEqual(const UInt & l, sint index = -1) const + { + sint i; + + if( index==-1 || index>=sint(value_size) ) + i = value_size - 1; + else + i = index; + + + for( ; i>=0 ; --i) + if( table[i] != l.table[i] ) + return false; + + return true; + } + + + + /*! + this method returns true if 'this' is smaller than or equal 'l' + + 'index' is an index of the first word from will be the comparison performed + (note: we start the comparison from back - from the last word, when index is -1 /default/ + it is automatically set into the last word) + */ + bool CmpSmallerEqual(const UInt & l, sint index=-1) const + { + sint i; + + if( index==-1 || index>=sint(value_size) ) + i = value_size - 1; + else + i = index; + + + for( ; i>=0 ; --i) + { + if( table[i] != l.table[i] ) + return table[i] < l.table[i]; + } + + // they're equal + return true; + } + + + + /*! + this method returns true if 'this' is bigger than or equal 'l' + + 'index' is an index of the first word from will be the comparison performed + (note: we start the comparison from back - from the last word, when index is -1 /default/ + it is automatically set into the last word) + */ + bool CmpBiggerEqual(const UInt & l, sint index=-1) const + { + sint i; + + if( index==-1 || index>=sint(value_size) ) + i = value_size - 1; + else + i = index; + + + for( ; i>=0 ; --i) + { + if( table[i] != l.table[i] ) + return table[i] > l.table[i]; + } + + // they're equal + return true; + } + + + /* + operators for comparising + */ + + bool operator<(const UInt & l) const + { + return CmpSmaller(l); + } + + + bool operator>(const UInt & l) const + { + return CmpBigger(l); + } + + + bool operator==(const UInt & l) const + { + return CmpEqual(l); + } + + + bool operator!=(const UInt & l) const + { + return !operator==(l); + } + + + bool operator<=(const UInt & l) const + { + return CmpSmallerEqual(l); + } + + bool operator>=(const UInt & l) const + { + return CmpBiggerEqual(l); + } + + + /*! + * + * standard mathematical operators + * + */ + + UInt operator-(const UInt & p2) const + { + UInt temp(*this); + + temp.Sub(p2); + + return temp; + } + + UInt & operator-=(const UInt & p2) + { + Sub(p2); + + return *this; + } + + UInt operator+(const UInt & p2) const + { + UInt temp(*this); + + temp.Add(p2); + + return temp; + } + + UInt & operator+=(const UInt & p2) + { + Add(p2); + + return *this; + } + + + UInt operator*(const UInt & p2) const + { + UInt temp(*this); + + temp.Mul(p2); + + return temp; + } + + + UInt & operator*=(const UInt & p2) + { + Mul(p2); + + return *this; + } + + + UInt operator/(const UInt & p2) const + { + UInt temp(*this); + + temp.Div(p2); + + return temp; + } + + + UInt & operator/=(const UInt & p2) + { + Div(p2); + + return *this; + } + + + UInt operator%(const UInt & p2) const + { + UInt temp(*this); + UInt remainder; + + temp.Div( p2, remainder ); + + return remainder; + } + + + UInt & operator%=(const UInt & p2) + { + UInt remainder; + + Div( p2, remainder ); + operator=(remainder); + + return *this; + } + + + /*! + Prefix operator e.g ++variable + */ + UInt & operator++() + { + AddOne(); + + return *this; + } + + + /*! + Postfix operator e.g variable++ + */ + UInt operator++(int) + { + UInt temp( *this ); + + AddOne(); + + return temp; + } + + + UInt & operator--() + { + SubOne(); + + return *this; + } + + + UInt operator--(int) + { + UInt temp( *this ); + + SubOne(); + + return temp; + } + + + + /*! + * + * bitwise operators + * + */ + + UInt operator~() const + { + UInt temp( *this ); + + temp.BitNot(); + + return temp; + } + + + UInt operator&(const UInt & p2) const + { + UInt temp( *this ); + + temp.BitAnd(p2); + + return temp; + } + + + UInt & operator&=(const UInt & p2) + { + BitAnd(p2); + + return *this; + } + + + UInt operator|(const UInt & p2) const + { + UInt temp( *this ); + + temp.BitOr(p2); + + return temp; + } + + + UInt & operator|=(const UInt & p2) + { + BitOr(p2); + + return *this; + } + + + UInt operator^(const UInt & p2) const + { + UInt temp( *this ); + + temp.BitXor(p2); + + return temp; + } + + + UInt & operator^=(const UInt & p2) + { + BitXor(p2); + + return *this; + } + + + UInt operator>>(int move) const + { + UInt temp( *this ); + + temp.Rcr(move); + + return temp; + } + + + UInt & operator>>=(int move) + { + Rcr(move); + + return *this; + } + + + UInt operator<<(int move) const + { + UInt temp( *this ); + + temp.Rcl(move); + + return temp; + } + + + UInt & operator<<=(int move) + { + Rcl(move); + + return *this; + } + + + /*! + * + * input/output operators for standard streams + * + * (they are very simple, in the future they should be changed) + * + */ + + +private: + + + /*! + an auxiliary method for outputing to standard streams + */ + template + static ostream_type & OutputToStream(ostream_type & s, const UInt & l) + { + string_type ss; + + l.ToString(ss); + s << ss; + + return s; + } + + +public: + + + /*! + output to standard streams + */ + friend std::ostream & operator<<(std::ostream & s, const UInt & l) + { + return OutputToStream(s, l); + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + output to standard streams + */ + friend std::wostream & operator<<(std::wostream & s, const UInt & l) + { + return OutputToStream(s, l); + } + +#endif + + + +private: + + /*! + an auxiliary method for reading from standard streams + */ + template + static istream_type & InputFromStream(istream_type & s, UInt & l) + { + string_type ss; + + // char or wchar_t for operator>> + char_type z; + + // operator>> omits white characters if they're set for ommiting + s >> z; + + // we're reading only digits (base=10) + while( s.good() && Misc::CharToDigit(z, 10)>=0 ) + { + ss += z; + z = static_cast(s.get()); + } + + // we're leaving the last read character + // (it's not belonging to the value) + s.unget(); + + l.FromString(ss); + + return s; + } + +public: + + + /*! + input from standard streams + */ + friend std::istream & operator>>(std::istream & s, UInt & l) + { + return InputFromStream(s, l); + } + + +#ifndef TTMATH_DONT_USE_WCHAR + + /*! + input from standard streams + */ + friend std::wistream & operator>>(std::wistream & s, UInt & l) + { + return InputFromStream(s, l); + } + +#endif + + + /* + Following methods are defined in: + ttmathuint_x86.h + ttmathuint_x86_64.h + ttmathuint_noasm.h + */ + +#ifdef TTMATH_NOASM + static uint AddTwoWords(uint a, uint b, uint carry, uint * result); + static uint SubTwoWords(uint a, uint b, uint carry, uint * result); + +#ifdef TTMATH_PLATFORM64 + + union uint_ + { + struct + { + unsigned int low; // 32 bit + unsigned int high; // 32 bit + } u_; + + uint u; // 64 bit + }; + + + static void DivTwoWords2(uint a,uint b, uint c, uint * r, uint * rest); + static uint DivTwoWordsNormalize(uint_ & a_, uint_ & b_, uint_ & c_); + static uint DivTwoWordsUnnormalize(uint u, uint d); + static unsigned int DivTwoWordsCalculate(uint_ u_, unsigned int u3, uint_ v_); + static void MultiplySubtract(uint_ & u_, unsigned int & u3, unsigned int & q, uint_ v_); + +#endif // TTMATH_PLATFORM64 +#endif // TTMATH_NOASM + + +private: + uint Rcl2_one(uint c); + uint Rcr2_one(uint c); + uint Rcl2(uint bits, uint c); + uint Rcr2(uint bits, uint c); + +public: + static const char * LibTypeStr(); + static LibTypeCode LibType(); + uint Add(const UInt & ss2, uint c=0); + uint AddInt(uint value, uint index = 0); + uint AddTwoInts(uint x2, uint x1, uint index); + static uint AddVector(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result); + uint Sub(const UInt & ss2, uint c=0); + uint SubInt(uint value, uint index = 0); + static uint SubVector(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result); + static sint FindLeadingBitInWord(uint x); + static sint FindLowestBitInWord(uint x); + static uint SetBitInWord(uint & value, uint bit); + static void MulTwoWords(uint a, uint b, uint * result_high, uint * result_low); + static void DivTwoWords(uint a,uint b, uint c, uint * r, uint * rest); + +}; + + + +/*! + this specialization is needed in order to not confused the compiler "error: ISO C++ forbids zero-size array" + when compiling Mul3Big2() method +*/ +template<> +class UInt<0> +{ +public: + uint table[1]; + + void Mul2Big(const UInt<0> &, UInt<0> &) { TTMATH_ASSERT(false) }; + void SetZero() { TTMATH_ASSERT(false) }; + uint AddTwoInts(uint, uint, uint) { TTMATH_ASSERT(false) return 0; }; +}; + + +} //namespace + + +#include "ttmathuint_x86.h" +#include "ttmathuint_x86_64.h" +#include "ttmathuint_noasm.h" + +#endif diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_noasm.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_noasm.h new file mode 100644 index 00000000..07c73fc4 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_noasm.h @@ -0,0 +1,1017 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2010, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + +#ifndef headerfilettmathuint_noasm +#define headerfilettmathuint_noasm + + +#ifdef TTMATH_NOASM + +/*! + \file ttmathuint_noasm.h + \brief template class UInt with methods without any assembler code + + this file is included at the end of ttmathuint.h +*/ + + +namespace ttmath +{ + + /*! + returning the string represents the currect type of the library + we have following types: + asm_vc_32 - with asm code designed for Microsoft Visual C++ (32 bits) + asm_gcc_32 - with asm code designed for GCC (32 bits) + asm_vc_64 - with asm for VC (64 bit) + asm_gcc_64 - with asm for GCC (64 bit) + no_asm_32 - pure C++ version (32 bit) - without any asm code + no_asm_64 - pure C++ version (64 bit) - without any asm code + */ + template + const char * UInt::LibTypeStr() + { + #ifdef TTMATH_PLATFORM32 + static const char info[] = "no_asm_32"; + #endif + + #ifdef TTMATH_PLATFORM64 + static const char info[] = "no_asm_64"; + #endif + + return info; + } + + + /*! + returning the currect type of the library + */ + template + LibTypeCode UInt::LibType() + { + #ifdef TTMATH_PLATFORM32 + LibTypeCode info = no_asm_32; + #endif + + #ifdef TTMATH_PLATFORM64 + LibTypeCode info = no_asm_64; + #endif + + return info; + } + + + /*! + this method adds two words together + returns carry + + this method is created only when TTMATH_NOASM macro is defined + */ + template + uint UInt::AddTwoWords(uint a, uint b, uint carry, uint * result) + { + uint temp; + + if( carry == 0 ) + { + temp = a + b; + + if( temp < a ) + carry = 1; + } + else + { + carry = 1; + temp = a + b + carry; + + if( temp > a ) // !(temp<=a) + carry = 0; + } + + *result = temp; + + return carry; + } + + + + /*! + this method adding ss2 to the this and adding carry if it's defined + (this = this + ss2 + c) + + c must be zero or one (might be a bigger value than 1) + function returns carry (1) (if it was) + */ + + template + uint UInt::Add(const UInt & ss2, uint c) + { + uint i; + + for(i=0 ; i + uint UInt::AddInt(uint value, uint index) + { + uint i, c; + + TTMATH_ASSERT( index < value_size ) + + + c = AddTwoWords(table[index], value, 0, &table[index]); + + for(i=index+1 ; i + uint UInt::AddTwoInts(uint x2, uint x1, uint index) + { + uint i, c; + + TTMATH_ASSERT( index < value_size - 1 ) + + + c = AddTwoWords(table[index], x1, 0, &table[index]); + c = AddTwoWords(table[index+1], x2, c, &table[index+1]); + + for(i=index+2 ; i + uint UInt::AddVector(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result) + { + uint i, c = 0; + + TTMATH_ASSERT( ss1_size >= ss2_size ) + + for(i=0 ; i + uint UInt::SubTwoWords(uint a, uint b, uint carry, uint * result) + { + if( carry == 0 ) + { + *result = a - b; + + if( a < b ) + carry = 1; + } + else + { + carry = 1; + *result = a - b - carry; + + if( a > b ) // !(a <= b ) + carry = 0; + } + + return carry; + } + + + + + /*! + this method's subtracting ss2 from the 'this' and subtracting + carry if it has been defined + (this = this - ss2 - c) + + c must be zero or one (might be a bigger value than 1) + function returns carry (1) (if it was) + */ + template + uint UInt::Sub(const UInt & ss2, uint c) + { + uint i; + + for(i=0 ; i + uint UInt::SubInt(uint value, uint index) + { + uint i, c; + + TTMATH_ASSERT( index < value_size ) + + + c = SubTwoWords(table[index], value, 0, &table[index]); + + for(i=index+1 ; i + uint UInt::SubVector(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result) + { + uint i, c = 0; + + TTMATH_ASSERT( ss1_size >= ss2_size ) + + for(i=0 ; i + uint UInt::Rcl2_one(uint c) + { + uint i, new_c; + + if( c != 0 ) + c = 1; + + for(i=0 ; i this -> return value + + the highest *bit* will be held the 'c' and + the state of one additional bit (on the right hand side) + will be returned + + for example: + let this is 000000010 + after Rcr2_one(1) there'll be 100000001 and Rcr2_one returns 0 + */ + template + uint UInt::Rcr2_one(uint c) + { + sint i; // signed i + uint new_c; + + if( c != 0 ) + c = TTMATH_UINT_HIGHEST_BIT; + + for(i=sint(value_size)-1 ; i>=0 ; --i) + { + new_c = (table[i] & 1) ? TTMATH_UINT_HIGHEST_BIT : 0; + table[i] = (table[i] >> 1) | c; + c = new_c; + } + + c = (c != 0)? 1 : 0; + + TTMATH_LOGC("UInt::Rcr2_one", c) + + return c; + } + + + + + /*! + this method moves all bits into the left hand side + return value <- this <- c + + the lowest *bits* will be held the 'c' and + the state of one additional bit (on the left hand side) + will be returned + + for example: + let this is 001010000 + after Rcl2(3, 1) there'll be 010000111 and Rcl2 returns 1 + */ + template + uint UInt::Rcl2(uint bits, uint c) + { + TTMATH_ASSERT( bits>0 && bits> move; + + for(i=0 ; i> move; + table[i] = (table[i] << bits) | c; + c = new_c; + } + + TTMATH_LOGC("UInt::Rcl2", (c & 1)) + + return (c & 1); + } + + + + + /*! + this method moves all bits into the right hand side + C -> this -> return value + + the highest *bits* will be held the 'c' and + the state of one additional bit (on the right hand side) + will be returned + + for example: + let this is 000000010 + after Rcr2(2, 1) there'll be 110000000 and Rcr2 returns 1 + */ + template + uint UInt::Rcr2(uint bits, uint c) + { + TTMATH_ASSERT( bits>0 && bits=0 ; --i) + { + new_c = table[i] << move; + table[i] = (table[i] >> bits) | c; + c = new_c; + } + + c = (c & TTMATH_UINT_HIGHEST_BIT) ? 1 : 0; + + TTMATH_LOGC("UInt::Rcr2", c) + + return c; + } + + + + + /*! + this method returns the number of the highest set bit in x + if the 'x' is zero this method returns '-1' + */ + template + sint UInt::FindLeadingBitInWord(uint x) + { + if( x == 0 ) + return -1; + + uint bit = TTMATH_BITS_PER_UINT - 1; + + while( (x & TTMATH_UINT_HIGHEST_BIT) == 0 ) + { + x = x << 1; + --bit; + } + + return bit; + } + + + + /*! + this method returns the number of the highest set bit in x + if the 'x' is zero this method returns '-1' + */ + template + sint UInt::FindLowestBitInWord(uint x) + { + if( x == 0 ) + return -1; + + uint bit = 0; + + while( (x & 1) == 0 ) + { + x = x >> 1; + ++bit; + } + + return bit; + } + + + + /*! + this method sets a special bit in the 'value' + and returns the last state of the bit (zero or one) + + bit is from <0,TTMATH_BITS_PER_UINT-1> + + e.g. + uint x = 100; + uint bit = SetBitInWord(x, 3); + now: x = 108 and bit = 0 + */ + template + uint UInt::SetBitInWord(uint & value, uint bit) + { + TTMATH_ASSERT( bit < TTMATH_BITS_PER_UINT ) + + uint mask = 1; + + if( bit > 0 ) + mask = mask << bit; + + uint last = value & mask; + value = value | mask; + + return (last != 0) ? 1 : 0; + } + + + + + + + /*! + * + * Multiplication + * + * + */ + + + /*! + multiplication: result_high:result_low = a * b + result_high - higher word of the result + result_low - lower word of the result + + this methos never returns a carry + this method is used in the second version of the multiplication algorithms + */ + template + void UInt::MulTwoWords(uint a, uint b, uint * result_high, uint * result_low) + { + #ifdef TTMATH_PLATFORM32 + + /* + on 32bit platforms we have defined 'unsigned long long int' type known as 'ulint' in ttmath namespace + this type has 64 bits, then we're using only one multiplication: 32bit * 32bit = 64bit + */ + + union uint_ + { + struct + { + uint low; // 32 bits + uint high; // 32 bits + } u_; + + ulint u; // 64 bits + } res; + + res.u = ulint(a) * ulint(b); // multiply two 32bit words, the result has 64 bits + + *result_high = res.u_.high; + *result_low = res.u_.low; + + #else + + /* + 64 bits platforms + + we don't have a native type which has 128 bits + then we're splitting 'a' and 'b' to 4 parts (high and low halves) + and using 4 multiplications (with additions and carry correctness) + */ + + uint_ a_; + uint_ b_; + uint_ res_high1, res_high2; + uint_ res_low1, res_low2; + + a_.u = a; + b_.u = b; + + /* + the multiplication is as follows (schoolbook algorithm with O(n^2) ): + + 32 bits 32 bits + + +--------------------------------+ + | a_.u_.high | a_.u_.low | + +--------------------------------+ + | b_.u_.high | b_.u_.low | + +--------------------------------+--------------------------------+ + | res_high1.u | res_low1.u | + +--------------------------------+--------------------------------+ + | res_high2.u | res_low2.u | + +--------------------------------+--------------------------------+ + + 64 bits 64 bits + */ + + + uint_ temp; + + res_low1.u = uint(b_.u_.low) * uint(a_.u_.low); + + temp.u = uint(res_low1.u_.high) + uint(b_.u_.low) * uint(a_.u_.high); + res_low1.u_.high = temp.u_.low; + res_high1.u_.low = temp.u_.high; + res_high1.u_.high = 0; + + res_low2.u_.low = 0; + temp.u = uint(b_.u_.high) * uint(a_.u_.low); + res_low2.u_.high = temp.u_.low; + + res_high2.u = uint(b_.u_.high) * uint(a_.u_.high) + uint(temp.u_.high); + + uint c = AddTwoWords(res_low1.u, res_low2.u, 0, &res_low2.u); + AddTwoWords(res_high1.u, res_high2.u, c, &res_high2.u); // there is no carry from here + + *result_high = res_high2.u; + *result_low = res_low2.u; + + #endif + } + + + + + /*! + * + * Division + * + * + */ + + + /*! + this method calculates 64bits word a:b / 32bits c (a higher, b lower word) + r = a:b / c and rest - remainder + + * + * WARNING: + * the c has to be suitably large for the result being keeped in one word, + * if c is equal zero there'll be a hardware interruption (0) + * and probably the end of your program + * + */ + template + void UInt::DivTwoWords(uint a, uint b, uint c, uint * r, uint * rest) + { + // (a < c ) for the result to be one word + TTMATH_ASSERT( c != 0 && a < c ) + + #ifdef TTMATH_PLATFORM32 + + union + { + struct + { + uint low; // 32 bits + uint high; // 32 bits + } u_; + + ulint u; // 64 bits + } ab; + + ab.u_.high = a; + ab.u_.low = b; + + *r = uint(ab.u / c); + *rest = uint(ab.u % c); + + #else + + uint_ c_; + c_.u = c; + + + if( a == 0 ) + { + *r = b / c; + *rest = b % c; + } + else + if( c_.u_.high == 0 ) + { + // higher half of 'c' is zero + // then higher half of 'a' is zero too (look at the asserts at the beginning - 'a' is smaller than 'c') + uint_ a_, b_, res_, temp1, temp2; + + a_.u = a; + b_.u = b; + + temp1.u_.high = a_.u_.low; + temp1.u_.low = b_.u_.high; + + res_.u_.high = (unsigned int)(temp1.u / c); + temp2.u_.high = (unsigned int)(temp1.u % c); + temp2.u_.low = b_.u_.low; + + res_.u_.low = (unsigned int)(temp2.u / c); + *rest = temp2.u % c; + + *r = res_.u; + } + else + { + return DivTwoWords2(a, b, c, r, rest); + } + + #endif + } + + +#ifdef TTMATH_PLATFORM64 + + + /*! + this method is available only on 64bit platforms + + the same algorithm like the third division algorithm in ttmathuint.h + but now with the radix=2^32 + */ + template + void UInt::DivTwoWords2(uint a, uint b, uint c, uint * r, uint * rest) + { + // a is not zero + // c_.u_.high is not zero + + uint_ a_, b_, c_, u_, q_; + unsigned int u3; // 32 bit + + a_.u = a; + b_.u = b; + c_.u = c; + + // normalizing + uint d = DivTwoWordsNormalize(a_, b_, c_); + + // loop from j=1 to j=0 + // the first step (for j=2) is skipped because our result is only in one word, + // (first 'q' were 0 and nothing would be changed) + u_.u_.high = a_.u_.high; + u_.u_.low = a_.u_.low; + u3 = b_.u_.high; + q_.u_.high = DivTwoWordsCalculate(u_, u3, c_); + MultiplySubtract(u_, u3, q_.u_.high, c_); + + u_.u_.high = u_.u_.low; + u_.u_.low = u3; + u3 = b_.u_.low; + q_.u_.low = DivTwoWordsCalculate(u_, u3, c_); + MultiplySubtract(u_, u3, q_.u_.low, c_); + + *r = q_.u; + + // unnormalizing for the remainder + u_.u_.high = u_.u_.low; + u_.u_.low = u3; + *rest = DivTwoWordsUnnormalize(u_.u, d); + } + + + + + template + uint UInt::DivTwoWordsNormalize(uint_ & a_, uint_ & b_, uint_ & c_) + { + uint d = 0; + + for( ; (c_.u & TTMATH_UINT_HIGHEST_BIT) == 0 ; ++d ) + { + c_.u = c_.u << 1; + + uint bc = b_.u & TTMATH_UINT_HIGHEST_BIT; // carry from 'b' + + b_.u = b_.u << 1; + a_.u = a_.u << 1; // carry bits from 'a' are simply skipped + + if( bc ) + a_.u = a_.u | 1; + } + + return d; + } + + + template + uint UInt::DivTwoWordsUnnormalize(uint u, uint d) + { + if( d == 0 ) + return u; + + u = u >> d; + + return u; + } + + + template + unsigned int UInt::DivTwoWordsCalculate(uint_ u_, unsigned int u3, uint_ v_) + { + bool next_test; + uint_ qp_, rp_, temp_; + + qp_.u = u_.u / uint(v_.u_.high); + rp_.u = u_.u % uint(v_.u_.high); + + TTMATH_ASSERT( qp_.u_.high==0 || qp_.u_.high==1 ) + + do + { + bool decrease = false; + + if( qp_.u_.high == 1 ) + decrease = true; + else + { + temp_.u_.high = rp_.u_.low; + temp_.u_.low = u3; + + if( qp_.u * uint(v_.u_.low) > temp_.u ) + decrease = true; + } + + next_test = false; + + if( decrease ) + { + --qp_.u; + rp_.u += v_.u_.high; + + if( rp_.u_.high == 0 ) + next_test = true; + } + } + while( next_test ); + + return qp_.u_.low; + } + + + template + void UInt::MultiplySubtract(uint_ & u_, unsigned int & u3, unsigned int & q, uint_ v_) + { + uint_ temp_; + + uint res_high; + uint res_low; + + MulTwoWords(v_.u, q, &res_high, &res_low); + + uint_ sub_res_high_; + uint_ sub_res_low_; + + temp_.u_.high = u_.u_.low; + temp_.u_.low = u3; + + uint c = SubTwoWords(temp_.u, res_low, 0, &sub_res_low_.u); + + temp_.u_.high = 0; + temp_.u_.low = u_.u_.high; + c = SubTwoWords(temp_.u, res_high, c, &sub_res_high_.u); + + if( c ) + { + --q; + + c = AddTwoWords(sub_res_low_.u, v_.u, 0, &sub_res_low_.u); + AddTwoWords(sub_res_high_.u, 0, c, &sub_res_high_.u); + } + + u_.u_.high = sub_res_high_.u_.low; + u_.u_.low = sub_res_low_.u_.high; + u3 = sub_res_low_.u_.low; + } + +#endif // #ifdef TTMATH_PLATFORM64 + + + +} //namespace + + +#endif //ifdef TTMATH_NOASM +#endif + + + + diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86.h new file mode 100644 index 00000000..1dd087f5 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86.h @@ -0,0 +1,1602 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2009, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + + + +#ifndef headerfilettmathuint_x86 +#define headerfilettmathuint_x86 + + +#ifndef TTMATH_NOASM +#ifdef TTMATH_PLATFORM32 + + +/*! + \file ttmathuint_x86.h + \brief template class UInt with assembler code for 32bit x86 processors + + this file is included at the end of ttmathuint.h +*/ + + + +/*! + \brief a namespace for the TTMath library +*/ +namespace ttmath +{ + + /*! + returning the string represents the currect type of the library + we have following types: + asm_vc_32 - with asm code designed for Microsoft Visual C++ (32 bits) + asm_gcc_32 - with asm code designed for GCC (32 bits) + asm_vc_64 - with asm for VC (64 bit) + asm_gcc_64 - with asm for GCC (64 bit) + no_asm_32 - pure C++ version (32 bit) - without any asm code + no_asm_64 - pure C++ version (64 bit) - without any asm code + */ + template + const char * UInt::LibTypeStr() + { + #ifndef __GNUC__ + static const char info[] = "asm_vc_32"; + #endif + + #ifdef __GNUC__ + static const char info[] = "asm_gcc_32"; + #endif + + return info; + } + + + /*! + returning the currect type of the library + */ + template + LibTypeCode UInt::LibType() + { + #ifndef __GNUC__ + LibTypeCode info = asm_vc_32; + #endif + + #ifdef __GNUC__ + LibTypeCode info = asm_gcc_32; + #endif + + return info; + } + + + + /*! + * + * basic mathematic functions + * + */ + + + /*! + adding ss2 to the this and adding carry if it's defined + (this = this + ss2 + c) + + c must be zero or one (might be a bigger value than 1) + function returns carry (1) (if it has been) + */ + template + uint UInt::Add(const UInt & ss2, uint c) + { + uint b = value_size; + uint * p1 = table; + uint * p2 = const_cast(ss2.table); + + // we don't have to use TTMATH_REFERENCE_ASSERT here + // this algorithm doesn't require it + + #ifndef __GNUC__ + + // this part might be compiled with for example visual c + + __asm + { + push eax + push ebx + push ecx + push edx + push esi + + mov ecx,[b] + + mov ebx,[p1] + mov esi,[p2] + + xor edx,edx // edx=0 + mov eax,[c] + neg eax // CF=1 if rax!=0 , CF=0 if rax==0 + + ttmath_loop: + mov eax,[esi+edx*4] + adc [ebx+edx*4],eax + + inc edx + dec ecx + jnz ttmath_loop + + adc ecx, ecx + mov [c], ecx + + pop esi + pop edx + pop ecx + pop ebx + pop eax + } + + + + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + // this part should be compiled with gcc + + __asm__ __volatile__( + + "xorl %%edx, %%edx \n" + "negl %%eax \n" // CF=1 if rax!=0 , CF=0 if rax==0 + + "1: \n" + "movl (%%esi,%%edx,4), %%eax \n" + "adcl %%eax, (%%ebx,%%edx,4) \n" + + "incl %%edx \n" + "decl %%ecx \n" + "jnz 1b \n" + + "adc %%ecx, %%ecx \n" + + : "=c" (c), "=a" (dummy), "=d" (dummy2) + : "0" (b), "1" (c), "b" (p1), "S" (p2) + : "cc", "memory" ); + #endif + + TTMATH_LOGC("UInt::Add", c) + + return c; + } + + + + /*! + adding one word (at a specific position) + and returning a carry (if it has been) + + e.g. + + if we've got (value_size=3): + table[0] = 10; + table[1] = 30; + table[2] = 5; + and we call: + AddInt(2,1) + then it'll be: + table[0] = 10; + table[1] = 30 + 2; + table[2] = 5; + + of course if there was a carry from table[2] it would be returned + */ + template + uint UInt::AddInt(uint value, uint index) + { + uint b = value_size; + uint * p1 = table; + uint c; + + TTMATH_ASSERT( index < value_size ) + + #ifndef __GNUC__ + + __asm + { + push eax + push ebx + push ecx + push edx + + mov ecx, [b] + sub ecx, [index] + + mov edx, [index] + mov ebx, [p1] + + mov eax, [value] + + ttmath_loop: + add [ebx+edx*4], eax + jnc ttmath_end + + mov eax, 1 + inc edx + dec ecx + jnz ttmath_loop + + ttmath_end: + setc al + movzx edx, al + mov [c], edx + + pop edx + pop ecx + pop ebx + pop eax + } + + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + + __asm__ __volatile__( + + "subl %%edx, %%ecx \n" + + "1: \n" + "addl %%eax, (%%ebx,%%edx,4) \n" + "jnc 2f \n" + + "movl $1, %%eax \n" + "incl %%edx \n" + "decl %%ecx \n" + "jnz 1b \n" + + "2: \n" + "setc %%al \n" + "movzx %%al, %%edx \n" + + : "=d" (c), "=a" (dummy), "=c" (dummy2) + : "0" (index), "1" (value), "2" (b), "b" (p1) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::AddInt", c) + + return c; + } + + + + + /*! + adding only two unsigned words to the existing value + and these words begin on the 'index' position + (it's used in the multiplication algorithm 2) + + index should be equal or smaller than value_size-2 (index <= value_size-2) + x1 - lower word, x2 - higher word + + for example if we've got value_size equal 4 and: + table[0] = 3 + table[1] = 4 + table[2] = 5 + table[3] = 6 + then let + x1 = 10 + x2 = 20 + and + index = 1 + + the result of this method will be: + table[0] = 3 + table[1] = 4 + x1 = 14 + table[2] = 5 + x2 = 25 + table[3] = 6 + + and no carry at the end of table[3] + + (of course if there was a carry in table[2](5+20) then + this carry would be passed to the table[3] etc.) + */ + template + uint UInt::AddTwoInts(uint x2, uint x1, uint index) + { + uint b = value_size; + uint * p1 = table; + uint c; + + TTMATH_ASSERT( index < value_size - 1 ) + + #ifndef __GNUC__ + __asm + { + push eax + push ebx + push ecx + push edx + + mov ecx, [b] + sub ecx, [index] + + mov ebx, [p1] + mov edx, [index] + + mov eax, [x1] + add [ebx+edx*4], eax + inc edx + dec ecx + + mov eax, [x2] + + ttmath_loop: + adc [ebx+edx*4], eax + jnc ttmath_end + + mov eax, 0 + inc edx + dec ecx + jnz ttmath_loop + + ttmath_end: + setc al + movzx edx, al + mov [c], edx + + pop edx + pop ecx + pop ebx + pop eax + + } + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + + __asm__ __volatile__( + + "subl %%edx, %%ecx \n" + + "addl %%esi, (%%ebx,%%edx,4) \n" + "incl %%edx \n" + "decl %%ecx \n" + + "1: \n" + "adcl %%eax, (%%ebx,%%edx,4) \n" + "jnc 2f \n" + + "mov $0, %%eax \n" + "incl %%edx \n" + "decl %%ecx \n" + "jnz 1b \n" + + "2: \n" + "setc %%al \n" + "movzx %%al, %%eax \n" + + : "=a" (c), "=c" (dummy), "=d" (dummy2) + : "0" (x2), "1" (b), "2" (index), "b" (p1), "S" (x1) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::AddTwoInts", c) + + return c; + } + + + + /*! + this static method addes one vector to the other + 'ss1' is larger in size or equal to 'ss2' + + ss1 points to the first (larger) vector + ss2 points to the second vector + ss1_size - size of the ss1 (and size of the result too) + ss2_size - size of the ss2 + result - is the result vector (which has size the same as ss1: ss1_size) + + Example: ss1_size is 5, ss2_size is 3 + ss1: ss2: result (output): + 5 1 5+1 + 4 3 4+3 + 2 7 2+7 + 6 6 + 9 9 + of course the carry is propagated and will be returned from the last item + (this method is used by the Karatsuba multiplication algorithm) + */ + template + uint UInt::AddVector(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result) + { + TTMATH_ASSERT( ss1_size >= ss2_size ) + + uint rest = ss1_size - ss2_size; + uint c; + + #ifndef __GNUC__ + + // this part might be compiled with for example visual c + __asm + { + pushad + + mov ecx, [ss2_size] + xor edx, edx // edx = 0, cf = 0 + + mov esi, [ss1] + mov ebx, [ss2] + mov edi, [result] + + ttmath_loop: + mov eax, [esi+edx*4] + adc eax, [ebx+edx*4] + mov [edi+edx*4], eax + + inc edx + dec ecx + jnz ttmath_loop + + adc ecx, ecx // ecx has the cf state + + mov ebx, [rest] + or ebx, ebx + jz ttmath_end + + xor ebx, ebx // ebx = 0 + neg ecx // setting cf from ecx + mov ecx, [rest] // ecx is != 0 + + ttmath_loop2: + mov eax, [esi+edx*4] + adc eax, ebx + mov [edi+edx*4], eax + + inc edx + dec ecx + jnz ttmath_loop2 + + adc ecx, ecx + + ttmath_end: + mov [c], ecx + + popad + } + + #endif + + + #ifdef __GNUC__ + + // this part should be compiled with gcc + uint dummy1, dummy2, dummy3; + + __asm__ __volatile__( + "push %%edx \n" + "xor %%edx, %%edx \n" // edx = 0, cf = 0 + "1: \n" + "mov (%%esi,%%edx,4), %%eax \n" + "adc (%%ebx,%%edx,4), %%eax \n" + "mov %%eax, (%%edi,%%edx,4) \n" + + "inc %%edx \n" + "dec %%ecx \n" + "jnz 1b \n" + + "adc %%ecx, %%ecx \n" // ecx has the cf state + "pop %%eax \n" // eax = rest + + "or %%eax, %%eax \n" + "jz 3f \n" + + "xor %%ebx, %%ebx \n" // ebx = 0 + "neg %%ecx \n" // setting cf from ecx + "mov %%eax, %%ecx \n" // ecx=rest and is != 0 + "2: \n" + "mov (%%esi, %%edx, 4), %%eax \n" + "adc %%ebx, %%eax \n" + "mov %%eax, (%%edi, %%edx, 4) \n" + + "inc %%edx \n" + "dec %%ecx \n" + "jnz 2b \n" + + "adc %%ecx, %%ecx \n" + "3: \n" + + : "=a" (dummy1), "=b" (dummy2), "=c" (c), "=d" (dummy3) + : "1" (ss2), "2" (ss2_size), "3" (rest), "S" (ss1), "D" (result) + : "cc", "memory" ); + + #endif + + TTMATH_VECTOR_LOGC("UInt::AddVector", c, result, ss1_size) + + return c; + } + + + /*! + subtracting ss2 from the 'this' and subtracting + carry if it has been defined + (this = this - ss2 - c) + + c must be zero or one (might be a bigger value than 1) + function returns carry (1) (if it has been) + */ + template + uint UInt::Sub(const UInt & ss2, uint c) + { + uint b = value_size; + uint * p1 = table; + uint * p2 = const_cast(ss2.table); + + // we don't have to use TTMATH_REFERENCE_ASSERT here + // this algorithm doesn't require it + + #ifndef __GNUC__ + + __asm + { + push eax + push ebx + push ecx + push edx + push esi + + mov ecx,[b] + + mov ebx,[p1] + mov esi,[p2] + + xor edx,edx // edx=0 + mov eax,[c] + neg eax // CF=1 if rax!=0 , CF=0 if rax==0 + + ttmath_loop: + mov eax,[esi+edx*4] + sbb [ebx+edx*4],eax + + inc edx + dec ecx + jnz ttmath_loop + + adc ecx, ecx + mov [c], ecx + + pop esi + pop edx + pop ecx + pop ebx + pop eax + } + + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + + __asm__ __volatile__( + + "xorl %%edx, %%edx \n" + "negl %%eax \n" // CF=1 if rax!=0 , CF=0 if rax==0 + + "1: \n" + "movl (%%esi,%%edx,4), %%eax \n" + "sbbl %%eax, (%%ebx,%%edx,4) \n" + + "incl %%edx \n" + "decl %%ecx \n" + "jnz 1b \n" + + "adc %%ecx, %%ecx \n" + + : "=c" (c), "=a" (dummy), "=d" (dummy2) + : "0" (b), "1" (c), "b" (p1), "S" (p2) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::Sub", c) + + return c; + } + + + + + /*! + this method subtracts one word (at a specific position) + and returns a carry (if it was) + + e.g. + + if we've got (value_size=3): + table[0] = 10; + table[1] = 30; + table[2] = 5; + and we call: + SubInt(2,1) + then it'll be: + table[0] = 10; + table[1] = 30 - 2; + table[2] = 5; + + of course if there was a carry from table[2] it would be returned + */ + template + uint UInt::SubInt(uint value, uint index) + { + uint b = value_size; + uint * p1 = table; + uint c; + + TTMATH_ASSERT( index < value_size ) + + #ifndef __GNUC__ + + __asm + { + push eax + push ebx + push ecx + push edx + + mov ecx, [b] + sub ecx, [index] + + mov edx, [index] + mov ebx, [p1] + + mov eax, [value] + + ttmath_loop: + sub [ebx+edx*4], eax + jnc ttmath_end + + mov eax, 1 + inc edx + dec ecx + jnz ttmath_loop + + ttmath_end: + setc al + movzx edx, al + mov [c], edx + + pop edx + pop ecx + pop ebx + pop eax + } + + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + + __asm__ __volatile__( + + "subl %%edx, %%ecx \n" + + "1: \n" + "subl %%eax, (%%ebx,%%edx,4) \n" + "jnc 2f \n" + + "movl $1, %%eax \n" + "incl %%edx \n" + "decl %%ecx \n" + "jnz 1b \n" + + "2: \n" + "setc %%al \n" + "movzx %%al, %%edx \n" + + : "=d" (c), "=a" (dummy), "=c" (dummy2) + : "0" (index), "1" (value), "2" (b), "b" (p1) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::SubInt", c) + + return c; + } + + + + /*! + this static method subtractes one vector from the other + 'ss1' is larger in size or equal to 'ss2' + + ss1 points to the first (larger) vector + ss2 points to the second vector + ss1_size - size of the ss1 (and size of the result too) + ss2_size - size of the ss2 + result - is the result vector (which has size the same as ss1: ss1_size) + + Example: ss1_size is 5, ss2_size is 3 + ss1: ss2: result (output): + 5 1 5-1 + 4 3 4-3 + 2 7 2-7 + 6 6-1 (the borrow from previous item) + 9 9 + return (carry): 0 + of course the carry (borrow) is propagated and will be returned from the last item + (this method is used by the Karatsuba multiplication algorithm) + */ + template + uint UInt::SubVector(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result) + { + TTMATH_ASSERT( ss1_size >= ss2_size ) + + uint rest = ss1_size - ss2_size; + uint c; + + #ifndef __GNUC__ + + // this part might be compiled with for example visual c + + /* + the asm code is nearly the same as in AddVector + only two instructions 'adc' are changed to 'sbb' + */ + __asm + { + pushad + + mov ecx, [ss2_size] + xor edx, edx // edx = 0, cf = 0 + + mov esi, [ss1] + mov ebx, [ss2] + mov edi, [result] + + ttmath_loop: + mov eax, [esi+edx*4] + sbb eax, [ebx+edx*4] + mov [edi+edx*4], eax + + inc edx + dec ecx + jnz ttmath_loop + + adc ecx, ecx // ecx has the cf state + + mov ebx, [rest] + or ebx, ebx + jz ttmath_end + + xor ebx, ebx // ebx = 0 + neg ecx // setting cf from ecx + mov ecx, [rest] // ecx is != 0 + + ttmath_loop2: + mov eax, [esi+edx*4] + sbb eax, ebx + mov [edi+edx*4], eax + + inc edx + dec ecx + jnz ttmath_loop2 + + adc ecx, ecx + + ttmath_end: + mov [c], ecx + + popad + } + + #endif + + + #ifdef __GNUC__ + + // this part should be compiled with gcc + uint dummy1, dummy2, dummy3; + + __asm__ __volatile__( + "push %%edx \n" + "xor %%edx, %%edx \n" // edx = 0, cf = 0 + "1: \n" + "mov (%%esi,%%edx,4), %%eax \n" + "sbb (%%ebx,%%edx,4), %%eax \n" + "mov %%eax, (%%edi,%%edx,4) \n" + + "inc %%edx \n" + "dec %%ecx \n" + "jnz 1b \n" + + "adc %%ecx, %%ecx \n" // ecx has the cf state + "pop %%eax \n" // eax = rest + + "or %%eax, %%eax \n" + "jz 3f \n" + + "xor %%ebx, %%ebx \n" // ebx = 0 + "neg %%ecx \n" // setting cf from ecx + "mov %%eax, %%ecx \n" // ecx=rest and is != 0 + "2: \n" + "mov (%%esi, %%edx, 4), %%eax \n" + "sbb %%ebx, %%eax \n" + "mov %%eax, (%%edi, %%edx, 4) \n" + + "inc %%edx \n" + "dec %%ecx \n" + "jnz 2b \n" + + "adc %%ecx, %%ecx \n" + "3: \n" + + : "=a" (dummy1), "=b" (dummy2), "=c" (c), "=d" (dummy3) + : "1" (ss2), "2" (ss2_size), "3" (rest), "S" (ss1), "D" (result) + : "cc", "memory" ); + + #endif + + TTMATH_VECTOR_LOGC("UInt::SubVector", c, result, ss1_size) + + return c; + } + + + + /*! + this method moves all bits into the left hand side + return value <- this <- c + + the lowest *bit* will be held the 'c' and + the state of one additional bit (on the left hand side) + will be returned + + for example: + let this is 001010000 + after Rcl2_one(1) there'll be 010100001 and Rcl2_one returns 0 + */ + template + uint UInt::Rcl2_one(uint c) + { + uint b = value_size; + uint * p1 = table; + + #ifndef __GNUC__ + __asm + { + push ebx + push ecx + push edx + + mov ebx, [p1] + xor edx, edx + mov ecx, [c] + neg ecx + mov ecx, [b] + + ttmath_loop: + rcl dword ptr [ebx+edx*4], 1 + + inc edx + dec ecx + jnz ttmath_loop + + adc ecx, ecx + mov [c], ecx + + pop edx + pop ecx + pop ebx + } + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + + __asm__ __volatile__( + + "xorl %%edx, %%edx \n" // edx=0 + "negl %%eax \n" // CF=1 if eax!=0 , CF=0 if eax==0 + + "1: \n" + "rcll $1, (%%ebx, %%edx, 4) \n" + + "incl %%edx \n" + "decl %%ecx \n" + "jnz 1b \n" + + "adcl %%ecx, %%ecx \n" + + : "=c" (c), "=a" (dummy), "=d" (dummy2) + : "0" (b), "1" (c), "b" (p1) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::Rcl2_one", c) + + return c; + } + + + + /*! + this method moves all bits into the right hand side + c -> this -> return value + + the highest *bit* will be held the 'c' and + the state of one additional bit (on the right hand side) + will be returned + + for example: + let this is 000000010 + after Rcr2_one(1) there'll be 100000001 and Rcr2_one returns 0 + */ + template + uint UInt::Rcr2_one(uint c) + { + uint b = value_size; + uint * p1 = table; + + #ifndef __GNUC__ + __asm + { + push ebx + push ecx + + mov ebx, [p1] + mov ecx, [c] + neg ecx + mov ecx, [b] + + ttmath_loop: + rcr dword ptr [ebx+ecx*4-4], 1 + + dec ecx + jnz ttmath_loop + + adc ecx, ecx + mov [c], ecx + + pop ecx + pop ebx + } + #endif + + + #ifdef __GNUC__ + uint dummy; + + __asm__ __volatile__( + + "negl %%eax \n" // CF=1 if eax!=0 , CF=0 if eax==0 + + "1: \n" + "rcrl $1, -4(%%ebx, %%ecx, 4) \n" + + "decl %%ecx \n" + "jnz 1b \n" + + "adcl %%ecx, %%ecx \n" + + : "=c" (c), "=a" (dummy) + : "0" (b), "1" (c), "b" (p1) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::Rcr2_one", c) + + return c; + } + + + +#ifdef _MSC_VER +#pragma warning (disable : 4731) +//warning C4731: frame pointer register 'ebp' modified by inline assembly code +#endif + + + + /*! + this method moves all bits into the left hand side + return value <- this <- c + + the lowest *bits* will be held the 'c' and + the state of one additional bit (on the left hand side) + will be returned + + for example: + let this is 001010000 + after Rcl2(3, 1) there'll be 010000111 and Rcl2 returns 1 + */ + template + uint UInt::Rcl2(uint bits, uint c) + { + TTMATH_ASSERT( bits>0 && bits edx -> cf) (cl times) + "movl %%edx, %%ebp \n" // ebp = edx = mask + "movl %%esi, %%ecx \n" + + "xorl %%edx, %%edx \n" + "movl %%edx, %%esi \n" + "orl %%eax, %%eax \n" + "cmovnz %%ebp, %%esi \n" // if(c) esi=mask else esi=0 + + "1: \n" + "roll %%cl, (%%ebx,%%edx,4) \n" + + "movl (%%ebx,%%edx,4), %%eax \n" + "andl %%ebp, %%eax \n" + "xorl %%eax, (%%ebx,%%edx,4) \n" + "orl %%esi, (%%ebx,%%edx,4) \n" + "movl %%eax, %%esi \n" + + "incl %%edx \n" + "decl %%edi \n" + "jnz 1b \n" + + "and $1, %%eax \n" + + "pop %%ebp \n" + + : "=a" (c), "=D" (dummy), "=S" (dummy2), "=d" (dummy3) + : "0" (c), "1" (b), "b" (p1), "c" (bits) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::Rcl2", c) + + return c; + } + + + + + /*! + this method moves all bits into the right hand side + C -> this -> return value + + the highest *bits* will be held the 'c' and + the state of one additional bit (on the right hand side) + will be returned + + for example: + let this is 000000010 + after Rcr2(2, 1) there'll be 110000000 and Rcr2 returns 1 + */ + template + uint UInt::Rcr2(uint bits, uint c) + { + TTMATH_ASSERT( bits>0 && bits + sint UInt::FindLeadingBitInWord(uint x) + { + sint result; + + #ifndef __GNUC__ + __asm + { + push eax + push edx + + mov edx,-1 + bsr eax,[x] + cmovz eax,edx + mov [result], eax + + pop edx + pop eax + } + #endif + + + #ifdef __GNUC__ + uint dummy; + + __asm__ ( + + "movl $-1, %1 \n" + "bsrl %2, %0 \n" + "cmovz %1, %0 \n" + + : "=r" (result), "=&r" (dummy) + : "r" (x) + : "cc" ); + + #endif + + return result; + } + + + + /* + this method returns the number of the smallest set bit in one 32-bit word + if the 'x' is zero this method returns '-1' + */ + template + sint UInt::FindLowestBitInWord(uint x) + { + sint result; + + #ifndef __GNUC__ + __asm + { + push eax + push edx + + mov edx,-1 + bsf eax,[x] + cmovz eax,edx + mov [result], eax + + pop edx + pop eax + } + #endif + + + #ifdef __GNUC__ + uint dummy; + + __asm__ ( + + "movl $-1, %1 \n" + "bsfl %2, %0 \n" + "cmovz %1, %0 \n" + + : "=r" (result), "=&r" (dummy) + : "r" (x) + : "cc" ); + + #endif + + return result; + } + + + + /*! + this method sets a special bit in the 'value' + and returns the last state of the bit (zero or one) + + bit is from <0,31> + e.g. + uint x = 100; + uint bit = SetBitInWord(x, 3); + now: x = 108 and bit = 0 + */ + template + uint UInt::SetBitInWord(uint & value, uint bit) + { + TTMATH_ASSERT( bit < TTMATH_BITS_PER_UINT ) + + uint old_bit; + uint v = value; + + #ifndef __GNUC__ + __asm + { + push ebx + push eax + + mov eax, [v] + mov ebx, [bit] + bts eax, ebx + mov [v], eax + + setc bl + movzx ebx, bl + mov [old_bit], ebx + + pop eax + pop ebx + } + #endif + + + #ifdef __GNUC__ + __asm__ ( + + "btsl %%ebx, %%eax \n" + "setc %%bl \n" + "movzx %%bl, %%ebx \n" + + : "=a" (v), "=b" (old_bit) + : "0" (v), "1" (bit) + : "cc" ); + + #endif + + value = v; + + return old_bit; + } + + + + + /*! + multiplication: result_high:result_low = a * b + result_high - higher word of the result + result_low - lower word of the result + + this methos never returns a carry + this method is used in the second version of the multiplication algorithms + */ + template + void UInt::MulTwoWords(uint a, uint b, uint * result_high, uint * result_low) + { + /* + we must use these temporary variables in order to inform the compilator + that value pointed with result1 and result2 has changed + + this has no effect in visual studio but it's useful when + using gcc and options like -Ox + */ + uint result1_; + uint result2_; + + #ifndef __GNUC__ + + __asm + { + push eax + push edx + + mov eax, [a] + mul dword ptr [b] + + mov [result2_], edx + mov [result1_], eax + + pop edx + pop eax + } + + #endif + + + #ifdef __GNUC__ + + __asm__ ( + + "mull %%edx \n" + + : "=a" (result1_), "=d" (result2_) + : "0" (a), "1" (b) + : "cc" ); + + #endif + + + *result_low = result1_; + *result_high = result2_; + } + + + + + + /*! + * + * Division + * + * + */ + + + + + /*! + this method calculates 64bits word a:b / 32bits c (a higher, b lower word) + r = a:b / c and rest - remainder + + * + * WARNING: + * if r (one word) is too small for the result or c is equal zero + * there'll be a hardware interruption (0) + * and probably the end of your program + * + */ + template + void UInt::DivTwoWords(uint a, uint b, uint c, uint * r, uint * rest) + { + uint r_; + uint rest_; + /* + these variables have similar meaning like those in + the multiplication algorithm MulTwoWords + */ + + TTMATH_ASSERT( c != 0 ) + + #ifndef __GNUC__ + __asm + { + push eax + push edx + + mov edx, [a] + mov eax, [b] + div dword ptr [c] + + mov [r_], eax + mov [rest_], edx + + pop edx + pop eax + } + #endif + + + #ifdef __GNUC__ + + __asm__ ( + + "divl %%ecx \n" + + : "=a" (r_), "=d" (rest_) + : "0" (b), "1" (a), "c" (c) + : "cc" ); + + #endif + + + *r = r_; + *rest = rest_; + + } + + + +} //namespace + + + +#endif //ifdef TTMATH_PLATFORM32 +#endif //ifndef TTMATH_NOASM +#endif diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86_64.h b/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86_64.h new file mode 100644 index 00000000..188fc5e7 --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86_64.h @@ -0,0 +1,1146 @@ +/* + * This file is a part of TTMath Bignum Library + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2010, Tomasz Sowa + * 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 Tomasz Sowa nor the names of contributors to this + * project 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. + */ + + +#ifndef headerfilettmathuint_x86_64 +#define headerfilettmathuint_x86_64 + + +#ifndef TTMATH_NOASM +#ifdef TTMATH_PLATFORM64 + + +/*! + \file ttmathuint_x86_64.h + \brief template class UInt with assembler code for 64bit x86_64 processors + + this file is included at the end of ttmathuint.h +*/ + +#ifndef __GNUC__ +#include +#endif + + +namespace ttmath +{ + + #ifndef __GNUC__ + + extern "C" + { + uint __fastcall ttmath_adc_x64(uint* p1, const uint* p2, uint nSize, uint c); + uint __fastcall ttmath_addindexed_x64(uint* p1, uint nSize, uint nPos, uint nValue); + uint __fastcall ttmath_addindexed2_x64(uint* p1, uint nSize, uint nPos, uint nValue1, uint nValue2); + uint __fastcall ttmath_addvector_x64(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result); + uint __fastcall ttmath_sbb_x64(uint* p1, const uint* p2, uint nSize, uint c); + uint __fastcall ttmath_subindexed_x64(uint* p1, uint nSize, uint nPos, uint nValue); + uint __fastcall ttmath_subvector_x64(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result); + uint __fastcall ttmath_rcl_x64(uint* p1, uint nSize, uint nLowestBit); + uint __fastcall ttmath_rcr_x64(uint* p1, uint nSize, uint nLowestBit); + uint __fastcall ttmath_div_x64(uint* pnValHi, uint* pnValLo, uint nDiv); + uint __fastcall ttmath_rcl2_x64(uint* p1, uint nSize, uint nBits, uint c); + uint __fastcall ttmath_rcr2_x64(uint* p1, uint nSize, uint nBits, uint c); + }; + #endif + + + /*! + returning the string represents the currect type of the library + we have following types: + asm_vc_32 - with asm code designed for Microsoft Visual C++ (32 bits) + asm_gcc_32 - with asm code designed for GCC (32 bits) + asm_vc_64 - with asm for VC (64 bit) + asm_gcc_64 - with asm for GCC (64 bit) + no_asm_32 - pure C++ version (32 bit) - without any asm code + no_asm_64 - pure C++ version (64 bit) - without any asm code + */ + template + const char * UInt::LibTypeStr() + { + #ifndef __GNUC__ + static const char info[] = "asm_vc_64"; + #endif + + #ifdef __GNUC__ + static const char info[] = "asm_gcc_64"; + #endif + + return info; + } + + + /*! + returning the currect type of the library + */ + template + LibTypeCode UInt::LibType() + { + #ifndef __GNUC__ + LibTypeCode info = asm_vc_64; + #endif + + #ifdef __GNUC__ + LibTypeCode info = asm_gcc_64; + #endif + + return info; + } + + + /*! + * + * basic mathematic functions + * + */ + + + + /*! + this method adding ss2 to the this and adding carry if it's defined + (this = this + ss2 + c) + + ***this method is created only on a 64bit platform*** + + c must be zero or one (might be a bigger value than 1) + function returns carry (1) (if it was) + */ + template + uint UInt::Add(const UInt & ss2, uint c) + { + uint b = value_size; + uint * p1 = table; + const uint * p2 = ss2.table; + + // we don't have to use TTMATH_REFERENCE_ASSERT here + // this algorithm doesn't require it + + #ifndef __GNUC__ + c = ttmath_adc_x64(p1,p2,b,c); + #endif + + #ifdef __GNUC__ + uint dummy, dummy2; + + /* + this part should be compiled with gcc + */ + __asm__ __volatile__( + + "xorq %%rdx, %%rdx \n" + "negq %%rax \n" // CF=1 if rax!=0 , CF=0 if rax==0 + + "1: \n" + "movq (%%rsi,%%rdx,8), %%rax \n" + "adcq %%rax, (%%rbx,%%rdx,8) \n" + + "incq %%rdx \n" + "decq %%rcx \n" + "jnz 1b \n" + + "adcq %%rcx, %%rcx \n" + + : "=c" (c), "=a" (dummy), "=d" (dummy2) + : "0" (b), "1" (c), "b" (p1), "S" (p2) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::Add", c) + + return c; + } + + + + /*! + this method adds one word (at a specific position) + and returns a carry (if it was) + + ***this method is created only on a 64bit platform*** + + + if we've got (value_size=3): + table[0] = 10; + table[1] = 30; + table[2] = 5; + and we call: + AddInt(2,1) + then it'll be: + table[0] = 10; + table[1] = 30 + 2; + table[2] = 5; + + of course if there was a carry from table[2] it would be returned + */ + template + uint UInt::AddInt(uint value, uint index) + { + uint b = value_size; + uint * p1 = table; + uint c; + + TTMATH_ASSERT( index < value_size ) + + #ifndef __GNUC__ + c = ttmath_addindexed_x64(p1,b,index,value); + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + + __asm__ __volatile__( + + "subq %%rdx, %%rcx \n" + + "1: \n" + "addq %%rax, (%%rbx,%%rdx,8) \n" + "jnc 2f \n" + + "movq $1, %%rax \n" + "incq %%rdx \n" + "decq %%rcx \n" + "jnz 1b \n" + + "2: \n" + "setc %%al \n" + "movzx %%al, %%rdx \n" + + : "=d" (c), "=a" (dummy), "=c" (dummy2) + : "0" (index), "1" (value), "2" (b), "b" (p1) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::AddInt", c) + + return c; + } + + + + /*! + this method adds only two unsigned words to the existing value + and these words begin on the 'index' position + (it's used in the multiplication algorithm 2) + + ***this method is created only on a 64bit platform*** + + index should be equal or smaller than value_size-2 (index <= value_size-2) + x1 - lower word, x2 - higher word + + for example if we've got value_size equal 4 and: + table[0] = 3 + table[1] = 4 + table[2] = 5 + table[3] = 6 + then let + x1 = 10 + x2 = 20 + and + index = 1 + + the result of this method will be: + table[0] = 3 + table[1] = 4 + x1 = 14 + table[2] = 5 + x2 = 25 + table[3] = 6 + + and no carry at the end of table[3] + + (of course if there was a carry in table[2](5+20) then + this carry would be passed to the table[3] etc.) + */ + template + uint UInt::AddTwoInts(uint x2, uint x1, uint index) + { + uint b = value_size; + uint * p1 = table; + uint c; + + TTMATH_ASSERT( index < value_size - 1 ) + + #ifndef __GNUC__ + c = ttmath_addindexed2_x64(p1,b,index,x1,x2); + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + + __asm__ __volatile__( + + "subq %%rdx, %%rcx \n" + + "addq %%rsi, (%%rbx,%%rdx,8) \n" + "incq %%rdx \n" + "decq %%rcx \n" + + "1: \n" + "adcq %%rax, (%%rbx,%%rdx,8) \n" + "jnc 2f \n" + + "mov $0, %%rax \n" + "incq %%rdx \n" + "decq %%rcx \n" + "jnz 1b \n" + + "2: \n" + "setc %%al \n" + "movzx %%al, %%rax \n" + + : "=a" (c), "=c" (dummy), "=d" (dummy2) + : "0" (x2), "1" (b), "2" (index), "b" (p1), "S" (x1) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::AddTwoInts", c) + + return c; + } + + + + /*! + this static method addes one vector to the other + 'ss1' is larger in size or equal to 'ss2' + + ss1 points to the first (larger) vector + ss2 points to the second vector + ss1_size - size of the ss1 (and size of the result too) + ss2_size - size of the ss2 + result - is the result vector (which has size the same as ss1: ss1_size) + + Example: ss1_size is 5, ss2_size is 3 + ss1: ss2: result (output): + 5 1 5+1 + 4 3 4+3 + 2 7 2+7 + 6 6 + 9 9 + of course the carry is propagated and will be returned from the last item + (this method is used by the Karatsuba multiplication algorithm) + */ + template + uint UInt::AddVector(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result) + { + TTMATH_ASSERT( ss1_size >= ss2_size ) + + uint c; + + #ifndef __GNUC__ + c = ttmath_addvector_x64(ss1, ss2, ss1_size, ss2_size, result); + #endif + + + #ifdef __GNUC__ + uint dummy1, dummy2, dummy3; + uint rest = ss1_size - ss2_size; + + // this part should be compiled with gcc + + __asm__ __volatile__( + "mov %%rdx, %%r8 \n" + "xor %%rdx, %%rdx \n" // rdx = 0, cf = 0 + "1: \n" + "mov (%%rsi,%%rdx,8), %%rax \n" + "adc (%%rbx,%%rdx,8), %%rax \n" + "mov %%rax, (%%rdi,%%rdx,8) \n" + + "inc %%rdx \n" + "dec %%rcx \n" + "jnz 1b \n" + + "adc %%rcx, %%rcx \n" // rcx has the cf state + + "or %%r8, %%r8 \n" + "jz 3f \n" + + "xor %%rbx, %%rbx \n" // ebx = 0 + "neg %%rcx \n" // setting cf from rcx + "mov %%r8, %%rcx \n" // rcx=rest and is != 0 + "2: \n" + "mov (%%rsi, %%rdx, 8), %%rax \n" + "adc %%rbx, %%rax \n" + "mov %%rax, (%%rdi, %%rdx, 8) \n" + + "inc %%rdx \n" + "dec %%rcx \n" + "jnz 2b \n" + + "adc %%rcx, %%rcx \n" + "3: \n" + + : "=a" (dummy1), "=b" (dummy2), "=c" (c), "=d" (dummy3) + : "1" (ss2), "2" (ss2_size), "3" (rest), "S" (ss1), "D" (result) + : "%r8", "cc", "memory" ); + + #endif + + TTMATH_VECTOR_LOGC("UInt::AddVector", c, result, ss1_size) + + return c; + } + + + + /*! + this method's subtracting ss2 from the 'this' and subtracting + carry if it has been defined + (this = this - ss2 - c) + + ***this method is created only on a 64bit platform*** + + c must be zero or one (might be a bigger value than 1) + function returns carry (1) (if it was) + */ + template + uint UInt::Sub(const UInt & ss2, uint c) + { + uint b = value_size; + uint * p1 = table; + const uint * p2 = ss2.table; + + // we don't have to use TTMATH_REFERENCE_ASSERT here + // this algorithm doesn't require it + + #ifndef __GNUC__ + c = ttmath_sbb_x64(p1,p2,b,c); + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + + __asm__ __volatile__( + + "xorq %%rdx, %%rdx \n" + "negq %%rax \n" // CF=1 if rax!=0 , CF=0 if rax==0 + + "1: \n" + "movq (%%rsi,%%rdx,8), %%rax \n" + "sbbq %%rax, (%%rbx,%%rdx,8) \n" + + "incq %%rdx \n" + "decq %%rcx \n" + "jnz 1b \n" + + "adcq %%rcx, %%rcx \n" + + : "=c" (c), "=a" (dummy), "=d" (dummy2) + : "0" (b), "1" (c), "b" (p1), "S" (p2) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::Sub", c) + + return c; + } + + + + /*! + this method subtracts one word (at a specific position) + and returns a carry (if it was) + + ***this method is created only on a 64bit platform*** + + if we've got (value_size=3): + table[0] = 10; + table[1] = 30; + table[2] = 5; + and we call: + SubInt(2,1) + then it'll be: + table[0] = 10; + table[1] = 30 - 2; + table[2] = 5; + + of course if there was a carry from table[2] it would be returned + */ + template + uint UInt::SubInt(uint value, uint index) + { + uint b = value_size; + uint * p1 = table; + uint c; + + TTMATH_ASSERT( index < value_size ) + + #ifndef __GNUC__ + c = ttmath_subindexed_x64(p1,b,index,value); + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + + __asm__ __volatile__( + + "subq %%rdx, %%rcx \n" + + "1: \n" + "subq %%rax, (%%rbx,%%rdx,8) \n" + "jnc 2f \n" + + "movq $1, %%rax \n" + "incq %%rdx \n" + "decq %%rcx \n" + "jnz 1b \n" + + "2: \n" + "setc %%al \n" + "movzx %%al, %%rdx \n" + + : "=d" (c), "=a" (dummy), "=c" (dummy2) + : "0" (index), "1" (value), "2" (b), "b" (p1) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::SubInt", c) + + return c; + } + + + /*! + this static method subtractes one vector from the other + 'ss1' is larger in size or equal to 'ss2' + + ss1 points to the first (larger) vector + ss2 points to the second vector + ss1_size - size of the ss1 (and size of the result too) + ss2_size - size of the ss2 + result - is the result vector (which has size the same as ss1: ss1_size) + + Example: ss1_size is 5, ss2_size is 3 + ss1: ss2: result (output): + 5 1 5-1 + 4 3 4-3 + 2 7 2-7 + 6 6-1 (the borrow from previous item) + 9 9 + return (carry): 0 + of course the carry (borrow) is propagated and will be returned from the last item + (this method is used by the Karatsuba multiplication algorithm) + */ + template + uint UInt::SubVector(const uint * ss1, const uint * ss2, uint ss1_size, uint ss2_size, uint * result) + { + TTMATH_ASSERT( ss1_size >= ss2_size ) + + uint c; + + #ifndef __GNUC__ + c = ttmath_subvector_x64(ss1, ss2, ss1_size, ss2_size, result); + #endif + + + #ifdef __GNUC__ + + // the asm code is nearly the same as in AddVector + // only two instructions 'adc' are changed to 'sbb' + + uint dummy1, dummy2, dummy3; + uint rest = ss1_size - ss2_size; + + __asm__ __volatile__( + "mov %%rdx, %%r8 \n" + "xor %%rdx, %%rdx \n" // rdx = 0, cf = 0 + "1: \n" + "mov (%%rsi,%%rdx,8), %%rax \n" + "sbb (%%rbx,%%rdx,8), %%rax \n" + "mov %%rax, (%%rdi,%%rdx,8) \n" + + "inc %%rdx \n" + "dec %%rcx \n" + "jnz 1b \n" + + "adc %%rcx, %%rcx \n" // rcx has the cf state + + "or %%r8, %%r8 \n" + "jz 3f \n" + + "xor %%rbx, %%rbx \n" // ebx = 0 + "neg %%rcx \n" // setting cf from rcx + "mov %%r8, %%rcx \n" // rcx=rest and is != 0 + "2: \n" + "mov (%%rsi, %%rdx, 8), %%rax \n" + "sbb %%rbx, %%rax \n" + "mov %%rax, (%%rdi, %%rdx, 8) \n" + + "inc %%rdx \n" + "dec %%rcx \n" + "jnz 2b \n" + + "adc %%rcx, %%rcx \n" + "3: \n" + + : "=a" (dummy1), "=b" (dummy2), "=c" (c), "=d" (dummy3) + : "1" (ss2), "2" (ss2_size), "3" (rest), "S" (ss1), "D" (result) + : "%r8", "cc", "memory" ); + + #endif + + TTMATH_VECTOR_LOGC("UInt::SubVector", c, result, ss1_size) + + return c; + } + + + /*! + this method moves all bits into the left hand side + return value <- this <- c + + the lowest *bit* will be held the 'c' and + the state of one additional bit (on the left hand side) + will be returned + + for example: + let this is 001010000 + after Rcl2_one(1) there'll be 010100001 and Rcl2_one returns 0 + + ***this method is created only on a 64bit platform*** + */ + template + uint UInt::Rcl2_one(uint c) + { + sint b = value_size; + uint * p1 = table; + + + #ifndef __GNUC__ + c = ttmath_rcl_x64(p1,b,c); + #endif + + + #ifdef __GNUC__ + uint dummy, dummy2; + + __asm__ __volatile__( + + "xorq %%rdx, %%rdx \n" // rdx=0 + "negq %%rax \n" // CF=1 if rax!=0 , CF=0 if rax==0 + + "1: \n" + "rclq $1, (%%rbx, %%rdx, 8) \n" + + "incq %%rdx \n" + "decq %%rcx \n" + "jnz 1b \n" + + "adcq %%rcx, %%rcx \n" + + : "=c" (c), "=a" (dummy), "=d" (dummy2) + : "0" (b), "1" (c), "b" (p1) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::Rcl2_one", c) + + return c; + } + + + /*! + this method moves all bits into the right hand side + c -> this -> return value + + the highest *bit* will be held the 'c' and + the state of one additional bit (on the right hand side) + will be returned + + for example: + let this is 000000010 + after Rcr2_one(1) there'll be 100000001 and Rcr2_one returns 0 + + ***this method is created only on a 64bit platform*** + */ + template + uint UInt::Rcr2_one(uint c) + { + sint b = value_size; + uint * p1 = table; + + + #ifndef __GNUC__ + c = ttmath_rcr_x64(p1,b,c); + #endif + + + #ifdef __GNUC__ + uint dummy; + + __asm__ __volatile__( + + "negq %%rax \n" // CF=1 if rax!=0 , CF=0 if rax==0 + + "1: \n" + "rcrq $1, -8(%%rbx, %%rcx, 8) \n" + + "decq %%rcx \n" + "jnz 1b \n" + + "adcq %%rcx, %%rcx \n" + + : "=c" (c), "=a" (dummy) + : "0" (b), "1" (c), "b" (p1) + : "cc", "memory" ); + + #endif + + TTMATH_LOGC("UInt::Rcr2_one", c) + + return c; + } + + + + /*! + this method moves all bits into the left hand side + return value <- this <- c + + the lowest *bits* will be held the 'c' and + the state of one additional bit (on the left hand side) + will be returned + + for example: + let this is 001010000 + after Rcl2(3, 1) there'll be 010000111 and Rcl2 returns 1 + + ***this method is created only on a 64bit platform*** + */ + template + uint UInt::Rcl2(uint bits, uint c) + { + TTMATH_ASSERT( bits>0 && bits this -> return value + + the highest *bits* will be held the 'c' and + the state of one additional bit (on the right hand side) + will be returned + + for example: + let this is 000000010 + after Rcr2(2, 1) there'll be 110000000 and Rcr2 returns 1 + + ***this method is created only on a 64bit platform*** + */ + template + uint UInt::Rcr2(uint bits, uint c) + { + TTMATH_ASSERT( bits>0 && bits + sint UInt::FindLeadingBitInWord(uint x) + { + sint result; + + + #ifndef __GNUC__ + + unsigned long nIndex = 0; + + if( _BitScanReverse64(&nIndex,x) == 0 ) + result = -1; + else + result = nIndex; + + #endif + + + #ifdef __GNUC__ + uint dummy; + + __asm__ ( + + "movq $-1, %1 \n" + "bsrq %2, %0 \n" + "cmovz %1, %0 \n" + + : "=r" (result), "=&r" (dummy) + : "r" (x) + : "cc" ); + + #endif + + + return result; + } + + + /* + this method returns the number of the highest set bit in one 64-bit word + if the 'x' is zero this method returns '-1' + + ***this method is created only on a 64bit platform*** + */ + template + sint UInt::FindLowestBitInWord(uint x) + { + sint result; + + + #ifndef __GNUC__ + + unsigned long nIndex = 0; + + if( _BitScanForward64(&nIndex,x) == 0 ) + result = -1; + else + result = nIndex; + + #endif + + + #ifdef __GNUC__ + uint dummy; + + __asm__ ( + + "movq $-1, %1 \n" + "bsfq %2, %0 \n" + "cmovz %1, %0 \n" + + : "=r" (result), "=&r" (dummy) + : "r" (x) + : "cc" ); + + #endif + + + return result; + } + + + /*! + this method sets a special bit in the 'value' + and returns the last state of the bit (zero or one) + + ***this method is created only on a 64bit platform*** + + bit is from <0,63> + + e.g. + uint x = 100; + uint bit = SetBitInWord(x, 3); + now: x = 108 and bit = 0 + */ + template + uint UInt::SetBitInWord(uint & value, uint bit) + { + TTMATH_ASSERT( bit < TTMATH_BITS_PER_UINT ) + + uint old_bit; + uint v = value; + + + #ifndef __GNUC__ + old_bit = _bittestandset64((__int64*)&value,bit) != 0; + #endif + + + #ifdef __GNUC__ + + __asm__ ( + + "btsq %%rbx, %%rax \n" + "setc %%bl \n" + "movzx %%bl, %%rbx \n" + + : "=a" (v), "=b" (old_bit) + : "0" (v), "1" (bit) + : "cc" ); + + #endif + + value = v; + + return old_bit; + } + + + /*! + * + * Multiplication + * + * + */ + + + /*! + multiplication: result_high:result_low = a * b + result_high - higher word of the result + result_low - lower word of the result + + this methos never returns a carry + this method is used in the second version of the multiplication algorithms + + ***this method is created only on a 64bit platform*** + */ + template + void UInt::MulTwoWords(uint a, uint b, uint * result_high, uint * result_low) + { + /* + we must use these temporary variables in order to inform the compilator + that value pointed with result1 and result2 has changed + + this has no effect in visual studio but it's usefull when + using gcc and options like -O + */ + uint result1_; + uint result2_; + + + #ifndef __GNUC__ + result1_ = _umul128(a,b,&result2_); + #endif + + + #ifdef __GNUC__ + + __asm__ ( + + "mulq %%rdx \n" + + : "=a" (result1_), "=d" (result2_) + : "0" (a), "1" (b) + : "cc" ); + + #endif + + + *result_low = result1_; + *result_high = result2_; + } + + + + + /*! + * + * Division + * + * + */ + + + /*! + this method calculates 64bits word a:b / 32bits c (a higher, b lower word) + r = a:b / c and rest - remainder + + ***this method is created only on a 64bit platform*** + + * + * WARNING: + * if r (one word) is too small for the result or c is equal zero + * there'll be a hardware interruption (0) + * and probably the end of your program + * + */ + template + void UInt::DivTwoWords(uint a,uint b, uint c, uint * r, uint * rest) + { + uint r_; + uint rest_; + /* + these variables have similar meaning like those in + the multiplication algorithm MulTwoWords + */ + + TTMATH_ASSERT( c != 0 ) + + + #ifndef __GNUC__ + + ttmath_div_x64(&a,&b,c); + r_ = a; + rest_ = b; + + #endif + + + #ifdef __GNUC__ + + __asm__ ( + + "divq %%rcx \n" + + : "=a" (r_), "=d" (rest_) + : "d" (a), "a" (b), "c" (c) + : "cc" ); + + #endif + + + *r = r_; + *rest = rest_; + } + +} //namespace + + +#endif //ifdef TTMATH_PLATFORM64 +#endif //ifndef TTMATH_NOASM +#endif + + diff --git a/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86_64_msvc.asm b/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86_64_msvc.asm new file mode 100644 index 00000000..b7c85c2b --- /dev/null +++ b/3rd_party/ttmath-0.9.3/ttmath/ttmathuint_x86_64_msvc.asm @@ -0,0 +1,548 @@ +; +; This file is a part of TTMath Bignum Library +; and is distributed under the (new) BSD licence. +; Author: Christian Kaiser +; + +; +; Copyright (c) 2009, Christian Kaiser +; 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 Christian Kaiser nor the names of contributors to this +; project 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. +; + +; +; compile with debug info: ml64.exe /c /Zd /Zi ttmathuint_x86_64_msvc.asm +; compile without debug info: ml64.exe /c ttmathuint_x86_64_msvc.asm +; this creates ttmathuint_x86_64_msvc.obj file which can be linked with your program +; + +PUBLIC ttmath_adc_x64 +PUBLIC ttmath_addindexed_x64 +PUBLIC ttmath_addindexed2_x64 +PUBLIC ttmath_addvector_x64 + +PUBLIC ttmath_sbb_x64 +PUBLIC ttmath_subindexed_x64 +PUBLIC ttmath_subvector_x64 + +PUBLIC ttmath_rcl_x64 +PUBLIC ttmath_rcr_x64 + +PUBLIC ttmath_rcl2_x64 +PUBLIC ttmath_rcr2_x64 + +PUBLIC ttmath_div_x64 + +; +; Microsoft x86_64 convention: http://msdn.microsoft.com/en-us/library/9b372w95.aspx +; +; "rax, rcx, rdx, r8-r11 are volatile." +; "rbx, rbp, rdi, rsi, r12-r15 are nonvolatile." +; + + +.CODE + + + ALIGN 8 + +;---------------------------------------- + +ttmath_adc_x64 PROC + ; rcx = p1 + ; rdx = p2 + ; r8 = nSize + ; r9 = nCarry + + xor rax, rax + xor r11, r11 + sub rax, r9 ; sets CARRY if r9 != 0 + + ALIGN 16 + loop1: + mov rax,qword ptr [rdx + r11 * 8] + adc qword ptr [rcx + r11 * 8], rax + lea r11, [r11+1] + dec r8 + jnz loop1 + + setc al + movzx rax, al + + ret + +ttmath_adc_x64 ENDP + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + +ttmath_addindexed_x64 PROC + + ; rcx = p1 + ; rdx = nSize + ; r8 = nPos + ; r9 = nValue + + xor rax, rax ; rax = result + sub rdx, r8 ; rdx = remaining count of uints + + add qword ptr [rcx + r8 * 8], r9 + jc next1 + + ret + +next1: + mov r9, 1 + + ALIGN 16 +loop1: + dec rdx + jz done_with_cy + lea r8, [r8+1] + add qword ptr [rcx + r8 * 8], r9 + jc loop1 + + ret + +done_with_cy: + lea rax, [rax+1] ; rax = 1 + + ret + +ttmath_addindexed_x64 ENDP + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + +ttmath_addindexed2_x64 PROC + + ; rcx = p1 (pointer) + ; rdx = b (value size) + ; r8 = nPos + ; r9 = nValue1 + ; [esp+0x28] = nValue2 + + xor rax, rax ; return value + mov r11, rcx ; table + sub rdx, r8 ; rdx = remaining count of uints + mov r10, [esp+028h] ; r10 = nValue2 + + add qword ptr [r11 + r8 * 8], r9 + lea r8, [r8+1] + lea rdx, [rdx-1] + adc qword ptr [r11 + r8 * 8], r10 + jc next + ret + + ALIGN 16 +loop1: + lea r8, [r8+1] + add qword ptr [r11 + r8 * 8], 1 + jc next + ret + +next: + dec rdx ; does not modify CY too... + jnz loop1 + lea rax, [rax+1] + ret + +ttmath_addindexed2_x64 ENDP + + + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + + +ttmath_addvector_x64 PROC + ; rcx = ss1 + ; rdx = ss2 + ; r8 = ss1_size + ; r9 = ss2_size + ; [esp+0x28] = result + + mov r10, [esp+028h] + sub r8, r9 + xor r11, r11 ; r11=0, cf=0 + + ALIGN 16 + loop1: + mov rax, qword ptr [rcx + r11 * 8] + adc rax, qword ptr [rdx + r11 * 8] + mov qword ptr [r10 + r11 * 8], rax + inc r11 + dec r9 + jnz loop1 + + adc r9, r9 ; r9 has the cf state + + or r8, r8 + jz done + + neg r9 ; setting cf from r9 + mov r9, 0 ; don't use xor here (cf is used) + loop2: + mov rax, qword ptr [rcx + r11 * 8] + adc rax, r9 + mov qword ptr [r10 + r11 * 8], rax + inc r11 + dec r8 + jnz loop2 + + adc r8, r8 + mov rax, r8 + + ret + +done: + mov rax, r9 + ret + +ttmath_addvector_x64 ENDP + + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + +ttmath_sbb_x64 PROC + + ; rcx = p1 + ; rdx = p2 + ; r8 = nCount + ; r9 = nCarry + + xor rax, rax + xor r11, r11 + sub rax, r9 ; sets CARRY if r9 != 0 + + ALIGN 16 + loop1: + mov rax,qword ptr [rdx + r11 * 8] + sbb qword ptr [rcx + r11 * 8], rax + lea r11, [r11+1] + dec r8 + jnz loop1 + + setc al + movzx rax, al + + ret + +ttmath_sbb_x64 ENDP + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + +ttmath_subindexed_x64 PROC + ; rcx = p1 + ; rdx = nSize + ; r8 = nPos + ; r9 = nValue + + sub rdx, r8 ; rdx = remaining count of uints + + ALIGN 16 +loop1: + sub qword ptr [rcx + r8 * 8], r9 + jnc done + + lea r8, [r8+1] + mov r9, 1 + dec rdx + jnz loop1 + + mov rax, 1 + ret + +done: + xor rax, rax + ret + +ttmath_subindexed_x64 ENDP + + + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + +; the same asm code as in addvector_x64 only two instructions 'adc' changed to 'sbb' + +ttmath_subvector_x64 PROC + ; rcx = ss1 + ; rdx = ss2 + ; r8 = ss1_size + ; r9 = ss2_size + ; [esp+0x28] = result + + mov r10, [esp+028h] + sub r8, r9 + xor r11, r11 ; r11=0, cf=0 + + ALIGN 16 + loop1: + mov rax, qword ptr [rcx + r11 * 8] + sbb rax, qword ptr [rdx + r11 * 8] + mov qword ptr [r10 + r11 * 8], rax + inc r11 + dec r9 + jnz loop1 + + adc r9, r9 ; r9 has the cf state + + or r8, r8 + jz done + + neg r9 ; setting cf from r9 + mov r9, 0 ; don't use xor here (cf is used) + loop2: + mov rax, qword ptr [rcx + r11 * 8] + sbb rax, r9 + mov qword ptr [r10 + r11 * 8], rax + inc r11 + dec r8 + jnz loop2 + + adc r8, r8 + mov rax, r8 + + ret + +done: + mov rax, r9 + ret + +ttmath_subvector_x64 ENDP + + + + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + +ttmath_rcl_x64 PROC + ; rcx = p1 + ; rdx = b + ; r8 = nLowestBit + + mov r11, rcx ; table + xor r10, r10 + neg r8 ; CY set if r8 <> 0 + + ALIGN 16 +loop1: + rcl qword ptr [r11 + r10 * 8], 1 + lea r10, [r10+1] + dec rdx + jnz loop1 + + setc al + movzx rax, al + + ret + +ttmath_rcl_x64 ENDP + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + +ttmath_rcr_x64 PROC + ; rcx = p1 + ; rdx = nSize + ; r8 = nLowestBit + + xor r10, r10 + neg r8 ; CY set if r8 <> 0 + + ALIGN 16 +loop1: + rcr qword ptr -8[rcx + rdx * 8], 1 + dec rdx + jnz loop1 + + setc al + movzx rax, al + + ret + +ttmath_rcr_x64 ENDP + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + +ttmath_div_x64 PROC + + ; rcx = &Hi + ; rdx = &Lo + ; r8 = nDiv + + mov r11, rcx + mov r10, rdx + + mov rdx, qword ptr [r11] + mov rax, qword ptr [r10] + div r8 + mov qword ptr [r10], rdx ; remainder + mov qword ptr [r11], rax ; value + + ret + +ttmath_div_x64 ENDP + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + +ttmath_rcl2_x64 PROC + ; rcx = p1 + ; rdx = nSize + ; r8 = bits + ; r9 = c + + push rbx + + mov r10, rcx ; r10 = p1 + xor rax, rax + + mov rcx, 64 + sub rcx, r8 + + mov r11, -1 + shr r11, cl ; r11 = mask + + mov rcx, r8 ; rcx = count of bits + + mov rbx, rax ; rbx = old value = 0 + or r9, r9 + cmovnz rbx, r11 ; if (c) then old value = mask + + mov r9, rax ; r9 = index (0..nSize-1) + + ALIGN 16 +loop1: + rol qword ptr [r10+r9*8], cl + mov rax, qword ptr [r10+r9*8] + and rax, r11 + xor qword ptr [r10+r9*8], rax + or qword ptr [r10+r9*8], rbx + mov rbx, rax + + lea r9, [r9+1] + dec rdx + + jnz loop1 + + and rax, 1 + pop rbx + ret + +ttmath_rcl2_x64 ENDP + +;---------------------------------------- + + ALIGN 8 + +;---------------------------------------- + +ttmath_rcr2_x64 PROC + ; rcx = p1 + ; rdx = nSize + ; r8 = bits + ; r9 = c + + push rbx + mov r10, rcx ; r10 = p1 + xor rax, rax + + mov rcx, 64 + sub rcx, r8 + + mov r11, -1 + shl r11, cl ; r11 = mask + + mov rcx, r8 ; rcx = count of bits + + mov rbx, rax ; rbx = old value = 0 + or r9, r9 + cmovnz rbx, r11 ; if (c) then old value = mask + + mov r9, rdx ; r9 = index (0..nSize-1) + lea r9, [r9-1] + + ALIGN 16 +loop1: + ror qword ptr [r10+r9*8], cl + mov rax, qword ptr [r10+r9*8] + and rax, r11 + xor qword ptr [r10+r9*8], rax + or qword ptr [r10+r9*8], rbx + mov rbx, rax + + lea r9, [r9-1] + dec rdx + + jnz loop1 + + rol rax, 1 + and rax, 1 + pop rbx + + ret + +ttmath_rcr2_x64 ENDP + +END diff --git a/3rd_party/winfsp-1.10/License.txt b/3rd_party/winfsp-1.10/License.txt new file mode 100644 index 00000000..01afcd10 --- /dev/null +++ b/3rd_party/winfsp-1.10/License.txt @@ -0,0 +1,708 @@ +The WinFsp project is Copyright (C) Bill Zissimopoulos. It is licensed +under the terms of the GPLv3. + +As a special exception to GPLv3, Bill Zissimopoulos grants additional +permissions to Free/Libre and Open Source Software ("FLOSS") without requiring +that such software is covered by the GPLv3. + + 1. Permission to link with a platform specific version of the WinFsp DLL + (one of: winfsp-x64.dll, winfsp-x86.dll, winfsp-msil.dll). + + 2. Permission to distribute unmodified binary releases of the WinFsp + installer (as released by the WinFsp project). + + These permissions (and no other) are granted provided that the software: + + 1. Is distributed under a license that satisfies the Free Software + Definition Version 1.141 (https://www.gnu.org/philosophy/free-sw.en.html) + or the Open Source Definition Version 1.9 (https://opensource.org/osd). + + 2. Includes the copyright notice "WinFsp - Windows File System Proxy, + Copyright (C) Bill Zissimopoulos" and a link to the WinFsp repository in + its user-interface and any user-facing documentation. + + 3. Is not linked or distributed with proprietary (non-FLOSS) software. + [You cannot mix FLOSS and proprietary software while using WinFsp under + this special exception.] + +Commercial licensing options are also available: Please contact +Bill Zissimopoulos . + +The full text of the GPLv3 license follows below. + +----------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/3rd_party/winfsp-1.10/bin/diag.bat b/3rd_party/winfsp-1.10/bin/diag.bat new file mode 100644 index 00000000..18802b98 --- /dev/null +++ b/3rd_party/winfsp-1.10/bin/diag.bat @@ -0,0 +1,29 @@ +@echo off + +setlocal + +echo WINFSP INSTALLATION DIRECTORY AND LAUNCHER REGISTRATIONS +reg query HKLM\SOFTWARE\WinFsp /s /reg:32 +echo. + +echo WINFSP DLL REGISTRATIONS +reg query HKLM\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order +reg query HKLM\SYSTEM\CurrentControlSet\Services\WinFsp.Np\NetworkProvider +reg query HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Application\WinFsp +echo. + +echo WINFSP FSD CONFIGURATION AND STATUS +sc query WinFsp +sc qc WinFsp +sc sdshow WinFsp +echo. + +echo WINFSP LAUNCHER SERVICE CONFIGURATION AND STATUS +sc query WinFsp.Launcher +sc qc WinFsp.Launcher +sc sdshow WinFsp.Launcher +echo. + +echo OS INFORMATION +systeminfo +echo. diff --git a/3rd_party/winfsp-1.10/bin/fsptool-x64.exe b/3rd_party/winfsp-1.10/bin/fsptool-x64.exe new file mode 100644 index 0000000000000000000000000000000000000000..e21459c6a061fcbdbeebcff54413ccc5a27cbeb1 GIT binary patch literal 10240 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 literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/bin/fsptool-x86.exe b/3rd_party/winfsp-1.10/bin/fsptool-x86.exe new file mode 100644 index 0000000000000000000000000000000000000000..71036bee8c668ce27b2ecdc3e01af4717bd0afab GIT binary patch literal 9216 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 +exit /b 2 + +:usage +echo usage: fsreg NAME EXECUTABLE COMMANDLINE [SECURITY] >&2 +echo usage: fsreg -u NAME >&2 +exit /b 2 diff --git a/3rd_party/winfsp-1.10/bin/launchctl-x64.exe b/3rd_party/winfsp-1.10/bin/launchctl-x64.exe new file mode 100644 index 0000000000000000000000000000000000000000..3868f565d5bc221aeb89c4ef6f948522d5ac3682 GIT binary patch literal 7168 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 literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/bin/launchctl-x86.exe b/3rd_party/winfsp-1.10/bin/launchctl-x86.exe new file mode 100644 index 0000000000000000000000000000000000000000..60ecf4a84cfad5f4d98da608476935a726761012 GIT binary patch literal 7168 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 literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/bin/memfs-x64.exe b/3rd_party/winfsp-1.10/bin/memfs-x64.exe new file mode 100644 index 0000000000000000000000000000000000000000..7aff6b7b85c65ce3f65c8ed46f04fe0e2d359d3e GIT binary patch literal 152576 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
  • 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 literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/bin/memfs-x86.exe b/3rd_party/winfsp-1.10/bin/memfs-x86.exe new file mode 100644 index 0000000000000000000000000000000000000000..62c1c7a99ca9b66f298eb4f1bd1380eeb717efb1 GIT binary patch literal 123392 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 + + + winfsp-msil + + + +

    + Provides the base class that user mode file systems must inherit from. + + + + + Provides a means to customize the returned status code when an exception happens. + + + STATUS_SUCCESS or error code. + + + + Occurs just before the file system is mounted. + File systems may override this method to configure the file system host. + + + The file system host that is mounting this file system. + + STATUS_SUCCESS or error code. + + + + Occurs just after the file system is mounted, + but prior to receiving any file system operation. + + + The file system host that is mounting this file system. + + STATUS_SUCCESS or error code. + + + + Occurs just after the file system is unmounted. + No other file system operations will be received on this file system. + + + The file system host that is mounting this file system. + + + + + Gets the volume information. + + + Receives the volume information. + + STATUS_SUCCESS or error code. + + + + Sets the volume label. + + + The new label for the volume. + + + Receives the updated volume information. + + STATUS_SUCCESS or error code. + + + + Gets file or directory attributes and security descriptor given a file name. + + + The name of the file or directory to get the attributes and security descriptor for. + + + Receives the file attributes on successful return. + If this call returns STATUS_REPARSE, the file system may place here the index of the + first reparse point within FileName. + + + Receives the file security descriptor. If the SecurityDescriptor parameter is null + on input the file system should not fill this value. + + + STATUS_SUCCESS, STATUS_REPARSE or error code. + STATUS_REPARSE should be returned by file systems that support reparse points when + they encounter a FileName that contains reparse points anywhere but the final path + component. + + + + + Creates a new file or directory. + + + The name of the file or directory to be created. + + + Create options for this request. + + + Determines the specific access rights that have been granted for this request. + + + File attributes to apply to the newly created file or directory. + + + Security descriptor to apply to the newly created file or directory. + + + Allocation size for the newly created file. + + + Receives the file node for the newly created file. + + + Receives the file descriptor for the newly created file. + + + Receives the file information for the newly created file. + + + Receives the normalized name for the newly created file. + + STATUS_SUCCESS or error code. + + + + Opens a file or directory. + + + The name of the file or directory to be opened. + + + Create options for this request. + + + Determines the specific access rights that have been granted for this request. + + + Receives the file node for the newly opened file. + + + Receives the file descriptor for the newly opened file. + + + Receives the file information for the newly opened file. + + + Receives the normalized name for the newly opened file. + + STATUS_SUCCESS or error code. + + + + Overwrites a file. + + + The file node for the file to be overwritten. + + + The file descriptor for the file to be overwritten. + + + File attributes to apply to the overwritten file. + + + When true the existing file attributes should be replaced with the new ones. + When false the existing file attributes should be merged (or'ed) with the new ones. + + + Allocation size for the overwritten file. + + + Receives the updated file information. + + STATUS_SUCCESS or error code. + + + + Cleans up a file or directory. + + + + When CreateFile is used to open or create a file the kernel creates a kernel mode file + object (type FILE_OBJECT) and a handle for it, which it returns to user-mode. The handle may + be duplicated (using DuplicateHandle), but all duplicate handles always refer to the same + file object. When all handles for a particular file object get closed (using CloseHandle) + the system sends a Cleanup request to the file system. + + There will be a Cleanup operation for every Create or Open operation posted to the user mode + file system. However the Cleanup operation is not the final close operation on a file. + The file system must be ready to receive additional operations until close time. This is true + even when the file is being deleted! + + The Flags parameter contains information about the cleanup operation: + + CleanupDelete - + An important function of the Cleanup operation is to complete a delete operation. Deleting + a file or directory in Windows is a three-stage process where the file is first opened, then + tested to see if the delete can proceed and if the answer is positive the file is then + deleted during Cleanup. + When this flag is set, this is the last outstanding cleanup for this particular file node. + + CleanupSetAllocationSize - + The NTFS and FAT file systems reset a file's allocation size when they receive the last + outstanding cleanup for a particular file node. User mode file systems that implement + allocation size and wish to duplicate the NTFS and FAT behavior can use this flag. + + CleanupSetArchiveBit - + File systems that support the archive bit should set the file node's archive bit when this + flag is set. + + CleanupSetLastAccessTime, CleanupSetLastWriteTime, CleanupSetChangeTime - + File systems should set the corresponding file time when each one of these flags is set. + Note that updating the last access time is expensive and a file system may choose to not + implement it. + + + + There is no way to report failure of this operation. This is a Windows limitation. + + + + The file node of the file or directory to cleanup. + + + The file descriptor of the file or directory to cleanup. + + + The name of the file or directory to cleanup. Sent only when a Delete is requested. + + + These flags determine whether the file was modified and whether to delete the file. + + + + + + + + Closes a file or directory. + + + The file node of the file or directory to close. + + + The file descriptor of the file or directory to close. + + + + + Reads a file. + + + The file node of the file to read. + + + The file descriptor of the file to read. + + + Pointer to a buffer that receives the results of the read operation. + + + Offset within the file to read from. + + + Length of data to read. + + + Receives the actual number of bytes read. + + STATUS_SUCCESS or error code. + + + + Writes a file. + + + The file node of the file to write. + + + The file descriptor of the file to write. + + + Pointer to a buffer that receives the results of the write operation. + + + Offset within the file to write to. + + + Length of data to write. + + + When true the file system must write to the current end of file. In this case the Offset + parameter will contain the value -1. + + + When true the file system must not extend the file (i.e. change the file size). + + + Receives the actual number of bytes written. + + + Receives the updated file information. + + STATUS_SUCCESS or error code. + + + + Flushes a file or volume. + + + Note that the FSD will also flush all file/volume caches prior to invoking this operation. + + + The file node of the file to flush. + When this and the FileDesc parameter are null the whole volume is being flushed. + + + The file descriptor of the file to flush. + When this and the FileNode parameter are null the whole volume is being flushed. + + + Receives the updated file information. + + STATUS_SUCCESS or error code. + + + + Gets file or directory information. + + + The file node of the file to get information for. + + + The file descriptor of the file to get information for. + + + Receives the file information. + + STATUS_SUCCESS or error code. + + + + Sets file or directory basic information. + + + The file node of the file to set information for. + + + The file descriptor of the file to set information for. + + + File attributes to apply to the file or directory. + If the value -1 is sent, the file attributes should not be changed. + + + Creation time to apply to the file or directory. + If the value 0 is sent, the creation time should not be changed. + + + Last access time to apply to the file or directory. + If the value 0 is sent, the last access time should not be changed. + + + Last write time to apply to the file or directory. + If the value 0 is sent, the last write time should not be changed. + + + Change time to apply to the file or directory. + If the value 0 is sent, the change time should not be changed. + + + Receives the updated file information. + + STATUS_SUCCESS or error code. + + + + Sets file/allocation size. + + + + This function is used to change a file's sizes. Windows file systems maintain two kinds + of sizes: the file size is where the End Of File (EOF) is, and the allocation size is the + actual size that a file takes up on the "disk". + + The rules regarding file/allocation size are: + + + Allocation size must always be aligned to the allocation unit boundary. The allocation + unit is the product SectorSize * SectorsPerAllocationUnit. The FSD will always send + properly aligned allocation sizes when setting the allocation size. + + + Allocation size is always greater or equal to the file size. + + + A file size of more than the current allocation size will also extend the allocation + size to the next allocation unit boundary. + + + An allocation size of less than the current file size should also truncate the current + file size. + + + + + + The file node of the file to set the file/allocation size for. + + + The file descriptor of the file to set the file/allocation size for. + + + New file/allocation size to apply to the file. + + + If true, then the allocation size is being set. if false, then the file size is being set. + + + Receives the updated file information. + + STATUS_SUCCESS or error code. + + + + Determines whether a file or directory can be deleted. + + + + This function tests whether a file or directory can be safely deleted. This function does + not need to perform access checks, but may performs tasks such as check for empty + directories, etc. + + This function should NEVER delete the file or directory in question. Deletion should + happen during Cleanup with the CleanupDelete flag set. + + This function gets called when Win32 API's such as DeleteFile or RemoveDirectory are used. + It does not get called when a file or directory is opened with FILE_DELETE_ON_CLOSE. + + NOTE: If both CanDelete and SetDelete are defined, SetDelete takes precedence. However + most file systems need only implement the CanDelete operation. + + + + The file node of the file or directory to test for deletion. + + + The file descriptor of the file or directory to test for deletion. + + + The name of the file or directory to test for deletion. + + STATUS_SUCCESS or error code. + + + + + + Renames a file or directory. + + + The kernel mode FSD provides certain guarantees prior to posting a rename operation: + + + A file cannot be renamed if a file with the same name exists and has open handles. + + + A directory cannot be renamed if it or any of its subdirectories contains a file that + has open handles. + + + + + The file node of the file or directory to be renamed. + + + The file descriptor of the file or directory to be renamed. + + + The current name of the file or directory to rename. + + + The new name for the file or directory. + + + Whether to replace a file that already exists at NewFileName. + + STATUS_SUCCESS or error code. + + + + Gets file or directory security descriptor. + + + The file node of the file or directory to get the security descriptor for. + + + The file descriptor of the file or directory to get the security descriptor for. + + + Receives the file security descriptor. + + STATUS_SUCCESS or error code. + + + + Sets file or directory security descriptor. + + + The file node of the file or directory to set the security descriptor for. + + + The file descriptor of the file or directory to set the security descriptor for. + + + Describes what parts of the file or directory security descriptor should be modified. + + + Describes the modifications to apply to the file or directory security descriptor. + + STATUS_SUCCESS or error code. + + + + + Reads a directory. + + + + + + Reads a directory entry. + + + The file node of the directory to be read. + + + The file descriptor of the directory to be read. + + + The pattern to match against files in this directory. Can be null. The file system + can choose to ignore this parameter as the FSD will always perform its own pattern + matching on the returned results. + + + A file name that marks where in the directory to start reading. Files with names + that are greater than (not equal to) this marker (in the directory order determined + by the file system) should be returned. Can be null. + + + Can be used by the file system to track the ReadDirectory operation. + + + Receives the file name for the directory entry. + + + Receives the file information for the directory entry. + + True if there are additional directory entries to return. False otherwise. + + + + + Resolves reparse points. + + + + + Gets a reparse point given a file name. + + + The name of the file or directory to get the reparse point for. + + + Determines whether the passed file name is assumed to be a directory. + + + Receives the reparse data for the file or directory. + + STATUS_SUCCESS or error code. + + + + Gets a reparse point. + + + The file node of the reparse point. + + + The file descriptor of the reparse point. + + + The file name of the reparse point. + + + Receives the reparse data for the reparse point. + + STATUS_SUCCESS or error code. + + + + Sets a reparse point. + + + The file node of the reparse point. + + + The file descriptor of the reparse point. + + + The file name of the reparse point. + + + The new reparse data for the reparse point. + + STATUS_SUCCESS or error code. + + + + Deletes a reparse point. + + + The file node of the reparse point. + + + The file descriptor of the reparse point. + + + The file name of the reparse point. + + + The reparse data for the reparse point. + + STATUS_SUCCESS or error code. + + + + Gets named streams information. + + + + + Gets named streams information entry. + + + The file node of the file or directory to get stream information for. + + + The file descriptor of the file or directory to get stream information for. + + + Can be used by the file system to track the GetStreamInfo operation. + + + Receives the stream name for the stream entry. + + + Receives the stream size for the stream entry. + + + Receives the stream allocation size for the stream entry. + + True if there are additional stream entries to return. False otherwise. + + + + Gets directory information for a single file or directory within a parent directory. + + + The file node of the parent directory. + + + The file descriptor of the parent directory. + + + The name of the file or directory to get information for. This name is relative + to the parent directory and is a single path component. + + + Receives the normalized name from the directory entry. + + + Receives the file information. + + STATUS_SUCCESS or error code. + + + + Processes a control code. + + + This function is called when a program uses the DeviceIoControl API. + + + The file node of the file or directory to be controled. + + + The file descriptor of the file or directory to be controled. + + + The control code for the operation. This code must have a DeviceType with bit + 0x8000 set and must have a TransferType of METHOD_BUFFERED. + + + Pointer to a buffer that contains the input data. + + + Input data length. + + + Pointer to a buffer that will receive the output data. + + + Output data length. + + + Receives the actual number of bytes transferred. + + STATUS_SUCCESS or error code. + + + + Sets the file delete flag. + + + + This function sets a flag to indicates whether the FSD file should delete a file + when it is closed. This function does not need to perform access checks, but may + performs tasks such as check for empty directories, etc. + + This function should NEVER delete the file or directory in question. Deletion should + happen during Cleanup with the CleanupDelete flag set. + + This function gets called when Win32 API's such as DeleteFile or RemoveDirectory are used. + It does not get called when a file or directory is opened with FILE_DELETE_ON_CLOSE. + + NOTE: If both CanDelete and SetDelete are defined, SetDelete takes precedence. However + most file systems need only implement the CanDelete operation. + + + + The file node of the file or directory to set the delete flag for. + + + The file descriptor of the file or directory to set the delete flag for. + + + The name of the file or directory to set the delete flag for. + + + If set to TRUE the FSD indicates that the file will be deleted on Cleanup; otherwise + it will not be deleted. It is legal to receive multiple SetDelete calls for the same + file with different DeleteFile parameters. + + STATUS_SUCCESS or error code. + + + + + + Converts a Win32 error code to a Windows kernel status code. + + + + + Converts a Windows kernel status code to a Win32 error code. + + + + + Gets the originating process ID. + + + Valid only during Create, Open and Rename requests when the target exists. + + + + + Modifies a security descriptor. [OBSOLETE] + + + This is a helper for implementing the SetSecurity operation. + + + The original security descriptor. + + + Describes what parts of the file or directory security descriptor should be modified. + + + Describes the modifications to apply to the file or directory security descriptor. + + The modified security descriptor. + + + + + Modifies a security descriptor. + + + This is a helper for implementing the SetSecurity operation. + + + The original security descriptor. + + + Describes what parts of the file or directory security descriptor should be modified. + + + Describes the modifications to apply to the file or directory security descriptor. + + + The modified security descriptor. This parameter is modified only on success. + + STATUS_SUCCESS or error code. + + + + + Finds a reparse point in file name. + + + This is a helper for implementing the GetSecurityByName operation in file systems + that support reparse points. + + + The name of the file or directory. + + + Receives the index of the first reparse point within FileName. + + True if a reparse point was found, false otherwise. + + + + + Makes a byte array that contains a reparse point. + + The reparse point byte array. + + + + Gets the reparse tag from reparse data. + + + The reparse data to extract the reparse tag from. + + The reparse tag. + + + + Tests whether reparse data can be replaced. + + + This is a helper for implementing the SetReparsePoint/DeleteReparsePoint operation + in file systems that support reparse points. + + + The current reparse data. + + + The replacement reparse data. + + STATUS_SUCCESS or error code. + + + + + + Provides a means to host (mount) a file system. + + + + + Creates an instance of the FileSystemHost class. + + The file system to host. + + + + Unmounts the file system and releases all associated resources. + + + + + Gets or sets the sector size used by the file system. + + + + + Gets or sets the sectors per allocation unit used by the file system. + + + + + Gets or sets the maximum path component length used by the file system. + + + + + Gets or sets the volume creation time. + + + + + Gets or sets the volume serial number. + + + + + Gets or sets the file information timeout. + + + + + Gets or sets the volume information timeout. + + + + + Gets or sets the directory information timeout. + + + + + Gets or sets the security information timeout. + + + + + Gets or sets the stream information timeout. + + + + + Gets or sets the EA information timeout. + + + + + Gets or sets a value that determines whether the file system is case sensitive. + + + + + Gets or sets a value that determines whether a case insensitive file system + preserves case in file names. + + + + + Gets or sets a value that determines whether file names support unicode characters. + + + + + Gets or sets a value that determines whether the file system supports ACL security. + + + + + Gets or sets a value that determines whether the file system supports reparse points. + + + + + Gets or sets a value that determines whether the file system allows creation of + symbolic links without additional privileges. + + + + + Gets or sets a value that determines whether the file system supports named streams. + + + + + Gets or sets a value that determines whether the file system supports extended attributes. + + + + + Gets or sets the prefix for a network file system. + + + + + Gets or sets the file system name. + + + + + Checks whether mounting a file system is possible. + + + The mount point for the new file system. A value of null means that + the file system should use the next available drive letter counting + downwards from Z: as its mount point. + + STATUS_SUCCESS or error code. + + + + Mounts a file system. + + + The mount point for the new file system. A value of null means that + the file system should use the next available drive letter counting + downwards from Z: as its mount point. + + + Security descriptor to use if mounting on (newly created) directory. + A value of null means the directory should be created with default + security. + + + If true file system operations are synchronized using an exclusive lock. + + + A value of 0 disables all debug logging. + A value of -1 enables all debug logging. + + STATUS_SUCCESS or error code. + + + + Mounts a file system. + + + The mount point for the new file system. A value of null means that + the file system should use the next available drive letter counting + downwards from Z: as its mount point. + + + Number of threads to use to service file system requests. A value + of 0 means that the default number of threads should be used. + + + Security descriptor to use if mounting on (newly created) directory. + A value of null means the directory should be created with default + security. + + + If true file system operations are synchronized using an exclusive lock. + + + A value of 0 disables all debug logging. + A value of -1 enables all debug logging. + + STATUS_SUCCESS or error code. + + + + Unmounts the file system and releases all associated resources. + + + + + Gets the file system mount point. + + The file system mount point. + + + + Gets the hosted file system. + + The hosted file system. + + + + Sets the debug log file to use when debug logging is enabled. + + + The debug log file name. A value of "-" means standard error output. + + STATUS_SUCCESS or error code. + + + + Return the installed version of WinFsp. + + + + + Returns a RequestHint to reference the current operation asynchronously. + + + + + Asynchronously complete a Read operation. + + + A reference to the operation to complete. + + + STATUS_SUCCESS or error code. + + + Number of bytes read. + + + + + Asynchronously complete a Write operation. + + + A reference to the operation to complete. + + + STATUS_SUCCESS or error code. + + + The number of bytes written. + + + Updated file information. + + + + + Asynchronously complete a ReadDirectory operation. + + + A reference to the operation to complete. + + + STATUS_SUCCESS or error code. + + + Number of bytes read. + + + + + Begin notifying Windows that the file system has file changes. + + + + A file system that wishes to notify Windows about file changes must + first issue an FspFileSystemBegin call, followed by 0 or more + FspFileSystemNotify calls, followed by an FspFileSystemNotifyEnd call. + + This operation blocks concurrent file rename operations. File rename + operations may interfere with file notification, because a file being + notified may also be concurrently renamed. After all file change + notifications have been issued, you must make sure to call + FspFileSystemNotifyEnd to allow file rename operations to proceed. + + + + STATUS_SUCCESS or error code. The error code STATUS_CANT_WAIT means that + a file rename operation is currently in progress and the operation must be + retried at a later time. + + + + + End notifying Windows that the file system has file changes. + + + + A file system that wishes to notify Windows about file changes must + first issue an FspFileSystemBegin call, followed by 0 or more + FspFileSystemNotify calls, followed by an FspFileSystemNotifyEnd call. + + This operation allows any blocked file rename operations to proceed. + + + STATUS_SUCCESS or error code. + + + + Notify Windows that the file system has file changes. + + + + A file system that wishes to notify Windows about file changes must + first issue an FspFileSystemBegin call, followed by 0 or more + FspFileSystemNotify calls, followed by an FspFileSystemNotifyEnd call. + + Note that FspFileSystemNotify requires file names to be normalized. A + normalized file name is one that contains the correct case of all characters + in the file name. + + For case-sensitive file systems all file names are normalized by definition. + For case-insensitive file systems that implement file name normalization, + a normalized file name is the one that the file system specifies in the + response to Create or Open (see also FspFileSystemGetOpenFileInfo). For + case-insensitive file systems that do not implement file name normalization + a normalized file name is the upper case version of the file name used + to open the file. + + + STATUS_SUCCESS or error code. + + + + Contains volume information about a file system. + + + + + Total size of volume in bytes. + + + + + Free size of volume in bytes. + + + + + Sets the volume label. + + + + + Contains metadata information about a file or directory. + + + + + The file or directory attributes. + + + + + The reparse tag of the file or directory. + This value is 0 if the file or directory is not a reparse point. + + + + + The allocation size of the file. + + + + + The file size of the file (end of file). + + + + + The time that the file or directory was created. + + + + + The time that the file or directory was last accessed. + + + + + The time that the file or direcotry was last modified. + + + + + The time that the file or directory metadata was last modified. + + + + + A unique identifier that is associated with the file or directory. + Not all file systems support this value. + + + + + The number of hard links. + Not currently implemented. Set to 0. + + + + + The extended attribute size of the file. + + + + + Enumeration of all the possible values for NotifyInfo.Action + + + + + Enumeration of all the possible values for NotifyInfo.Filter + + + + + Contains file change notification information. + + + + + Provides the base class for a process that can be run as a service, + command line application or under the control of the WinFsp launcher. + + + + + Creates an instance of the Service class. + + The name of the service. + + + + Runs a service. + + Service process exit code. + + + + Stops a running service. + + + + + Gets or sets the service process exit code. + + + + + Provides a means to customize the returned status code when an exception happens. + + + STATUS_SUCCESS or error code. + + + + Occurs when the service starts. + + Command line arguments passed to the service. + + + + Occurs when the service stops. + + + + diff --git a/3rd_party/winfsp-1.10/bin/winfsp-x64.dll b/3rd_party/winfsp-1.10/bin/winfsp-x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..05638d0cc11a5827306a0221567a614ef4d57047 GIT binary patch literal 173056 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%0A51yA8KTe5Lk&|3tW`vLx!4EVk)KLO-a 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

    Vi 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 Fe*hZlz-Ise literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/bin/winfsp-x86.sys b/3rd_party/winfsp-1.10/bin/winfsp-x86.sys new file mode 100644 index 0000000000000000000000000000000000000000..da423a8724171cef616942d9a6fa3b6ebc26d96c GIT binary patch literal 148240 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 =ReSFJ0V-5r$JMrK-65h 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 Kj*uM*ivJHq!eQ + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef FUSE_H_ +#define FUSE_H_ + +#include "fuse_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct fuse; + +typedef int (*fuse_fill_dir_t)(void *buf, const char *name, + const struct fuse_stat *stbuf, fuse_off_t off); +typedef struct fuse_dirhandle *fuse_dirh_t; +typedef int (*fuse_dirfil_t)(fuse_dirh_t h, const char *name, + int type, fuse_ino_t ino); + +struct fuse_operations +{ + /* S - supported by WinFsp */ + /* S */ int (*getattr)(const char *path, struct fuse_stat *stbuf); + /* S */ int (*getdir)(const char *path, fuse_dirh_t h, fuse_dirfil_t filler); + /* S */ int (*readlink)(const char *path, char *buf, size_t size); + /* S */ int (*mknod)(const char *path, fuse_mode_t mode, fuse_dev_t dev); + /* S */ int (*mkdir)(const char *path, fuse_mode_t mode); + /* S */ int (*unlink)(const char *path); + /* S */ int (*rmdir)(const char *path); + /* S */ int (*symlink)(const char *dstpath, const char *srcpath); + /* S */ int (*rename)(const char *oldpath, const char *newpath); + /* _ */ int (*link)(const char *srcpath, const char *dstpath); + /* S */ int (*chmod)(const char *path, fuse_mode_t mode); + /* S */ int (*chown)(const char *path, fuse_uid_t uid, fuse_gid_t gid); + /* S */ int (*truncate)(const char *path, fuse_off_t size); + /* S */ int (*utime)(const char *path, struct fuse_utimbuf *timbuf); + /* S */ int (*open)(const char *path, struct fuse_file_info *fi); + /* S */ int (*read)(const char *path, char *buf, size_t size, fuse_off_t off, + struct fuse_file_info *fi); + /* S */ int (*write)(const char *path, const char *buf, size_t size, fuse_off_t off, + struct fuse_file_info *fi); + /* S */ int (*statfs)(const char *path, struct fuse_statvfs *stbuf); + /* S */ int (*flush)(const char *path, struct fuse_file_info *fi); + /* S */ int (*release)(const char *path, struct fuse_file_info *fi); + /* S */ int (*fsync)(const char *path, int datasync, struct fuse_file_info *fi); + /* S */ int (*setxattr)(const char *path, const char *name, const char *value, size_t size, + int flags); + /* S */ int (*getxattr)(const char *path, const char *name, char *value, size_t size); + /* S */ int (*listxattr)(const char *path, char *namebuf, size_t size); + /* S */ int (*removexattr)(const char *path, const char *name); + /* S */ int (*opendir)(const char *path, struct fuse_file_info *fi); + /* S */ int (*readdir)(const char *path, void *buf, fuse_fill_dir_t filler, fuse_off_t off, + struct fuse_file_info *fi); + /* S */ int (*releasedir)(const char *path, struct fuse_file_info *fi); + /* S */ int (*fsyncdir)(const char *path, int datasync, struct fuse_file_info *fi); + /* S */ void *(*init)(struct fuse_conn_info *conn); + /* S */ void (*destroy)(void *data); + /* S */ int (*access)(const char *path, int mask); + /* S */ int (*create)(const char *path, fuse_mode_t mode, struct fuse_file_info *fi); + /* S */ int (*ftruncate)(const char *path, fuse_off_t off, struct fuse_file_info *fi); + /* S */ int (*fgetattr)(const char *path, struct fuse_stat *stbuf, struct fuse_file_info *fi); + /* _ */ int (*lock)(const char *path, + struct fuse_file_info *fi, int cmd, struct fuse_flock *lock); + /* S */ int (*utimens)(const char *path, const struct fuse_timespec tv[2]); + /* _ */ int (*bmap)(const char *path, size_t blocksize, uint64_t *idx); + /* _ */ unsigned int flag_nullpath_ok:1; + /* _ */ unsigned int flag_nopath:1; + /* _ */ unsigned int flag_utime_omit_ok:1; + /* _ */ unsigned int flag_reserved:29; + /* S */ int (*ioctl)(const char *path, int cmd, void *arg, struct fuse_file_info *fi, + unsigned int flags, void *data); + /* _ */ int (*poll)(const char *path, struct fuse_file_info *fi, + struct fuse_pollhandle *ph, unsigned *reventsp); + /* FUSE 2.9 */ + /* _ */ int (*write_buf)(const char *path, + struct fuse_bufvec *buf, fuse_off_t off, struct fuse_file_info *fi); + /* _ */ int (*read_buf)(const char *path, + struct fuse_bufvec **bufp, size_t size, fuse_off_t off, struct fuse_file_info *fi); + /* _ */ int (*flock)(const char *path, struct fuse_file_info *, int op); + /* _ */ int (*fallocate)(const char *path, int mode, fuse_off_t off, fuse_off_t len, + struct fuse_file_info *fi); + /* OSXFUSE */ + /* _ */ int (*reserved00)(); + /* _ */ int (*reserved01)(); + /* _ */ int (*reserved02)(); + /* _ */ int (*statfs_x)(const char *path, struct fuse_statfs *stbuf); + /* _ */ int (*setvolname)(const char *volname); + /* _ */ int (*exchange)(const char *oldpath, const char *newpath, unsigned long flags); + /* _ */ int (*getxtimes)(const char *path, + struct fuse_timespec *bkuptime, struct fuse_timespec *crtime); + /* _ */ int (*setbkuptime)(const char *path, const struct fuse_timespec *tv); + /* S */ int (*setchgtime)(const char *path, const struct fuse_timespec *tv); + /* S */ int (*setcrtime)(const char *path, const struct fuse_timespec *tv); + /* S */ int (*chflags)(const char *path, uint32_t flags); + /* _ */ int (*setattr_x)(const char *path, struct fuse_setattr_x *attr); + /* _ */ int (*fsetattr_x)(const char *path, struct fuse_setattr_x *attr, + struct fuse_file_info *fi); +}; + +struct fuse_context +{ + struct fuse *fuse; + fuse_uid_t uid; + fuse_gid_t gid; + fuse_pid_t pid; + void *private_data; + fuse_mode_t umask; +}; + +#define fuse_main(argc, argv, ops, data)\ + fuse_main_real(argc, argv, ops, sizeof *(ops), data) + +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_main_real)(struct fsp_fuse_env *env, + int argc, char *argv[], + const struct fuse_operations *ops, size_t opsize, void *data); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_is_lib_option)(struct fsp_fuse_env *env, + const char *opt); +FSP_FUSE_API struct fuse *FSP_FUSE_API_NAME(fsp_fuse_new)(struct fsp_fuse_env *env, + struct fuse_chan *ch, struct fuse_args *args, + const struct fuse_operations *ops, size_t opsize, void *data); +FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse_destroy)(struct fsp_fuse_env *env, + struct fuse *f); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_loop)(struct fsp_fuse_env *env, + struct fuse *f); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_loop_mt)(struct fsp_fuse_env *env, + struct fuse *f); +FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse_exit)(struct fsp_fuse_env *env, + struct fuse *f); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_exited)(struct fsp_fuse_env *env, + struct fuse *f); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_notify)(struct fsp_fuse_env *env, + struct fuse *f, const char *path, uint32_t action); +FSP_FUSE_API struct fuse_context *FSP_FUSE_API_NAME(fsp_fuse_get_context)(struct fsp_fuse_env *env); + +FSP_FUSE_SYM( +int fuse_main_real(int argc, char *argv[], + const struct fuse_operations *ops, size_t opsize, void *data), +{ + return FSP_FUSE_API_CALL(fsp_fuse_main_real) + (fsp_fuse_env(), argc, argv, ops, opsize, data); +}) + +FSP_FUSE_SYM( +int fuse_is_lib_option(const char *opt), +{ + return FSP_FUSE_API_CALL(fsp_fuse_is_lib_option) + (fsp_fuse_env(), opt); +}) + +FSP_FUSE_SYM( +struct fuse *fuse_new(struct fuse_chan *ch, struct fuse_args *args, + const struct fuse_operations *ops, size_t opsize, void *data), +{ + return FSP_FUSE_API_CALL(fsp_fuse_new) + (fsp_fuse_env(), ch, args, ops, opsize, data); +}) + +FSP_FUSE_SYM( +void fuse_destroy(struct fuse *f), +{ + FSP_FUSE_API_CALL(fsp_fuse_destroy) + (fsp_fuse_env(), f); +}) + +FSP_FUSE_SYM( +int fuse_loop(struct fuse *f), +{ + return FSP_FUSE_API_CALL(fsp_fuse_loop) + (fsp_fuse_env(), f); +}) + +FSP_FUSE_SYM( +int fuse_loop_mt(struct fuse *f), +{ + return FSP_FUSE_API_CALL(fsp_fuse_loop_mt) + (fsp_fuse_env(), f); +}) + +FSP_FUSE_SYM( +void fuse_exit(struct fuse *f), +{ + FSP_FUSE_API_CALL(fsp_fuse_exit) + (fsp_fuse_env(), f); +}) + +FSP_FUSE_SYM( +int fuse_exited(struct fuse *f), +{ + return FSP_FUSE_API_CALL(fsp_fuse_exited) + (fsp_fuse_env(), f); +}) + +FSP_FUSE_SYM( +int fuse_notify(struct fuse *f, const char *path, uint32_t action), +{ + return FSP_FUSE_API_CALL(fsp_fuse_notify) + (fsp_fuse_env(), f, path, action); +}) + +FSP_FUSE_SYM( +struct fuse_context *fuse_get_context(void), +{ + return FSP_FUSE_API_CALL(fsp_fuse_get_context) + (fsp_fuse_env()); +}) + +FSP_FUSE_SYM( +int fuse_getgroups(int size, fuse_gid_t list[]), +{ + (void)size; + (void)list; + return -ENOSYS; +}) + +FSP_FUSE_SYM( +int fuse_interrupted(void), +{ + return 0; +}) + +FSP_FUSE_SYM( +int fuse_invalidate(struct fuse *f, const char *path), +{ + return FSP_FUSE_API_CALL(fsp_fuse_notify) + (fsp_fuse_env(), f, path, 0); +}) + +FSP_FUSE_SYM( +int fuse_notify_poll(struct fuse_pollhandle *ph), +{ + (void)ph; + return 0; +}) + +FSP_FUSE_SYM( +struct fuse_session *fuse_get_session(struct fuse *f), +{ + return (struct fuse_session *)f; +}) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/inc/fuse/fuse_common.h b/3rd_party/winfsp-1.10/inc/fuse/fuse_common.h new file mode 100644 index 00000000..5e7cd432 --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/fuse/fuse_common.h @@ -0,0 +1,199 @@ +/** + * @file fuse/fuse_common.h + * WinFsp FUSE compatible API. + * + * This file is derived from libfuse/include/fuse_common.h: + * FUSE: Filesystem in Userspace + * Copyright (C) 2001-2007 Miklos Szeredi + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef FUSE_COMMON_H_ +#define FUSE_COMMON_H_ + +#include "winfsp_fuse.h" +#include "fuse_opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define FUSE_MAJOR_VERSION 2 +#define FUSE_MINOR_VERSION 8 +#define FUSE_MAKE_VERSION(maj, min) ((maj) * 10 + (min)) +#define FUSE_VERSION FUSE_MAKE_VERSION(FUSE_MAJOR_VERSION, FUSE_MINOR_VERSION) + +#define FUSE_CAP_ASYNC_READ (1 << 0) +#define FUSE_CAP_POSIX_LOCKS (1 << 1) +#define FUSE_CAP_ATOMIC_O_TRUNC (1 << 3) +#define FUSE_CAP_EXPORT_SUPPORT (1 << 4) +#define FUSE_CAP_BIG_WRITES (1 << 5) +#define FUSE_CAP_DONT_MASK (1 << 6) +#define FUSE_CAP_ALLOCATE (1 << 27) /* reserved (OSXFUSE) */ +#define FUSE_CAP_EXCHANGE_DATA (1 << 28) /* reserved (OSXFUSE) */ +#define FUSE_CAP_CASE_INSENSITIVE (1 << 29) /* file system is case insensitive */ +#define FUSE_CAP_VOL_RENAME (1 << 30) /* reserved (OSXFUSE) */ +#define FUSE_CAP_XTIMES (1 << 31) /* reserved (OSXFUSE) */ + +#define FSP_FUSE_CAP_READDIR_PLUS (1 << 21) /* file system supports enhanced readdir */ +#define FSP_FUSE_CAP_READ_ONLY (1 << 22) /* file system is marked read-only */ +#define FSP_FUSE_CAP_STAT_EX (1 << 23) /* file system supports fuse_stat_ex */ +#define FSP_FUSE_CAP_DELETE_ACCESS (1 << 24) /* file system supports access with DELETE_OK */ +#define FSP_FUSE_CAP_CASE_INSENSITIVE FUSE_CAP_CASE_INSENSITIVE + +#define FUSE_IOCTL_COMPAT (1 << 0) +#define FUSE_IOCTL_UNRESTRICTED (1 << 1) +#define FUSE_IOCTL_RETRY (1 << 2) +#define FUSE_IOCTL_MAX_IOV 256 + +/* from FreeBSD */ +#define FSP_FUSE_UF_HIDDEN 0x00008000 +#define FSP_FUSE_UF_READONLY 0x00001000 +#define FSP_FUSE_UF_SYSTEM 0x00000080 +#define FSP_FUSE_UF_ARCHIVE 0x00000800 +#if !defined(UF_HIDDEN) +#define UF_HIDDEN FSP_FUSE_UF_HIDDEN +#endif +#if !defined(UF_READONLY) +#define UF_READONLY FSP_FUSE_UF_READONLY +#endif +#if !defined(UF_SYSTEM) +#define UF_SYSTEM FSP_FUSE_UF_SYSTEM +#endif +#if !defined(UF_ARCHIVE) +#define UF_ARCHIVE FSP_FUSE_UF_ARCHIVE +#endif + +/* delete access */ +#define FSP_FUSE_DELETE_OK 0x40000000 + +/* notify extension */ +#define FSP_FUSE_NOTIFY_MKDIR 0x0001 +#define FSP_FUSE_NOTIFY_RMDIR 0x0002 +#define FSP_FUSE_NOTIFY_CREATE 0x0004 +#define FSP_FUSE_NOTIFY_UNLINK 0x0008 +#define FSP_FUSE_NOTIFY_CHMOD 0x0010 +#define FSP_FUSE_NOTIFY_CHOWN 0x0020 +#define FSP_FUSE_NOTIFY_UTIME 0x0040 +#define FSP_FUSE_NOTIFY_CHFLAGS 0x0080 +#define FSP_FUSE_NOTIFY_TRUNCATE 0x0100 + +struct fuse_file_info +{ + int flags; + unsigned int fh_old; + int writepage; + unsigned int direct_io:1; + unsigned int keep_cache:1; + unsigned int flush:1; + unsigned int nonseekable:1; + unsigned int padding:28; + uint64_t fh; + uint64_t lock_owner; +}; + +struct fuse_conn_info +{ + unsigned proto_major; + unsigned proto_minor; + unsigned async_read; + unsigned max_write; + unsigned max_readahead; + unsigned capable; + unsigned want; + unsigned reserved[25]; +}; + +struct fuse_session; +struct fuse_chan; +struct fuse_pollhandle; +struct fuse_bufvec; +struct fuse_statfs; +struct fuse_setattr_x; + +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_version)(struct fsp_fuse_env *env); +FSP_FUSE_API struct fuse_chan *FSP_FUSE_API_NAME(fsp_fuse_mount)(struct fsp_fuse_env *env, + const char *mountpoint, struct fuse_args *args); +FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse_unmount)(struct fsp_fuse_env *env, + const char *mountpoint, struct fuse_chan *ch); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_parse_cmdline)(struct fsp_fuse_env *env, + struct fuse_args *args, + char **mountpoint, int *multithreaded, int *foreground); +FSP_FUSE_API int32_t FSP_FUSE_API_NAME(fsp_fuse_ntstatus_from_errno)(struct fsp_fuse_env *env, + int err); + +FSP_FUSE_SYM( +int fuse_version(void), +{ + return FSP_FUSE_API_CALL(fsp_fuse_version) + (fsp_fuse_env()); +}) + +FSP_FUSE_SYM( +struct fuse_chan *fuse_mount(const char *mountpoint, struct fuse_args *args), +{ + return FSP_FUSE_API_CALL(fsp_fuse_mount) + (fsp_fuse_env(), mountpoint, args); +}) + +FSP_FUSE_SYM( +void fuse_unmount(const char *mountpoint, struct fuse_chan *ch), +{ + FSP_FUSE_API_CALL(fsp_fuse_unmount) + (fsp_fuse_env(), mountpoint, ch); +}) + +FSP_FUSE_SYM( +int fuse_parse_cmdline(struct fuse_args *args, + char **mountpoint, int *multithreaded, int *foreground), +{ + return FSP_FUSE_API_CALL(fsp_fuse_parse_cmdline) + (fsp_fuse_env(), args, mountpoint, multithreaded, foreground); +}) + +FSP_FUSE_SYM( +void fuse_pollhandle_destroy(struct fuse_pollhandle *ph), +{ + (void)ph; +}) + +FSP_FUSE_SYM( +int fuse_daemonize(int foreground), +{ + return fsp_fuse_daemonize(foreground); +}) + +FSP_FUSE_SYM( +int fuse_set_signal_handlers(struct fuse_session *se), +{ + return fsp_fuse_set_signal_handlers(se); +}) + +FSP_FUSE_SYM( +void fuse_remove_signal_handlers(struct fuse_session *se), +{ + (void)se; + fsp_fuse_set_signal_handlers(0); +}) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/inc/fuse/fuse_opt.h b/3rd_party/winfsp-1.10/inc/fuse/fuse_opt.h new file mode 100644 index 00000000..30d659cf --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/fuse/fuse_opt.h @@ -0,0 +1,133 @@ +/** + * @file fuse/fuse_opt.h + * WinFsp FUSE compatible API. + * + * This file is derived from libfuse/include/fuse_opt.h: + * FUSE: Filesystem in Userspace + * Copyright (C) 2001-2007 Miklos Szeredi + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef FUSE_OPT_H_ +#define FUSE_OPT_H_ + +#include "winfsp_fuse.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define FUSE_OPT_KEY(templ, key) { templ, -1, key } +#define FUSE_OPT_END { NULL, 0, 0 } + +#define FUSE_OPT_KEY_OPT -1 +#define FUSE_OPT_KEY_NONOPT -2 +#define FUSE_OPT_KEY_KEEP -3 +#define FUSE_OPT_KEY_DISCARD -4 + +#define FUSE_ARGS_INIT(argc, argv) { argc, argv, 0 } + +struct fuse_opt +{ + const char *templ; + unsigned int offset; + int value; +}; + +struct fuse_args +{ + int argc; + char **argv; + int allocated; +}; + +typedef int (*fuse_opt_proc_t)(void *data, const char *arg, int key, + struct fuse_args *outargs); + +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_opt_parse)(struct fsp_fuse_env *env, + struct fuse_args *args, void *data, + const struct fuse_opt opts[], fuse_opt_proc_t proc); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_opt_add_arg)(struct fsp_fuse_env *env, + struct fuse_args *args, const char *arg); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_opt_insert_arg)(struct fsp_fuse_env *env, + struct fuse_args *args, int pos, const char *arg); +FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse_opt_free_args)(struct fsp_fuse_env *env, + struct fuse_args *args); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_opt_add_opt)(struct fsp_fuse_env *env, + char **opts, const char *opt); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_opt_add_opt_escaped)(struct fsp_fuse_env *env, + char **opts, const char *opt); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_opt_match)(struct fsp_fuse_env *env, + const struct fuse_opt opts[], const char *opt); + +FSP_FUSE_SYM( +int fuse_opt_parse(struct fuse_args *args, void *data, + const struct fuse_opt opts[], fuse_opt_proc_t proc), +{ + return FSP_FUSE_API_CALL(fsp_fuse_opt_parse) + (fsp_fuse_env(), args, data, opts, proc); +}) + +FSP_FUSE_SYM( +int fuse_opt_add_arg(struct fuse_args *args, const char *arg), +{ + return FSP_FUSE_API_CALL(fsp_fuse_opt_add_arg) + (fsp_fuse_env(), args, arg); +}) + +FSP_FUSE_SYM( +int fuse_opt_insert_arg(struct fuse_args *args, int pos, const char *arg), +{ + return FSP_FUSE_API_CALL(fsp_fuse_opt_insert_arg) + (fsp_fuse_env(), args, pos, arg); +}) + +FSP_FUSE_SYM( +void fuse_opt_free_args(struct fuse_args *args), +{ + FSP_FUSE_API_CALL(fsp_fuse_opt_free_args) + (fsp_fuse_env(), args); +}) + +FSP_FUSE_SYM( +int fuse_opt_add_opt(char **opts, const char *opt), +{ + return FSP_FUSE_API_CALL(fsp_fuse_opt_add_opt) + (fsp_fuse_env(), opts, opt); +}) + +FSP_FUSE_SYM( +int fuse_opt_add_opt_escaped(char **opts, const char *opt), +{ + return FSP_FUSE_API_CALL(fsp_fuse_opt_add_opt_escaped) + (fsp_fuse_env(), opts, opt); +}) + +FSP_FUSE_SYM( +int fuse_opt_match(const struct fuse_opt opts[], const char *opt), +{ + return FSP_FUSE_API_CALL(fsp_fuse_opt_match) + (fsp_fuse_env(), opts, opt); +}) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/inc/fuse/winfsp_fuse.h b/3rd_party/winfsp-1.10/inc/fuse/winfsp_fuse.h new file mode 100644 index 00000000..37d14063 --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/fuse/winfsp_fuse.h @@ -0,0 +1,434 @@ +/** + * @file fuse/winfsp_fuse.h + * WinFsp FUSE compatible API. + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef FUSE_WINFSP_FUSE_H_INCLUDED +#define FUSE_WINFSP_FUSE_H_INCLUDED + +#include +#include +#if !defined(WINFSP_DLL_INTERNAL) +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(FSP_FUSE_API) +#if defined(WINFSP_DLL_INTERNAL) +#define FSP_FUSE_API __declspec(dllexport) +#else +#define FSP_FUSE_API __declspec(dllimport) +#endif +#endif + +#if !defined(FSP_FUSE_API_NAME) +#define FSP_FUSE_API_NAME(n) (n) +#endif + +#if !defined(FSP_FUSE_API_CALL) +#define FSP_FUSE_API_CALL(n) (n) +#endif + +#if !defined(FSP_FUSE_SYM) +#if !defined(CYGFUSE) +#define FSP_FUSE_SYM(proto, ...) static inline proto { __VA_ARGS__ } +#else +#define FSP_FUSE_SYM(proto, ...) proto; +#endif +#endif + +#define FSP_FUSE_DEVICE_TYPE (0x8000 | 'W' | 'F' * 0x100) /* DeviceIoControl -> ioctl */ +#define FSP_FUSE_CTLCODE_FROM_IOCTL(cmd)\ + (FSP_FUSE_DEVICE_TYPE << 16) | (((cmd) & 0x0fff) << 2) +#define FSP_FUSE_IOCTL(cmd, isiz, osiz) \ + ( \ + (((osiz) != 0) << 31) | \ + (((isiz) != 0) << 30) | \ + (((isiz) | (osiz)) << 16) | \ + (cmd) \ + ) + +/* + * FUSE uses a number of types (notably: struct stat) that are OS specific. + * Furthermore there are sometimes multiple definitions of the same type even + * within the same OS. This is certainly true on Windows, where these types + * are not even native. + * + * For this reason we will define our own fuse_* types which represent the + * types as the WinFsp DLL expects to see them. We will define these types + * to be compatible with the equivalent Cygwin types as we want WinFsp-FUSE + * to be usable from Cygwin. + */ + +#define FSP_FUSE_STAT_FIELD_DEFN \ + fuse_dev_t st_dev; \ + fuse_ino_t st_ino; \ + fuse_mode_t st_mode; \ + fuse_nlink_t st_nlink; \ + fuse_uid_t st_uid; \ + fuse_gid_t st_gid; \ + fuse_dev_t st_rdev; \ + fuse_off_t st_size; \ + struct fuse_timespec st_atim; \ + struct fuse_timespec st_mtim; \ + struct fuse_timespec st_ctim; \ + fuse_blksize_t st_blksize; \ + fuse_blkcnt_t st_blocks; \ + struct fuse_timespec st_birthtim; +#define FSP_FUSE_STAT_EX_FIELD_DEFN \ + FSP_FUSE_STAT_FIELD_DEFN \ + uint32_t st_flags; \ + uint32_t st_reserved32[3]; \ + uint64_t st_reserved64[2]; + +#if defined(_WIN64) || defined(_WIN32) + +typedef uint32_t fuse_uid_t; +typedef uint32_t fuse_gid_t; +typedef int32_t fuse_pid_t; + +typedef uint32_t fuse_dev_t; +typedef uint64_t fuse_ino_t; +typedef uint32_t fuse_mode_t; +typedef uint16_t fuse_nlink_t; +typedef int64_t fuse_off_t; + +#if defined(_WIN64) +typedef uint64_t fuse_fsblkcnt_t; +typedef uint64_t fuse_fsfilcnt_t; +#else +typedef uint32_t fuse_fsblkcnt_t; +typedef uint32_t fuse_fsfilcnt_t; +#endif +typedef int32_t fuse_blksize_t; +typedef int64_t fuse_blkcnt_t; + +#if defined(_WIN64) +struct fuse_utimbuf +{ + int64_t actime; + int64_t modtime; +}; +struct fuse_timespec +{ + int64_t tv_sec; + int64_t tv_nsec; +}; +#else +struct fuse_utimbuf +{ + int32_t actime; + int32_t modtime; +}; +struct fuse_timespec +{ + int32_t tv_sec; + int32_t tv_nsec; +}; +#endif + +#if !defined(FSP_FUSE_USE_STAT_EX) +struct fuse_stat +{ + FSP_FUSE_STAT_FIELD_DEFN +}; +#else +struct fuse_stat +{ + FSP_FUSE_STAT_EX_FIELD_DEFN +}; +#endif + +#if defined(_WIN64) +struct fuse_statvfs +{ + uint64_t f_bsize; + uint64_t f_frsize; + fuse_fsblkcnt_t f_blocks; + fuse_fsblkcnt_t f_bfree; + fuse_fsblkcnt_t f_bavail; + fuse_fsfilcnt_t f_files; + fuse_fsfilcnt_t f_ffree; + fuse_fsfilcnt_t f_favail; + uint64_t f_fsid; + uint64_t f_flag; + uint64_t f_namemax; +}; +#else +struct fuse_statvfs +{ + uint32_t f_bsize; + uint32_t f_frsize; + fuse_fsblkcnt_t f_blocks; + fuse_fsblkcnt_t f_bfree; + fuse_fsblkcnt_t f_bavail; + fuse_fsfilcnt_t f_files; + fuse_fsfilcnt_t f_ffree; + fuse_fsfilcnt_t f_favail; + uint32_t f_fsid; + uint32_t f_flag; + uint32_t f_namemax; +}; +#endif + +struct fuse_flock +{ + int16_t l_type; + int16_t l_whence; + fuse_off_t l_start; + fuse_off_t l_len; + fuse_pid_t l_pid; +}; + +#if defined(WINFSP_DLL_INTERNAL) +#define FSP_FUSE_ENV_INIT \ + { \ + 'W', \ + MemAlloc, MemFree, \ + fsp_fuse_daemonize, \ + fsp_fuse_set_signal_handlers, \ + 0/*conv_to_win_path*/, \ + 0/*winpid_to_pid*/, \ + { 0 }, \ + } +#else +#define FSP_FUSE_ENV_INIT \ + { \ + 'W', \ + malloc, free, \ + fsp_fuse_daemonize, \ + fsp_fuse_set_signal_handlers, \ + 0/*conv_to_win_path*/, \ + 0/*winpid_to_pid*/, \ + { 0 }, \ + } +#endif + +#elif defined(__CYGWIN__) + +#include +#include +#include +#include +#include +#include +#include + +#define fuse_uid_t uid_t +#define fuse_gid_t gid_t +#define fuse_pid_t pid_t + +#define fuse_dev_t dev_t +#define fuse_ino_t ino_t +#define fuse_mode_t mode_t +#define fuse_nlink_t nlink_t +#define fuse_off_t off_t + +#define fuse_fsblkcnt_t fsblkcnt_t +#define fuse_fsfilcnt_t fsfilcnt_t +#define fuse_blksize_t blksize_t +#define fuse_blkcnt_t blkcnt_t + +#define fuse_utimbuf utimbuf +#define fuse_timespec timespec + +#if !defined(FSP_FUSE_USE_STAT_EX) +#define fuse_stat stat +#else +struct fuse_stat +{ + FSP_FUSE_STAT_EX_FIELD_DEFN +}; +#endif +#define fuse_statvfs statvfs +#define fuse_flock flock + +#define FSP_FUSE_ENV_INIT \ + { \ + 'C', \ + malloc, free, \ + fsp_fuse_daemonize, \ + fsp_fuse_set_signal_handlers, \ + fsp_fuse_conv_to_win_path, \ + fsp_fuse_winpid_to_pid, \ + { 0 }, \ + } + +/* + * Note that long is 8 bytes long in Cygwin64 and 4 bytes long in Win64. + * For this reason we avoid using long anywhere in these headers. + */ + +#else +#error unsupported environment +#endif + +struct fuse_stat_ex +{ + FSP_FUSE_STAT_EX_FIELD_DEFN +}; + +struct fsp_fuse_env +{ + unsigned environment; + void *(*memalloc)(size_t); + void (*memfree)(void *); + int (*daemonize)(int); + int (*set_signal_handlers)(void *); + char *(*conv_to_win_path)(const char *); + fuse_pid_t (*winpid_to_pid)(uint32_t); + void (*reserved[2])(); +}; + +FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse_signal_handler)(int sig); + +#if defined(_WIN64) || defined(_WIN32) + +static inline int fsp_fuse_daemonize(int foreground) +{ + (void)foreground; + return 0; +} + +static inline int fsp_fuse_set_signal_handlers(void *se) +{ + (void)se; + return 0; +} + +#elif defined(__CYGWIN__) + +static inline int fsp_fuse_daemonize(int foreground) +{ + int daemon(int nochdir, int noclose); + int chdir(const char *path); + + if (!foreground) + { + if (-1 == daemon(0, 0)) + return -1; + } + else + chdir("/"); + + return 0; +} + +static inline void *fsp_fuse_signal_thread(void *psigmask) +{ + int sig; + + if (0 == sigwait((sigset_t *)psigmask, &sig)) + FSP_FUSE_API_CALL(fsp_fuse_signal_handler)(sig); + + return 0; +} + +static inline int fsp_fuse_set_signal_handlers(void *se) +{ +#define FSP_FUSE_SET_SIGNAL_HANDLER(sig, newha)\ + if (-1 != sigaction((sig), 0, &oldsa) &&\ + oldsa.sa_handler == (se ? SIG_DFL : (newha)))\ + {\ + newsa.sa_handler = se ? (newha) : SIG_DFL;\ + sigaction((sig), &newsa, 0);\ + } +#define FSP_FUSE_SIGADDSET(sig)\ + if (-1 != sigaction((sig), 0, &oldsa) &&\ + oldsa.sa_handler == SIG_DFL)\ + sigaddset(&sigmask, (sig)); + + static sigset_t sigmask; + static pthread_t sigthr; + struct sigaction oldsa, newsa; + + // memset instead of initializer to avoid GCC -Wmissing-field-initializers warning + memset(&newsa, 0, sizeof newsa); + + if (0 != se) + { + if (0 == sigthr) + { + FSP_FUSE_SET_SIGNAL_HANDLER(SIGPIPE, SIG_IGN); + + sigemptyset(&sigmask); + FSP_FUSE_SIGADDSET(SIGHUP); + FSP_FUSE_SIGADDSET(SIGINT); + FSP_FUSE_SIGADDSET(SIGTERM); + if (0 != pthread_sigmask(SIG_BLOCK, &sigmask, 0)) + return -1; + + if (0 != pthread_create(&sigthr, 0, fsp_fuse_signal_thread, &sigmask)) + return -1; + } + } + else + { + if (0 != sigthr) + { + pthread_cancel(sigthr); + pthread_join(sigthr, 0); + sigthr = 0; + + if (0 != pthread_sigmask(SIG_UNBLOCK, &sigmask, 0)) + return -1; + sigemptyset(&sigmask); + + FSP_FUSE_SET_SIGNAL_HANDLER(SIGPIPE, SIG_IGN); + } + } + + return 0; + +#undef FSP_FUSE_SIGADDSET +#undef FSP_FUSE_SET_SIGNAL_HANDLER +} + +static inline char *fsp_fuse_conv_to_win_path(const char *path) +{ + void *cygwin_create_path(unsigned, const void *); + return (char *)cygwin_create_path( + 0/*CCP_POSIX_TO_WIN_A*/ | 0x100/*CCP_RELATIVE*/, + path); +} + +static inline fuse_pid_t fsp_fuse_winpid_to_pid(uint32_t winpid) +{ + pid_t cygwin_winpid_to_pid(int winpid); + pid_t pid = cygwin_winpid_to_pid(winpid); + return -1 != pid ? pid : (fuse_pid_t)winpid; +} +#endif + + +static inline struct fsp_fuse_env *fsp_fuse_env(void) +{ + static struct fsp_fuse_env env = FSP_FUSE_ENV_INIT; + return &env; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/inc/fuse3/fuse.h b/3rd_party/winfsp-1.10/inc/fuse3/fuse.h new file mode 100644 index 00000000..85314c2a --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/fuse3/fuse.h @@ -0,0 +1,338 @@ +/** + * @file fuse3/fuse.h + * WinFsp FUSE3 compatible API. + * + * This file is derived from libfuse/include/fuse.h: + * FUSE: Filesystem in Userspace + * Copyright (C) 2001-2007 Miklos Szeredi + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef FUSE_H_ +#define FUSE_H_ + +#include "fuse_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct fuse3; + +enum fuse3_readdir_flags +{ + FUSE_READDIR_PLUS = (1 << 0), +}; + +enum fuse3_fill_dir_flags +{ + FUSE_FILL_DIR_PLUS = (1 << 1), +}; + +typedef int (*fuse3_fill_dir_t)(void *buf, const char *name, + const struct fuse_stat *stbuf, fuse_off_t off, + enum fuse3_fill_dir_flags flags); + +struct fuse3_config +{ + int set_gid; + unsigned int gid; + int set_uid; + unsigned int uid; + int set_mode; + unsigned int umask; + double entry_timeout; + double negative_timeout; + double attr_timeout; + int intr; + int intr_signal; + int remember; + int hard_remove; + int use_ino; + int readdir_ino; + int direct_io; + int kernel_cache; + int auto_cache; + int ac_attr_timeout_set; + double ac_attr_timeout; + int nullpath_ok; + /* private */ + int show_help; + char *modules; + int debug; +}; + +struct fuse3_operations +{ + /* S - supported by WinFsp */ + /* S */ int (*getattr)(const char *path, struct fuse_stat *stbuf, + struct fuse3_file_info *fi); + /* S */ int (*readlink)(const char *path, char *buf, size_t size); + /* S */ int (*mknod)(const char *path, fuse_mode_t mode, fuse_dev_t dev); + /* S */ int (*mkdir)(const char *path, fuse_mode_t mode); + /* S */ int (*unlink)(const char *path); + /* S */ int (*rmdir)(const char *path); + /* S */ int (*symlink)(const char *dstpath, const char *srcpath); + /* S */ int (*rename)(const char *oldpath, const char *newpath, unsigned int flags); + /* _ */ int (*link)(const char *srcpath, const char *dstpath); + /* S */ int (*chmod)(const char *path, fuse_mode_t mode, + struct fuse3_file_info *fi); + /* S */ int (*chown)(const char *path, fuse_uid_t uid, fuse_gid_t gid, + struct fuse3_file_info *fi); + /* S */ int (*truncate)(const char *path, fuse_off_t size, + struct fuse3_file_info *fi); + /* S */ int (*open)(const char *path, struct fuse3_file_info *fi); + /* S */ int (*read)(const char *path, char *buf, size_t size, fuse_off_t off, + struct fuse3_file_info *fi); + /* S */ int (*write)(const char *path, const char *buf, size_t size, fuse_off_t off, + struct fuse3_file_info *fi); + /* S */ int (*statfs)(const char *path, struct fuse_statvfs *stbuf); + /* S */ int (*flush)(const char *path, struct fuse3_file_info *fi); + /* S */ int (*release)(const char *path, struct fuse3_file_info *fi); + /* S */ int (*fsync)(const char *path, int datasync, struct fuse3_file_info *fi); + /* S */ int (*setxattr)(const char *path, const char *name, const char *value, size_t size, + int flags); + /* S */ int (*getxattr)(const char *path, const char *name, char *value, size_t size); + /* S */ int (*listxattr)(const char *path, char *namebuf, size_t size); + /* S */ int (*removexattr)(const char *path, const char *name); + /* S */ int (*opendir)(const char *path, struct fuse3_file_info *fi); + /* S */ int (*readdir)(const char *path, void *buf, fuse3_fill_dir_t filler, fuse_off_t off, + struct fuse3_file_info *fi, enum fuse3_readdir_flags); + /* S */ int (*releasedir)(const char *path, struct fuse3_file_info *fi); + /* S */ int (*fsyncdir)(const char *path, int datasync, struct fuse3_file_info *fi); + /* S */ void *(*init)(struct fuse3_conn_info *conn, + struct fuse3_config *conf); + /* S */ void (*destroy)(void *data); + /* _ */ int (*access)(const char *path, int mask); + /* S */ int (*create)(const char *path, fuse_mode_t mode, struct fuse3_file_info *fi); + /* _ */ int (*lock)(const char *path, + struct fuse3_file_info *fi, int cmd, struct fuse_flock *lock); + /* S */ int (*utimens)(const char *path, const struct fuse_timespec tv[2], + struct fuse3_file_info *fi); + /* _ */ int (*bmap)(const char *path, size_t blocksize, uint64_t *idx); + /* S */ int (*ioctl)(const char *path, int cmd, void *arg, struct fuse3_file_info *fi, + unsigned int flags, void *data); + /* _ */ int (*poll)(const char *path, struct fuse3_file_info *fi, + struct fuse3_pollhandle *ph, unsigned *reventsp); + /* _ */ int (*write_buf)(const char *path, + struct fuse3_bufvec *buf, fuse_off_t off, struct fuse3_file_info *fi); + /* _ */ int (*read_buf)(const char *path, + struct fuse3_bufvec **bufp, size_t size, fuse_off_t off, struct fuse3_file_info *fi); + /* _ */ int (*flock)(const char *path, struct fuse3_file_info *, int op); + /* _ */ int (*fallocate)(const char *path, int mode, fuse_off_t off, fuse_off_t len, + struct fuse3_file_info *fi); +}; + +struct fuse3_context +{ + struct fuse3 *fuse; + fuse_uid_t uid; + fuse_gid_t gid; + fuse_pid_t pid; + void *private_data; + fuse_mode_t umask; +}; + +#define fuse_main(argc, argv, ops, data)\ + fuse3_main_real(argc, argv, ops, sizeof *(ops), data) + +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_main_real)(struct fsp_fuse_env *env, + int argc, char *argv[], + const struct fuse3_operations *ops, size_t opsize, void *data); +FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse3_lib_help)(struct fsp_fuse_env *env, + struct fuse_args *args); +FSP_FUSE_API struct fuse3 *FSP_FUSE_API_NAME(fsp_fuse3_new_30)(struct fsp_fuse_env *env, + struct fuse_args *args, + const struct fuse3_operations *ops, size_t opsize, void *data); +FSP_FUSE_API struct fuse3 *FSP_FUSE_API_NAME(fsp_fuse3_new)(struct fsp_fuse_env *env, + struct fuse_args *args, + const struct fuse3_operations *ops, size_t opsize, void *data); +FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse3_destroy)(struct fsp_fuse_env *env, + struct fuse3 *f); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_mount)(struct fsp_fuse_env *env, + struct fuse3 *f, const char *mountpoint); +FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse3_unmount)(struct fsp_fuse_env *env, + struct fuse3 *f); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_loop)(struct fsp_fuse_env *env, + struct fuse3 *f); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_loop_mt_31)(struct fsp_fuse_env *env, + struct fuse3 *f, int clone_fd); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_loop_mt)(struct fsp_fuse_env *env, + struct fuse3 *f, struct fuse3_loop_config *config); +FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse3_exit)(struct fsp_fuse_env *env, + struct fuse3 *f); +FSP_FUSE_API struct fuse3_context *FSP_FUSE_API_NAME(fsp_fuse3_get_context)(struct fsp_fuse_env *env); + +FSP_FUSE_SYM( +int fuse3_main_real(int argc, char *argv[], + const struct fuse3_operations *ops, size_t opsize, void *data), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_main_real) + (fsp_fuse_env(), argc, argv, ops, opsize, data); +}) + +FSP_FUSE_SYM( +void fuse3_lib_help(struct fuse_args *args), +{ + FSP_FUSE_API_CALL(fsp_fuse3_lib_help) + (fsp_fuse_env(), args); +}) + +#if FUSE_USE_VERSION == 30 +FSP_FUSE_SYM( +struct fuse3 *fuse3_new_30(struct fuse_args *args, + const struct fuse3_operations *ops, size_t opsize, void *data), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_new_30) + (fsp_fuse_env(), args, ops, opsize, data); +}) +#define fuse_new(args, op, size, data)\ + fuse3_new_30(args, op, size, data) + +#else +FSP_FUSE_SYM( +struct fuse3 *fuse3_new(struct fuse_args *args, + const struct fuse3_operations *ops, size_t opsize, void *data), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_new) + (fsp_fuse_env(), args, ops, opsize, data); +}) +#endif + +FSP_FUSE_SYM( +void fuse3_destroy(struct fuse3 *f), +{ + FSP_FUSE_API_CALL(fsp_fuse3_destroy) + (fsp_fuse_env(), f); +}) + +FSP_FUSE_SYM( +int fuse3_mount(struct fuse3 *f, const char *mountpoint), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_mount) + (fsp_fuse_env(), f, mountpoint); +}) + +FSP_FUSE_SYM( +void fuse3_unmount(struct fuse3 *f), +{ + FSP_FUSE_API_CALL(fsp_fuse3_unmount) + (fsp_fuse_env(), f); +}) + +FSP_FUSE_SYM( +int fuse3_loop(struct fuse3 *f), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_loop) + (fsp_fuse_env(), f); +}) + +#if FUSE_USE_VERSION < 32 +FSP_FUSE_SYM( +int fuse3_loop_mt_31(struct fuse3 *f, int clone_fd), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_loop_mt_31) + (fsp_fuse_env(), f, clone_fd); +}) +#define fuse_loop_mt(f, clone_fd)\ + fuse3_loop_mt_31(f, clone_fd) + +#else +FSP_FUSE_SYM( +int fuse3_loop_mt(struct fuse3 *f, struct fuse3_loop_config *config), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_loop_mt) + (fsp_fuse_env(), f, config); +}) +#endif + +FSP_FUSE_SYM( +void fuse3_exit(struct fuse3 *f), +{ + FSP_FUSE_API_CALL(fsp_fuse3_exit) + (fsp_fuse_env(), f); +}) + +FSP_FUSE_SYM( +struct fuse3_context *fuse3_get_context(void), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_get_context) + (fsp_fuse_env()); +}) + +FSP_FUSE_SYM( +int fuse3_getgroups(int size, fuse_gid_t list[]), +{ + (void)size; + (void)list; + return -ENOSYS; +}) + +FSP_FUSE_SYM( +int fuse3_interrupted(void), +{ + return 0; +}) + +FSP_FUSE_SYM( +int fuse3_invalidate_path(struct fuse3 *f, const char *path), +{ + (void)f; + (void)path; + return -ENOENT; +}) + +FSP_FUSE_SYM( +int fuse3_notify_poll(struct fuse3_pollhandle *ph), +{ + (void)ph; + return 0; +}) + +FSP_FUSE_SYM( +int fuse3_start_cleanup_thread(struct fuse3 *f), +{ + (void)f; + return 0; +}) + +FSP_FUSE_SYM( +void fuse3_stop_cleanup_thread(struct fuse3 *f), +{ + (void)f; +}) + +FSP_FUSE_SYM( +int fuse3_clean_cache(struct fuse3 *f), +{ + (void)f; + return 600; +}) + +FSP_FUSE_SYM( +struct fuse3_session *fuse3_get_session(struct fuse3 *f), +{ + return (struct fuse3_session *)f; +}) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/inc/fuse3/fuse_common.h b/3rd_party/winfsp-1.10/inc/fuse3/fuse_common.h new file mode 100644 index 00000000..953be35f --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/fuse3/fuse_common.h @@ -0,0 +1,238 @@ +/** + * @file fuse3/fuse_common.h + * WinFsp FUSE3 compatible API. + * + * This file is derived from libfuse/include/fuse_common.h: + * FUSE: Filesystem in Userspace + * Copyright (C) 2001-2007 Miklos Szeredi + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef FUSE_COMMON_H_ +#define FUSE_COMMON_H_ + +#include "winfsp_fuse.h" +#if !defined(WINFSP_DLL_INTERNAL) +#include "fuse_opt.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define FUSE_MAJOR_VERSION 3 +#define FUSE_MINOR_VERSION 2 +#define FUSE_MAKE_VERSION(maj, min) ((maj) * 10 + (min)) +#define FUSE_VERSION FUSE_MAKE_VERSION(FUSE_MAJOR_VERSION, FUSE_MINOR_VERSION) + +#define FUSE_CAP_ASYNC_READ (1 << 0) +#define FUSE_CAP_POSIX_LOCKS (1 << 1) +#define FUSE_CAP_ATOMIC_O_TRUNC (1 << 3) +#define FUSE_CAP_EXPORT_SUPPORT (1 << 4) +#define FUSE_CAP_DONT_MASK (1 << 6) +#define FUSE_CAP_SPLICE_WRITE (1 << 7) +#define FUSE_CAP_SPLICE_MOVE (1 << 8) +#define FUSE_CAP_SPLICE_READ (1 << 9) +#define FUSE_CAP_FLOCK_LOCKS (1 << 10) +#define FUSE_CAP_IOCTL_DIR (1 << 11) +#define FUSE_CAP_AUTO_INVAL_DATA (1 << 12) +#define FUSE_CAP_READDIRPLUS (1 << 13) +#define FUSE_CAP_READDIRPLUS_AUTO (1 << 14) +#define FUSE_CAP_ASYNC_DIO (1 << 15) +#define FUSE_CAP_WRITEBACK_CACHE (1 << 16) +#define FUSE_CAP_NO_OPEN_SUPPORT (1 << 17) +#define FUSE_CAP_PARALLEL_DIROPS (1 << 18) +#define FUSE_CAP_POSIX_ACL (1 << 19) +#define FUSE_CAP_HANDLE_KILLPRIV (1 << 20) +#define FUSE_CAP_ALLOCATE (1 << 27) /* reserved (OSXFUSE) */ +#define FUSE_CAP_EXCHANGE_DATA (1 << 28) /* reserved (OSXFUSE) */ +#define FUSE_CAP_CASE_INSENSITIVE (1 << 29) /* file system is case insensitive */ +#define FUSE_CAP_VOL_RENAME (1 << 30) /* reserved (OSXFUSE) */ +#define FUSE_CAP_XTIMES (1 << 31) /* reserved (OSXFUSE) */ + +#define FSP_FUSE_CAP_CASE_INSENSITIVE FUSE_CAP_CASE_INSENSITIVE + +#define FUSE_IOCTL_COMPAT (1 << 0) +#define FUSE_IOCTL_UNRESTRICTED (1 << 1) +#define FUSE_IOCTL_RETRY (1 << 2) +#define FUSE_IOCTL_DIR (1 << 4) +#define FUSE_IOCTL_MAX_IOV 256 + +#define FUSE_BUFVEC_INIT(s) \ + ((struct fuse3_bufvec){ 1, 0, 0, { {s, (enum fuse3_buf_flags)0, 0, -1, 0} } }) + +struct fuse3_file_info +{ + int flags; + unsigned int writepage:1; + unsigned int direct_io:1; + unsigned int keep_cache:1; + unsigned int flush:1; + unsigned int nonseekable:1; + unsigned int flock_release:1; + unsigned int padding:27; + uint64_t fh; + uint64_t lock_owner; + uint32_t poll_events; +}; + +struct fuse3_loop_config +{ + int clone_fd; + unsigned int max_idle_threads; +}; + +struct fuse3_conn_info +{ + unsigned proto_major; + unsigned proto_minor; + unsigned max_write; + unsigned max_read; + unsigned max_readahead; + unsigned capable; + unsigned want; + unsigned max_background; + unsigned congestion_threshold; + unsigned time_gran; + unsigned reserved[22]; +}; + +enum fuse3_buf_flags +{ + FUSE_BUF_IS_FD = (1 << 1), + FUSE_BUF_FD_SEEK = (1 << 2), + FUSE_BUF_FD_RETRY = (1 << 3), +}; + +enum fuse3_buf_copy_flags +{ + FUSE_BUF_NO_SPLICE = (1 << 1), + FUSE_BUF_FORCE_SPLICE = (1 << 2), + FUSE_BUF_SPLICE_MOVE = (1 << 3), + FUSE_BUF_SPLICE_NONBLOCK = (1 << 4), +}; + +struct fuse3_buf +{ + size_t size; + enum fuse3_buf_flags flags; + void *mem; + int fd; + fuse_off_t pos; +}; + +struct fuse3_bufvec +{ + size_t count; + size_t idx; + size_t off; + struct fuse3_buf buf[1]; +}; + +struct fuse3_session; +struct fuse3_pollhandle; +struct fuse3_conn_info_opts; + +FSP_FUSE_API struct fuse3_conn_info_opts *FSP_FUSE_API_NAME(fsp_fuse3_parse_conn_info_opts)( + struct fsp_fuse_env *env, + struct fuse_args *args); +FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse3_apply_conn_info_opts)(struct fsp_fuse_env *env, + struct fuse3_conn_info_opts *opts, struct fuse3_conn_info *conn); +FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_version)(struct fsp_fuse_env *env); +FSP_FUSE_API const char *FSP_FUSE_API_NAME(fsp_fuse3_pkgversion)(struct fsp_fuse_env *env); +FSP_FUSE_API int32_t FSP_FUSE_API_NAME(fsp_fuse_ntstatus_from_errno)(struct fsp_fuse_env *env, + int err); + +FSP_FUSE_SYM( +struct fuse3_conn_info_opts* fuse3_parse_conn_info_opts( + struct fuse_args *args), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_parse_conn_info_opts) + (fsp_fuse_env(), args); +}) + +FSP_FUSE_SYM( +void fuse3_apply_conn_info_opts( + struct fuse3_conn_info_opts *opts, struct fuse3_conn_info *conn), +{ + FSP_FUSE_API_CALL(fsp_fuse3_apply_conn_info_opts) + (fsp_fuse_env(), opts, conn); +}) + +FSP_FUSE_SYM( +int fuse3_version(void), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_version) + (fsp_fuse_env()); +}) + +FSP_FUSE_SYM( +const char *fuse3_pkgversion(void), +{ + return FSP_FUSE_API_CALL(fsp_fuse3_pkgversion) + (fsp_fuse_env()); +}) + +FSP_FUSE_SYM( +void fuse3_pollhandle_destroy(struct fuse3_pollhandle *ph), +{ + (void)ph; +}) + +FSP_FUSE_SYM( +size_t fuse3_buf_size(const struct fuse3_bufvec *bufv), +{ + (void)bufv; + return 0; +}) + +FSP_FUSE_SYM( +ssize_t fuse3_buf_copy(struct fuse3_bufvec *dst, struct fuse3_bufvec *src, + enum fuse3_buf_copy_flags flags), +{ + (void)dst; + (void)src; + (void)flags; + return 0; +}) + +FSP_FUSE_SYM( +int fuse3_daemonize(int foreground), +{ + return fsp_fuse_daemonize(foreground); +}) + +FSP_FUSE_SYM( +int fuse3_set_signal_handlers(struct fuse3_session *se), +{ + return fsp_fuse_set_signal_handlers(se); +}) + +FSP_FUSE_SYM( +void fuse3_remove_signal_handlers(struct fuse3_session *se), +{ + (void)se; + fsp_fuse_set_signal_handlers(0); +}) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/inc/fuse3/fuse_opt.h b/3rd_party/winfsp-1.10/inc/fuse3/fuse_opt.h new file mode 100644 index 00000000..d6221856 --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/fuse3/fuse_opt.h @@ -0,0 +1,23 @@ +/** + * @file fuse3/fuse_opt.h + * WinFsp FUSE3 compatible API. + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#include "../fuse/fuse_opt.h" diff --git a/3rd_party/winfsp-1.10/inc/fuse3/winfsp_fuse.h b/3rd_party/winfsp-1.10/inc/fuse3/winfsp_fuse.h new file mode 100644 index 00000000..cf3a66be --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/fuse3/winfsp_fuse.h @@ -0,0 +1,82 @@ +/** + * @file fuse3/winfsp_fuse.h + * WinFsp FUSE3 compatible API. + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef FUSE3_WINFSP_FUSE_H_INCLUDED +#define FUSE3_WINFSP_FUSE_H_INCLUDED + +#include "../fuse/winfsp_fuse.h" + +#if defined(_WIN64) || defined(_WIN32) +typedef intptr_t ssize_t; +#endif + +#if !defined(WINFSP_DLL_INTERNAL) +#define fuse3 fuse +#define fuse3_apply_conn_info_opts fuse_apply_conn_info_opts +#define fuse3_buf fuse_buf +#define fuse3_buf_copy fuse_buf_copy +#define fuse3_buf_copy_flags fuse_buf_copy_flags +#define fuse3_buf_flags fuse_buf_flags +#define fuse3_buf_size fuse_buf_size +#define fuse3_bufvec fuse_bufvec +#define fuse3_clean_cache fuse_clean_cache +#define fuse3_config fuse_config +#define fuse3_conn_info fuse_conn_info +#define fuse3_conn_info_opts fuse_conn_info_opts +#define fuse3_context fuse_context +#define fuse3_daemonize fuse_daemonize +#define fuse3_destroy fuse_destroy +#define fuse3_exit fuse_exit +#define fuse3_file_info fuse_file_info +#define fuse3_fill_dir_flags fuse_fill_dir_flags +#define fuse3_fill_dir_t fuse_fill_dir_t +#define fuse3_get_context fuse_get_context +#define fuse3_get_session fuse_get_session +#define fuse3_getgroups fuse_getgroups +#define fuse3_interrupted fuse_interrupted +#define fuse3_invalidate_path fuse_invalidate_path +#define fuse3_lib_help fuse_lib_help +#define fuse3_loop fuse_loop +#define fuse3_loop_config fuse_loop_config +#define fuse3_loop_mt fuse_loop_mt +#define fuse3_loop_mt_31 fuse_loop_mt_31 +#define fuse3_main_real fuse_main_real +#define fuse3_mount fuse_mount +#define fuse3_new fuse_new +#define fuse3_new_30 fuse_new_30 +#define fuse3_notify_poll fuse_notify_poll +#define fuse3_operations fuse_operations +#define fuse3_parse_conn_info_opts fuse_parse_conn_info_opts +#define fuse3_pkgversion fuse_pkgversion +#define fuse3_pollhandle fuse_pollhandle +#define fuse3_pollhandle_destroy fuse_pollhandle_destroy +#define fuse3_readdir_flags fuse_readdir_flags +#define fuse3_remove_signal_handlers fuse_remove_signal_handlers +#define fuse3_session fuse_session +#define fuse3_set_signal_handlers fuse_set_signal_handlers +#define fuse3_start_cleanup_thread fuse_start_cleanup_thread +#define fuse3_stop_cleanup_thread fuse_stop_cleanup_thread +#define fuse3_unmount fuse_unmount +#define fuse3_version fuse_version +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/inc/winfsp/fsctl.h b/3rd_party/winfsp-1.10/inc/winfsp/fsctl.h new file mode 100644 index 00000000..0eec0da7 --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/winfsp/fsctl.h @@ -0,0 +1,690 @@ +/** + * @file winfsp/fsctl.h + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef WINFSP_FSCTL_H_INCLUDED +#define WINFSP_FSCTL_H_INCLUDED + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* static_assert is a C++11 feature, but seems to work with C on MSVC 2015 */ +#if defined(WINFSP_SYS_INTERNAL) || defined(WINFSP_DLL_INTERNAL) +#define FSP_FSCTL_STATIC_ASSERT(e,m) static_assert(e,m) +#else +#define FSP_FSCTL_STATIC_ASSERT(e,m) static_assert(1,"") +#endif + +#define FSP_FSCTL_STR(x) FSP_FSCTL_STR_(x) +#define FSP_FSCTL_STR_(x) #x +#if defined(MyProductName) +#define FSP_FSCTL_PRODUCT_NAME FSP_FSCTL_STR(MyProductName) +#else +#define FSP_FSCTL_PRODUCT_NAME "WinFsp" +#endif +#if defined(MyProductFileName) +#define FSP_FSCTL_PRODUCT_FILE_NAME FSP_FSCTL_STR(MyProductFileName) +#else +#define FSP_FSCTL_PRODUCT_FILE_NAME "winfsp" +#endif + +#define FSP_FSCTL_DRIVER_NAME FSP_FSCTL_PRODUCT_NAME +#define FSP_FSCTL_DISK_DEVICE_NAME FSP_FSCTL_DRIVER_NAME ".Disk" +#define FSP_FSCTL_NET_DEVICE_NAME FSP_FSCTL_DRIVER_NAME ".Net" +#define FSP_FSCTL_MUP_DEVICE_NAME FSP_FSCTL_DRIVER_NAME ".Mup" + +#if defined(MyFspFsctlDeviceClassGuid) +extern const __declspec(selectany) GUID FspFsctlDeviceClassGuid = MyFspFsctlDeviceClassGuid; +#else +extern const __declspec(selectany) GUID FspFsctlDeviceClassGuid = + { 0x6f9d25fa, 0x6dee, 0x4a9d, { 0x80, 0xf5, 0xe9, 0x8e, 0x14, 0xf3, 0x5e, 0x54 } }; +#endif +#if defined(MyFspFsvrtDeviceClassGuid) +extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid = MyFspFsvrtDeviceClassGuid; +#else +extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid = + { 0xb48171c3, 0xdd50, 0x4852, { 0x83, 0xa3, 0x34, 0x4c, 0x50, 0xd9, 0x3b, 0x17 } }; +#endif + +/* alignment macros */ +#define FSP_FSCTL_ALIGN_UP(x, s) (((x) + ((s) - 1L)) & ~((s) - 1L)) +#define FSP_FSCTL_DEFAULT_ALIGNMENT 8 +#define FSP_FSCTL_DEFAULT_ALIGN_UP(x) FSP_FSCTL_ALIGN_UP(x, FSP_FSCTL_DEFAULT_ALIGNMENT) +#define FSP_FSCTL_DECLSPEC_ALIGN __declspec(align(FSP_FSCTL_DEFAULT_ALIGNMENT)) + +/* fsctl device codes */ +#define FSP_FSCTL_MOUNTDEV \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'M', METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSP_FSCTL_VOLUME_NAME \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'N', METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSP_FSCTL_VOLUME_LIST \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'L', METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSP_FSCTL_TRANSACT \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'T', METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSP_FSCTL_TRANSACT_BATCH \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 't', METHOD_OUT_DIRECT, FILE_ANY_ACCESS) +#define FSP_FSCTL_STOP \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'S', METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSP_FSCTL_STOP0 \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 's', METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSP_FSCTL_NOTIFY \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'n', METHOD_NEITHER, FILE_ANY_ACCESS) + +/* fsctl internal device codes (usable only in-kernel) */ +#define FSP_FSCTL_TRANSACT_INTERNAL \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'I', METHOD_NEITHER, FILE_ANY_ACCESS) + +/* fsvol device codes */ +#define FSP_FSCTL_QUERY_WINFSP \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + '?', METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define FSP_FSCTL_VOLUME_PARAMS_PREFIX "\\VolumeParams=" + +#define FSP_FSCTL_VOLUME_NAME_SIZE (64 * sizeof(WCHAR)) +#define FSP_FSCTL_VOLUME_PREFIX_SIZE (192 * sizeof(WCHAR)) +#define FSP_FSCTL_VOLUME_FSNAME_SIZE (16 * sizeof(WCHAR)) +#define FSP_FSCTL_VOLUME_NAME_SIZEMAX (FSP_FSCTL_VOLUME_NAME_SIZE + FSP_FSCTL_VOLUME_PREFIX_SIZE) +FSP_FSCTL_STATIC_ASSERT(FSP_FSCTL_VOLUME_NAME_SIZEMAX <= 260 * sizeof(WCHAR), + "Max volume name size is greater than MAX_PATH."); + +#define FSP_FSCTL_TRANSACT_PATH_SIZEMAX (1024 * sizeof(WCHAR)) + +#define FSP_FSCTL_TRANSACT_REQ_SIZEMAX (16 * 1024 - 64) /* 64: size for internal request header */ +#define FSP_FSCTL_TRANSACT_RSP_SIZEMAX (16 * 1024) +#define FSP_FSCTL_TRANSACT_REQ_BUFFER_SIZEMAX (FSP_FSCTL_TRANSACT_REQ_SIZEMAX - sizeof(FSP_FSCTL_TRANSACT_REQ)) +#define FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX (FSP_FSCTL_TRANSACT_RSP_SIZEMAX - sizeof(FSP_FSCTL_TRANSACT_RSP)) +#define FSP_FSCTL_TRANSACT_BATCH_BUFFER_SIZEMIN (64 * 1024) +#define FSP_FSCTL_TRANSACT_BUFFER_SIZEMIN FSP_FSCTL_TRANSACT_REQ_SIZEMAX + +#define FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(T) ((HANDLE)((UINT_PTR)((T) & 0xffffffff))) +#define FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(T) ((UINT32)(((T) >> 32) & 0xffffffff)) + +#define FSP_FSCTL_DEVICECONTROL_SIZEMAX (4 * 1024) /* must be < FSP_FSCTL_TRANSACT_{REQ,RSP}_SIZEMAX */ + +/* marshalling */ +#pragma warning(push) +#pragma warning(disable:4200 4201) /* zero-sized array in struct/union; nameless struct/union */ +enum +{ + FspFsctlTransactReservedKind = 0, + FspFsctlTransactCreateKind, + FspFsctlTransactOverwriteKind, + FspFsctlTransactCleanupKind, + FspFsctlTransactCloseKind, + FspFsctlTransactReadKind, + FspFsctlTransactWriteKind, + FspFsctlTransactQueryInformationKind, + FspFsctlTransactSetInformationKind, + FspFsctlTransactQueryEaKind, + FspFsctlTransactSetEaKind, + FspFsctlTransactFlushBuffersKind, + FspFsctlTransactQueryVolumeInformationKind, + FspFsctlTransactSetVolumeInformationKind, + FspFsctlTransactQueryDirectoryKind, + FspFsctlTransactFileSystemControlKind, + FspFsctlTransactDeviceControlKind, + FspFsctlTransactShutdownKind, + FspFsctlTransactLockControlKind, + FspFsctlTransactQuerySecurityKind, + FspFsctlTransactSetSecurityKind, + FspFsctlTransactQueryStreamInformationKind, + FspFsctlTransactKindCount, +}; +enum +{ + FspFsctlTransactTimeoutMinimum = 1000, + FspFsctlTransactTimeoutMaximum = 10000, + FspFsctlTransactTimeoutDefault = 1000, /* DEPRECATED: default is unspecified */ + FspFsctlIrpTimeoutMinimum = 60000, + FspFsctlIrpTimeoutMaximum = 600000, + FspFsctlIrpTimeoutDefault = 300000, + FspFsctlIrpTimeoutDebug = 142, /* special value for IRP timeout testing */ + FspFsctlIrpCapacityMinimum = 100, + FspFsctlIrpCapacityMaximum = 1000, + FspFsctlIrpCapacityDefault = 1000, +}; +#define FSP_FSCTL_VOLUME_PARAMS_V0_FIELD_DEFN\ + UINT16 Version; /* set to 0 or sizeof(FSP_FSCTL_VOLUME_PARAMS) */\ + /* volume information */\ + UINT16 SectorSize;\ + UINT16 SectorsPerAllocationUnit;\ + UINT16 MaxComponentLength; /* maximum file name component length (bytes) */\ + UINT64 VolumeCreationTime;\ + UINT32 VolumeSerialNumber;\ + /* I/O timeouts, capacity, etc. */\ + UINT32 TransactTimeout; /* DEPRECATED: (millis; 1 sec - 10 sec) */\ + UINT32 IrpTimeout; /* pending IRP timeout (millis; 1 min - 10 min) */\ + UINT32 IrpCapacity; /* maximum number of pending IRP's (100 - 1000)*/\ + UINT32 FileInfoTimeout; /* FileInfo/Security/VolumeInfo timeout (millis) */\ + /* FILE_FS_ATTRIBUTE_INFORMATION::FileSystemAttributes */\ + UINT32 CaseSensitiveSearch:1; /* file system supports case-sensitive file names */\ + UINT32 CasePreservedNames:1; /* file system preserves the case of file names */\ + UINT32 UnicodeOnDisk:1; /* file system supports Unicode in file names */\ + UINT32 PersistentAcls:1; /* file system preserves and enforces access control lists */\ + UINT32 ReparsePoints:1; /* file system supports reparse points */\ + UINT32 ReparsePointsAccessCheck:1; /* file system performs reparse point access checks */\ + UINT32 NamedStreams:1; /* file system supports named streams */\ + UINT32 HardLinks:1; /* unimplemented; set to 0 */\ + UINT32 ExtendedAttributes:1; /* file system supports extended attributes */\ + UINT32 ReadOnlyVolume:1;\ + /* kernel-mode flags */\ + UINT32 PostCleanupWhenModifiedOnly:1; /* post Cleanup when a file was modified/deleted */\ + UINT32 PassQueryDirectoryPattern:1; /* pass Pattern during QueryDirectory operations */\ + UINT32 AlwaysUseDoubleBuffering:1;\ + UINT32 PassQueryDirectoryFileName:1; /* pass FileName during QueryDirectory (GetDirInfoByName) */\ + UINT32 FlushAndPurgeOnCleanup:1; /* keeps file off "standby" list */\ + UINT32 DeviceControl:1; /* support user-mode ioctl handling */\ + /* user-mode flags */\ + UINT32 UmFileContextIsUserContext2:1; /* user mode: FileContext parameter is UserContext2 */\ + UINT32 UmFileContextIsFullContext:1; /* user mode: FileContext parameter is FullContext */\ + UINT32 UmNoReparsePointsDirCheck:1; /* user mode: no dir option check for reparse points */\ + UINT32 UmReservedFlags:5;\ + /* additional kernel-mode flags */\ + UINT32 AllowOpenInKernelMode:1; /* allow kernel mode to open files when possible */\ + UINT32 CasePreservedExtendedAttributes:1; /* preserve case of EA (default is UPPERCASE) */\ + UINT32 WslFeatures:1; /* support features required for WSLinux */\ + UINT32 DirectoryMarkerAsNextOffset:1; /* directory marker is next offset instead of last name */\ + UINT32 RejectIrpPriorToTransact0:1; /* reject IRP's prior to FspFsctlTransact with 0 buffers */\ + UINT32 SupportsPosixUnlinkRename:1; /* file system supports POSIX-style unlink and rename */\ + UINT32 KmReservedFlags:2;\ + WCHAR Prefix[FSP_FSCTL_VOLUME_PREFIX_SIZE / sizeof(WCHAR)]; /* UNC prefix (\Server\Share) */\ + WCHAR FileSystemName[FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)]; +#define FSP_FSCTL_VOLUME_PARAMS_V1_FIELD_DEFN\ + /* additional fields; specify .Version == sizeof(FSP_FSCTL_VOLUME_PARAMS) */\ + UINT32 VolumeInfoTimeoutValid:1; /* VolumeInfoTimeout field is valid */\ + UINT32 DirInfoTimeoutValid:1; /* DirInfoTimeout field is valid */\ + UINT32 SecurityTimeoutValid:1; /* SecurityTimeout field is valid*/\ + UINT32 StreamInfoTimeoutValid:1; /* StreamInfoTimeout field is valid */\ + UINT32 EaTimeoutValid:1; /* EaTimeout field is valid */\ + UINT32 KmAdditionalReservedFlags:27;\ + UINT32 VolumeInfoTimeout; /* volume info timeout (millis); overrides FileInfoTimeout */\ + UINT32 DirInfoTimeout; /* dir info timeout (millis); overrides FileInfoTimeout */\ + UINT32 SecurityTimeout; /* security info timeout (millis); overrides FileInfoTimeout */\ + UINT32 StreamInfoTimeout; /* stream info timeout (millis); overrides FileInfoTimeout */\ + UINT32 EaTimeout; /* EA timeout (millis); overrides FileInfoTimeout */\ + UINT32 FsextControlCode;\ + UINT32 Reserved32[1];\ + UINT64 Reserved64[2]; +typedef struct +{ + FSP_FSCTL_VOLUME_PARAMS_V0_FIELD_DEFN +} FSP_FSCTL_VOLUME_PARAMS_V0; +FSP_FSCTL_STATIC_ASSERT(456 == sizeof(FSP_FSCTL_VOLUME_PARAMS_V0), + "sizeof(FSP_FSCTL_VOLUME_PARAMS_V0) must be exactly 456."); +typedef struct +{ + FSP_FSCTL_VOLUME_PARAMS_V0_FIELD_DEFN + FSP_FSCTL_VOLUME_PARAMS_V1_FIELD_DEFN +} FSP_FSCTL_VOLUME_PARAMS; +FSP_FSCTL_STATIC_ASSERT(504 == sizeof(FSP_FSCTL_VOLUME_PARAMS), + "sizeof(FSP_FSCTL_VOLUME_PARAMS) is currently 504. Update this assertion check if it changes."); +typedef struct +{ + UINT64 TotalSize; + UINT64 FreeSize; + UINT16 VolumeLabelLength; + WCHAR VolumeLabel[32]; +} FSP_FSCTL_VOLUME_INFO; +FSP_FSCTL_STATIC_ASSERT(88 == sizeof(FSP_FSCTL_VOLUME_INFO), + "sizeof(FSP_FSCTL_VOLUME_INFO) must be exactly 88."); +typedef struct +{ + UINT32 FileAttributes; + UINT32 ReparseTag; + UINT64 AllocationSize; + UINT64 FileSize; + UINT64 CreationTime; + UINT64 LastAccessTime; + UINT64 LastWriteTime; + UINT64 ChangeTime; + UINT64 IndexNumber; + UINT32 HardLinks; /* unimplemented: set to 0 */ + UINT32 EaSize; +} FSP_FSCTL_FILE_INFO; +FSP_FSCTL_STATIC_ASSERT(72 == sizeof(FSP_FSCTL_FILE_INFO), + "sizeof(FSP_FSCTL_FILE_INFO) must be exactly 72."); +typedef struct +{ + FSP_FSCTL_FILE_INFO FileInfo; + PWSTR NormalizedName; + UINT16 NormalizedNameSize; +} FSP_FSCTL_OPEN_FILE_INFO; +typedef struct +{ + UINT16 Size; + FSP_FSCTL_FILE_INFO FileInfo; + union + { + UINT64 NextOffset; + UINT8 Padding[24]; + /* make struct as big as FILE_ID_BOTH_DIR_INFORMATION; allows for in-place copying */ + } DUMMYUNIONNAME; + WCHAR FileNameBuf[]; +} FSP_FSCTL_DIR_INFO; +FSP_FSCTL_STATIC_ASSERT(104 == sizeof(FSP_FSCTL_DIR_INFO), + "sizeof(FSP_FSCTL_DIR_INFO) must be exactly 104."); +typedef struct +{ + UINT16 Size; + UINT64 StreamSize; + UINT64 StreamAllocationSize; + WCHAR StreamNameBuf[]; +} FSP_FSCTL_STREAM_INFO; +FSP_FSCTL_STATIC_ASSERT(24 == sizeof(FSP_FSCTL_STREAM_INFO), + "sizeof(FSP_FSCTL_STREAM_INFO) must be exactly 24."); +typedef struct +{ + UINT16 Size; + UINT32 Filter; + UINT32 Action; + WCHAR FileNameBuf[]; +} FSP_FSCTL_NOTIFY_INFO; +FSP_FSCTL_STATIC_ASSERT(12 == sizeof(FSP_FSCTL_NOTIFY_INFO), + "sizeof(FSP_FSCTL_NOTIFY_INFO) must be exactly 12."); +typedef struct +{ + UINT64 UserContext; + UINT64 UserContext2; +} FSP_FSCTL_TRANSACT_FULL_CONTEXT; +typedef struct +{ + UINT16 Offset; + UINT16 Size; +} FSP_FSCTL_TRANSACT_BUF; +typedef struct +{ + UINT16 Version; + UINT16 Size; + UINT32 Kind; + UINT64 Hint; + union + { + struct + { + UINT32 CreateOptions; /* Disposition: high 8 bits; Options: low 24 bits */ + UINT32 FileAttributes; /* file attributes for new files */ + FSP_FSCTL_TRANSACT_BUF SecurityDescriptor; /* security descriptor for new files */ + UINT64 AllocationSize; /* initial allocation size */ + UINT64 AccessToken; /* request access token (PID,HANDLE) */ + UINT32 DesiredAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */ + UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */ + UINT32 ShareAccess; /* FILE_SHARE_{READ,WRITE,DELETE} */ + FSP_FSCTL_TRANSACT_BUF Ea; /* extended attributes or reparse point buffer */ + UINT32 UserMode:1; /* request originated in user mode */ + UINT32 HasTraversePrivilege:1; /* requestor has TOKEN_HAS_TRAVERSE_PRIVILEGE */ + UINT32 HasBackupPrivilege:1; /* requestor has TOKEN_HAS_BACKUP_PRIVILEGE */ + UINT32 HasRestorePrivilege:1; /* requestor has TOKEN_HAS_RESTORE_PRIVILEGE */ + UINT32 OpenTargetDirectory:1; /* open target dir and report FILE_{EXISTS,DOES_NOT_EXIST} */ + UINT32 CaseSensitive:1; /* FileName comparisons should be case-sensitive */ + UINT32 HasTrailingBackslash:1; /* FileName had trailing backslash */ + UINT32 AcceptsSecurityDescriptor:1; + UINT32 EaIsReparsePoint:1; /* Ea buffer is reparse point */ + UINT32 ReservedFlags:24; + UINT16 NamedStream; /* request targets named stream; colon offset in FileName */ + } Create; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + UINT32 FileAttributes; /* file attributes for overwritten/superseded files */ + UINT64 AllocationSize; /* allocation size for overwritten/superseded files */ + UINT32 Supersede:1; /* 0: FILE_OVERWRITE operation, 1: FILE_SUPERSEDE operation */ + FSP_FSCTL_TRANSACT_BUF Ea; /* extended attributes buffer */ + } Overwrite; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + UINT32 Delete:1; /* file must be deleted */ + UINT32 SetAllocationSize:1; + UINT32 SetArchiveBit:1; + UINT32 SetLastAccessTime:1; + UINT32 SetLastWriteTime:1; + UINT32 SetChangeTime:1; + } Cleanup; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + } Close; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + UINT64 Address; + UINT64 Offset; + UINT32 Length; + UINT32 Key; + } Read; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + UINT64 Address; + UINT64 Offset; + UINT32 Length; + UINT32 Key; + UINT32 ConstrainedIo:1; + } Write; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + } QueryInformation; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + UINT32 FileInformationClass; + union + { + struct + { + UINT64 AllocationSize; + } Allocation; + struct + { + UINT32 FileAttributes; + UINT64 CreationTime; + UINT64 LastAccessTime; + UINT64 LastWriteTime; + UINT64 ChangeTime; + } Basic; + struct + { + UINT32 Delete:1; + } Disposition; + struct + { + UINT32 Flags; + } DispositionEx; + struct + { + UINT64 FileSize; + } EndOfFile; + struct + { + FSP_FSCTL_TRANSACT_BUF NewFileName; + UINT64 AccessToken; /* request access token (PID,HANDLE) */ + } Rename; + struct + { + FSP_FSCTL_TRANSACT_BUF NewFileName; + UINT64 AccessToken; /* request access token (PID,HANDLE) */ + UINT32 Flags; + } RenameEx; + } Info; + } SetInformation; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + } QueryEa; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + FSP_FSCTL_TRANSACT_BUF Ea; + } SetEa; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + } FlushBuffers; + struct + { + UINT32 FsInformationClass; + union + { + struct + { + FSP_FSCTL_TRANSACT_BUF VolumeLabel; + } Label; + } Info; + } SetVolumeInformation; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + UINT64 Address; + UINT32 Length; + FSP_FSCTL_TRANSACT_BUF Pattern; + FSP_FSCTL_TRANSACT_BUF Marker; + UINT32 CaseSensitive:1; /* FileName comparisons should be case-sensitive */ + UINT32 PatternIsFileName:1; /* Pattern does not contain wildcards */ + } QueryDirectory; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + UINT32 FsControlCode; + FSP_FSCTL_TRANSACT_BUF Buffer; + UINT16 TargetOnFileSystem; /* the target of the symbolic link is on this file system */ + } FileSystemControl; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + UINT32 IoControlCode; + FSP_FSCTL_TRANSACT_BUF Buffer; + UINT32 OutputLength; + } DeviceControl; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + } QuerySecurity; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + UINT32 SecurityInformation; + FSP_FSCTL_TRANSACT_BUF SecurityDescriptor; + } SetSecurity; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + } QueryStreamInformation; + } Req; + FSP_FSCTL_TRANSACT_BUF FileName; + /* Create,Cleanup,SetInformation{Disposition,Rename},FileSystemControl{ReparsePoint} */ + FSP_FSCTL_DECLSPEC_ALIGN UINT8 Buffer[]; +} FSP_FSCTL_TRANSACT_REQ; +typedef struct +{ + UINT16 Version; + UINT16 Size; + UINT32 Kind; + UINT64 Hint; + struct + { + UINT32 Information; + UINT32 Status; + } IoStatus; + union + { + union + { + /* IoStatus.Status == STATUS_SUCCESS */ + struct + { + UINT64 UserContext; /* user context associated with file node */ + UINT64 UserContext2; /* user context associated with file descriptor (handle) */ + UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */ + FSP_FSCTL_TRANSACT_BUF SecurityDescriptor; + FSP_FSCTL_FILE_INFO FileInfo; + FSP_FSCTL_TRANSACT_BUF FileName; + UINT32 DisableCache:1; + UINT32 HasSecurityDescriptor:1; + } Opened; + /* IoStatus.Status == STATUS_REPARSE */ + struct + { + FSP_FSCTL_TRANSACT_BUF Buffer; + } Reparse; + } Create; + struct + { + FSP_FSCTL_FILE_INFO FileInfo; + } Overwrite; + struct + { + FSP_FSCTL_FILE_INFO FileInfo; + } Write; + struct + { + FSP_FSCTL_FILE_INFO FileInfo; + } QueryInformation; + struct + { + FSP_FSCTL_FILE_INFO FileInfo; /* valid: File{Allocation,Basic,EndOfFile}Information */ + } SetInformation; + struct + { + FSP_FSCTL_TRANSACT_BUF Ea; + } QueryEa; + struct + { + FSP_FSCTL_FILE_INFO FileInfo; + FSP_FSCTL_TRANSACT_BUF Ea; /* Size==0 means no extended atttributed returned */ + } SetEa; + struct + { + FSP_FSCTL_FILE_INFO FileInfo; /* valid when flushing file (not volume) */ + } FlushBuffers; + struct + { + FSP_FSCTL_VOLUME_INFO VolumeInfo; + } QueryVolumeInformation; + struct + { + FSP_FSCTL_VOLUME_INFO VolumeInfo; + } SetVolumeInformation; + struct + { + FSP_FSCTL_TRANSACT_BUF Buffer; + } FileSystemControl; + struct + { + FSP_FSCTL_TRANSACT_BUF Buffer; + } DeviceControl; + struct + { + FSP_FSCTL_TRANSACT_BUF SecurityDescriptor; + } QuerySecurity; + struct + { + FSP_FSCTL_TRANSACT_BUF SecurityDescriptor; /* Size==0 means no security descriptor returned */ + } SetSecurity; + struct + { + FSP_FSCTL_TRANSACT_BUF Buffer; + } QueryStreamInformation; + } Rsp; + FSP_FSCTL_DECLSPEC_ALIGN UINT8 Buffer[]; +} FSP_FSCTL_TRANSACT_RSP; +#pragma warning(pop) +FSP_FSCTL_STATIC_ASSERT(FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX > FSP_FSCTL_TRANSACT_PATH_SIZEMAX, + "FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX must be greater than FSP_FSCTL_TRANSACT_PATH_SIZEMAX " + "to detect when a normalized name has been set during a Create/Open request."); +static inline BOOLEAN FspFsctlTransactCanProduceRequest( + FSP_FSCTL_TRANSACT_REQ *Request, PVOID RequestBufEnd) +{ + return (PUINT8)Request + FSP_FSCTL_TRANSACT_REQ_SIZEMAX <= (PUINT8)RequestBufEnd; +} +static inline FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactProduceRequest( + FSP_FSCTL_TRANSACT_REQ *Request, SIZE_T RequestSize) +{ + PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_DEFAULT_ALIGN_UP(RequestSize); + return (FSP_FSCTL_TRANSACT_REQ *)NextRequest; +} +static inline FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactConsumeRequest( + FSP_FSCTL_TRANSACT_REQ *Request, PVOID RequestBufEnd) +{ + if ((PUINT8)Request + sizeof(Request->Size) > (PUINT8)RequestBufEnd || + sizeof(FSP_FSCTL_TRANSACT_REQ) > Request->Size) + return 0; + PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_DEFAULT_ALIGN_UP(Request->Size); + return NextRequest <= RequestBufEnd ? (FSP_FSCTL_TRANSACT_REQ *)NextRequest : 0; +} +static inline BOOLEAN FspFsctlTransactCanProduceResponse( + FSP_FSCTL_TRANSACT_RSP *Response, PVOID ResponseBufEnd) +{ + return (PUINT8)Response + FSP_FSCTL_TRANSACT_RSP_SIZEMAX <= (PUINT8)ResponseBufEnd; +} +static inline FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactProduceResponse( + FSP_FSCTL_TRANSACT_RSP *Response, SIZE_T ResponseSize) +{ + PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_DEFAULT_ALIGN_UP(ResponseSize); + return (FSP_FSCTL_TRANSACT_RSP *)NextResponse; +} +static inline FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactConsumeResponse( + FSP_FSCTL_TRANSACT_RSP *Response, PVOID ResponseBufEnd) +{ + if ((PUINT8)Response + sizeof(Response->Size) > (PUINT8)ResponseBufEnd || + sizeof(FSP_FSCTL_TRANSACT_RSP) > Response->Size) + return 0; + PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_DEFAULT_ALIGN_UP(Response->Size); + return NextResponse <= ResponseBufEnd ? (FSP_FSCTL_TRANSACT_RSP *)NextResponse : 0; +} + +#if !defined(_KERNEL_MODE) +FSP_API NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, + const FSP_FSCTL_VOLUME_PARAMS *VolumeParams, + PWCHAR VolumeNameBuf, SIZE_T VolumeNameSize, + PHANDLE PVolumeHandle); +FSP_API NTSTATUS FspFsctlMakeMountdev(HANDLE VolumeHandle, + BOOLEAN Persistent, GUID *UniqueId); +FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle, + PVOID ResponseBuf, SIZE_T ResponseBufSize, + PVOID RequestBuf, SIZE_T *PRequestBufSize, + BOOLEAN Batch); +FSP_API NTSTATUS FspFsctlStop(HANDLE VolumeHandle); +FSP_API NTSTATUS FspFsctlStop0(HANDLE VolumeHandle); +FSP_API NTSTATUS FspFsctlNotify(HANDLE VolumeHandle, + FSP_FSCTL_NOTIFY_INFO *NotifyInfo, SIZE_T Size); +FSP_API NTSTATUS FspFsctlGetVolumeList(PWSTR DevicePath, + PWCHAR VolumeListBuf, PSIZE_T PVolumeListSize); +FSP_API NTSTATUS FspFsctlPreflight(PWSTR DevicePath); + +typedef struct +{ + /* in */ + HANDLE VolumeHandle; /* volume handle returned by FspFsctlCreateVolume */ + PWSTR VolumeName; /* volume name returned by FspFsctlCreateVolume */ + PSECURITY_DESCRIPTOR Security; /* optional: security descriptor for directories */ + UINT64 Reserved; /* reserved for future use */ + /* in/out */ + PWSTR MountPoint; /* FspMountSet sets drive in buffer when passed "*:" */ + HANDLE MountHandle; /* FspMountSet sets, FspMountRemove uses */ +} FSP_MOUNT_DESC; +FSP_API NTSTATUS FspMountSet(FSP_MOUNT_DESC *Desc); +FSP_API NTSTATUS FspMountRemove(FSP_MOUNT_DESC *Desc); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/inc/winfsp/launch.h b/3rd_party/winfsp-1.10/inc/winfsp/launch.h new file mode 100644 index 00000000..0b29acac --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/winfsp/launch.h @@ -0,0 +1,349 @@ +/** + * @file winfsp/launch.h + * WinFsp Launch API. + * + * In order to use the WinFsp Launch API a program must include <winfsp/launch.h> + * and link with the winfsp_x64.dll (or winfsp_x86.dll) library. + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef WINFSP_LAUNCH_H_INCLUDED +#define WINFSP_LAUNCH_H_INCLUDED + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define FSP_LAUNCH_REGKEY "Software\\" FSP_FSCTL_PRODUCT_NAME "\\Services" +#define FSP_LAUNCH_REGKEY_WOW64 KEY_WOW64_32KEY + +#define FSP_LAUNCH_PIPE_NAME "\\\\.\\pipe\\" FSP_FSCTL_PRODUCT_NAME ".{14E7137D-22B4-437A-B0C1-D21D1BDF3767}" +#define FSP_LAUNCH_PIPE_BUFFER_SIZE 4096 +#define FSP_LAUNCH_PIPE_OWNER ((PSID)WinLocalSystemSid) + +/* + * The launcher named pipe SDDL gives full access to LocalSystem and Administrators and + * GENERIC_READ and FILE_WRITE_DATA access to Everyone. We are careful not to give the + * FILE_CREATE_PIPE_INSTANCE right to Everyone to disallow the creation of additional + * pipe instances. + */ +#define FSP_LAUNCH_PIPE_SDDL "O:SYG:SYD:P(A;;GA;;;SY)(A;;GA;;;BA)(A;;GRDCCR;;;WD)" + +/* + * The default service instance SDDL gives full access to LocalSystem and Administrators. + * The only possible service instance rights are as follows: + * RP SERVICE_START + * WP SERVICE_STOP + * LC SERVICE_QUERY_STATUS + * + * To create a service that can be started, stopped or queried by Everyone, you can set + * the following SDDL: + * D:P(A;;RPWPLC;;;WD) + */ +#define FSP_LAUNCH_SERVICE_DEFAULT_SDDL "D:P(A;;RPWPLC;;;SY)(A;;RPWPLC;;;BA)" +#define FSP_LAUNCH_SERVICE_WORLD_SDDL "D:P(A;;RPWPLC;;;WD)" + +enum +{ + FspLaunchCmdStart = 'S', /* requires: SERVICE_START */ + FspLaunchCmdStartWithSecret = 'X', /* requires: SERVICE_START */ + FspLaunchCmdStop = 'T', /* requires: SERVICE_STOP */ + FspLaunchCmdGetInfo = 'I', /* requires: SERVICE_QUERY_STATUS */ + FspLaunchCmdGetNameList = 'L', /* requires: none*/ + FspLaunchCmdDefineDosDevice = 'D', /* internal: do not use! */ + FspLaunchCmdQuit = 'Q', /* DEBUG version only */ +}; + +enum +{ + FspLaunchCmdSuccess = '$', + FspLaunchCmdFailure = '!', +}; + +/** + * @group Launch Control + */ +/** + * Call launcher pipe. + * + * This function is used to send a command to the launcher and receive a response. + * + * @param Command + * Launcher command to send. For example, the 'L' launcher command instructs + * the launcher to list all running service instances. + * @param Argc + * Command argument count. May be 0. + * @param Argv + * Command argument array. May be NULL. + * @param Argl + * Command argument length array. May be NULL. If this is NULL all command arguments + * are assumed to be NULL-terminated strings. It is also possible for specific arguments + * to be NULL-terminated; in this case pass -1 in the corresponding Argl position. + * @param Buffer + * Buffer that receives the command response. May be NULL. + * @param PSize + * Pointer to a ULONG. On input it contains the size of the Buffer. On output it + * contains the number of bytes transferred. May be NULL. + * @param PLauncherError + * Receives the launcher error if any. This is always a Win32 error code. May not be NULL. + * @return + * STATUS_SUCCESS if the command is sent successfully to the launcher, even if the launcher + * returns an error. Other status codes indicate a communication error. Launcher errors are + * reported through PLauncherError. + */ +FSP_API NTSTATUS FspLaunchCallLauncherPipe( + WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl, + PWSTR Buffer, PULONG PSize, + PULONG PLauncherError); +/** + * Call launcher pipe. + * + * This function is used to send a command to the launcher and receive a response. + * + * @param Command + * Launcher command to send. For example, the 'L' launcher command instructs + * the launcher to list all running service instances. + * @param Argc + * Command argument count. May be 0. + * @param Argv + * Command argument array. May be NULL. + * @param Argl + * Command argument length array. May be NULL. If this is NULL all command arguments + * are assumed to be NULL-terminated strings. It is also possible for specific arguments + * to be NULL-terminated; in this case pass -1 in the corresponding Argl position. + * @param Buffer + * Buffer that receives the command response. May be NULL. + * @param PSize + * Pointer to a ULONG. On input it contains the size of the Buffer. On output it + * contains the number of bytes transferred. May be NULL. + * @param AllowImpersonation + * Allow caller to be impersonated by launcher. + * @param PLauncherError + * Receives the launcher error if any. This is always a Win32 error code. May not be NULL. + * @return + * STATUS_SUCCESS if the command is sent successfully to the launcher, even if the launcher + * returns an error. Other status codes indicate a communication error. Launcher errors are + * reported through PLauncherError. + */ +FSP_API NTSTATUS FspLaunchCallLauncherPipeEx( + WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl, + PWSTR Buffer, PULONG PSize, + BOOLEAN AllowImpersonation, + PULONG PLauncherError); +/** + * Start a service instance. + * + * @param ClassName + * Class name of the service instance to start. + * @param InstanceName + * Instance name of the service instance to start. + * @param Argc + * Service instance argument count. May be 0. + * @param Argv + * Service instance argument array. May be NULL. + * @param HasSecret + * Whether the last argument in Argv is assumed to be a secret (e.g. password) or not. + * Secrets are passed to service instances through standard input rather than the command + * line. + * @param PLauncherError + * Receives the launcher error if any. This is always a Win32 error code. May not be NULL. + * @return + * STATUS_SUCCESS if the command is sent successfully to the launcher, even if the launcher + * returns an error. Other status codes indicate a communication error. Launcher errors are + * reported through PLauncherError. + */ +FSP_API NTSTATUS FspLaunchStart( + PWSTR ClassName, PWSTR InstanceName, ULONG Argc, PWSTR *Argv, + BOOLEAN HasSecret, + PULONG PLauncherError); +/** + * Start a service instance. + * + * @param ClassName + * Class name of the service instance to start. + * @param InstanceName + * Instance name of the service instance to start. + * @param Argc + * Service instance argument count. May be 0. + * @param Argv + * Service instance argument array. May be NULL. + * @param HasSecret + * Whether the last argument in Argv is assumed to be a secret (e.g. password) or not. + * Secrets are passed to service instances through standard input rather than the command + * line. + * @param AllowImpersonation + * Allow caller to be impersonated by launcher. + * @param PLauncherError + * Receives the launcher error if any. This is always a Win32 error code. May not be NULL. + * @return + * STATUS_SUCCESS if the command is sent successfully to the launcher, even if the launcher + * returns an error. Other status codes indicate a communication error. Launcher errors are + * reported through PLauncherError. + */ +FSP_API NTSTATUS FspLaunchStartEx( + PWSTR ClassName, PWSTR InstanceName, ULONG Argc, PWSTR *Argv, + BOOLEAN HasSecret, + BOOLEAN AllowImpersonation, + PULONG PLauncherError); +/** + * Stop a service instance. + * + * @param ClassName + * Class name of the service instance to stop. + * @param InstanceName + * Instance name of the service instance to stop. + * @param PLauncherError + * Receives the launcher error if any. This is always a Win32 error code. May not be NULL. + * @return + * STATUS_SUCCESS if the command is sent successfully to the launcher, even if the launcher + * returns an error. Other status codes indicate a communication error. Launcher errors are + * reported through PLauncherError. + */ +FSP_API NTSTATUS FspLaunchStop( + PWSTR ClassName, PWSTR InstanceName, + PULONG PLauncherError); +/** + * Get information about a service instance. + * + * The information is a list of NULL-terminated strings: the class name of the service instance, + * the instance name of the service instance and the full command line used to start the service + * instance. + * + * @param ClassName + * Class name of the service instance to stop. + * @param InstanceName + * Instance name of the service instance to stop. + * @param Buffer + * Buffer that receives the command response. May be NULL. + * @param PSize + * Pointer to a ULONG. On input it contains the size of the Buffer. On output it + * contains the number of bytes transferred. May be NULL. + * @param PLauncherError + * Receives the launcher error if any. This is always a Win32 error code. May not be NULL. + * @return + * STATUS_SUCCESS if the command is sent successfully to the launcher, even if the launcher + * returns an error. Other status codes indicate a communication error. Launcher errors are + * reported through PLauncherError. + */ +FSP_API NTSTATUS FspLaunchGetInfo( + PWSTR ClassName, PWSTR InstanceName, + PWSTR Buffer, PULONG PSize, + PULONG PLauncherError); +/** + * List service instances. + * + * The information is a list of pairs of NULL-terminated strings. Each pair contains the class + * name and instance name of a service instance. All currently running service instances are + * listed. + * + * @param Buffer + * Buffer that receives the command response. May be NULL. + * @param PSize + * Pointer to a ULONG. On input it contains the size of the Buffer. On output it + * contains the number of bytes transferred. May be NULL. + * @param PLauncherError + * Receives the launcher error if any. This is always a Win32 error code. May not be NULL. + * @return + * STATUS_SUCCESS if the command is sent successfully to the launcher, even if the launcher + * returns an error. Other status codes indicate a communication error. Launcher errors are + * reported through PLauncherError. + */ +FSP_API NTSTATUS FspLaunchGetNameList( + PWSTR Buffer, PULONG PSize, + PULONG PLauncherError); + +/** + * @group Service Registry + */ +#pragma warning(push) +#pragma warning(disable:4200) /* zero-sized array in struct/union */ +/** + * Service registry record. + */ +typedef struct _FSP_LAUNCH_REG_RECORD +{ + PWSTR Agent; + PWSTR Executable; + PWSTR CommandLine; + PWSTR WorkDirectory; + PWSTR RunAs; + PWSTR Security; + PWSTR AuthPackage; + PWSTR Stderr; + PVOID Reserved0[4]; + ULONG JobControl; + ULONG Credentials; + ULONG AuthPackageId; + ULONG Recovery; + ULONG Reserved1[4]; + UINT8 Buffer[]; +} FSP_LAUNCH_REG_RECORD; +#pragma warning(pop) +/** + * Add/change/delete a service registry record. + * + * @param ClassName + * The service class name. + * @param Record + * The record to set in the registry. If NULL, the registry record is deleted. + * @return + * STATUS_SUCCESS or error code. + */ +FSP_API NTSTATUS FspLaunchRegSetRecord( + PWSTR ClassName, + const FSP_LAUNCH_REG_RECORD *Record); +/** + * Get a service registry record. + * + * @param ClassName + * The service class name. + * @param Agent + * The name of the agent that is retrieving the service record. This API matches + * the supplied Agent against the Agent in the service record and it only returns + * the record if they match. Pass NULL to match any Agent. + * @param PRecord + * Pointer to a record pointer. Memory for the service record will be allocated + * and a pointer to it will be stored at this address. This memory must be later + * freed using FspLaunchRegFreeRecord. + * @return + * STATUS_SUCCESS or error code. + * @see + * FspLaunchRegFreeRecord + */ +FSP_API NTSTATUS FspLaunchRegGetRecord( + PWSTR ClassName, PWSTR Agent, + FSP_LAUNCH_REG_RECORD **PRecord); +/** + * Free a service registry record. + * + * @param Record + * The service record to free. + * @see + * FspLaunchRegGetRecord + */ +FSP_API VOID FspLaunchRegFreeRecord( + FSP_LAUNCH_REG_RECORD *Record); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/inc/winfsp/winfsp.h b/3rd_party/winfsp-1.10/inc/winfsp/winfsp.h new file mode 100644 index 00000000..00b4eb89 --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/winfsp/winfsp.h @@ -0,0 +1,2191 @@ +/** + * @file winfsp/winfsp.h + * WinFsp User Mode API. + * + * In order to use the WinFsp API the user mode file system must include <winfsp/winfsp.h> + * and link with the winfsp_x64.dll (or winfsp_x86.dll) library. + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef WINFSP_WINFSP_H_INCLUDED +#define WINFSP_WINFSP_H_INCLUDED + +#define WIN32_NO_STATUS +#include +#undef WIN32_NO_STATUS +#include +#pragma warning(push) +#pragma warning(disable:4005) /* macro redefinition */ +#include +#pragma warning(pop) + +#if defined(WINFSP_DLL_INTERNAL) +#define FSP_API __declspec(dllexport) +#else +#define FSP_API __declspec(dllimport) +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The REPARSE_DATA_BUFFER definitions appear to be missing from the user mode headers. + */ +#if !defined(SYMLINK_FLAG_RELATIVE) +#define SYMLINK_FLAG_RELATIVE 1 +#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer) +typedef struct _REPARSE_DATA_BUFFER +{ + ULONG ReparseTag; + USHORT ReparseDataLength; + USHORT Reserved; + union + { + struct + { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + ULONG Flags; + WCHAR PathBuffer[1]; + } SymbolicLinkReparseBuffer; + struct + { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + WCHAR PathBuffer[1]; + } MountPointReparseBuffer; + struct + { + UCHAR DataBuffer[1]; + } GenericReparseBuffer; + } DUMMYUNIONNAME; +} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; +#endif + +/* + * The FILE_FULL_EA_INFORMATION definitions are missing from the user mode headers. + */ +#if !defined(FILE_NEED_EA) +#define FILE_NEED_EA 0x00000080 +#endif +#if !defined(__MINGW32__) +typedef struct _FILE_FULL_EA_INFORMATION +{ + ULONG NextEntryOffset; + UCHAR Flags; + UCHAR EaNameLength; + USHORT EaValueLength; + CHAR EaName[1]; +} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; +#endif + +/** + * @group File System + * + * A user mode file system is a program that uses the WinFsp API to expose a file system to + * Windows. The user mode file system must implement the operations in FSP_FILE_SYSTEM_INTERFACE, + * create a file system object using FspFileSystemCreate and start its dispatcher using + * FspFileSystemStartDispatcher. At that point it will start receiving file system requests on the + * FSP_FILE_SYSTEM_INTERFACE operations. + */ +typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM; +typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION_GUARD(FSP_FILE_SYSTEM *, + FSP_FSCTL_TRANSACT_REQ *, FSP_FSCTL_TRANSACT_RSP *); +typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION(FSP_FILE_SYSTEM *, + FSP_FSCTL_TRANSACT_REQ *, FSP_FSCTL_TRANSACT_RSP *); +/** + * User mode file system locking strategy. + * + * Two concurrency models are provided: + * + * 1. A fine-grained concurrency model where file system NAMESPACE accesses + * are guarded using an exclusive-shared (read-write) lock. File I/O is not + * guarded and concurrent reads/writes/etc. are possible. [Note that the FSD + * will still apply an exclusive-shared lock PER INDIVIDUAL FILE, but it will + * not limit I/O operations for different files.] + * + * The fine-grained concurrency model applies the exclusive-shared lock as + * follows: + *

    + * + * 2. A coarse-grained concurrency model where all file system accesses are + * guarded by a mutually exclusive lock. + * + * @see FspFileSystemSetOperationGuardStrategy + */ +typedef enum +{ + FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_FINE = 0, + FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_COARSE, +} FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY; +enum +{ + FspCleanupDelete = 0x01, + FspCleanupSetAllocationSize = 0x02, + FspCleanupSetArchiveBit = 0x10, + FspCleanupSetLastAccessTime = 0x20, + FspCleanupSetLastWriteTime = 0x40, + FspCleanupSetChangeTime = 0x80, +}; +/** + * @class FSP_FILE_SYSTEM + * File system interface. + * + * The operations in this interface must be implemented by the user mode + * file system. Not all operations need be implemented. For example, + * a user mode file system that does not wish to support reparse points, + * need not implement the reparse point operations. + * + * Most of the operations accept a FileContext parameter. This parameter + * has different meanings depending on the value of the FSP_FSCTL_VOLUME_PARAMS + * flags UmFileContextIsUserContext2 and UmFileContextIsFullContext. + * + * There are three cases to consider: + *
      + *
    • When both of these flags are unset (default), the FileContext parameter + * represents the file node. The file node is a void pointer (or an integer + * that can fit in a pointer) that is used to uniquely identify an open file. + * Opening the same file name should always yield the same file node value + * for as long as the file with that name remains open anywhere in the system. + *
    • + *
    • When the UmFileContextIsUserContext2 is set, the FileContext parameter + * represents the file descriptor. The file descriptor is a void pointer (or + * an integer that can fit in a pointer) that is used to identify an open + * instance of a file. Opening the same file name may yield a different file + * descriptor. + *
    • + *
    • When the UmFileContextIsFullContext is set, the FileContext parameter + * is a pointer to a FSP_FSCTL_TRANSACT_FULL_CONTEXT. This allows a user mode + * file system to access the low-level UserContext and UserContext2 values. + * The UserContext is used to store the file node and the UserContext2 is + * used to store the file descriptor for an open file. + *
    • + *
    + */ +typedef struct _FSP_FILE_SYSTEM_INTERFACE +{ + /** + * Get volume information. + * + * @param FileSystem + * The file system on which this request is posted. + * @param VolumeInfo [out] + * Pointer to a structure that will receive the volume information on successful return + * from this call. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*GetVolumeInfo)(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_VOLUME_INFO *VolumeInfo); + /** + * Set volume label. + * + * @param FileSystem + * The file system on which this request is posted. + * @param VolumeLabel + * The new label for the volume. + * @param VolumeInfo [out] + * Pointer to a structure that will receive the volume information on successful return + * from this call. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*SetVolumeLabel)(FSP_FILE_SYSTEM *FileSystem, + PWSTR VolumeLabel, + FSP_FSCTL_VOLUME_INFO *VolumeInfo); + /** + * Get file or directory attributes and security descriptor given a file name. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileName + * The name of the file or directory to get the attributes and security descriptor for. + * @param PFileAttributes + * Pointer to a memory location that will receive the file attributes on successful return + * from this call. May be NULL. + * + * If this call returns STATUS_REPARSE, the file system MAY place here the index of the + * first reparse point within FileName. The file system MAY also leave this at its default + * value of 0. + * @param SecurityDescriptor + * Pointer to a buffer that will receive the file security descriptor on successful return + * from this call. May be NULL. + * @param PSecurityDescriptorSize [in,out] + * Pointer to the security descriptor buffer size. On input it contains the size of the + * security descriptor buffer. On output it will contain the actual size of the security + * descriptor copied into the security descriptor buffer. May be NULL. + * @return + * STATUS_SUCCESS, STATUS_REPARSE or error code. + * + * STATUS_REPARSE should be returned by file systems that support reparse points when + * they encounter a FileName that contains reparse points anywhere but the final path + * component. + */ + NTSTATUS (*GetSecurityByName)(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, PUINT32 PFileAttributes/* or ReparsePointIndex */, + PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize); + /** + * Create new file or directory. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileName + * The name of the file or directory to be created. + * @param CreateOptions + * Create options for this request. This parameter has the same meaning as the + * CreateOptions parameter of the NtCreateFile API. User mode file systems should typically + * only be concerned with the flag FILE_DIRECTORY_FILE, which is an instruction to create a + * directory rather than a file. Some file systems may also want to pay attention to the + * FILE_NO_INTERMEDIATE_BUFFERING and FILE_WRITE_THROUGH flags, although these are + * typically handled by the FSD component. + * @param GrantedAccess + * Determines the specific access rights that have been granted for this request. Upon + * receiving this call all access checks have been performed and the user mode file system + * need not perform any additional checks. However this parameter may be useful to a user + * mode file system; for example the WinFsp-FUSE layer uses this parameter to determine + * which flags to use in its POSIX open() call. + * @param FileAttributes + * File attributes to apply to the newly created file or directory. + * @param SecurityDescriptor + * Security descriptor to apply to the newly created file or directory. This security + * descriptor will always be in self-relative format. Its length can be retrieved using the + * Windows GetSecurityDescriptorLength API. Will be NULL for named streams. + * @param AllocationSize + * Allocation size for the newly created file. + * @param PFileContext [out] + * Pointer that will receive the file context on successful return from this call. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*Create)(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess, + UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, + PVOID *PFileContext, FSP_FSCTL_FILE_INFO *FileInfo); + /** + * Open a file or directory. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileName + * The name of the file or directory to be opened. + * @param CreateOptions + * Create options for this request. This parameter has the same meaning as the + * CreateOptions parameter of the NtCreateFile API. User mode file systems typically + * do not need to do anything special with respect to this parameter. Some file systems may + * also want to pay attention to the FILE_NO_INTERMEDIATE_BUFFERING and FILE_WRITE_THROUGH + * flags, although these are typically handled by the FSD component. + * @param GrantedAccess + * Determines the specific access rights that have been granted for this request. Upon + * receiving this call all access checks have been performed and the user mode file system + * need not perform any additional checks. However this parameter may be useful to a user + * mode file system; for example the WinFsp-FUSE layer uses this parameter to determine + * which flags to use in its POSIX open() call. + * @param PFileContext [out] + * Pointer that will receive the file context on successful return from this call. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*Open)(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess, + PVOID *PFileContext, FSP_FSCTL_FILE_INFO *FileInfo); + /** + * Overwrite a file. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file to overwrite. + * @param FileAttributes + * File attributes to apply to the overwritten file. + * @param ReplaceFileAttributes + * When TRUE the existing file attributes should be replaced with the new ones. + * When FALSE the existing file attributes should be merged (or'ed) with the new ones. + * @param AllocationSize + * Allocation size for the overwritten file. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*Overwrite)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize, + FSP_FSCTL_FILE_INFO *FileInfo); + /** + * Cleanup a file. + * + * When CreateFile is used to open or create a file the kernel creates a kernel mode file + * object (type FILE_OBJECT) and a handle for it, which it returns to user-mode. The handle may + * be duplicated (using DuplicateHandle), but all duplicate handles always refer to the same + * file object. When all handles for a particular file object get closed (using CloseHandle) + * the system sends a Cleanup request to the file system. + * + * There will be a Cleanup operation for every Create or Open operation posted to the user mode + * file system. However the Cleanup operation is not the final close operation on a file. + * The file system must be ready to receive additional operations until close time. This is true + * even when the file is being deleted! + * + * The Flags parameter contains information about the cleanup operation: + *
      + *
    • FspCleanupDelete - + * An important function of the Cleanup operation is to complete a delete operation. Deleting + * a file or directory in Windows is a three-stage process where the file is first opened, then + * tested to see if the delete can proceed and if the answer is positive the file is then + * deleted during Cleanup. + * + * If the file system supports POSIX unlink (FSP_FSCTL_VOLUME_PARAMS :: + * SupportsPosixUnlinkRename), then a Cleanup / FspCleanupDelete operation may arrive while + * there are other open file handles for this particular file node. If the file system does not + * support POSIX unlink, then a Cleanup / FspCleanupDelete operation will always be the last + * outstanding cleanup for this particular file node. + *
    • + *
    • FspCleanupSetAllocationSize - + * The NTFS and FAT file systems reset a file's allocation size when they receive the last + * outstanding cleanup for a particular file node. User mode file systems that implement + * allocation size and wish to duplicate the NTFS and FAT behavior can use this flag. + *
    • + *
    • + * FspCleanupSetArchiveBit - + * File systems that support the archive bit should set the file node's archive bit when this + * flag is set. + *
    • + *
    • FspCleanupSetLastAccessTime, FspCleanupSetLastWriteTime, FspCleanupSetChangeTime - File + * systems should set the corresponding file time when each one of these flags is set. Note that + * updating the last access time is expensive and a file system may choose to not implement it. + *
    + * + * There is no way to report failure of this operation. This is a Windows limitation. + * + * As an optimization a file system may specify the FSP_FSCTL_VOLUME_PARAMS :: + * PostCleanupWhenModifiedOnly flag. In this case the FSD will only post Cleanup requests when + * the file was modified/deleted. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to cleanup. + * @param FileName + * The name of the file or directory to cleanup. Sent only when a Delete is requested. + * @param Flags + * These flags determine whether the file was modified and whether to delete the file. + * @see + * Close + * CanDelete + * SetDelete + */ + VOID (*Cleanup)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PWSTR FileName, ULONG Flags); + /** + * Close a file. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to be closed. + */ + VOID (*Close)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext); + /** + * Read a file. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file to be read. + * @param Buffer + * Pointer to a buffer that will receive the results of the read operation. + * @param Offset + * Offset within the file to read from. + * @param Length + * Length of data to read. + * @param PBytesTransferred [out] + * Pointer to a memory location that will receive the actual number of bytes read. + * @return + * STATUS_SUCCESS or error code. STATUS_PENDING is supported allowing for asynchronous + * operation. + */ + NTSTATUS (*Read)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PVOID Buffer, UINT64 Offset, ULONG Length, + PULONG PBytesTransferred); + /** + * Write a file. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file to be written. + * @param Buffer + * Pointer to a buffer that contains the data to write. + * @param Offset + * Offset within the file to write to. + * @param Length + * Length of data to write. + * @param WriteToEndOfFile + * When TRUE the file system must write to the current end of file. In this case the Offset + * parameter will contain the value -1. + * @param ConstrainedIo + * When TRUE the file system must not extend the file (i.e. change the file size). + * @param PBytesTransferred [out] + * Pointer to a memory location that will receive the actual number of bytes written. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. STATUS_PENDING is supported allowing for asynchronous + * operation. + */ + NTSTATUS (*Write)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PVOID Buffer, UINT64 Offset, ULONG Length, + BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo, + PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo); + /** + * Flush a file or volume. + * + * Note that the FSD will also flush all file/volume caches prior to invoking this operation. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file to be flushed. When NULL the whole volume is being flushed. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. Used when + * flushing file (not volume). + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*Flush)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + FSP_FSCTL_FILE_INFO *FileInfo); + /** + * Get file or directory information. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to get information for. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*GetFileInfo)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + FSP_FSCTL_FILE_INFO *FileInfo); + /** + * Set file or directory basic information. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to set information for. + * @param FileAttributes + * File attributes to apply to the file or directory. If the value INVALID_FILE_ATTRIBUTES + * is sent, the file attributes should not be changed. + * @param CreationTime + * Creation time to apply to the file or directory. If the value 0 is sent, the creation + * time should not be changed. + * @param LastAccessTime + * Last access time to apply to the file or directory. If the value 0 is sent, the last + * access time should not be changed. + * @param LastWriteTime + * Last write time to apply to the file or directory. If the value 0 is sent, the last + * write time should not be changed. + * @param ChangeTime + * Change time to apply to the file or directory. If the value 0 is sent, the change time + * should not be changed. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*SetBasicInfo)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, UINT32 FileAttributes, + UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime, + FSP_FSCTL_FILE_INFO *FileInfo); + /** + * Set file/allocation size. + * + * This function is used to change a file's sizes. Windows file systems maintain two kinds + * of sizes: the file size is where the End Of File (EOF) is, and the allocation size is the + * actual size that a file takes up on the "disk". + * + * The rules regarding file/allocation size are: + *
      + *
    • Allocation size must always be aligned to the allocation unit boundary. The allocation + * unit is the product (UINT64)SectorSize * (UINT64)SectorsPerAllocationUnit from + * the FSP_FSCTL_VOLUME_PARAMS structure. The FSD will always send properly aligned allocation + * sizes when setting the allocation size.
    • + *
    • Allocation size is always greater or equal to the file size.
    • + *
    • A file size of more than the current allocation size will also extend the allocation + * size to the next allocation unit boundary.
    • + *
    • An allocation size of less than the current file size should also truncate the current + * file size.
    • + *
    + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file to set the file/allocation size for. + * @param NewSize + * New file/allocation size to apply to the file. + * @param SetAllocationSize + * If TRUE, then the allocation size is being set. if FALSE, then the file size is being set. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*SetFileSize)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, UINT64 NewSize, BOOLEAN SetAllocationSize, + FSP_FSCTL_FILE_INFO *FileInfo); + /** + * Determine whether a file or directory can be deleted. + * + * This function tests whether a file or directory can be safely deleted. This function does + * not need to perform access checks, but may performs tasks such as check for empty + * directories, etc. + * + * This function should NEVER delete the file or directory in question. Deletion should + * happen during Cleanup with the FspCleanupDelete flag set. + * + * This function gets called when Win32 API's such as DeleteFile or RemoveDirectory are used. + * It does not get called when a file or directory is opened with FILE_DELETE_ON_CLOSE. + * + * NOTE: If both CanDelete and SetDelete are defined, SetDelete takes precedence. However + * most file systems need only implement the CanDelete operation. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to test for deletion. + * @param FileName + * The name of the file or directory to test for deletion. + * @return + * STATUS_SUCCESS or error code. + * @see + * Cleanup + * SetDelete + */ + NTSTATUS (*CanDelete)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PWSTR FileName); + /** + * Renames a file or directory. + * + * The kernel mode FSD provides certain guarantees prior to posting a rename operation: + *
      + *
    • A file cannot be renamed if a file with the same name exists and has open handles.
    • + *
    • A directory cannot be renamed if it or any of its subdirectories contains a file that + * has open handles.
    • + *
    + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to be renamed. + * @param FileName + * The current name of the file or directory to rename. + * @param NewFileName + * The new name for the file or directory. + * @param ReplaceIfExists + * Whether to replace a file that already exists at NewFileName. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*Rename)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + PWSTR FileName, PWSTR NewFileName, BOOLEAN ReplaceIfExists); + /** + * Get file or directory security descriptor. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to get the security descriptor for. + * @param SecurityDescriptor + * Pointer to a buffer that will receive the file security descriptor on successful return + * from this call. May be NULL. + * @param PSecurityDescriptorSize [in,out] + * Pointer to the security descriptor buffer size. On input it contains the size of the + * security descriptor buffer. On output it will contain the actual size of the security + * descriptor copied into the security descriptor buffer. Cannot be NULL. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*GetSecurity)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize); + /** + * Set file or directory security descriptor. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to set the security descriptor for. + * @param SecurityInformation + * Describes what parts of the file or directory security descriptor should + * be modified. + * @param ModificationDescriptor + * Describes the modifications to apply to the file or directory security descriptor. + * @return + * STATUS_SUCCESS or error code. + * @see + * FspSetSecurityDescriptor + * FspDeleteSecurityDescriptor + */ + NTSTATUS (*SetSecurity)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor); + /** + * Read a directory. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the directory to be read. + * @param Pattern + * The pattern to match against files in this directory. Can be NULL. The file system + * can choose to ignore this parameter as the FSD will always perform its own pattern + * matching on the returned results. + * @param Marker + * A file name that marks where in the directory to start reading. Files with names + * that are greater than (not equal to) this marker (in the directory order determined + * by the file system) should be returned. Can be NULL. + * @param Buffer + * Pointer to a buffer that will receive the results of the read operation. + * @param Length + * Length of data to read. + * @param PBytesTransferred [out] + * Pointer to a memory location that will receive the actual number of bytes read. + * @return + * STATUS_SUCCESS or error code. STATUS_PENDING is supported allowing for asynchronous + * operation. + * @see + * FspFileSystemAddDirInfo + */ + NTSTATUS (*ReadDirectory)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PWSTR Pattern, PWSTR Marker, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred); + /** + * Resolve reparse points. + * + * Reparse points are a general mechanism for attaching special behavior to files. + * A file or directory can contain a reparse point. A reparse point is data that has + * special meaning to the file system, Windows or user applications. For example, NTFS + * and Windows use reparse points to implement symbolic links. As another example, + * a particular file system may use reparse points to emulate UNIX FIFO's. + * + * This function is expected to resolve as many reparse points as possible. If a reparse + * point is encountered that is not understood by the file system further reparse point + * resolution should stop; the reparse point data should be returned to the FSD with status + * STATUS_REPARSE/reparse-tag. If a reparse point (symbolic link) is encountered that is + * understood by the file system but points outside it, the reparse point should be + * resolved, but further reparse point resolution should stop; the resolved file name + * should be returned to the FSD with status STATUS_REPARSE/IO_REPARSE. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileName + * The name of the file or directory to have its reparse points resolved. + * @param ReparsePointIndex + * The index of the first reparse point within FileName. + * @param ResolveLastPathComponent + * If FALSE, the last path component of FileName should not be resolved, even + * if it is a reparse point that can be resolved. If TRUE, all path components + * should be resolved if possible. + * @param PIoStatus + * Pointer to storage that will receive the status to return to the FSD. When + * this function succeeds it must set PIoStatus->Status to STATUS_REPARSE and + * PIoStatus->Information to either IO_REPARSE or the reparse tag. + * @param Buffer + * Pointer to a buffer that will receive the resolved file name (IO_REPARSE) or + * reparse data (reparse tag). If the function returns a file name, it should + * not be NULL terminated. + * @param PSize [in,out] + * Pointer to the buffer size. On input it contains the size of the buffer. + * On output it will contain the actual size of data copied. + * @return + * STATUS_REPARSE or error code. + */ + NTSTATUS (*ResolveReparsePoints)(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 ReparsePointIndex, BOOLEAN ResolveLastPathComponent, + PIO_STATUS_BLOCK PIoStatus, PVOID Buffer, PSIZE_T PSize); + /** + * Get reparse point. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the reparse point. + * @param FileName + * The file name of the reparse point. + * @param Buffer + * Pointer to a buffer that will receive the results of this operation. If + * the function returns a symbolic link path, it should not be NULL terminated. + * @param PSize [in,out] + * Pointer to the buffer size. On input it contains the size of the buffer. + * On output it will contain the actual size of data copied. + * @return + * STATUS_SUCCESS or error code. + * @see + * SetReparsePoint + */ + NTSTATUS (*GetReparsePoint)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + PWSTR FileName, PVOID Buffer, PSIZE_T PSize); + /** + * Set reparse point. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the reparse point. + * @param FileName + * The file name of the reparse point. + * @param Buffer + * Pointer to a buffer that contains the data for this operation. If this buffer + * contains a symbolic link path, it should not be assumed to be NULL terminated. + * @param Size + * Size of data to write. + * @return + * STATUS_SUCCESS or error code. + * @see + * GetReparsePoint + */ + NTSTATUS (*SetReparsePoint)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + PWSTR FileName, PVOID Buffer, SIZE_T Size); + /** + * Delete reparse point. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the reparse point. + * @param FileName + * The file name of the reparse point. + * @param Buffer + * Pointer to a buffer that contains the data for this operation. + * @param Size + * Size of data to write. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*DeleteReparsePoint)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + PWSTR FileName, PVOID Buffer, SIZE_T Size); + /** + * Get named streams information. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to get stream information for. + * @param Buffer + * Pointer to a buffer that will receive the stream information. + * @param Length + * Length of buffer. + * @param PBytesTransferred [out] + * Pointer to a memory location that will receive the actual number of bytes stored. + * @return + * STATUS_SUCCESS or error code. + * @see + * FspFileSystemAddStreamInfo + */ + NTSTATUS (*GetStreamInfo)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PVOID Buffer, ULONG Length, + PULONG PBytesTransferred); + /** + * Get directory information for a single file or directory within a parent directory. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the parent directory. + * @param FileName + * The name of the file or directory to get information for. This name is relative + * to the parent directory and is a single path component. + * @param DirInfo [out] + * Pointer to a structure that will receive the directory information on successful + * return from this call. This information includes the file name, but also file + * attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*GetDirInfoByName)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PWSTR FileName, + FSP_FSCTL_DIR_INFO *DirInfo); + /** + * Process control code. + * + * This function is called when a program uses the DeviceIoControl API. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to be controled. + * @param ControlCode + * The control code for the operation. This code must have a DeviceType with bit + * 0x8000 set and must have a TransferType of METHOD_BUFFERED. + * @param InputBuffer + * Pointer to a buffer that contains the input data. + * @param InputBufferLength + * Input data length. + * @param OutputBuffer + * Pointer to a buffer that will receive the output data. + * @param OutputBufferLength + * Output data length. + * @param PBytesTransferred [out] + * Pointer to a memory location that will receive the actual number of bytes transferred. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*Control)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, UINT32 ControlCode, + PVOID InputBuffer, ULONG InputBufferLength, + PVOID OutputBuffer, ULONG OutputBufferLength, PULONG PBytesTransferred); + /** + * Set the file delete flag. + * + * This function sets a flag to indicates whether the FSD file should delete a file + * when it is closed. This function does not need to perform access checks, but may + * performs tasks such as check for empty directories, etc. + * + * This function should NEVER delete the file or directory in question. Deletion should + * happen during Cleanup with the FspCleanupDelete flag set. + * + * This function gets called when Win32 API's such as DeleteFile or RemoveDirectory are used. + * It does not get called when a file or directory is opened with FILE_DELETE_ON_CLOSE. + * + * NOTE: If both CanDelete and SetDelete are defined, SetDelete takes precedence. However + * most file systems need only implement the CanDelete operation. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file or directory to set the delete flag for. + * @param FileName + * The name of the file or directory to set the delete flag for. + * @param DeleteFile + * If set to TRUE the FSD indicates that the file will be deleted on Cleanup; otherwise + * it will not be deleted. It is legal to receive multiple SetDelete calls for the same + * file with different DeleteFile parameters. + * @return + * STATUS_SUCCESS or error code. + * @see + * Cleanup + * CanDelete + */ + NTSTATUS (*SetDelete)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PWSTR FileName, BOOLEAN DeleteFile); + /** + * Create new file or directory. + * + * This function works like Create, except that it also accepts an extra buffer that + * may contain extended attributes or a reparse point. + * + * NOTE: If both Create and CreateEx are defined, CreateEx takes precedence. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileName + * The name of the file or directory to be created. + * @param CreateOptions + * Create options for this request. This parameter has the same meaning as the + * CreateOptions parameter of the NtCreateFile API. User mode file systems should typically + * only be concerned with the flag FILE_DIRECTORY_FILE, which is an instruction to create a + * directory rather than a file. Some file systems may also want to pay attention to the + * FILE_NO_INTERMEDIATE_BUFFERING and FILE_WRITE_THROUGH flags, although these are + * typically handled by the FSD component. + * @param GrantedAccess + * Determines the specific access rights that have been granted for this request. Upon + * receiving this call all access checks have been performed and the user mode file system + * need not perform any additional checks. However this parameter may be useful to a user + * mode file system; for example the WinFsp-FUSE layer uses this parameter to determine + * which flags to use in its POSIX open() call. + * @param FileAttributes + * File attributes to apply to the newly created file or directory. + * @param SecurityDescriptor + * Security descriptor to apply to the newly created file or directory. This security + * descriptor will always be in self-relative format. Its length can be retrieved using the + * Windows GetSecurityDescriptorLength API. Will be NULL for named streams. + * @param AllocationSize + * Allocation size for the newly created file. + * @param ExtraBuffer + * Extended attributes or reparse point buffer. + * @param ExtraLength + * Extended attributes or reparse point buffer length. + * @param ExtraBufferIsReparsePoint + * FALSE: extra buffer is extended attributes; TRUE: extra buffer is reparse point. + * @param PFileContext [out] + * Pointer that will receive the file context on successful return from this call. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*CreateEx)(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess, + UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, + PVOID ExtraBuffer, ULONG ExtraLength, BOOLEAN ExtraBufferIsReparsePoint, + PVOID *PFileContext, FSP_FSCTL_FILE_INFO *FileInfo); + /** + * Overwrite a file. + * + * This function works like Overwrite, except that it also accepts EA (extended attributes). + * + * NOTE: If both Overwrite and OverwriteEx are defined, OverwriteEx takes precedence. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file to overwrite. + * @param FileAttributes + * File attributes to apply to the overwritten file. + * @param ReplaceFileAttributes + * When TRUE the existing file attributes should be replaced with the new ones. + * When FALSE the existing file attributes should be merged (or'ed) with the new ones. + * @param AllocationSize + * Allocation size for the overwritten file. + * @param Ea + * Extended attributes buffer. + * @param EaLength + * Extended attributes buffer length. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. + */ + NTSTATUS (*OverwriteEx)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize, + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength, + FSP_FSCTL_FILE_INFO *FileInfo); + /** + * Get extended attributes. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file to get extended attributes for. + * @param Ea + * Extended attributes buffer. + * @param EaLength + * Extended attributes buffer length. + * @param PBytesTransferred [out] + * Pointer to a memory location that will receive the actual number of bytes transferred. + * @return + * STATUS_SUCCESS or error code. + * @see + * SetEa + * FspFileSystemAddEa + */ + NTSTATUS (*GetEa)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength, PULONG PBytesTransferred); + /** + * Set extended attributes. + * + * @param FileSystem + * The file system on which this request is posted. + * @param FileContext + * The file context of the file to set extended attributes for. + * @param Ea + * Extended attributes buffer. + * @param EaLength + * Extended attributes buffer length. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. + * @return + * STATUS_SUCCESS or error code. + * @see + * GetEa + */ + NTSTATUS (*SetEa)(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength, + FSP_FSCTL_FILE_INFO *FileInfo); + + NTSTATUS (*Obsolete0)(VOID); + + /* + * This ensures that this interface will always contain 64 function pointers. + * Please update when changing the interface as it is important for future compatibility. + */ + NTSTATUS (*Reserved[32])(); +} FSP_FILE_SYSTEM_INTERFACE; +FSP_FSCTL_STATIC_ASSERT(sizeof(FSP_FILE_SYSTEM_INTERFACE) == 64 * sizeof(NTSTATUS (*)()), + "FSP_FILE_SYSTEM_INTERFACE must have 64 entries."); +typedef struct _FSP_FILE_SYSTEM +{ + UINT16 Version; + PVOID UserContext; + WCHAR VolumeName[FSP_FSCTL_VOLUME_NAME_SIZEMAX / sizeof(WCHAR)]; + HANDLE VolumeHandle; + FSP_FILE_SYSTEM_OPERATION_GUARD *EnterOperation, *LeaveOperation; + FSP_FILE_SYSTEM_OPERATION *Operations[FspFsctlTransactKindCount]; + const FSP_FILE_SYSTEM_INTERFACE *Interface; + HANDLE DispatcherThread; + ULONG DispatcherThreadCount; + NTSTATUS DispatcherResult; + PWSTR MountPoint; + HANDLE MountHandle; + UINT32 DebugLog; + FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY OpGuardStrategy; + SRWLOCK OpGuardLock; + BOOLEAN UmFileContextIsUserContext2, UmFileContextIsFullContext; + UINT16 UmNoReparsePointsDirCheck:1; + UINT16 UmReservedFlags:15; +} FSP_FILE_SYSTEM; +FSP_FSCTL_STATIC_ASSERT( + (4 == sizeof(PVOID) && 660 == sizeof(FSP_FILE_SYSTEM)) || + (8 == sizeof(PVOID) && 792 == sizeof(FSP_FILE_SYSTEM)), + "sizeof(FSP_FILE_SYSTEM) must be exactly 660 in 32-bit and 792 in 64-bit."); +typedef struct _FSP_FILE_SYSTEM_OPERATION_CONTEXT +{ + FSP_FSCTL_TRANSACT_REQ *Request; + FSP_FSCTL_TRANSACT_RSP *Response; +} FSP_FILE_SYSTEM_OPERATION_CONTEXT; +/** + * Check whether creating a file system object is possible. + * + * @param DevicePath + * The name of the control device for this file system. This must be either + * FSP_FSCTL_DISK_DEVICE_NAME or FSP_FSCTL_NET_DEVICE_NAME. + * @param MountPoint + * The mount point for the new file system. A value of NULL means that the file system should + * use the next available drive letter counting downwards from Z: as its mount point. + * @return + * STATUS_SUCCESS or error code. + */ +FSP_API NTSTATUS FspFileSystemPreflight(PWSTR DevicePath, + PWSTR MountPoint); +/** + * Create a file system object. + * + * @param DevicePath + * The name of the control device for this file system. This must be either + * FSP_FSCTL_DISK_DEVICE_NAME or FSP_FSCTL_NET_DEVICE_NAME. + * @param VolumeParams + * Volume parameters for the newly created file system. + * @param Interface + * A pointer to the actual operations that actually implement this user mode file system. + * @param PFileSystem [out] + * Pointer that will receive the file system object created on successful return from this + * call. + * @return + * STATUS_SUCCESS or error code. + */ +FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, + const FSP_FSCTL_VOLUME_PARAMS *VolumeParams, + const FSP_FILE_SYSTEM_INTERFACE *Interface, + FSP_FILE_SYSTEM **PFileSystem); +/** + * Delete a file system object. + * + * @param FileSystem + * The file system object. + */ +FSP_API VOID FspFileSystemDelete(FSP_FILE_SYSTEM *FileSystem); +/** + * Set the mount point for a file system. + * + * This function supports drive letters (X:) or directories as mount points: + *
      + *
    • Drive letters: Refer to the documentation of the DefineDosDevice Windows API + * to better understand how they are created.
    • + *
    • Directories: They can be used as mount points for disk based file systems. They cannot + * be used for network file systems. This is a limitation that Windows imposes on junctions.
    • + *
    + * + * @param FileSystem + * The file system object. + * @param MountPoint + * The mount point for the new file system. A value of NULL means that the file system should + * use the next available drive letter counting downwards from Z: as its mount point. + * @return + * STATUS_SUCCESS or error code. + */ +FSP_API NTSTATUS FspFileSystemSetMountPoint(FSP_FILE_SYSTEM *FileSystem, PWSTR MountPoint); +FSP_API NTSTATUS FspFileSystemSetMountPointEx(FSP_FILE_SYSTEM *FileSystem, PWSTR MountPoint, + PSECURITY_DESCRIPTOR SecurityDescriptor); +/** + * Remove the mount point for a file system. + * + * @param FileSystem + * The file system object. + */ +FSP_API VOID FspFileSystemRemoveMountPoint(FSP_FILE_SYSTEM *FileSystem); +/** + * Start the file system dispatcher. + * + * The file system dispatcher is used to dispatch operations posted by the FSD to the user mode + * file system. Once this call starts executing the user mode file system will start receiving + * file system requests from the kernel. + * + * @param FileSystem + * The file system object. + * @param ThreadCount + * The number of threads for the file system dispatcher. A value of 0 will create a default + * number of threads and should be chosen in most cases. + * @return + * STATUS_SUCCESS or error code. + */ +FSP_API NTSTATUS FspFileSystemStartDispatcher(FSP_FILE_SYSTEM *FileSystem, ULONG ThreadCount); +/** + * Stop the file system dispatcher. + * + * @param FileSystem + * The file system object. + */ +FSP_API VOID FspFileSystemStopDispatcher(FSP_FILE_SYSTEM *FileSystem); +/** + * Send a response to the FSD. + * + * This call is not required when the user mode file system performs synchronous processing of + * requests. It is possible however for the following FSP_FILE_SYSTEM_INTERFACE operations to be + * processed asynchronously: + *
      + *
    • Read
    • + *
    • Write
    • + *
    • ReadDirectory
    • + *
    + * + * These operations are allowed to return STATUS_PENDING to postpone sending a response to the FSD. + * At a later time the file system can use FspFileSystemSendResponse to send the response. + * + * @param FileSystem + * The file system object. + * @param Response + * The response buffer. + */ +FSP_API VOID FspFileSystemSendResponse(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_RSP *Response); +/** + * Begin notifying Windows that the file system has file changes. + * + * A file system that wishes to notify Windows about file changes must + * first issue an FspFileSystemBegin call, followed by 0 or more + * FspFileSystemNotify calls, followed by an FspFileSystemNotifyEnd call. + * + * This operation blocks concurrent file rename operations. File rename + * operations may interfere with file notification, because a file being + * notified may also be concurrently renamed. After all file change + * notifications have been issued, you must make sure to call + * FspFileSystemNotifyEnd to allow file rename operations to proceed. + * + * @param FileSystem + * The file system object. + * @return + * STATUS_SUCCESS or error code. The error code STATUS_CANT_WAIT means that + * a file rename operation is currently in progress and the operation must be + * retried at a later time. + */ +FSP_API NTSTATUS FspFileSystemNotifyBegin(FSP_FILE_SYSTEM *FileSystem, ULONG Timeout); +/** + * End notifying Windows that the file system has file changes. + * + * A file system that wishes to notify Windows about file changes must + * first issue an FspFileSystemBegin call, followed by 0 or more + * FspFileSystemNotify calls, followed by an FspFileSystemNotifyEnd call. + * + * This operation allows any blocked file rename operations to proceed. + * + * @param FileSystem + * The file system object. + * @return + * STATUS_SUCCESS or error code. + */ +FSP_API NTSTATUS FspFileSystemNotifyEnd(FSP_FILE_SYSTEM *FileSystem); +/** + * Notify Windows that the file system has file changes. + * + * A file system that wishes to notify Windows about file changes must + * first issue an FspFileSystemBegin call, followed by 0 or more + * FspFileSystemNotify calls, followed by an FspFileSystemNotifyEnd call. + * + * Note that FspFileSystemNotify requires file names to be normalized. A + * normalized file name is one that contains the correct case of all characters + * in the file name. + * + * For case-sensitive file systems all file names are normalized by definition. + * For case-insensitive file systems that implement file name normalization, + * a normalized file name is the one that the file system specifies in the + * response to Create or Open (see also FspFileSystemGetOpenFileInfo). For + * case-insensitive file systems that do not implement file name normalization + * a normalized file name is the upper case version of the file name used + * to open the file. + * + * @param FileSystem + * The file system object. + * @param NotifyInfo + * Buffer containing information about file changes. + * @param Size + * Size of buffer. + * @return + * STATUS_SUCCESS or error code. + */ +FSP_API NTSTATUS FspFileSystemNotify(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_NOTIFY_INFO *NotifyInfo, SIZE_T Size); +/** + * Get the current operation context. + * + * This function may be used only when servicing one of the FSP_FILE_SYSTEM_INTERFACE operations. + * The current operation context is stored in thread local storage. It allows access to the + * Request and Response associated with this operation. + * + * @return + * The current operation context. + */ +FSP_API FSP_FILE_SYSTEM_OPERATION_CONTEXT *FspFileSystemGetOperationContext(VOID); +static inline +PWSTR FspFileSystemMountPoint(FSP_FILE_SYSTEM *FileSystem) +{ + return FileSystem->MountPoint; +} +FSP_API PWSTR FspFileSystemMountPointF(FSP_FILE_SYSTEM *FileSystem); +static inline +NTSTATUS FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) +{ + if (0 == FileSystem->EnterOperation) + return STATUS_SUCCESS; + + return FileSystem->EnterOperation(FileSystem, Request, Response); +} +FSP_API NTSTATUS FspFileSystemEnterOperationF(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +static inline +NTSTATUS FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) +{ + if (0 == FileSystem->LeaveOperation) + return STATUS_SUCCESS; + + return FileSystem->LeaveOperation(FileSystem, Request, Response); +} +FSP_API NTSTATUS FspFileSystemLeaveOperationF(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +static inline +VOID FspFileSystemSetOperationGuard(FSP_FILE_SYSTEM *FileSystem, + FSP_FILE_SYSTEM_OPERATION_GUARD *EnterOperation, + FSP_FILE_SYSTEM_OPERATION_GUARD *LeaveOperation) +{ + FileSystem->EnterOperation = EnterOperation; + FileSystem->LeaveOperation = LeaveOperation; +} +FSP_API VOID FspFileSystemSetOperationGuardF(FSP_FILE_SYSTEM *FileSystem, + FSP_FILE_SYSTEM_OPERATION_GUARD *EnterOperation, + FSP_FILE_SYSTEM_OPERATION_GUARD *LeaveOperation); +/** + * Set file system locking strategy. + * + * @param FileSystem + * The file system object. + * @param GuardStrategy + * The locking (guard) strategy. + * @see + * FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY + */ +static inline +VOID FspFileSystemSetOperationGuardStrategy(FSP_FILE_SYSTEM *FileSystem, + FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY GuardStrategy) +{ + FileSystem->OpGuardStrategy = GuardStrategy; +} +FSP_API VOID FspFileSystemSetOperationGuardStrategyF(FSP_FILE_SYSTEM *FileSystem, + FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY GuardStrategy); +static inline +VOID FspFileSystemSetOperation(FSP_FILE_SYSTEM *FileSystem, + ULONG Index, + FSP_FILE_SYSTEM_OPERATION *Operation) +{ + FileSystem->Operations[Index] = Operation; +} +FSP_API VOID FspFileSystemSetOperationF(FSP_FILE_SYSTEM *FileSystem, + ULONG Index, + FSP_FILE_SYSTEM_OPERATION *Operation); +static inline +VOID FspFileSystemGetDispatcherResult(FSP_FILE_SYSTEM *FileSystem, + NTSTATUS *PDispatcherResult) +{ + /* 32-bit reads are atomic */ + *PDispatcherResult = FileSystem->DispatcherResult; + MemoryBarrier(); +} +FSP_API VOID FspFileSystemGetDispatcherResultF(FSP_FILE_SYSTEM *FileSystem, + NTSTATUS *PDispatcherResult); +static inline +VOID FspFileSystemSetDispatcherResult(FSP_FILE_SYSTEM *FileSystem, + NTSTATUS DispatcherResult) +{ + if (NT_SUCCESS(DispatcherResult)) + return; + InterlockedCompareExchange(&FileSystem->DispatcherResult, DispatcherResult, 0); +} +FSP_API VOID FspFileSystemSetDispatcherResultF(FSP_FILE_SYSTEM *FileSystem, + NTSTATUS DispatcherResult); +static inline +VOID FspFileSystemSetDebugLog(FSP_FILE_SYSTEM *FileSystem, + UINT32 DebugLog) +{ + FileSystem->DebugLog = DebugLog; +} +FSP_API VOID FspFileSystemSetDebugLogF(FSP_FILE_SYSTEM *FileSystem, + UINT32 DebugLog); +static inline +BOOLEAN FspFileSystemIsOperationCaseSensitive(VOID) +{ + FSP_FSCTL_TRANSACT_REQ *Request = FspFileSystemGetOperationContext()->Request; + return + FspFsctlTransactCreateKind == Request->Kind && Request->Req.Create.CaseSensitive || + FspFsctlTransactQueryDirectoryKind == Request->Kind && Request->Req.QueryDirectory.CaseSensitive; +} +FSP_API BOOLEAN FspFileSystemIsOperationCaseSensitiveF(VOID); +/** + * Gets the originating process ID. + * + * Valid only during Create, Open and Rename requests when the target exists. + */ +static inline +UINT32 FspFileSystemOperationProcessId(VOID) +{ + FSP_FSCTL_TRANSACT_REQ *Request = FspFileSystemGetOperationContext()->Request; + switch (Request->Kind) + { + case FspFsctlTransactCreateKind: + return FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(Request->Req.Create.AccessToken); + case FspFsctlTransactSetInformationKind: + if (10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass || + 65/*FileRenameInformationEx*/ == Request->Req.SetInformation.FileInformationClass) + return FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(Request->Req.SetInformation.Info.Rename.AccessToken); + /* fall through! */ + default: + return 0; + } +} +FSP_API UINT32 FspFileSystemOperationProcessIdF(VOID); + +/* + * Operations + */ +FSP_API NTSTATUS FspFileSystemOpEnter(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpLeave(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpRead(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpWrite(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpQueryEa(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpSetEa(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpFlushBuffers(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpQueryVolumeInformation(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpSetVolumeInformation(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpQueryDirectory(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpDeviceControl(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpQuerySecurity(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpSetSecurity(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpQueryStreamInformation(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); + +/* + * Helpers + */ +/** + * Get open information buffer. + * + * This is a helper for implementing the Create and Open operations. It cannot be used with + * any other operations. + * + * The FileInfo parameter to Create and Open is typed as pointer to FSP_FSCTL_FILE_INFO. The + * true type of this parameter is pointer to FSP_FSCTL_OPEN_FILE_INFO. This simple function + * converts from one type to the other. + * + * The FSP_FSCTL_OPEN_FILE_INFO type contains a FSP_FSCTL_FILE_INFO as well as the fields + * NormalizedName and NormalizedNameSize. These fields can be used for file name normalization. + * File name normalization is used to ensure that the FSD and the OS know the correct case + * of a newly opened file name. + * + * For case-sensitive file systems this functionality should be ignored. The FSD will always + * assume that the normalized file name is the same as the file name used to open the file. + * + * For case-insensitive file systems this functionality may be ignored. In this case the FSD + * will assume that the normalized file name is the upper case version of the file name used + * to open the file. The file system will work correctly and the only way an application will + * be able to tell that the file system does not preserve case in normalized file names is by + * issuing a GetFinalPathNameByHandle API call (or NtQueryInformationFile with + * FileNameInformation/FileNormalizedNameInformation). + * + * For case-insensitive file systems this functionality may also be used. In this case the + * user mode file system may use the NormalizedName and NormalizedNameSize parameters to + * report to the FSD the normalized file name. It should be noted that the normalized file + * name may only differ in case from the file name used to open the file. The NormalizedName + * field will point to a buffer that can receive the normalized file name. The + * NormalizedNameSize field will contain the size of the normalized file name buffer. On + * completion of the Create or Open operation it should contain the actual size of the + * normalized file name copied into the normalized file name buffer. The normalized file name + * should not contain a terminating zero. + * + * @param FileInfo + * The FileInfo parameter as passed to Create or Open operation. + * @return + * A pointer to the open information buffer for this Create or Open operation. + * @see + * Create + * Open + */ +static inline +FSP_FSCTL_OPEN_FILE_INFO *FspFileSystemGetOpenFileInfo(FSP_FSCTL_FILE_INFO *FileInfo) +{ + return (FSP_FSCTL_OPEN_FILE_INFO *)FileInfo; +} +/** + * Add directory information to a buffer. + * + * This is a helper for implementing the ReadDirectory operation. + * + * @param DirInfo + * The directory information to add. A value of NULL acts as an EOF marker for a ReadDirectory + * operation. + * @param Buffer + * Pointer to a buffer that will receive the results of the read operation. This should contain + * the same value passed to the ReadDirectory Buffer parameter. + * @param Length + * Length of data to read. This should contain the same value passed to the ReadDirectory + * Length parameter. + * @param PBytesTransferred [out] + * Pointer to a memory location that will receive the actual number of bytes read. This should + * contain the same value passed to the ReadDirectory PBytesTransferred parameter. + * FspFileSystemAddDirInfo uses the value pointed by this parameter to track how much of the + * buffer has been used so far. + * @return + * TRUE if the directory information was added, FALSE if there was not enough space to add it. + * @see + * ReadDirectory + */ +FSP_API BOOLEAN FspFileSystemAddDirInfo(FSP_FSCTL_DIR_INFO *DirInfo, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred); +/** + * Find reparse point in file name. + * + * Given a file name this function returns an index to the first path component that is a reparse + * point. The function will call the supplied GetReparsePointByName function for every path + * component until it finds a reparse point or the whole path is processed. + * + * This is a helper for implementing the GetSecurityByName operation in file systems + * that support reparse points. + * + * @param FileSystem + * The file system object. + * @param GetReparsePointByName + * Pointer to function that can retrieve reparse point information by name. The + * FspFileSystemFindReparsePoint will call this function with the Buffer and PSize + * arguments set to NULL. The function should return STATUS_SUCCESS if the passed + * FileName is a reparse point or STATUS_NOT_A_REPARSE_POINT (or other error code) + * otherwise. + * @param Context + * User context to supply to GetReparsePointByName. + * @param FileName + * The name of the file or directory. + * @param PReparsePointIndex + * Pointer to a memory location that will receive the index of the first reparse point + * within FileName. A value is only placed in this memory location if the function returns + * TRUE. May be NULL. + * @return + * TRUE if a reparse point was found, FALSE otherwise. + * @see + * GetSecurityByName + */ +FSP_API BOOLEAN FspFileSystemFindReparsePoint(FSP_FILE_SYSTEM *FileSystem, + NTSTATUS (*GetReparsePointByName)( + FSP_FILE_SYSTEM *FileSystem, PVOID Context, + PWSTR FileName, BOOLEAN IsDirectory, PVOID Buffer, PSIZE_T PSize), + PVOID Context, + PWSTR FileName, PUINT32 PReparsePointIndex); +/** + * Resolve reparse points. + * + * Given a file name (and an index where to start resolving) this function will attempt to + * resolve as many reparse points as possible. The function will call the supplied + * GetReparsePointByName function for every path component until it resolves the reparse points + * or the whole path is processed. + * + * This is a helper for implementing the ResolveReparsePoints operation in file systems + * that support reparse points. + * + * @param FileSystem + * The file system object. + * @param GetReparsePointByName + * Pointer to function that can retrieve reparse point information by name. The function + * should return STATUS_SUCCESS if the passed FileName is a reparse point or + * STATUS_NOT_A_REPARSE_POINT (or other error code) otherwise. + * @param Context + * User context to supply to GetReparsePointByName. + * @param FileName + * The name of the file or directory to have its reparse points resolved. + * @param ReparsePointIndex + * The index of the first reparse point within FileName. + * @param ResolveLastPathComponent + * If FALSE, the last path component of FileName should not be resolved, even + * if it is a reparse point that can be resolved. If TRUE, all path components + * should be resolved if possible. + * @param PIoStatus + * Pointer to storage that will receive the status to return to the FSD. When + * this function succeeds it must set PIoStatus->Status to STATUS_REPARSE and + * PIoStatus->Information to either IO_REPARSE or the reparse tag. + * @param Buffer + * Pointer to a buffer that will receive the resolved file name (IO_REPARSE) or + * reparse data (reparse tag). If the function returns a file name, it should + * not be NULL terminated. + * @param PSize [in,out] + * Pointer to the buffer size. On input it contains the size of the buffer. + * On output it will contain the actual size of data copied. + * @return + * STATUS_REPARSE or error code. + * @see + * ResolveReparsePoints + */ +FSP_API NTSTATUS FspFileSystemResolveReparsePoints(FSP_FILE_SYSTEM *FileSystem, + NTSTATUS (*GetReparsePointByName)( + FSP_FILE_SYSTEM *FileSystem, PVOID Context, + PWSTR FileName, BOOLEAN IsDirectory, PVOID Buffer, PSIZE_T PSize), + PVOID Context, + PWSTR FileName, UINT32 ReparsePointIndex, BOOLEAN ResolveLastPathComponent, + PIO_STATUS_BLOCK PIoStatus, PVOID Buffer, PSIZE_T PSize); +/** + * Test whether reparse data can be replaced. + * + * This is a helper for implementing the SetReparsePoint/DeleteReparsePoint operation + * in file systems that support reparse points. + * + * @param CurrentReparseData + * Pointer to the current reparse data. + * @param CurrentReparseDataSize + * Pointer to the current reparse data size. + * @param ReplaceReparseData + * Pointer to the replacement reparse data. + * @param ReplaceReparseDataSize + * Pointer to the replacement reparse data size. + * @return + * STATUS_SUCCESS or error code. + * @see + * SetReparsePoint + * DeleteReparsePoint + */ +FSP_API NTSTATUS FspFileSystemCanReplaceReparsePoint( + PVOID CurrentReparseData, SIZE_T CurrentReparseDataSize, + PVOID ReplaceReparseData, SIZE_T ReplaceReparseDataSize); +/** + * Add named stream information to a buffer. + * + * This is a helper for implementing the GetStreamInfo operation. + * + * @param StreamInfo + * The stream information to add. A value of NULL acts as an EOF marker for a GetStreamInfo + * operation. + * @param Buffer + * Pointer to a buffer that will receive the stream information. This should contain + * the same value passed to the GetStreamInfo Buffer parameter. + * @param Length + * Length of buffer. This should contain the same value passed to the GetStreamInfo + * Length parameter. + * @param PBytesTransferred [out] + * Pointer to a memory location that will receive the actual number of bytes stored. This should + * contain the same value passed to the GetStreamInfo PBytesTransferred parameter. + * @return + * TRUE if the stream information was added, FALSE if there was not enough space to add it. + * @see + * GetStreamInfo + */ +FSP_API BOOLEAN FspFileSystemAddStreamInfo(FSP_FSCTL_STREAM_INFO *StreamInfo, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred); +/** + * Enumerate extended attributes in a buffer. + * + * This is a helper for implementing the CreateEx and SetEa operations in file systems + * that support extended attributes. + * + * @param FileSystem + * The file system object. + * @param EnumerateEa + * Pointer to function that receives a single extended attribute. The function + * should return STATUS_SUCCESS or an error code if unsuccessful. + * @param Context + * User context to supply to EnumEa. + * @param Ea + * Extended attributes buffer. + * @param EaLength + * Extended attributes buffer length. + * @return + * STATUS_SUCCESS or error code from EnumerateEa. + */ +FSP_API NTSTATUS FspFileSystemEnumerateEa(FSP_FILE_SYSTEM *FileSystem, + NTSTATUS (*EnumerateEa)( + FSP_FILE_SYSTEM *FileSystem, PVOID Context, + PFILE_FULL_EA_INFORMATION SingleEa), + PVOID Context, + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength); +/** + * Add extended attribute to a buffer. + * + * This is a helper for implementing the GetEa operation. + * + * @param SingleEa + * The extended attribute to add. A value of NULL acts as an EOF marker for a GetEa + * operation. + * @param Ea + * Pointer to a buffer that will receive the extended attribute. This should contain + * the same value passed to the GetEa Ea parameter. + * @param EaLength + * Length of buffer. This should contain the same value passed to the GetEa + * EaLength parameter. + * @param PBytesTransferred [out] + * Pointer to a memory location that will receive the actual number of bytes stored. This should + * contain the same value passed to the GetEa PBytesTransferred parameter. + * @return + * TRUE if the extended attribute was added, FALSE if there was not enough space to add it. + * @see + * GetEa + */ +FSP_API BOOLEAN FspFileSystemAddEa(PFILE_FULL_EA_INFORMATION SingleEa, + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength, PULONG PBytesTransferred); +/** + * Get extended attribute "packed" size. This computation matches what NTFS reports. + * + * @param SingleEa + * The extended attribute to get the size for. + * @return + * The packed size of the extended attribute. + */ +static inline +UINT32 FspFileSystemGetEaPackedSize(PFILE_FULL_EA_INFORMATION SingleEa) +{ + /* magic computations are courtesy of NTFS */ + return 5 + SingleEa->EaNameLength + SingleEa->EaValueLength; +} +/** + * Add notify information to a buffer. + * + * This is a helper for filling a buffer to use with FspFileSystemNotify. + * + * @param NotifyInfo + * The notify information to add. + * @param Buffer + * Pointer to a buffer that will receive the notify information. + * @param Length + * Length of buffer. + * @param PBytesTransferred [out] + * Pointer to a memory location that will receive the actual number of bytes stored. This should + * be initialized to 0 prior to the first call to FspFileSystemAddNotifyInfo for a particular + * buffer. + * @return + * TRUE if the notify information was added, FALSE if there was not enough space to add it. + * @see + * FspFileSystemNotify + */ +FSP_API BOOLEAN FspFileSystemAddNotifyInfo(FSP_FSCTL_NOTIFY_INFO *NotifyInfo, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred); + +/* + * Directory buffering + */ +FSP_API BOOLEAN FspFileSystemAcquireDirectoryBuffer(PVOID *PDirBuffer, + BOOLEAN Reset, PNTSTATUS PResult); +FSP_API BOOLEAN FspFileSystemFillDirectoryBuffer(PVOID *PDirBuffer, + FSP_FSCTL_DIR_INFO *DirInfo, PNTSTATUS PResult); +FSP_API VOID FspFileSystemReleaseDirectoryBuffer(PVOID *PDirBuffer); +FSP_API VOID FspFileSystemReadDirectoryBuffer(PVOID *PDirBuffer, + PWSTR Marker, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred); +FSP_API VOID FspFileSystemDeleteDirectoryBuffer(PVOID *PDirBuffer); + +/* + * Security + */ +FSP_API PGENERIC_MAPPING FspGetFileGenericMapping(VOID); +FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, + BOOLEAN CheckParentOrMain, BOOLEAN AllowTraverseCheck, + UINT32 DesiredAccess, PUINT32 PGrantedAccess/* or ReparsePointIndex */, + PSECURITY_DESCRIPTOR *PSecurityDescriptor); +FSP_API NTSTATUS FspCreateSecurityDescriptor(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, + PSECURITY_DESCRIPTOR ParentDescriptor, + PSECURITY_DESCRIPTOR *PSecurityDescriptor); +/** + * Modify security descriptor. + * + * This is a helper for implementing the SetSecurity operation. + * + * @param InputDescriptor + * The input security descriptor to be modified. + * @param SecurityInformation + * Describes what parts of the InputDescriptor should be modified. This should contain + * the same value passed to the SetSecurity SecurityInformation parameter. + * @param ModificationDescriptor + * Describes the modifications to apply to the InputDescriptor. This should contain + * the same value passed to the SetSecurity ModificationDescriptor parameter. + * @param PSecurityDescriptor [out] + * Pointer to a memory location that will receive the resulting security descriptor. + * This security descriptor can be later freed using FspDeleteSecurityDescriptor. + * @return + * STATUS_SUCCESS or error code. + * @see + * SetSecurity + * FspDeleteSecurityDescriptor + */ +FSP_API NTSTATUS FspSetSecurityDescriptor( + PSECURITY_DESCRIPTOR InputDescriptor, + SECURITY_INFORMATION SecurityInformation, + PSECURITY_DESCRIPTOR ModificationDescriptor, + PSECURITY_DESCRIPTOR *PSecurityDescriptor); +/** + * Delete security descriptor. + * + * This is a helper for implementing the SetSecurity operation. + * + * @param SecurityDescriptor + * The security descriptor to be deleted. + * @param CreateFunc + * Function used to create the security descriptor. This parameter should be + * set to FspSetSecurityDescriptor for the public API. + * @return + * STATUS_SUCCESS or error code. + * @see + * SetSecurity + * FspSetSecurityDescriptor + */ +FSP_API VOID FspDeleteSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, + NTSTATUS (*CreateFunc)()); +static inline +NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, + BOOLEAN CheckParentOrMain, BOOLEAN AllowTraverseCheck, + UINT32 DesiredAccess, PUINT32 PGrantedAccess) +{ + return FspAccessCheckEx(FileSystem, Request, + CheckParentOrMain, AllowTraverseCheck, + DesiredAccess, PGrantedAccess, + 0); +} + +/* + * POSIX Interop + */ +FSP_API NTSTATUS FspPosixMapUidToSid(UINT32 Uid, PSID *PSid); +FSP_API NTSTATUS FspPosixMapSidToUid(PSID Sid, PUINT32 PUid); +FSP_API VOID FspDeleteSid(PSID Sid, NTSTATUS (*CreateFunc)()); +FSP_API NTSTATUS FspPosixMapPermissionsToSecurityDescriptor( + UINT32 Uid, UINT32 Gid, UINT32 Mode, + PSECURITY_DESCRIPTOR *PSecurityDescriptor); +FSP_API NTSTATUS FspPosixMergePermissionsToSecurityDescriptor( + UINT32 Uid, UINT32 Gid, UINT32 Mode, + PSECURITY_DESCRIPTOR ExistingSecurityDescriptor, + PSECURITY_DESCRIPTOR *PSecurityDescriptor); +FSP_API NTSTATUS FspPosixMapSecurityDescriptorToPermissions( + PSECURITY_DESCRIPTOR SecurityDescriptor, + PUINT32 PUid, PUINT32 PGid, PUINT32 PMode); +FSP_API NTSTATUS FspPosixMapWindowsToPosixPathEx(PWSTR WindowsPath, char **PPosixPath, + BOOLEAN Translate); +FSP_API NTSTATUS FspPosixMapPosixToWindowsPathEx(const char *PosixPath, PWSTR *PWindowsPath, + BOOLEAN Translate); +static inline +NTSTATUS FspPosixMapWindowsToPosixPath(PWSTR WindowsPath, char **PPosixPath) +{ + return FspPosixMapWindowsToPosixPathEx(WindowsPath, PPosixPath, TRUE); +} +static inline +NTSTATUS FspPosixMapPosixToWindowsPath(const char *PosixPath, PWSTR *PWindowsPath) +{ + return FspPosixMapPosixToWindowsPathEx(PosixPath, PWindowsPath, TRUE); +} +FSP_API VOID FspPosixDeletePath(void *Path); +FSP_API VOID FspPosixEncodeWindowsPath(PWSTR WindowsPath, ULONG Size); +FSP_API VOID FspPosixDecodeWindowsPath(PWSTR WindowsPath, ULONG Size); +static inline +VOID FspPosixFileTimeToUnixTime(UINT64 FileTime0, __int3264 UnixTime[2]) +{ + INT64 FileTime = (INT64)FileTime0 - 116444736000000000LL; + UnixTime[0] = (__int3264)(FileTime / 10000000); + UnixTime[1] = (__int3264)(FileTime % 10000000 * 100); + /* may produce negative nsec for times before UNIX epoch; strictly speaking this is incorrect */ +} +static inline +VOID FspPosixUnixTimeToFileTime(const __int3264 UnixTime[2], PUINT64 PFileTime) +{ + INT64 FileTime = (INT64)UnixTime[0] * 10000000 + (INT64)UnixTime[1] / 100 + + 116444736000000000LL; + *PFileTime = FileTime; +} + +/* + * Path Handling + */ +FSP_API VOID FspPathPrefix(PWSTR Path, PWSTR *PPrefix, PWSTR *PRemain, PWSTR Root); +FSP_API VOID FspPathSuffix(PWSTR Path, PWSTR *PRemain, PWSTR *PSuffix, PWSTR Root); +FSP_API VOID FspPathCombine(PWSTR Prefix, PWSTR Suffix); + +/** + * @group Service Framework + * + * User mode file systems typically are run as Windows services. WinFsp provides an API to make + * the creation of Windows services easier. This API is provided for convenience and is not + * necessary to expose a user mode file system to Windows. + */ +typedef struct _FSP_SERVICE FSP_SERVICE; +typedef NTSTATUS FSP_SERVICE_START(FSP_SERVICE *, ULONG, PWSTR *); +typedef NTSTATUS FSP_SERVICE_STOP(FSP_SERVICE *); +typedef NTSTATUS FSP_SERVICE_CONTROL(FSP_SERVICE *, ULONG, ULONG, PVOID); +#pragma warning(push) +#pragma warning(disable:4200) /* zero-sized array in struct/union */ +typedef struct _FSP_SERVICE +{ + UINT16 Version; + PVOID UserContext; + FSP_SERVICE_START *OnStart; + FSP_SERVICE_STOP *OnStop; + FSP_SERVICE_CONTROL *OnControl; + ULONG AcceptControl; + ULONG ExitCode; + SERVICE_STATUS_HANDLE StatusHandle; + SERVICE_STATUS ServiceStatus; + CRITICAL_SECTION ServiceStatusGuard; + CRITICAL_SECTION ServiceStopGuard; + BOOLEAN AllowConsoleMode; + WCHAR ServiceName[]; +} FSP_SERVICE; +#pragma warning(pop) +/** + * Run a service. + * + * This function wraps calls to FspServiceCreate, FspServiceLoop and FspServiceDelete to create, + * run and delete a service. It is intended to be used from a service's main/wmain function. + * + * This function runs a service with console mode allowed. + * + * @param ServiceName + * The name of the service. + * @param OnStart + * Function to call when the service starts. + * @param OnStop + * Function to call when the service stops. + * @param OnControl + * Function to call when the service receives a service control code. + * @return + * Service process exit code. + */ +FSP_API ULONG FspServiceRunEx(PWSTR ServiceName, + FSP_SERVICE_START *OnStart, + FSP_SERVICE_STOP *OnStop, + FSP_SERVICE_CONTROL *OnControl, + PVOID UserContext); +static inline +ULONG FspServiceRun(PWSTR ServiceName, + FSP_SERVICE_START *OnStart, + FSP_SERVICE_STOP *OnStop, + FSP_SERVICE_CONTROL *OnControl) +{ + return FspServiceRunEx(ServiceName, OnStart, OnStop, OnControl, 0); +} +/** + * Create a service object. + * + * @param ServiceName + * The name of the service. + * @param OnStart + * Function to call when the service starts. + * @param OnStop + * Function to call when the service stops. + * @param OnControl + * Function to call when the service receives a service control code. + * @param PService [out] + * Pointer that will receive the service object created on successful return from this + * call. + * @return + * STATUS_SUCCESS or error code. + */ +FSP_API NTSTATUS FspServiceCreate(PWSTR ServiceName, + FSP_SERVICE_START *OnStart, + FSP_SERVICE_STOP *OnStop, + FSP_SERVICE_CONTROL *OnControl, + FSP_SERVICE **PService); +/** + * Delete a service object. + * + * @param Service + * The service object. + */ +FSP_API VOID FspServiceDelete(FSP_SERVICE *Service); +/** + * Allow a service to run in console mode. + * + * A service that is run in console mode runs with a console attached and outside the control of + * the Service Control Manager. This is useful for debugging and testing a service during + * development. + * + * User mode file systems that wish to use the WinFsp Launcher functionality must also use this + * call. The WinFsp Launcher is a Windows service that can be configured to launch and manage + * multiple instances of a user mode file system. + * + * @param Service + * The service object. + */ +FSP_API VOID FspServiceAllowConsoleMode(FSP_SERVICE *Service); +/** + * Configure the control codes that a service accepts. + * + * This API should be used prior to Start operations. + * + * @param Service + * The service object. + * @param Control + * The control codes to accept. Note that the SERVICE_ACCEPT_PAUSE_CONTINUE code is silently + * ignored. + */ +FSP_API VOID FspServiceAcceptControl(FSP_SERVICE *Service, ULONG Control); +/** + * Request additional time from the Service Control Manager. + * + * This API should be used during Start and Stop operations only. + * + * @param Service + * The service object. + * @param Time + * Additional time (in milliseconds). + */ +FSP_API VOID FspServiceRequestTime(FSP_SERVICE *Service, ULONG Time); +/** + * Set the service process exit code. + * + * @param Service + * The service object. + * @param ExitCode + * Service process exit code. + */ +FSP_API VOID FspServiceSetExitCode(FSP_SERVICE *Service, ULONG ExitCode); +/** + * Get the service process exit code. + * + * @param Service + * The service object. + * @return + * Service process exit code. + */ +FSP_API ULONG FspServiceGetExitCode(FSP_SERVICE *Service); +/** + * Run a service main loop. + * + * This function starts and runs a service. It executes the Windows StartServiceCtrlDispatcher API + * to connect the service process to the Service Control Manager. If the Service Control Manager is + * not available (and console mode is allowed) it will enter console mode. + * + * @param Service + * The service object. + * @return + * STATUS_SUCCESS or error code. + */ +FSP_API NTSTATUS FspServiceLoop(FSP_SERVICE *Service); +/** + * Stops a running service. + * + * Stopping a service usually happens when the Service Control Manager instructs the service to + * stop. In some situations (e.g. fatal errors) the service may wish to stop itself. It can do so + * in a clean manner by calling this function. + * + * @param Service + * The service object. + * @return + * STATUS_SUCCESS or error code. + */ +FSP_API VOID FspServiceStop(FSP_SERVICE *Service); +/** + * Determine if the current process is running in user interactive mode. + * + * @return + * TRUE if the process is running in running user interactive mode. + */ +FSP_API BOOLEAN FspServiceIsInteractive(VOID); +/** + * Check if the supplied token is from the service context. + * + * @param Token + * Token to check. Pass NULL to check the current process token. + * @param PIsLocalSystem + * Pointer to a boolean that will receive a TRUE value if the token belongs to LocalSystem + * and FALSE otherwise. May be NULL. + * @return + * STATUS_SUCCESS if the token is from the service context. STATUS_ACCESS_DENIED if it is not. + * Other error codes are possible. + */ +FSP_API NTSTATUS FspServiceContextCheck(HANDLE Token, PBOOLEAN PIsLocalSystem); +/** + * Log a service message. + * + * This function can be used to log an arbitrary message to the Windows Event Log or to the current + * console if running in user interactive mode. + * + * @param Type + * One of EVENTLOG_INFORMATION_TYPE, EVENTLOG_WARNING_TYPE, EVENTLOG_ERROR_TYPE. + * @param Format + * Format specification. This function uses the Windows wsprintf API for formatting. Refer to + * that API's documentation for details on the format specification. + */ +FSP_API VOID FspServiceLog(ULONG Type, PWSTR Format, ...); +FSP_API VOID FspServiceLogV(ULONG Type, PWSTR Format, va_list ap); + +/* + * Utility + */ +FSP_API NTSTATUS FspNtStatusFromWin32(DWORD Error); +FSP_API DWORD FspWin32FromNtStatus(NTSTATUS Status); +FSP_API VOID FspEventLog(ULONG Type, PWSTR Format, ...); +FSP_API VOID FspEventLogV(ULONG Type, PWSTR Format, va_list ap); +FSP_API VOID FspDebugLogSetHandle(HANDLE Handle); +FSP_API VOID FspDebugLog(const char *Format, ...); +FSP_API VOID FspDebugLogSD(const char *Format, PSECURITY_DESCRIPTOR SecurityDescriptor); +FSP_API VOID FspDebugLogSid(const char *format, PSID Sid); +FSP_API VOID FspDebugLogFT(const char *Format, PFILETIME FileTime); +FSP_API VOID FspDebugLogRequest(FSP_FSCTL_TRANSACT_REQ *Request); +FSP_API VOID FspDebugLogResponse(FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspCallNamedPipeSecurely(PWSTR PipeName, + PVOID InBuffer, ULONG InBufferSize, PVOID OutBuffer, ULONG OutBufferSize, + PULONG PBytesTransferred, ULONG Timeout, + PSID Sid); +FSP_API NTSTATUS FspCallNamedPipeSecurelyEx(PWSTR PipeName, + PVOID InBuffer, ULONG InBufferSize, PVOID OutBuffer, ULONG OutBufferSize, + PULONG PBytesTransferred, ULONG Timeout, BOOLEAN AllowImpersonation, + PSID Sid); +FSP_API NTSTATUS FspVersion(PUINT32 PVersion); + +/* + * Delay load + */ +static inline +NTSTATUS FspLoad(PVOID *PModule) +{ +#if defined(_WIN64) +#define FSP_DLLNAME FSP_FSCTL_PRODUCT_FILE_NAME "-x64.dll" +#else +#define FSP_DLLNAME FSP_FSCTL_PRODUCT_FILE_NAME "-x86.dll" +#endif +#define FSP_DLLPATH "bin\\" FSP_DLLNAME + + WINADVAPI + LSTATUS + APIENTRY + RegGetValueW( + HKEY hkey, + LPCWSTR lpSubKey, + LPCWSTR lpValue, + DWORD dwFlags, + LPDWORD pdwType, + PVOID pvData, + LPDWORD pcbData); + + WCHAR PathBuf[MAX_PATH]; + DWORD Size; + HKEY RegKey; + LONG Result; + HMODULE Module; + + if (0 != PModule) + *PModule = 0; + + Module = LoadLibraryW(L"" FSP_DLLNAME); + if (0 == Module) + { + Result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\" FSP_FSCTL_PRODUCT_NAME, + 0, KEY_READ | KEY_WOW64_32KEY, &RegKey); + if (ERROR_SUCCESS == Result) + { + Size = sizeof PathBuf - sizeof L"" FSP_DLLPATH + sizeof(WCHAR); + Result = RegGetValueW(RegKey, 0, L"InstallDir", + RRF_RT_REG_SZ, 0, PathBuf, &Size); + RegCloseKey(RegKey); + } + if (ERROR_SUCCESS != Result) + return STATUS_OBJECT_NAME_NOT_FOUND; + + RtlCopyMemory(PathBuf + (Size / sizeof(WCHAR) - 1), L"" FSP_DLLPATH, sizeof L"" FSP_DLLPATH); + Module = LoadLibraryW(PathBuf); + if (0 == Module) + return STATUS_DLL_NOT_FOUND; + } + + if (0 != PModule) + *PModule = Module; + + return STATUS_SUCCESS; + +#undef FSP_DLLNAME +#undef FSP_DLLPATH +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/inc/winfsp/winfsp.hpp b/3rd_party/winfsp-1.10/inc/winfsp/winfsp.hpp new file mode 100644 index 00000000..d2270777 --- /dev/null +++ b/3rd_party/winfsp-1.10/inc/winfsp/winfsp.hpp @@ -0,0 +1,1320 @@ +/** + * @file winfsp/winfsp.hpp + * WinFsp C++ Layer. + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef WINFSP_WINFSP_HPP_INCLUDED +#define WINFSP_WINFSP_HPP_INCLUDED + +#ifndef __cplusplus +#error this header requires a C++ compiler +#endif + +#include + +#define FSP_CPP_EXCEPTION_GUARD(...)\ + try { __VA_ARGS__ } catch (...) { return self->ExceptionHandler(); } +#define FSP_CPP_EXCEPTION_GUARD_VOID(...)\ + try { __VA_ARGS__ } catch (...) { self->ExceptionHandler(); return; } + +namespace Fsp { + +inline NTSTATUS Initialize() +{ + static NTSTATUS LoadResult = FspLoad(0); + return LoadResult; +} + +class FileSystemBase +{ +public: + typedef FSP_FSCTL_VOLUME_INFO VolumeInfo; + typedef FSP_FSCTL_FILE_INFO FileInfo; + typedef FSP_FSCTL_OPEN_FILE_INFO OpenFileInfo; + typedef FSP_FSCTL_DIR_INFO DirInfo; + typedef FSP_FSCTL_STREAM_INFO StreamInfo; + enum CleanupFlags + { + CleanupDelete = FspCleanupDelete, + CleanupSetAllocationSize = FspCleanupSetAllocationSize, + CleanupSetArchiveBit = FspCleanupSetArchiveBit, + CleanupSetLastAccessTime = FspCleanupSetLastAccessTime, + CleanupSetLastWriteTime = FspCleanupSetLastWriteTime, + CleanupSetChangeTime = FspCleanupSetChangeTime, + }; + +public: + FileSystemBase() + { + } + virtual ~FileSystemBase() + { + } + + /* operations */ + virtual NTSTATUS ExceptionHandler() + { + return STATUS_UNEXPECTED_IO_ERROR; + } + virtual NTSTATUS Init(PVOID Host) + { + return STATUS_SUCCESS; + } + virtual NTSTATUS Mounted(PVOID Host) + { + return STATUS_SUCCESS; + } + virtual VOID Unmounted(PVOID Host) + { + } + virtual NTSTATUS GetVolumeInfo( + VolumeInfo *VolumeInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS SetVolumeLabel_( + PWSTR VolumeLabel, + VolumeInfo *VolumeInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS GetSecurityByName( + PWSTR FileName, + PUINT32 PFileAttributes/* or ReparsePointIndex */, + PSECURITY_DESCRIPTOR SecurityDescriptor, + SIZE_T *PSecurityDescriptorSize) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS Create( + PWSTR FileName, + UINT32 CreateOptions, + UINT32 GrantedAccess, + UINT32 FileAttributes, + PSECURITY_DESCRIPTOR SecurityDescriptor, + UINT64 AllocationSize, + PVOID *PFileNode, + PVOID *PFileDesc, + OpenFileInfo *OpenFileInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS Open( + PWSTR FileName, + UINT32 CreateOptions, + UINT32 GrantedAccess, + PVOID *PFileNode, + PVOID *PFileDesc, + OpenFileInfo *OpenFileInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS Overwrite( + PVOID FileNode, + PVOID FileDesc, + UINT32 FileAttributes, + BOOLEAN ReplaceFileAttributes, + UINT64 AllocationSize, + FileInfo *FileInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual VOID Cleanup( + PVOID FileNode, + PVOID FileDesc, + PWSTR FileName, + ULONG Flags) + { + } + virtual VOID Close( + PVOID FileNode, + PVOID FileDesc) + { + } + virtual NTSTATUS Read( + PVOID FileNode, + PVOID FileDesc, + PVOID Buffer, + UINT64 Offset, + ULONG Length, + PULONG PBytesTransferred) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS Write( + PVOID FileNode, + PVOID FileDesc, + PVOID Buffer, + UINT64 Offset, + ULONG Length, + BOOLEAN WriteToEndOfFile, + BOOLEAN ConstrainedIo, + PULONG PBytesTransferred, + FileInfo *FileInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS Flush( + PVOID FileNode, + PVOID FileDesc, + FileInfo *FileInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS GetFileInfo( + PVOID FileNode, + PVOID FileDesc, + FileInfo *FileInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS SetBasicInfo( + PVOID FileNode, + PVOID FileDesc, + UINT32 FileAttributes, + UINT64 CreationTime, + UINT64 LastAccessTime, + UINT64 LastWriteTime, + UINT64 ChangeTime, + FileInfo *FileInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS SetFileSize( + PVOID FileNode, + PVOID FileDesc, + UINT64 NewSize, + BOOLEAN SetAllocationSize, + FileInfo *FileInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS CanDelete( + PVOID FileNode, + PVOID FileDesc, + PWSTR FileName) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS Rename( + PVOID FileNode, + PVOID FileDesc, + PWSTR FileName, + PWSTR NewFileName, + BOOLEAN ReplaceIfExists) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS GetSecurity( + PVOID FileNode, + PVOID FileDesc, + PSECURITY_DESCRIPTOR SecurityDescriptor, + SIZE_T *PSecurityDescriptorSize) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS SetSecurity( + PVOID FileNode, + PVOID FileDesc, + SECURITY_INFORMATION SecurityInformation, + PSECURITY_DESCRIPTOR ModificationDescriptor) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS ReadDirectory( + PVOID FileNode, + PVOID FileDesc, + PWSTR Pattern, + PWSTR Marker, + PVOID Buffer, + ULONG Length, + PULONG PBytesTransferred) + { + return SeekableReadDirectory( + FileNode, + FileDesc, + Pattern, + Marker, + Buffer, + Length, + PBytesTransferred); + } + virtual NTSTATUS ReadDirectoryEntry( + PVOID FileNode, + PVOID FileDesc, + PWSTR Pattern, + PWSTR Marker, + PVOID *PContext, + DirInfo *DirInfo) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS ResolveReparsePoints( + PWSTR FileName, + UINT32 ReparsePointIndex, + BOOLEAN ResolveLastPathComponent, + PIO_STATUS_BLOCK PIoStatus, + PVOID Buffer, + PSIZE_T PSize) + { + return FspFileSystemResolveReparsePoints( + 0, + GetReparsePointByName, + this, + FileName, + ReparsePointIndex, + ResolveLastPathComponent, + PIoStatus, + Buffer, + PSize); + } + virtual NTSTATUS GetReparsePointByName( + PWSTR FileName, + BOOLEAN IsDirectory, + PVOID Buffer, + PSIZE_T PSize) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS GetReparsePoint( + PVOID FileNode, + PVOID FileDesc, + PWSTR FileName, + PVOID Buffer, + PSIZE_T PSize) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS SetReparsePoint( + PVOID FileNode, + PVOID FileDesc, + PWSTR FileName, + PVOID Buffer, + SIZE_T Size) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS DeleteReparsePoint( + PVOID FileNode, + PVOID FileDesc, + PWSTR FileName, + PVOID Buffer, + SIZE_T Size) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + virtual NTSTATUS GetStreamInfo( + PVOID FileNode, + PVOID FileDesc, + PVOID Buffer, + ULONG Length, + PULONG PBytesTransferred) + { + return STATUS_INVALID_DEVICE_REQUEST; + } + + /* helpers */ + static NTSTATUS NtStatusFromWin32(DWORD Error) + { + return FspNtStatusFromWin32(Error); + } + static DWORD Win32FromNtStatus(NTSTATUS Status) + { + return FspWin32FromNtStatus(Status); + } + static VOID DeleteDirectoryBuffer(PVOID *PDirBuffer) + { + FspFileSystemDeleteDirectoryBuffer(PDirBuffer); + } + NTSTATUS SeekableReadDirectory( + PVOID FileNode, + PVOID FileDesc, + PWSTR Pattern, + PWSTR Marker, + PVOID Buffer, + ULONG Length, + PULONG PBytesTransferred) + { + PVOID Context = 0; + union + { + UINT8 B[FIELD_OFFSET(FileSystemBase::DirInfo, FileNameBuf) + MAX_PATH * sizeof(WCHAR)]; + FileSystemBase::DirInfo D; + } DirInfoBuf; + FileSystemBase::DirInfo *DirInfo = &DirInfoBuf.D; + NTSTATUS Result = STATUS_SUCCESS; + *PBytesTransferred = 0; + for (;;) + { + Result = ReadDirectoryEntry(FileNode, FileDesc, Pattern, Marker, &Context, DirInfo); + if (STATUS_NO_MORE_FILES == Result) + { + Result = STATUS_SUCCESS; + break; + } + if (!NT_SUCCESS(Result)) + break; + if (!FspFileSystemAddDirInfo(DirInfo, Buffer, Length, PBytesTransferred)) + break; + } + if (!NT_SUCCESS(Result)) + return Result; + return STATUS_SUCCESS; + } + NTSTATUS BufferedReadDirectory( + PVOID *PDirBuffer, + PVOID FileNode, + PVOID FileDesc, + PWSTR Pattern, + PWSTR Marker, + PVOID Buffer, + ULONG Length, + PULONG PBytesTransferred) + { + PVOID Context = 0; + union + { + UINT8 B[FIELD_OFFSET(FileSystemBase::DirInfo, FileNameBuf) + MAX_PATH * sizeof(WCHAR)]; + FileSystemBase::DirInfo D; + } DirInfoBuf; + FileSystemBase::DirInfo *DirInfo = &DirInfoBuf.D; + NTSTATUS Result = STATUS_SUCCESS; + *PBytesTransferred = 0; + if (FspFileSystemAcquireDirectoryBuffer(PDirBuffer, 0 == Marker, &Result)) + { + try + { + for (;;) + { + Result = ReadDirectoryEntry(FileNode, FileDesc, Pattern, Marker, &Context, DirInfo); + if (STATUS_NO_MORE_FILES == Result) + { + Result = STATUS_SUCCESS; + break; + } + if (!NT_SUCCESS(Result)) + break; + if (!FspFileSystemFillDirectoryBuffer(PDirBuffer, DirInfo, &Result)) + break; + } + } + catch (...) + { + FspFileSystemReleaseDirectoryBuffer(PDirBuffer); + throw; + } + FspFileSystemReleaseDirectoryBuffer(PDirBuffer); + } + if (!NT_SUCCESS(Result)) + return Result; + FspFileSystemReadDirectoryBuffer(PDirBuffer, Marker, Buffer, Length, PBytesTransferred); + return STATUS_SUCCESS; + } + BOOLEAN FindReparsePoint( + PWSTR FileName, PUINT32 PReparsePointIndex) + { + return FspFileSystemFindReparsePoint( + 0, + GetReparsePointByName, + this, + FileName, + PReparsePointIndex); + } + static NTSTATUS CanReplaceReparsePoint( + PVOID CurrentReparseData, SIZE_T CurrentReparseDataSize, + PVOID ReplaceReparseData, SIZE_T ReplaceReparseDataSize) + { + return FspFileSystemCanReplaceReparsePoint( + CurrentReparseData, CurrentReparseDataSize, + ReplaceReparseData, ReplaceReparseDataSize); + } + static BOOLEAN AddStreamInfo(StreamInfo *StreamInfo, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred) + { + return FspFileSystemAddStreamInfo(StreamInfo, Buffer, Length, PBytesTransferred); + } + +private: + static NTSTATUS GetReparsePointByName(FSP_FILE_SYSTEM *FileSystem, + PVOID Context, + PWSTR FileName, + BOOLEAN IsDirectory, + PVOID Buffer, + PSIZE_T PSize) + { + FileSystemBase *self = (FileSystemBase *)Context; + FSP_CPP_EXCEPTION_GUARD( + return self->GetReparsePointByName( + FileName, + IsDirectory, + Buffer, + PSize); + ) + } + +private: + /* disallow copy and assignment */ + FileSystemBase(const FileSystemBase &); + FileSystemBase &operator=(const FileSystemBase &); +}; + +class FileSystemHost +{ +public: + /* ctor/dtor */ + FileSystemHost(FileSystemBase &FileSystem) : + _VolumeParams(), _FileSystemPtr(0), _FileSystem(&FileSystem) + { + Initialize(); + _VolumeParams.UmFileContextIsFullContext = 1; + } + virtual ~FileSystemHost() + { + if (0 != _FileSystemPtr) + FspFileSystemDelete(_FileSystemPtr); + } + + /* properties */ + UINT16 SectorSize() + { + return _VolumeParams.SectorSize; + } + VOID SetSectorSize(UINT16 SectorSize) + { + _VolumeParams.SectorSize = SectorSize; + } + UINT16 SectorsPerAllocationUnit() + { + return _VolumeParams.SectorsPerAllocationUnit; + } + VOID SetSectorsPerAllocationUnit(UINT16 SectorsPerAllocationUnit) + { + _VolumeParams.SectorsPerAllocationUnit = SectorsPerAllocationUnit; + } + UINT16 MaxComponentLength() + { + return _VolumeParams.MaxComponentLength; + } + VOID SetMaxComponentLength(UINT16 MaxComponentLength) + { + _VolumeParams.MaxComponentLength = MaxComponentLength; + } + UINT64 VolumeCreationTime() + { + return _VolumeParams.VolumeCreationTime; + } + VOID SetVolumeCreationTime(UINT64 VolumeCreationTime) + { + _VolumeParams.VolumeCreationTime = VolumeCreationTime; + } + UINT32 VolumeSerialNumber() + { + return _VolumeParams.VolumeSerialNumber; + } + VOID SetVolumeSerialNumber(UINT32 VolumeSerialNumber) + { + _VolumeParams.VolumeSerialNumber = VolumeSerialNumber; + } + UINT32 FileInfoTimeout() + { + return _VolumeParams.FileInfoTimeout; + } + VOID SetFileInfoTimeout(UINT32 FileInfoTimeout) + { + _VolumeParams.FileInfoTimeout = FileInfoTimeout; + } + BOOLEAN CaseSensitiveSearch() + { + return _VolumeParams.CaseSensitiveSearch; + } + VOID SetCaseSensitiveSearch(BOOLEAN CaseSensitiveSearch) + { + _VolumeParams.CaseSensitiveSearch = !!CaseSensitiveSearch; + } + BOOLEAN CasePreservedNames() + { + return _VolumeParams.CasePreservedNames; + } + VOID SetCasePreservedNames(BOOLEAN CasePreservedNames) + { + _VolumeParams.CasePreservedNames = !!CasePreservedNames; + } + BOOLEAN UnicodeOnDisk() + { + return _VolumeParams.UnicodeOnDisk; + } + VOID SetUnicodeOnDisk(BOOLEAN UnicodeOnDisk) + { + _VolumeParams.UnicodeOnDisk = !!UnicodeOnDisk; + } + BOOLEAN PersistentAcls() + { + return _VolumeParams.PersistentAcls; + } + VOID SetPersistentAcls(BOOLEAN PersistentAcls) + { + _VolumeParams.PersistentAcls = !!PersistentAcls; + } + BOOLEAN ReparsePoints() + { + return _VolumeParams.ReparsePoints; + } + VOID SetReparsePoints(BOOLEAN ReparsePoints) + { + _VolumeParams.ReparsePoints = !!ReparsePoints; + } + BOOLEAN ReparsePointsAccessCheck() + { + return _VolumeParams.ReparsePointsAccessCheck; + } + VOID SetReparsePointsAccessCheck(BOOLEAN ReparsePointsAccessCheck) + { + _VolumeParams.ReparsePointsAccessCheck = !!ReparsePointsAccessCheck; + } + BOOLEAN NamedStreams() + { + return _VolumeParams.NamedStreams; + } + VOID SetNamedStreams(BOOLEAN NamedStreams) + { + _VolumeParams.NamedStreams = !!NamedStreams; + } + BOOLEAN PostCleanupWhenModifiedOnly() + { + return _VolumeParams.PostCleanupWhenModifiedOnly; + } + VOID SetPostCleanupWhenModifiedOnly(BOOLEAN PostCleanupWhenModifiedOnly) + { + _VolumeParams.PostCleanupWhenModifiedOnly = !!PostCleanupWhenModifiedOnly; + } + BOOLEAN PassQueryDirectoryPattern() + { + return _VolumeParams.PassQueryDirectoryPattern; + } + VOID SetPassQueryDirectoryPattern(BOOLEAN PassQueryDirectoryPattern) + { + _VolumeParams.PassQueryDirectoryPattern = !!PassQueryDirectoryPattern; + } + BOOLEAN FlushAndPurgeOnCleanup() + { + return _VolumeParams.FlushAndPurgeOnCleanup; + } + VOID SetFlushAndPurgeOnCleanup(BOOLEAN FlushAndPurgeOnCleanup) + { + _VolumeParams.FlushAndPurgeOnCleanup = !!FlushAndPurgeOnCleanup; + } + PWSTR Prefix() + { + return _VolumeParams.Prefix; + } + VOID SetPrefix(PWSTR Prefix) + { + int Size = lstrlenW(Prefix) * sizeof(WCHAR); + if (Size > sizeof _VolumeParams.Prefix - sizeof(WCHAR)) + Size = sizeof _VolumeParams.Prefix - sizeof(WCHAR); + RtlCopyMemory(_VolumeParams.Prefix, Prefix, Size); + _VolumeParams.Prefix[Size / sizeof(WCHAR)] = L'\0'; + } + PWSTR FileSystemName() + { + return _VolumeParams.FileSystemName; + } + VOID SetFileSystemName(PWSTR FileSystemName) + { + int Size = lstrlenW(FileSystemName) * sizeof(WCHAR); + if (Size > sizeof _VolumeParams.FileSystemName - sizeof(WCHAR)) + Size = sizeof _VolumeParams.FileSystemName - sizeof(WCHAR); + RtlCopyMemory(_VolumeParams.FileSystemName, FileSystemName, Size); + _VolumeParams.FileSystemName[Size / sizeof(WCHAR)] = L'\0'; + } + + /* control */ + NTSTATUS Preflight(PWSTR MountPoint) + { + return FspFileSystemPreflight( + _VolumeParams.Prefix[0] ? L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME, + MountPoint); + } + NTSTATUS Mount(PWSTR MountPoint, + PSECURITY_DESCRIPTOR SecurityDescriptor = 0, + BOOLEAN Synchronized = FALSE, + UINT32 DebugLog = 0) + { + NTSTATUS Result; + try + { + Result = _FileSystem->Init(this); + } + catch (...) + { + Result = _FileSystem->ExceptionHandler(); + } + if (!NT_SUCCESS(Result)) + return Result; + Result = FspFileSystemCreate( + _VolumeParams.Prefix[0] ? L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME, + &_VolumeParams, Interface(), &_FileSystemPtr); + if (!NT_SUCCESS(Result)) + return Result; + _FileSystemPtr->UserContext = _FileSystem; + FspFileSystemSetOperationGuardStrategy(_FileSystemPtr, Synchronized ? + FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_COARSE : + FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_FINE); + FspFileSystemSetDebugLog(_FileSystemPtr, DebugLog); + Result = FspFileSystemSetMountPointEx(_FileSystemPtr, MountPoint, SecurityDescriptor); + if (NT_SUCCESS(Result)) + { + try + { + Result = _FileSystem->Mounted(this); + } + catch (...) + { + Result = _FileSystem->ExceptionHandler(); + } + if (NT_SUCCESS(Result)) + { + Result = FspFileSystemStartDispatcher(_FileSystemPtr, 0); + if (!NT_SUCCESS(Result)) + try + { + _FileSystem->Unmounted(this); + } + catch (...) + { + _FileSystem->ExceptionHandler(); + } + } + } + if (!NT_SUCCESS(Result)) + { + FspFileSystemDelete(_FileSystemPtr); + _FileSystemPtr = 0; + } + return Result; + } + VOID Unmount() + { + FspFileSystemStopDispatcher(_FileSystemPtr); + try + { + _FileSystem->Unmounted(this); + } + catch (...) + { + _FileSystem->ExceptionHandler(); + } + _FileSystemPtr->UserContext = 0; + FspFileSystemDelete(_FileSystemPtr); + _FileSystemPtr = 0; + } + PWSTR MountPoint() + { + return 0 != _FileSystemPtr ? FspFileSystemMountPoint(_FileSystemPtr) : 0; + } + FSP_FILE_SYSTEM *FileSystemHandle() + { + return _FileSystemPtr; + } + FileSystemBase &FileSystem() + { + return *_FileSystem; + } + static NTSTATUS SetDebugLogFile(PWSTR FileName) + { + HANDLE Handle; + if ('-' == FileName[0] && '\0' == FileName[1]) + Handle = GetStdHandle(STD_ERROR_HANDLE); + else + Handle = CreateFileW( + FileName, + FILE_APPEND_DATA, + FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, + OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + 0); + if (INVALID_HANDLE_VALUE == Handle) + return FspNtStatusFromWin32(GetLastError()); + FspDebugLogSetHandle(Handle); + return STATUS_SUCCESS; + } + +private: + /* FSP_FILE_SYSTEM_INTERFACE */ + static NTSTATUS GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem0, + FSP_FSCTL_VOLUME_INFO *VolumeInfo) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->GetVolumeInfo( + VolumeInfo); + ) + } + static NTSTATUS SetVolumeLabel_(FSP_FILE_SYSTEM *FileSystem0, + PWSTR VolumeLabel, + FSP_FSCTL_VOLUME_INFO *VolumeInfo) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->SetVolumeLabel_( + VolumeLabel, + VolumeInfo); + ) + } + static NTSTATUS GetSecurityByName(FSP_FILE_SYSTEM *FileSystem0, + PWSTR FileName, + PUINT32 PFileAttributes/* or ReparsePointIndex */, + PSECURITY_DESCRIPTOR SecurityDescriptor, + SIZE_T *PSecurityDescriptorSize) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->GetSecurityByName( + FileName, + PFileAttributes, + SecurityDescriptor, + PSecurityDescriptorSize); + ) + } + static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem0, + PWSTR FileName, + UINT32 CreateOptions, + UINT32 GrantedAccess, + UINT32 FileAttributes, + PSECURITY_DESCRIPTOR SecurityDescriptor, + UINT64 AllocationSize, + PVOID *FullContext, + FSP_FSCTL_FILE_INFO *FileInfo) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + PVOID FileNode, FileDesc; + NTSTATUS Result; + FSP_CPP_EXCEPTION_GUARD( + Result = self->Create( + FileName, + CreateOptions, + GrantedAccess, + FileAttributes, + SecurityDescriptor, + AllocationSize, + &FileNode, + &FileDesc, + FspFileSystemGetOpenFileInfo(FileInfo)); + ) + ((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext = (UINT64)(UINT_PTR)FileNode; + ((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2 = (UINT64)(UINT_PTR)FileDesc; + return Result; + } + static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem0, + PWSTR FileName, + UINT32 CreateOptions, + UINT32 GrantedAccess, + PVOID *FullContext, + FSP_FSCTL_FILE_INFO *FileInfo) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + PVOID FileNode, FileDesc; + NTSTATUS Result; + FSP_CPP_EXCEPTION_GUARD( + Result = self->Open( + FileName, + CreateOptions, + GrantedAccess, + &FileNode, + &FileDesc, + FspFileSystemGetOpenFileInfo(FileInfo)); + ) + ((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext = (UINT64)(UINT_PTR)FileNode; + ((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2 = (UINT64)(UINT_PTR)FileDesc; + return Result; + } + static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + UINT32 FileAttributes, + BOOLEAN ReplaceFileAttributes, + UINT64 AllocationSize, + FSP_FSCTL_FILE_INFO *FileInfo) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->Overwrite( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + FileAttributes, + ReplaceFileAttributes, + AllocationSize, + FileInfo); + ) + } + static VOID Cleanup(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PWSTR FileName, + ULONG Flags) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD_VOID( + return self->Cleanup( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + FileName, + Flags); + ) + } + static VOID Close(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD_VOID( + return self->Close( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2); + ) + } + static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PVOID Buffer, + UINT64 Offset, + ULONG Length, + PULONG PBytesTransferred) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->Read( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + Buffer, + Offset, + Length, + PBytesTransferred); + ) + } + static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PVOID Buffer, + UINT64 Offset, + ULONG Length, + BOOLEAN WriteToEndOfFile, + BOOLEAN ConstrainedIo, + PULONG PBytesTransferred, + FSP_FSCTL_FILE_INFO *FileInfo) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->Write( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + Buffer, + Offset, + Length, + WriteToEndOfFile, + ConstrainedIo, + PBytesTransferred, + FileInfo); + ) + } + static NTSTATUS Flush(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + FSP_FSCTL_FILE_INFO *FileInfo) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->Flush( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + FileInfo); + ) + } + static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + FSP_FSCTL_FILE_INFO *FileInfo) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->GetFileInfo( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + FileInfo); + ) + } + static NTSTATUS SetBasicInfo(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + UINT32 FileAttributes, + UINT64 CreationTime, + UINT64 LastAccessTime, + UINT64 LastWriteTime, + UINT64 ChangeTime, + FSP_FSCTL_FILE_INFO *FileInfo) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->SetBasicInfo( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + FileAttributes, + CreationTime, + LastAccessTime, + LastWriteTime, + ChangeTime, + FileInfo); + ) + } + static NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + UINT64 NewSize, + BOOLEAN SetAllocationSize, + FSP_FSCTL_FILE_INFO *FileInfo) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->SetFileSize( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + NewSize, + SetAllocationSize, + FileInfo); + ) + } + static NTSTATUS CanDelete(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PWSTR FileName) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->CanDelete( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + FileName); + ) + } + static NTSTATUS Rename(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PWSTR FileName, + PWSTR NewFileName, + BOOLEAN ReplaceIfExists) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->Rename( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + FileName, + NewFileName, + ReplaceIfExists); + ) + } + static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PSECURITY_DESCRIPTOR SecurityDescriptor, + SIZE_T *PSecurityDescriptorSize) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->GetSecurity( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + SecurityDescriptor, + PSecurityDescriptorSize); + ) + } + static NTSTATUS SetSecurity(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + SECURITY_INFORMATION SecurityInformation, + PSECURITY_DESCRIPTOR ModificationDescriptor) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->SetSecurity( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + SecurityInformation, + ModificationDescriptor); + ) + } + static NTSTATUS ReadDirectory(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PWSTR Pattern, + PWSTR Marker, + PVOID Buffer, + ULONG Length, + PULONG PBytesTransferred) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->ReadDirectory( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + Pattern, + Marker, + Buffer, + Length, + PBytesTransferred); + ) + } + static NTSTATUS ResolveReparsePoints(FSP_FILE_SYSTEM *FileSystem0, + PWSTR FileName, + UINT32 ReparsePointIndex, + BOOLEAN ResolveLastPathComponent, + PIO_STATUS_BLOCK PIoStatus, + PVOID Buffer, + PSIZE_T PSize) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->ResolveReparsePoints( + FileName, + ReparsePointIndex, + ResolveLastPathComponent, + PIoStatus, + Buffer, + PSize); + ) + } + static NTSTATUS GetReparsePoint(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PWSTR FileName, + PVOID Buffer, + PSIZE_T PSize) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->GetReparsePoint( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + FileName, + Buffer, + PSize); + ) + } + static NTSTATUS SetReparsePoint(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PWSTR FileName, + PVOID Buffer, + SIZE_T Size) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->SetReparsePoint( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + FileName, + Buffer, + Size); + ) + } + static NTSTATUS DeleteReparsePoint(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PWSTR FileName, + PVOID Buffer, + SIZE_T Size) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->DeleteReparsePoint( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + FileName, + Buffer, + Size); + ) + } + static NTSTATUS GetStreamInfo(FSP_FILE_SYSTEM *FileSystem0, + PVOID FullContext, + PVOID Buffer, + ULONG Length, + PULONG PBytesTransferred) + { + FileSystemBase *self = (FileSystemBase *)FileSystem0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->GetStreamInfo( + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext, + (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2, + Buffer, + Length, + PBytesTransferred); + ) + } + static FSP_FILE_SYSTEM_INTERFACE *Interface() + { + static FSP_FILE_SYSTEM_INTERFACE _Interface = + { + GetVolumeInfo, + SetVolumeLabel_, + GetSecurityByName, + Create, + Open, + Overwrite, + Cleanup, + Close, + Read, + Write, + Flush, + GetFileInfo, + SetBasicInfo, + SetFileSize, + CanDelete, + Rename, + GetSecurity, + SetSecurity, + ReadDirectory, + ResolveReparsePoints, + GetReparsePoint, + SetReparsePoint, + DeleteReparsePoint, + GetStreamInfo, + }; + return &_Interface; + } + +private: + /* disallow copy and assignment */ + FileSystemHost(const FileSystemHost &); + FileSystemHost &operator=(const FileSystemHost &); + +private: + FSP_FSCTL_VOLUME_PARAMS _VolumeParams; + FSP_FILE_SYSTEM *_FileSystemPtr; + FileSystemBase *_FileSystem; +}; + +class Service +{ +public: + /* ctor/dtor */ + Service(PWSTR ServiceName) : _Service(0) + { + Initialize(); + FspServiceCreate(ServiceName, OnStart, OnStop, 0, &_Service); + if (0 != _Service) + _Service->UserContext = this; + } + virtual ~Service() + { + if (0 != _Service) + FspServiceDelete(_Service); + } + + /* control */ + ULONG Run() + { + if (0 == _Service) + { + FspServiceLog(EVENTLOG_ERROR_TYPE, + L"The service cannot be created (Status=%lx).", + STATUS_INSUFFICIENT_RESOURCES); + return FspWin32FromNtStatus(STATUS_INSUFFICIENT_RESOURCES); + } + FspServiceAllowConsoleMode(_Service); + NTSTATUS Result = FspServiceLoop(_Service); + ULONG ExitCode = FspServiceGetExitCode(_Service); + if (!NT_SUCCESS(Result)) + { + FspServiceLog(EVENTLOG_ERROR_TYPE, + L"The service has failed to run (Status=%lx).", + Result); + return FspWin32FromNtStatus(Result); + } + return ExitCode; + } + VOID Stop() + { + if (0 == _Service) + return; + FspServiceStop(_Service); + } + VOID RequestTime(ULONG Time) + { + if (0 == _Service) + return; + FspServiceRequestTime(_Service, Time); + } + ULONG GetExitCode() + { + return 0 != _Service ? FspServiceGetExitCode(_Service) : ERROR_NO_SYSTEM_RESOURCES; + } + VOID SetExitCode(ULONG ExitCode) + { + if (0 == _Service) + return; + FspServiceSetExitCode(_Service, ExitCode); + } + FSP_SERVICE *ServiceHandle() + { + return _Service; + } + static VOID Log(ULONG Type, PWSTR Format, ...) + { + va_list ap; + va_start(ap, Format); + FspServiceLogV(Type, Format, ap); + va_end(ap); + } + static VOID LogV(ULONG Type, PWSTR Format, va_list ap) + { + FspServiceLogV(Type, Format, ap); + } + +protected: + /* start/stop */ + virtual NTSTATUS ExceptionHandler() + { + return 0xE06D7363/*STATUS_CPP_EH_EXCEPTION*/; + } + virtual NTSTATUS OnStart(ULONG Argc, PWSTR *Argv) + { + return STATUS_SUCCESS; + } + virtual NTSTATUS OnStop() + { + return STATUS_SUCCESS; + } + +private: + /* callbacks */ + static NTSTATUS OnStart(FSP_SERVICE *Service0, ULONG Argc, PWSTR *Argv) + { + Service *self = (Service *)Service0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->OnStart(Argc, Argv); + ) + } + static NTSTATUS OnStop(FSP_SERVICE *Service0) + { + Service *self = (Service *)Service0->UserContext; + FSP_CPP_EXCEPTION_GUARD( + return self->OnStop(); + ) + } + +private: + /* disallow copy and assignment */ + Service(const Service &); + Service &operator=(const Service &); + +private: + FSP_SERVICE *_Service; +}; + +} + +#undef FSP_CPP_EXCEPTION_GUARD +#undef FSP_CPP_EXCEPTION_GUARD_VOID + +#endif diff --git a/3rd_party/winfsp-1.10/lib/fuse.pc b/3rd_party/winfsp-1.10/lib/fuse.pc new file mode 100644 index 00000000..e61267a1 --- /dev/null +++ b/3rd_party/winfsp-1.10/lib/fuse.pc @@ -0,0 +1,11 @@ +arch=x64 +prefix=${pcfiledir}/.. +incdir=${prefix}/inc/fuse +implib=${prefix}/bin/winfsp-${arch}.dll + +Name: fuse +Description: WinFsp FUSE compatible API +Version: 2.8 +URL: http://www.secfs.net/winfsp/ +Libs: "${implib}" +Cflags: -I"${incdir}" diff --git a/3rd_party/winfsp-1.10/lib/fuse3.pc b/3rd_party/winfsp-1.10/lib/fuse3.pc new file mode 100644 index 00000000..967ce40c --- /dev/null +++ b/3rd_party/winfsp-1.10/lib/fuse3.pc @@ -0,0 +1,11 @@ +arch=x64 +prefix=${pcfiledir}/.. +incdir=${prefix}/inc/fuse3 +implib=${prefix}/bin/winfsp-${arch}.dll + +Name: fuse3 +Description: WinFsp FUSE3 compatible API +Version: 3.2 +URL: http://www.secfs.net/winfsp/ +Libs: "${implib}" +Cflags: -I"${incdir}" diff --git a/3rd_party/winfsp-1.10/lib/winfsp-x64.lib b/3rd_party/winfsp-1.10/lib/winfsp-x64.lib new file mode 100644 index 0000000000000000000000000000000000000000..a2af257de5799509e2fc76d4ebdf54d6256012d0 GIT binary patch literal 52896 zcmd^Id6-niwLhXpW0VjzhKS;bxFe3h04^aQFoLo?5phQ}sE7)Rh=_pf;0hw5h!~$5B?Om;@Xo2ab#GPOb9EFzQgT0b*g@~ zoI17F9DiO#va+_zA!inu|IRqebSqb}^W&^`ojP?Ezpp$5V87P@s;&U2o&->{8Xz@O z(v5oni2i=9r1~NNqWC6<68I%LK+=<+0T4a$sH8`a1R$EBXbk>FdJ@AB%^W1@k;wo= zGj>RNbSH)*8Y}7X3jqYp$1l=jh%aaeevzIimNa)N0MUyWH_^h*l3rT?Kr|oYB%1fF zLzu65L`@~lJq^Pny|hr$D_sDHUVcZ?!r2%f()^Z^UMfR5r1|3{ySpY#@@r$(l6o;_9mLn}&D`~~mD3A2~B1!*<0SE&85@DK& zp6?@Rb}azWvwIxEGJF>4xls;%i(jN?u`Y;aZp~Eg?L?$I`$@V3F^DEL zk#yHY070$si*(0eNwK+p*M zBGqA9h@vYc4Lub3NOk8(x((}wXgt;d(QT!YCSW=RorGVc+d%?0HXTok`h;{*=?v`}Td;p?RSbjv; z^pbQH=85RWgCz|w0wB8SYKL~=7pbA8q+4PDMB{2D-SP#xk%m7mDcuIk2Wdnrhfrrn zAdMXBP*eOOHB6UuQxl9I>DH*Eao=LRNMn&lbn^~}M&K7I)lpJ%5tcjBjWrve58ItU8rAV?@Ue z5DN9Xq)#8e42<@Kq)2(MOZr_D>d~#d8Jp(G1Pzh0a79%PF>zv6JkfAPDwjl+Vd@!4BR0%yG>24iVn#gODu>l$ zG35|dfF#D&vmqQy_legG@=DlaY5sn1hf|$OgsSUP;r5~WSY5n6mIgmZR-VVV<)qt| zstTvl$@oYuKE<&mW8vYN6uB6QQ2Sz2h#0n9VrWf6IGKvXW16hSwB`N6iepPwBofh) zp~`qH7Q)sN55*Jdl!n22+i@f+lBsZT9IUq;M@=|QF{HyI^qSJSc8KtZh%PFewoEi0 zPlW1pF~tdx47EQ?%e^B^OitdC^vgsBhib#ogf6F8c6@aekyt1hu83;F9?y{$`b=e# z3a6wp_&B;`CARrksIsE6HVm>Y=p0=#mBw-sp7n`Px)#$><%HmT%#amHtT{sR2W7nU zu(5bLQav)1h(|HkA}2aWmyE<3Dx#69igY-Xs7Tj3(l*x&kq#%5^@(&?EVUl60(}j67Hx{Unlj-sfYHoRtkA;T`C!_i#LQrsYp$%A{wf# zh*d?=z&Uvi@YKVns1>k*IUhY_RRu!FBBNBB@Z7r8;QDH;-2|F>k#W~)%cQ)BNJcny z8B%VUyO1hs86)Figwrg(NP*wl3%0WBGE(KzV`5FX6lcBku&n8J($5)vC#=)=hGOYd zx*}bl3RNfLbs=nhvAApASWhdwZvIs_9nzVWyfhyggfK9cT@F#JB&(oO>A0=9WHZ)f z?0DSzR6>ej#iS1dLRyPb!6K;;wJYp-_5M9%vaL8(vv)J07?zwlqzM_;K;bK;apO`9 zCoa@8QRsT7V=y#1-GGyxgmi``=b3KNz;NuL47@633ap!K5u47?Vlz!RrOju-4Yd(* zF?!@BSfk(EW9Ox(a#;SJr(On1sYIHULkp>lwXRvB>`bll zv$Qxo6D?3YrzR6%lSP04KP@z8ltoa^Lks5_XPJN3c55<>B^AO9Uk@eiS6x*!5|dp4 z4lTqu)?sO~s&R>El|%FQI$X1bQK75GB*H3(78aX*sIDSiDF-!V1sta(Q&CkVJj1EV zii9($5e(ad4=0t2Vt3?q9V2#iG8_(7Bx__JEMoRpR-BPoDvYB(l=h<4c$PE)8ls9} z$%*3kB9u-?M%gN}%lB-!#kWGK2IpEh#bD&TI7vvAlEU|zh8vg1vSKsU$(1+RRv54P zU3rhi$l8@}gt9$@!+V)#G(_dy(h{D{U}&0QBv0crp_GysK@^jbceF=Om1LEs5`8M_ zW0kdK;hIuZ^0IJcJXz&bY=EcEz95_q4C49eAqHj$;rY2CFp_>1b>TjdRN79J?xoB3 z#;H0ZE7-2wK%CUsLV~AB;0&$j2)~eIn{uoat&z#n?OqX$%3tB+fJh?jkCu@L3~hti zVF|Y{E$fttd4wmfGnEXMxg|gx^p$IR1H+Z|$w+!+4>YaGNCH>)Jn29Q42_Xw3d(z9 zxb8T;PKPrE4V1vp-6|__^54BSTsc%PVv~(>s5-QGc|kZ9PDU#G;!r;ltMM|%dtggqBoqjRT3-L-*mFeh!WVkvSsj1a6Xz`UKmg}H+wBBycLfZ6GA^Pc)6pN{x z)NIwNpvlu+UQPs@YU{#Lo~($aDk|*^xNH?q--@AO(T1wR4OV=Hmy(yNDzj|K8(t*u zuBCUYs*<@j?O2e29kyqMhNMS|9)@hs7*<3Q8yg=&_cp>|`Ua-4mDXiQpC(|0?OqWp z3n!u#mDtgU4ro9eXDwWU10;>uuocFm4MtQcE-qHih^aIZtIC!lpNtU$mI|)vXDAZo zYlP~bxVS!?9O)HT5=Xl<(UpC8ZnBn?W?K1ZbO9@@OpRmm`Ov0_6~0HfAyOIcj!V_a zc$5!sidf-2CC?a#U(AX}B+}hu;S*xXSTSHB$#zRsnz2?`Nh>yim1BGXvQ~_U%D3D8 z)b-kJ-O;n45CYO41|!NP_qvRgN)fT{AFS89lod;9v_4fU_Y~Ro-9KSSSfMY);fvN$ zd%DvF&|EJ`B)fmtH=3u^GSvbeB5?rk(De=#Mkw;la7^ylpHo zmI{E9epZM+;fjWUvXWkwd{5do-~ptUB~SegnzsSTIE~YKSC#T%{bEKuy;J=Yj!1Xh zw;dRcr6TD_Lzs;%SlEaYbzP06*k}xYU&u%bcV2KODT!T8eKZ{ygHO(g35P&Ed=iW% zvT{aDm|C}pf)b+%1ctq!z9LDzJ&qD;MrMu3lFl4!Zn2e`Z9yoZmT;zUY!M?BLMbzc zw?&NbV(=%%ENt?1ZzG&<80!wq93MuyXN)yNG5~opVa^ZNMA*TD3?;pdaHvaec~GBA zTg*(Ua$-h2*a&e1WzUK{b7=URA#wQbsXYfyV|7i!3XRio&67#{z_cl1gqKrfui`j- zpNtU$wly!fKI_yoZ;Awm=im(hv)1JdoD1am7)Wx?!AUzlhBP;=bJf=K#4wjeV(r_N z;x1OdG?q1PX?YNSFO*ke6hsJk@_sLrAAq~s-Q#tGX)W5VU!Cd548&tc5pBVSL>!(Y zLCLly93Dyx3@2&$YM!jonTCv)6iQHeeioKaHkm>7% z5>r{XTpV~czjf25FL&uoFCJ{;J#qK1d%Vhzt^0W)P%{HV=zd;^vhXlk3Mr4&`7v}q zF9faKBrs9dl)}k^>8pi`M&rXV5Ka(r#?EA@n=RmlwHuWK<+Uh>VK*m}?ZsDCAJff( zBPO{hHOM);! zFt}J)DJ>TNdL>2}PS!=lNhHl4s$^vg;Km(J)`Yc~%H#f!R@L;)C5Rh8mZO)>Tw>22 z0OOWbX{}UJB|7VrZZSlv%Hx;l3z|M3Eu|=kDdePGpMAI`(plXS`2+y2sKWE-)p+*4 z2JaW70QTI7=d1q?P*e}FDUN5ikq$um>`A=0@dUt;cn8F=;@DS^B}cs6_TBLF+l zy%YV$B3+1QpywlPdJNC{A{Aq}sdG{OMS#u=@m>VpP1%WOu)m#$SV&EgPDB5NF9CFU z1>l{R@ytESwM3aRwjCas}d`yA{fGSdDo@_p@&SbVWL4 zIi?F~En;1b{6){>*=2D_0prGRA9UBw#yWTw(}*Zjqwx1etj0Y&i@5BiJCn3>=fc41x;#REJVE`W_@IFr(?~dT_E=fF_KNin- zqpnIKr2$ru;Xln3#P^u<&x zlWCa$hcF$}F~9ixa{S$Zzjxh_=|KP04`3TY`U-h-v8<26vYv)zeegY~KS*Pcez+I) zVhUp4hwXvFp_|UGH$h$l(rf$S-2-?J-i1*x21diRa1C4!H^6l;0zQUA;MZ_4+y%G6 zc&v;&;5AqP2f%EY00+TDyyNl`%!KFQd6)w)!VB;yJOYoyJun0Ah3W7FJO=l{1MnbB zhDmTgJPcD|8r%(2;30St7Q%t>D|iL>_n(JPohHe3%8#!ZYwP%!6Cu?=TL=!i{h< z+yuA4)ld&$4TnNg_$?d( z&EPliJ2(%{g>#@Ybb-N80hQ1d{sd=3Cl~^F+5&1J0$~^mRd6Nz8M;9U6vJ6?44et4 zLTfkyT0ko}9*W>}I0;UKHgF1@2FF21Xb12a3l~CfxB$+FQs@ai zpg;71i(mj;3jLrLbcZY8Z}3;R9R3Ub0wK5r%Hd)tgF$c^{NK;P{xk~oZJ7p+7g-M+ zL}4Uygv^Xs#1KJlrIMVx@@8ywI`aWtz+GX`0-5`oIPGwDE_D&LJ1T}C{vB;0str%n zZ3==`zXy@So6-m0&d_AMJs~q}Rh7NiZf^S7(%$}%nTT9A$+)S#H z2w3^&w-DH+`;7Z)>|(rE_iA=+6l>;P6?Quya3@0S1G&0oYL&M)Wx@M4k2rs2T-Z3h zcB6LixG4Pla+Vag??cNQ)`q&+dCRbkg+YQ+i(Xk%!ERP%*(ouW>Ad=;47s(zwe(zW z#ARL;#g^*dn>Wfe!-}xJ7h{FVW(=?-y{2j^h2bSTD6dG+(_II*TDa~dwm7o+dmAQZ z;xny7Gi%&*wnkcSsT(3U#6*K9IpS0tVGx%+fudO_^QevrrPc}ELovlJjDGwDA*rma z15+3Yf4+_4;C*DdOFxX1nu{ll4EL~~8-sZ=QD>vLbNEo_Vs+VEu>;`22&bM9RR}_J zoI`UMrEp?&6f*0=G|JHGk++&mE^YOhUsa<}(#N;N6}(VJ%UW3$ZB)EDtbi$->NJMI&ZW;kKRu7U2v1$WQMuWh?)z)l>fYYe{9PW1KH6=7%###r*ct(bkg`|U1A zn==8I%?|s$rAXEr+ng6()CQ9wS3=DSyfBKx9gK93B%7x7(shx!ir=(?ug0p%~F_Hd~+2>2CayH#=^_FLk?#{kSpTg*$We= zJ%?dLyx|dhhQS#zFaf1cmLmoMrxv^!4ihnX2A`smR+|lG&Usi7IrCw?JPlOyA6_i$ z=`%SOVgq|KBG%iQ7X{1k?bn$)>2r?YD3qz?bZj5aq59`5EHq6uctq;#SgYilN3juW zy%bZ(ZOz$O5#w}{C*hmFnO@jUXtOxe z&zQ@ZUOxM5&g)EJF?95^?AsFVOwSd?#8Jsx^F7y_pWAtw$ouQ{YR&+yh!NeL2U=d{ zY|!tCK?5(Op@Q&!a(-wWhNroW5w?nWxXkoqzg#*jcD0mCIbz4dTqw z%o(ZA*FIQe3phi)fP-PyXvcxHhsX{amED~$+A!v<)%K;iE5p;KAr3?z@18F|o3&%% zPdj022u!JIq)^hY9bQ`1T-Sx=X1w(5ShaK6wS6elLmsYB6`o3?hpS|~Uf?i2q+~N| zwD*{7Klc?FpNChHUiAE3>-Hgs&poabbfvnzdA;7vng3CZ_VgSA`;u1nXG_|L{BNze zP}c2#m)~F-+VDkN<1B56}k1CgcGsxY=sp`#s@;U%jAS4h2vz=Za_UZ9GUP&3~>m+vt!ampLzmWN=5 zD$Qpj6jggG~Oif$}(DOs$#UecvF@0|miPyTEcfoXF@39SoYnly# zrJD@FV9bTfSMSE?k)pisiI(=pdoQ}Q_d1Mx{!90>jgf%WwclmnLvWh05p198ORlc> zf}<(DbZak{>4|Yv!F)~65b&OLGT8oCqIB;h|5%nTl49P&GW=-Qr9kQ(;$ypj?SwE8CRZ6h^8bxfMLIvm(vf0Omj0bbPtc#9H*&s@oWk!j` z>5Upc-k;f4_>N$0V^ti75(O5JLGM(%rl;&fT zo(_3IWe@DRNrMcR`Fbd8emr??SmQBOyY@JC$+^u}iO9xlxb*kbxN@>yGjqcVLv6V9 zlG56hD`OUkXj86VOg^RHxih^#r<#v=nn-omib-wCjYea-Ez0op+LOW7T9d(do_o?U zWlM6U%y#6mt-*xLx9iXyK+vO8L5eTD+(CnsbcYMlsSgw+$20Ga+Zh~4muxU1VnYdB zjxyX*+_Txzt-tQ3ILcD%?|ynsPDCtq$o=Vb^D+XhQ3(M@d&F#CKPzmt|et_p}GxlI^dT9-_sUTY?YTVtvN79w`#8J(_@ zaJpOJv};c9Vx@r5xeAtBZElAu*k+A6ov83p^`$ya$+W7@?G=45j)^8sd1jll^3a;H zV(HCT@th{CoKEv4r`2=?i&v1KZcpSZNIl%HPDrVG&h(1;@Q8W^y=_%AdS=lXS^la> zNpVN#?~7b{NY&W=;n*J!{_1c%uYNGde{HMig`n009Vea~#`_V<;e5M7v-8{1d%YE{ z+bORj@yA-E&m6}7`0WbC3mv(R4jWHF<2iZ6Q*y-b3PlT>;P>}zZ(-$-RLo{Cqei%uy!wWv?;eiun^^Z!H9NogU%n=j%QrQtyF%LKxd zRL1KPnB;l&`|Y=PuO14;fzsFnZ(hipcf|`X#Hm#rkw=N;$aEkX6!BzAJPz?sp#PkI z6c^z6aPMCeJdF)FHr==L4~?lc?Mm8fTGIq(ectQK`It7DX1tBUXib%u5%EjYn)b?z zv}T5KIA78liuae$hFt3RSi}zeg93+`8k4=fwL80=R&x8prPrOiZ3`k~D!B~ptptOL zf7D)8gK${T6}qbS))!0sdXtIlN znqYe`wQmBL6$qv?dwq6Pf1XLhn{njUwWlE7{t}NpIb;D@&Kz)=d@j49-}ciG_kawz zxMgK#(Q@X1teU=-*>(RX*?SC`87wp*8;JBC9&0! zDl1=*Ki1iPtnXKxxt{F7K_(U+-zqd`B^~@|(es|z(+bfJHqq3b^>5%W+B6OZ4S(Ob^!XdRihc;gZEyQnQ5rqBZJ2wBkiw-0&E7?sGg zv=feR^2srX-PFJ?JfB>1H{+PEm(tzl963aU;5^#Fb#LPdxC5)XrY&Yp{Cfsj zJEK}4GN)nh41M||(y*g!-UmE0rfnNgimc2KuC(PzH zrgIvhP|Qw@?XOxmbuCSb|Hxz72kERNn9dyZjA>IZw`;Y#4W{5|I|cR`V-qZY9cOai z=Dx{GX(ZgjkL?{^E)?jv7-of87~~f2<$hdY9D# z&%14PWUP1bd4so|h3GA9^b5Fy+y$qADgPyxw_Qu+e;ktn_pqWmB5ozXbY|E2PK?fX zUcLDzT7D_A@q^Evo3Qz7Ka+|T-P8Y~mUq0J3j0udq1a5z>-XT)J=F4A+1Pz)yW4s3 zuRvVRuHQFl~{uZ$5%&ui6jFyK+ox0{E z#66M6rJDmLjOE-n)FA@~yiKSl*{I%?ghEl7dDDA?4_Zs}rjt2Ty6aFVCNr~NGj;RA z6A|+i2D5QS2_2bMdtqYf&(vy9^`n~CGYZWyQ_AyZp0<@r`7}Say!TNcW=BSg-*|2J zn`Em`_hWi<4|SoWP<&>-T5|d8+iAYqhQZfws#wr@TMlkDpm`+zE|vEger$OM#sW2+ z+1oF-I(R^NVj)?pwth_Sa*YXOHLe_RnK8+@(r-SYG0B;JT8h(Nt(ExKT;dRX6RWQAvqE6=igv zt6)sVmX~guxS4EAM?dC3aZ}6!HJ#b(yd%@bpD2H5IkoXlEM}u>JF}MZ@6-BjqZN(L zEPA8qI*WNpK(u&5}Eb=d)V@!P)&n;d@^?i;%4e~yoS;3ah_1)_2zmXEGKc?sqEPc|yGq#SS`jm2A%3!;zS*2Ds zEoTn7X2!2A=l$t_X#9FXCS>PoaG~|xi5X9v+U%;Ooe;lQR($V?s6x}hjiaAmu!!bXW z?xB78ei|mfOqn+tqerie|MjZl5v{+57C21GdyLS58y$|i>nqx|9-twLyQyY&^0rhR zn7(OivzcGhDUORRtYRzneb5%hBA28)eqV%WWg41$=fA+*acee5e|^t7TC*7_@vu2C zj|mit%Z+k6z4|SUHOeI}{|Z6DCCr^7X>;un|0Jt-NhV}}cbm7~a_9A0oG|yzBE%k~ zV`G^&#!fu93Rr#i+Y8C|Tx#LDPc{@-v)s(-n13AoJ8SEy3@ekSGl#x} zu}FJQxnofgqFwGo^EZ-w@i=>1S-JarvbX^GxmM3w@g|7_w1&NsVuLMXkw`E zJQ8BTna=EG$(`&v=*dan)5)%ohK9OQc+Qv+*2q_GTTN~MN{Quv*Tl?_m4@v3D`86W zvUqd@m1c#+)E`VK5RKE6#r?OxN18I&LvvnYvB2_f>m1tPgAWjTS?QrUZ@d(W){*HS z|FY!kt<*nOIcWUrF@+*?XLBDOv2Y`uR0|u(?wh9;r0LAAHC$dN>>n5F4%Hf>|G^s* zDgV~ri5W-sYxvuSb1<(p8gdR#=~ziIojH^N(~}(bW%I=}AFj1h!oAUB;x$f5>~~Pb z8Y+p1iLaKngI@o!l43fumjt(?(fZAs-=iIkAy!J%gSI9{{<-HcKddhOfG~%enC^o` zg<^JOYW$J)&EKRNkD8d5%0J{~{*|jj@jElN`l<3SKRyrf>va5F9$B&yV>)xFb7qcp z`K}oo=~Qk^riFdI$;8RO-nlcff1AJQJ6ivWo4EG7P!_c5%pu2& zgHt9<{{1sEmb>Nj@TMX}9cH4kM@~%m9CFFvE!um>dcsQ@c>JN%yz!VeweYg-AJKR` zW#Hi)pr`t4i6%<^TEv|xuUc^7TGHOMfoi_$RVXeuB01>6GuP4hr{2J&_reNAN`^;>tCnBuj$Lh-n9&c9kb{1uIJ?lkb|8I?lOxHbASPu%r$5u#1B(ddmT3($0C zuR+eX9`@wWHDp`wGVs`kdrUYhG1<|%-sGCj8}^XSPBPKG=lu%BWLoC7Qf)?z7SG{WLQ-`(SYx%X<3Q`i-QeQ*^ux9i*9t>?O+W zW9>cq^si}#e!q@szEx|&SUJy*%GKlh6|j)%ajK3go|v-0@~=lmOMla{tC*iZV52cz zq=}zBcih_Yv~DM@r!mJg9WSu6${Udxb6nc`#rJ8<@t}dobyfMIapw|R?cTkc&LvFO z(U^`ZU#t?Q4ZeEGQ#+{*K4f6YmjliC^KXOPNu^EGCWwC8cInD&3f zgmoWL`+r2oR_~wD3uz{Z<=i*SMF(#AgfJiFFzFGt0x`KVE?af@7CH^~SOBK`Y-54g zoW1+HZu%0kcaPiH-cxdgqB1MLzdd@;R$4oI!ba6ztFvJ9w|va(XWsJ2>tu;$*tqgV zJPXov=Acgu;;l_LEhWS!ZAAI#o(W+oR}P5G8uK6jeCjr;(V04;`L17~s7#Gct^H{W z)#y_?s`cWh1)G13GJV;kQ7t|%Lfofy+<-x)iJwF1GI%2o-?@qK{-NUq3@P))9=QGb;Wk-w`aSE-ea_d;&CI&{^R1yKjT!&)iNd12?4mZ-x+k|caPFKzA5)un#Y1b1HBY8bx^m26ZxtcZd;`gO zN!lt%)0smXWNg_7b1vRM`uVDh7dV;Ay9ILR=N`Le?}v1LZh?o#P37{(VpdiMyuW+f z9}(*{7mJz5<&DJcZ*(3sWD~Wzg&vaj8njtY`P&t4EU|p(?9XT{@w$uni>x;?8hT6H z-fM~wd69?QXlsq!eqd_$&MmYb_=bn)f5qA=V$+$uWpFdO7kf`$Ni(^{E^fdp>Lys; zBPi}X-E;r`ua;joWCr}e?NT(p2GN8V`MKIrzX zZI{tle7S?By}@r4rRmIGhurE}i{U%g(CXO=7mXjN=8eTz_t_n~d_>lLrNZKdsd<+n z*Ju5w=lo^VXRXqa8e^TDv98mfJ?5Jt#9FPeG7O3HEk$mx?40m~RfM-j#|sz`=Z(jV z+uphEfuBhq*J^nDa5!%?rZitU_w41AyLAdJ!(cdXJjRBd86UNUMpNrOJT(-y`i1;0 z7q=R}7d@VsI8~(tq~$3D@~8fSNcsli)L z-2cC+20vA3zxd9?36J)9k9H=ux`?|bW8>VH31xB-)*#=xpO_N*O*wOwHaOo{#%cG3|t literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/lib/winfsp-x86.lib b/3rd_party/winfsp-1.10/lib/winfsp-x86.lib new file mode 100644 index 0000000000000000000000000000000000000000..89a875d430be5b0d3609757440642e81b3b8bcc1 GIT binary patch literal 54030 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 literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/samples/airfs/airfs.cpp b/3rd_party/winfsp-1.10/samples/airfs/airfs.cpp new file mode 100644 index 00000000..0e8f0b69 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/airfs/airfs.cpp @@ -0,0 +1,1448 @@ +/** + * @file airfs.cpp + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ +/* + * Airfs is based on Memfs with changes contributed by John Oberschelp. + * The contributed changes are under joint copyright by Bill Zissimopoulos + * and John Oberschelp per the Contributor Agreement found at the + * root of this project. + */ + +#include "common.h" + +enum +{ + AirfsDisk = 0x00000000, + AirfsNet = 0x00000001, + AirfsDeviceMask = 0x0000000f, + AirfsCaseInsensitive = 0x80000000, + AirfsFlushAndPurgeOnCleanup = 0x40000000, +}; + +////////////////////////////////////////////////////////////////////// + +NTSTATUS CreateNode(AIRFS_ Airfs, PWSTR Name, NODE_ *PNode) +{ + static UINT64 IndexNumber = 1; + + NODE_ Node = (NODE_) StorageAllocate(Airfs, sizeof NODE); + + if (!Node) + { + *PNode = 0; + return STATUS_INSUFFICIENT_RESOURCES; + } + + memset(Node, 0, sizeof NODE); + + size_t NameNumBytes = (wcslen(Name)+1) * sizeof WCHAR; + WCHAR* NameAllocation = (WCHAR*) StorageAllocate(Airfs, NameNumBytes); + if (!NameAllocation) + { + StorageFree(Airfs, Node); + *PNode = 0; + return STATUS_INSUFFICIENT_RESOURCES; + } + memcpy(NameAllocation, Name, NameNumBytes); + Node->Name = NameAllocation; + + Node->FileInfo.CreationTime = + Node->FileInfo.LastAccessTime = + Node->FileInfo.LastWriteTime = + Node->FileInfo.ChangeTime = SystemTime(); + Node->FileInfo.IndexNumber = IndexNumber++; + + *PNode = Node; + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +void DeleteNode(AIRFS_ Airfs, NODE_ Node) +{ + NODE_ Block; + while (Block = Node->FileBlocks) + { + Detach(Node->FileBlocks, Block); + StorageFree(Airfs, Block); + } + + StorageFree(Airfs, Node->Name); + StorageFree(Airfs, Node->ReparseData); + StorageFree(Airfs, Node->SecurityDescriptor); + StorageFree(Airfs, Node); +} + +////////////////////////////////////////////////////////////////////// + +inline void ReferenceNode(NODE_ Node) +{ + InterlockedIncrement(&Node->RefCount); +} + +////////////////////////////////////////////////////////////////////// + +inline void DereferenceNode(AIRFS_ Airfs, NODE_ Node) +{ + if (InterlockedDecrement(&Node->RefCount) == 0) + DeleteNode(Airfs, Node); +} + +////////////////////////////////////////////////////////////////////// + +void GetFileInfo(NODE_ Node, FSP_FSCTL_FILE_INFO *FileInfo) +{ + if (Node->IsAStream) + { + *FileInfo = Node->Parent->FileInfo; + FileInfo->FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY; + // Named streams cannot be directories. + FileInfo->AllocationSize = Node->FileInfo.AllocationSize; + FileInfo->FileSize = Node->FileInfo.FileSize; + } + else + *FileInfo = Node->FileInfo; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS FindNode(AIRFS_ Airfs, PWSTR Name, PWSTR *BaseName, NODE_ *PParent, NODE_ *PNode) +{ + CompareFunction* NodeCmp = Airfs->CaseInsensitive ? CaselessNameCmp : ExactNameCmp; + + // Special case root. + if (Name[0] == 0 || Name[1] == 0) + { + if (BaseName) *BaseName = Name; + if (PParent) *PParent = Airfs->Root; + *PNode = Airfs->Root; + return 0; + } + + WCHAR ParsedName[AIRFS_MAX_PATH]; + wcscpy_s(ParsedName, sizeof ParsedName / sizeof WCHAR, Name); + + // From root, for each ancestor... + NODE_ Ancestor = Airfs->Root; + WCHAR* fm; + WCHAR* to = ParsedName; + WCHAR* Colon = 0; + for (;;) + { + // Isolate the next base name. + for (fm = to+1; *fm == L'\\'; fm++) {} + for (to = fm; *to != L'\0' && *to != L'\\'; to++) + if (*to == ':') {Colon = to; break;} + if (*to == 0) break; + *to = 0; + + // Find this name. + NODE_ Child = Find(Ancestor->Children, fm, NodeCmp); + if (!Child) + { + if (PParent) *PParent = 0; + *PNode = 0; + if (Colon) return STATUS_OBJECT_NAME_NOT_FOUND; + return STATUS_OBJECT_PATH_NOT_FOUND; + } + + Ancestor = Child; + + if (Colon) + { + fm = to+1; + break; + } + + if (!(Ancestor->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + if (PParent) *PParent = 0; + *PNode = 0; + return STATUS_NOT_A_DIRECTORY; + } + } + + if (BaseName) + *BaseName = Name + ( ( (UINT_PTR)fm - (UINT_PTR)ParsedName ) / sizeof WCHAR); + + if (PParent) + *PParent = Ancestor; + + if (Colon) + { + // Find the stream, if it exists. + if (!Ancestor->Streams) + { + *PNode = 0; + return STATUS_OBJECT_NAME_NOT_FOUND; + } + NODE_ Stream = Find(Ancestor->Streams, fm, NodeCmp); + if (!Stream) + { + *PNode = 0; + return STATUS_OBJECT_NAME_NOT_FOUND; + } + *PNode = Stream; + return 0; + } + + // Find the directory entry, if it exists. + NODE_ Found = Find(Ancestor->Children, fm, NodeCmp); + if (!Found) + { + *PNode = 0; + return STATUS_OBJECT_NAME_NOT_FOUND; + } + *PNode = Found; + return 0; +} + +////////////////////////////////////////////////////////////////////// + +BOOLEAN AddStreamInfo(NODE_ Node, PWSTR StreamName, PVOID Buffer, ULONG Length, PULONG PBytesTransferred) +{ + UINT8 StreamInfoBuf[sizeof FSP_FSCTL_STREAM_INFO + AIRFS_MAX_PATH * sizeof WCHAR]; + FSP_FSCTL_STREAM_INFO *StreamInfo = (FSP_FSCTL_STREAM_INFO *)StreamInfoBuf; + + StreamInfo->Size = (UINT16)(sizeof FSP_FSCTL_STREAM_INFO + wcslen(StreamName) * sizeof WCHAR); + StreamInfo->StreamSize = Node->FileInfo.FileSize; + StreamInfo->StreamAllocationSize = Node->FileInfo.AllocationSize; + memcpy(StreamInfo->StreamNameBuf, StreamName, StreamInfo->Size - sizeof FSP_FSCTL_STREAM_INFO); + + return FspFileSystemAddStreamInfo(StreamInfo, Buffer, Length, PBytesTransferred); +} + +////////////////////////////////////////////////////////////////////// + +inline void TouchNode(NODE_ Node) +{ + Node->FileInfo.LastAccessTime = + Node->FileInfo.LastWriteTime = + Node->FileInfo.ChangeTime = SystemTime(); +} + +////////////////////////////////////////////////////////////////////// + +void InsertNode(AIRFS_ Airfs, NODE_ Parent, NODE_ Node) +{ + CompareFunction* NodeCmp = Airfs->CaseInsensitive ? CaselessNameCmp : ExactNameCmp; + + WCHAR* key = Node->Name; + if (Node->IsAStream) Attach(Parent->Streams , Node, NodeCmp, key); + else Attach(Parent->Children , Node, NodeCmp, key); + + Node->Parent = Parent; + ReferenceNode(Node); + TouchNode(Parent); +} + +////////////////////////////////////////////////////////////////////// + +void RemoveNode(AIRFS_ Airfs, NODE_ Node) +{ + NODE_ Parent = Node->Parent; + TouchNode(Parent); + + if (Node->IsAStream) + { + if (Parent->Streams) Detach(Parent->Streams, Node); + } + else + Detach(Parent->Children, Node); + + DereferenceNode(Airfs, Node); +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS GetReparsePointByName(FSP_FILE_SYSTEM *FileSystem, PVOID Context, + PWSTR Name, BOOLEAN IsDirectory, PVOID Buffer, PSIZE_T PSize) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node; + + NTSTATUS Result = FindNode(Airfs, Name, 0, 0, &Node); + + if (!Node) return STATUS_OBJECT_NAME_NOT_FOUND; + if (!(Node->FileInfo.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) return STATUS_NOT_A_REPARSE_POINT; + + if (Buffer) + { + if (Node->ReparseDataSize > *PSize) return STATUS_BUFFER_TOO_SMALL; + *PSize = Node->ReparseDataSize; + memcpy(Buffer, Node->ReparseData.Address(), Node->ReparseDataSize); + } + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS SetAllocSize(AIRFS_ Airfs, NODE_ Node, UINT64 RequestedAllocSize) +{ + NTSTATUS Result = StorageSetFileCapacity(Airfs, Node, RequestedAllocSize); + if (!Result) + { + Node->FileInfo.AllocationSize = RequestedAllocSize; + if (Node->FileInfo.FileSize > Node->FileInfo.AllocationSize) + Node->FileInfo.FileSize = Node->FileInfo.AllocationSize; + + } + return Result; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS SetFileSize(AIRFS_ Airfs, NODE_ Node, UINT64 RequestedFileSize) +{ + if (Node->FileInfo.FileSize != RequestedFileSize) + { + if (Node->FileInfo.AllocationSize < RequestedFileSize) + { + NTSTATUS Result = SetAllocSize(Airfs, Node, RequestedFileSize); + if (!NT_SUCCESS(Result)) + return Result; + } + + if (Node->FileInfo.FileSize < RequestedFileSize) + StorageAccessFile(ZERO, Node, Node->FileInfo.FileSize, RequestedFileSize - Node->FileInfo.FileSize, 0); + + Node->FileInfo.FileSize = RequestedFileSize; + } + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +BOOLEAN AddDirInfo(NODE_ Node, PWSTR Name, PVOID Buffer, ULONG Length, PULONG PBytesTransferred) +{ + size_t NameBytes = wcslen(Name) * sizeof WCHAR; + UINT8 DirInfoBuf[sizeof FSP_FSCTL_DIR_INFO + AIRFS_MAX_PATH * sizeof WCHAR]; + FSP_FSCTL_DIR_INFO *DirInfo = (FSP_FSCTL_DIR_INFO *)DirInfoBuf; + DirInfo->Size = (UINT16)(sizeof FSP_FSCTL_DIR_INFO + NameBytes); + DirInfo->FileInfo = Node->FileInfo; + memset(DirInfo->Padding, 0, sizeof DirInfo->Padding); + memcpy(DirInfo->FileNameBuf, Name, NameBytes + sizeof WCHAR); + + return FspFileSystemAddDirInfo(DirInfo, Buffer, Length, PBytesTransferred); +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiGetVolumeInfo(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_VOLUME_INFO *VolumeInfo) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + + VolumeInfo->TotalSize = Airfs->VolumeSize; + VolumeInfo->FreeSize = Airfs->FreeSize; + VolumeInfo->VolumeLabelLength = Airfs->VolumeLabelLength; + memcpy(VolumeInfo->VolumeLabel, Airfs->VolumeLabel, Airfs->VolumeLabelLength); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiSetVolumeLabel(FSP_FILE_SYSTEM *FileSystem, PWSTR VolumeLabel, + FSP_FSCTL_VOLUME_INFO *VolumeInfo) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + + Airfs->VolumeLabelLength = (UINT16)(wcslen(VolumeLabel) * sizeof WCHAR); + if (Airfs->VolumeLabelLength > sizeof Airfs->VolumeLabel) + Airfs->VolumeLabelLength = sizeof Airfs->VolumeLabel; + memcpy(Airfs->VolumeLabel, VolumeLabel, Airfs->VolumeLabelLength); + + VolumeInfo->TotalSize = Airfs->VolumeSize; + VolumeInfo->FreeSize = Airfs->FreeSize; + VolumeInfo->VolumeLabelLength = Airfs->VolumeLabelLength; + memcpy(VolumeInfo->VolumeLabel, Airfs->VolumeLabel, Airfs->VolumeLabelLength); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiGetSecurityByName(FSP_FILE_SYSTEM *FileSystem, PWSTR Name, PUINT32 PFileAttributes, + PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node; + NTSTATUS Result = FindNode(Airfs, Name, 0, 0, &Node); + if (!Node) + { + if (FspFileSystemFindReparsePoint(FileSystem, GetReparsePointByName, 0, + Name, PFileAttributes)) + { + return STATUS_REPARSE; + } + return Result; + } + + UINT32 FileAttributesMask = ~(UINT32)0; + if (Node->IsAStream) + { + FileAttributesMask = ~(UINT32)FILE_ATTRIBUTE_DIRECTORY; + Node = Node->Parent; + } + + if (PFileAttributes) + *PFileAttributes = Node->FileInfo.FileAttributes & FileAttributesMask; + + if (PSecurityDescriptorSize) + { + if (Node->SecurityDescriptorSize > *PSecurityDescriptorSize) + { + *PSecurityDescriptorSize = Node->SecurityDescriptorSize; + return STATUS_BUFFER_OVERFLOW; + } + + *PSecurityDescriptorSize = Node->SecurityDescriptorSize; + if (SecurityDescriptor) + memcpy(SecurityDescriptor, Node->SecurityDescriptor.Address(), Node->SecurityDescriptorSize); + } + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiCreate(FSP_FILE_SYSTEM *FileSystem, PWSTR Name, UINT32 CreateOptions, + UINT32 GrantedAccess, UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, + UINT64 AllocationSize, PVOID *PNode, FSP_FSCTL_FILE_INFO *FileInfo) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node; + NODE_ Parent; + NTSTATUS Result; + PWSTR BaseName; + + if (AIRFS_MAX_PATH <= wcslen(Name)) + return STATUS_OBJECT_NAME_INVALID; + + if (CreateOptions & FILE_DIRECTORY_FILE) + AllocationSize = 0; + + Result = FindNode(Airfs, Name, &BaseName, &Parent, &Node); + if (Node) return STATUS_OBJECT_NAME_COLLISION; + if (!Parent) return Result; + + Result = CreateNode(Airfs, BaseName, &Node); + if (!NT_SUCCESS(Result)) return Result; + + Node->IsAStream = BaseName[-1] == L':'; + + Node->FileInfo.FileAttributes = (FileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? + FileAttributes : FileAttributes | FILE_ATTRIBUTE_ARCHIVE; + + if (SecurityDescriptor) + { + Node->SecurityDescriptorSize = GetSecurityDescriptorLength(SecurityDescriptor); + Node->SecurityDescriptor = StorageAllocate(Airfs, (int)Node->SecurityDescriptorSize); + if (!Node->SecurityDescriptor) + { + DeleteNode(Airfs, Node); + return STATUS_INSUFFICIENT_RESOURCES; + } + memcpy(Node->SecurityDescriptor.Address(), SecurityDescriptor, Node->SecurityDescriptorSize); + } + + if (AllocationSize) + { + NTSTATUS Result = SetAllocSize(Airfs, Node, AllocationSize); + if (Result) + { + DeleteNode(Airfs, Node); + return Result; + } + } + + InsertNode(Airfs, Parent, Node); + ReferenceNode(Node); + *PNode = Node; + GetFileInfo(Node, FileInfo); + + if (Airfs->CaseInsensitive) + { + int ParentPathNumBytes = (int)( (char*)BaseName - (char*)Name ); + int NodeNameNumBytes = (int)( wcslen(Node->Name) * sizeof WCHAR ); + + FSP_FSCTL_OPEN_FILE_INFO *OpenFileInfo = FspFileSystemGetOpenFileInfo(FileInfo); + memcpy(OpenFileInfo->NormalizedName, Name, ParentPathNumBytes); + memcpy(OpenFileInfo->NormalizedName+ParentPathNumBytes / sizeof WCHAR, Node->Name, NodeNameNumBytes); + OpenFileInfo->NormalizedNameSize = ParentPathNumBytes + NodeNameNumBytes; + } + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiOpen(FSP_FILE_SYSTEM *FileSystem, PWSTR Name, UINT32 CreateOptions, + UINT32 GrantedAccess, PVOID *PNode, FSP_FSCTL_FILE_INFO *FileInfo) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node; + NTSTATUS Result; + + if (AIRFS_MAX_PATH <= wcslen(Name)) + return STATUS_OBJECT_NAME_INVALID; + + PWSTR baseName; + Result = FindNode(Airfs, Name, &baseName, 0, &Node); + if (Result) return Result; + if (!Node) + { + return STATUS_OBJECT_NAME_NOT_FOUND; + } + + ReferenceNode(Node); + *PNode = Node; + GetFileInfo(Node, FileInfo); + + if (Airfs->CaseInsensitive) + { + int ParentPathNumBytes = (int)( (char*)baseName - (char*)Name ); + int NodeNameNumBytes = (int)( wcslen(Node->Name) * sizeof WCHAR ); + + FSP_FSCTL_OPEN_FILE_INFO *OpenFileInfo = FspFileSystemGetOpenFileInfo(FileInfo); + memcpy(OpenFileInfo->NormalizedName, Name, ParentPathNumBytes); + memcpy(OpenFileInfo->NormalizedName+ParentPathNumBytes / sizeof WCHAR, Node->Name, NodeNameNumBytes); + OpenFileInfo->NormalizedNameSize = ParentPathNumBytes + NodeNameNumBytes; + } + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiOverwrite(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, UINT32 FileAttributes, + BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize, FSP_FSCTL_FILE_INFO *FileInfo) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node = (NODE_) Node0; + + for (NODE_ Stream = First(Node->Streams); Stream; ) + { + NODE_ NextStream = Next(Stream); + LONG RefCount = Stream->RefCount; + MemoryBarrier(); + if (RefCount <= 1) + { + RemoveNode(Airfs, Stream); + } + Stream = NextStream; + } + + NTSTATUS Result = SetAllocSize(Airfs, Node, AllocationSize); + if (!NT_SUCCESS(Result)) + return Result; + + if (ReplaceFileAttributes) Node->FileInfo.FileAttributes = FileAttributes | FILE_ATTRIBUTE_ARCHIVE; + else Node->FileInfo.FileAttributes |= FileAttributes | FILE_ATTRIBUTE_ARCHIVE; + + Node->FileInfo.FileSize = 0; + Node->FileInfo.LastAccessTime = + Node->FileInfo.LastWriteTime = + Node->FileInfo.ChangeTime = SystemTime(); + + GetFileInfo(Node, FileInfo); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +void ApiCleanup(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, PWSTR Name, ULONG Flags) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node = (NODE_) Node0; + + NODE_ MainNode = Node->IsAStream ? Node->Parent : Node; + + if (Flags & FspCleanupSetArchiveBit) + { + if (!(MainNode->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + MainNode->FileInfo.FileAttributes |= FILE_ATTRIBUTE_ARCHIVE; + } + + if (Flags & (FspCleanupSetLastAccessTime | FspCleanupSetLastWriteTime | FspCleanupSetChangeTime)) + { + UINT64 Time = SystemTime(); + if (Flags & FspCleanupSetLastAccessTime ) MainNode->FileInfo.LastAccessTime = Time; + if (Flags & FspCleanupSetLastWriteTime ) MainNode->FileInfo.LastWriteTime = Time; + if (Flags & FspCleanupSetChangeTime ) MainNode->FileInfo.ChangeTime = Time; + } + + if (Flags & FspCleanupSetAllocationSize) + { + SetAllocSize(Airfs, Node, Node->FileInfo.FileSize); + } + + if ((Flags & FspCleanupDelete) && !Node->Children) + { + NODE_ Stream; + while (Stream = Node->Streams) + { + Detach(Node->Streams, Stream); + DeleteNode(Airfs, Stream); + } + RemoveNode(Airfs, Node); + } +} + +////////////////////////////////////////////////////////////////////// + +void ApiClose(FSP_FILE_SYSTEM *FileSystem, PVOID Node0) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node = (NODE_) Node0; + DereferenceNode(Airfs, Node); +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiRead(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, PVOID Buffer, + UINT64 BegOffset, ULONG Length, PULONG PBytesTransferred) +{ + NODE_ Node = (NODE_) Node0; + UINT64 EndOffset; + + if (BegOffset >= Node->FileInfo.FileSize) + return STATUS_END_OF_FILE; + + EndOffset = BegOffset + Length; + if (EndOffset > Node->FileInfo.FileSize) + EndOffset = Node->FileInfo.FileSize; + + StorageAccessFile(READ, Node, BegOffset, EndOffset - BegOffset, (char*)Buffer); + + *PBytesTransferred = (ULONG)(EndOffset - BegOffset); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiWrite(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, PVOID Buffer, + UINT64 BegOffset, ULONG Length, BOOLEAN WriteToEndOfFile, + BOOLEAN ConstrainedIo, PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node = (NODE_) Node0; + UINT64 EndOffset; + NTSTATUS Result; + + if (ConstrainedIo) + { + if (BegOffset >= Node->FileInfo.FileSize) + return STATUS_SUCCESS; + EndOffset = BegOffset + Length; + if (EndOffset > Node->FileInfo.FileSize) + EndOffset = Node->FileInfo.FileSize; + } + else + { + if (WriteToEndOfFile) + BegOffset = Node->FileInfo.FileSize; + EndOffset = BegOffset + Length; + if (EndOffset > Node->FileInfo.FileSize) + { + Result = SetFileSize(Airfs, Node, EndOffset); + if (!NT_SUCCESS(Result)) + return Result; + } + } + + StorageAccessFile(WRITE, Node, BegOffset, EndOffset - BegOffset, (char*)Buffer); + + *PBytesTransferred = (ULONG)(EndOffset - BegOffset); + GetFileInfo(Node, FileInfo); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiFlush(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, FSP_FSCTL_FILE_INFO *FileInfo) +{ + NODE_ Node = (NODE_) Node0; + + if (Node) GetFileInfo(Node, FileInfo); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiGetFileInfo(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + NODE_ Node = (NODE_) Node0; + + GetFileInfo(Node, FileInfo); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiSetBasicInfo(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, UINT32 FileAttributes, + UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + NODE_ Node = (NODE_) Node0; + + if (Node->IsAStream) Node = Node->Parent; + + if (INVALID_FILE_ATTRIBUTES != FileAttributes) + Node->FileInfo.FileAttributes = FileAttributes; + if (CreationTime ) Node->FileInfo.CreationTime = CreationTime; + if (LastAccessTime ) Node->FileInfo.LastAccessTime = LastAccessTime; + if (LastWriteTime ) Node->FileInfo.LastWriteTime = LastWriteTime; + if (ChangeTime ) Node->FileInfo.ChangeTime = ChangeTime; + + GetFileInfo(Node, FileInfo); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiSetFileSize(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, + UINT64 NewSize, BOOLEAN SetAllocationSize, FSP_FSCTL_FILE_INFO *FileInfo) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node = (NODE_) Node0; + NTSTATUS Result = SetAllocationSize + ? SetAllocSize (Airfs, Node, NewSize) + : SetFileSize (Airfs, Node, NewSize); + if (!NT_SUCCESS(Result)) + return Result; + + GetFileInfo(Node, FileInfo); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiCanDelete(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, PWSTR Name) +{ + NODE_ Node = (NODE_) Node0; + + if (Node->Children) + return STATUS_DIRECTORY_NOT_EMPTY; + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiRename(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, PWSTR Name, + PWSTR NewFileName, BOOLEAN ReplaceIfExists) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node = (NODE_) Node0; + NODE_ NewNode; + NTSTATUS Result; + PWSTR NewBaseName; + NODE_ NewParent; + Result = FindNode(Airfs, NewFileName, &NewBaseName, &NewParent, &NewNode); + + // Create the replacement name. + size_t NewBaseNameNumBytes = (wcslen(NewBaseName)+1) * sizeof WCHAR; + WCHAR* NewBaseNameAlloc = (WCHAR*) StorageAllocate(Airfs, NewBaseNameNumBytes); + if (!NewBaseNameAlloc) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + memcpy(NewBaseNameAlloc, NewBaseName, NewBaseNameNumBytes); + + if (NewNode && Node != NewNode) + { + if (!ReplaceIfExists) + { + StorageFree(Airfs, NewBaseNameAlloc); + return STATUS_OBJECT_NAME_COLLISION; + } + + if (NewNode->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + StorageFree(Airfs, NewBaseNameAlloc); + return STATUS_ACCESS_DENIED; + } + + ReferenceNode(NewNode); + RemoveNode(Airfs, NewNode); + DereferenceNode(Airfs, NewNode); + } + + ReferenceNode(Node); + RemoveNode(Airfs, Node); + + StorageFree(Airfs, Node->Name); + Node->Name = NewBaseNameAlloc; + + InsertNode(Airfs, NewParent, Node); + DereferenceNode(Airfs, Node); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiGetSecurity(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, + PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) +{ + NODE_ Node = (NODE_) Node0; + + if (Node->IsAStream) Node = Node->Parent; + + if (Node->SecurityDescriptorSize > *PSecurityDescriptorSize) + { + *PSecurityDescriptorSize = Node->SecurityDescriptorSize; + return STATUS_BUFFER_OVERFLOW; + } + + *PSecurityDescriptorSize = Node->SecurityDescriptorSize; + if (SecurityDescriptor) + memcpy(SecurityDescriptor, Node->SecurityDescriptor.Address(), Node->SecurityDescriptorSize); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiSetSecurity(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, + SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node = (NODE_) Node0; + PSECURITY_DESCRIPTOR NewSecurityDescriptor, MallocSecurityDescriptor; + + if (Node->IsAStream) Node = Node->Parent; + + NTSTATUS Result = FspSetSecurityDescriptor( + Node->SecurityDescriptor.Address(), + SecurityInformation, + ModificationDescriptor, + &NewSecurityDescriptor); + if (!NT_SUCCESS(Result)) + return Result; + + uint64_t SecurityDescriptorSize = GetSecurityDescriptorLength(NewSecurityDescriptor); + MallocSecurityDescriptor = (PSECURITY_DESCRIPTOR) malloc(SecurityDescriptorSize); + if (!MallocSecurityDescriptor) + { + FspDeleteSecurityDescriptor(NewSecurityDescriptor, (NTSTATUS (*)())FspSetSecurityDescriptor); + return STATUS_INSUFFICIENT_RESOURCES; + } + memcpy(MallocSecurityDescriptor, NewSecurityDescriptor, SecurityDescriptorSize); + FspDeleteSecurityDescriptor(NewSecurityDescriptor, (NTSTATUS (*)())FspSetSecurityDescriptor); + + NODE_ NewHunk = (NODE_) StorageReallocate(Airfs, Node->SecurityDescriptor, SecurityDescriptorSize); + if (!NewHunk && SecurityDescriptorSize) + { + free(MallocSecurityDescriptor); + return STATUS_INSUFFICIENT_RESOURCES; + } + + Node->SecurityDescriptorSize = SecurityDescriptorSize; + if (!SecurityDescriptorSize) Node->SecurityDescriptor = 0; + else + { + Node->SecurityDescriptor = NewHunk; + memcpy(Node->SecurityDescriptor.Address(), MallocSecurityDescriptor, SecurityDescriptorSize); + } + + free(MallocSecurityDescriptor); + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiReadDirectory(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, PWSTR Pattern, + PWSTR Marker, PVOID Buffer, ULONG Length, PULONG PBytesTransferred) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + + CompareFunction* NodeCmp = Airfs->CaseInsensitive ? CaselessNameCmp : ExactNameCmp; + + NODE_ Node = (NODE_) Node0; + NODE_ Parent = Node->Parent; + if (Parent) + { + // If this is not the root directory, add the dot entries. + if (!Marker) + { + if (!AddDirInfo(Node, L".", Buffer, Length, PBytesTransferred)) + return STATUS_SUCCESS; + } + if (!Marker || (L'.' == Marker[0] && L'\0' == Marker[1])) + { + if (!AddDirInfo(Parent, L"..", Buffer, Length, PBytesTransferred)) + return STATUS_SUCCESS; + Marker = 0; + } + } + + // Find the next Child, even if the Marker child no longer exists. + NODE_ Child; + if (!Marker) Child = First(Node->Children); + else Child = Near(Node->Children, Marker, NodeCmp, GT); + + for (; Child; Child = Next(Child)) + { + if (!AddDirInfo(Child, Child->Name, Buffer, Length, PBytesTransferred)) + goto bufferReady; + } + FspFileSystemAddDirInfo(0, Buffer, Length, PBytesTransferred); + + bufferReady: + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiGetDirInfoByName(FSP_FILE_SYSTEM *FileSystem, PVOID ParentNode0, + PWSTR Name, FSP_FSCTL_DIR_INFO *DirInfo) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + + CompareFunction* NodeCmp = Airfs->CaseInsensitive ? CaselessNameCmp : ExactNameCmp; + + NODE_ Parent = (NODE_) ParentNode0; + NODE_ Node = Find(Parent->Children, Name, NodeCmp); + if (!Node) + return STATUS_OBJECT_NAME_NOT_FOUND; + + DirInfo->Size = (UINT16)(sizeof FSP_FSCTL_DIR_INFO + wcslen(Node->Name) * sizeof WCHAR); + DirInfo->FileInfo = Node->FileInfo; + memcpy(DirInfo->FileNameBuf, Node->Name, DirInfo->Size - sizeof FSP_FSCTL_DIR_INFO); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiResolveReparsePoints(FSP_FILE_SYSTEM *FileSystem, PWSTR Name, + UINT32 ReparsePointIndex, BOOLEAN ResolveLastPathComponent, + PIO_STATUS_BLOCK PIoStatus, PVOID Buffer, PSIZE_T PSize) +{ + return FspFileSystemResolveReparsePoints(FileSystem, GetReparsePointByName, 0, + Name, ReparsePointIndex, ResolveLastPathComponent, + PIoStatus, Buffer, PSize); +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiGetReparsePoint(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, + PWSTR Name, PVOID Buffer, PSIZE_T PSize) +{ + NODE_ Node = (NODE_) Node0; + + if (Node->IsAStream) Node = Node->Parent; + + if (!(Node->FileInfo.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) + return STATUS_NOT_A_REPARSE_POINT; + + if (Node->ReparseDataSize > *PSize) + return STATUS_BUFFER_TOO_SMALL; + + *PSize = Node->ReparseDataSize; + memcpy(Buffer, Node->ReparseData.Address(), Node->ReparseDataSize); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiSetReparsePoint(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, + PWSTR Name, PVOID Buffer, SIZE_T Size) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node = (NODE_) Node0; + NTSTATUS Result; + + if (Node->IsAStream) Node = Node->Parent; + + if (Node->Children) + return STATUS_DIRECTORY_NOT_EMPTY; + + if (Node->ReparseData) + { + Result = FspFileSystemCanReplaceReparsePoint( + Node->ReparseData.Address(), Node->ReparseDataSize, + Buffer, Size); + if (!NT_SUCCESS(Result)) + return Result; + } + + NODE_ ReparseData = (NODE_) StorageReallocate(Airfs, Node->ReparseData, Size); + if (!ReparseData && Size) + return STATUS_INSUFFICIENT_RESOURCES; + + Node->FileInfo.FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT; + Node->FileInfo.ReparseTag = *(PULONG)Buffer; + // The first field in a reparse buffer is the reparse tag. + Node->ReparseDataSize = Size; + Node->ReparseData = ReparseData; + memcpy(Node->ReparseData.Address(), Buffer, Size); + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiDeleteReparsePoint(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, + PWSTR Name, PVOID Buffer, SIZE_T Size) +{ + AIRFS_ Airfs = (AIRFS_) FileSystem->UserContext; + NODE_ Node = (NODE_) Node0; + NTSTATUS Result; + + if (Node->IsAStream) Node = Node->Parent; + + if (Node->ReparseData) + { + Result = FspFileSystemCanReplaceReparsePoint( + Node->ReparseData.Address(), Node->ReparseDataSize, + Buffer, Size); + if (!NT_SUCCESS(Result)) + return Result; + } + else + return STATUS_NOT_A_REPARSE_POINT; + + StorageFree(Airfs, Node->ReparseData); + + Node->FileInfo.FileAttributes &= ~FILE_ATTRIBUTE_REPARSE_POINT; + Node->FileInfo.ReparseTag = 0; + Node->ReparseDataSize = 0; + Node->ReparseData = 0; + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiGetStreamInfo(FSP_FILE_SYSTEM *FileSystem, PVOID Node0, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred) +{ + NODE_ Node = (NODE_) Node0; + + if (Node->IsAStream) Node = Node->Parent; + + if (!(Node->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + if (!AddStreamInfo(Node, L"", Buffer, Length, PBytesTransferred)) + return STATUS_SUCCESS; + + for (NODE_ Stream = First(Node->Streams); Stream; Stream = Next(Stream)) + { + BOOLEAN added = AddStreamInfo(Stream, Stream->Name, Buffer, Length, PBytesTransferred); + if (!added) goto done; + } + + FspFileSystemAddStreamInfo(0, Buffer, Length, PBytesTransferred); + + done: + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS ApiControl(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, UINT32 ControlCode, + PVOID InputBuffer, ULONG InputBufferLength, + PVOID OutputBuffer, ULONG OutputBufferLength, PULONG PBytesTransferred) +{ + // Trivial example: Perform a ROT13 translation on alphas. + if (CTL_CODE(0x8000 + 'M', 'R', METHOD_BUFFERED, FILE_ANY_ACCESS) == ControlCode) + { + if (OutputBufferLength != InputBufferLength) return STATUS_INVALID_PARAMETER; + for (ULONG i = 0; i < InputBufferLength; i++) + { + char c = ((char*)InputBuffer)[i]; + if (('A' <= c && c <= 'M') || ('a' <= c && c <= 'm')) c += 13; + else + if (('N' <= c && c <= 'Z') || ('n' <= c && c <= 'z')) c -= 13; + ((char*)OutputBuffer)[i] = c; + } + *PBytesTransferred = InputBufferLength; + return STATUS_SUCCESS; + } + + return STATUS_INVALID_DEVICE_REQUEST; +} + +////////////////////////////////////////////////////////////////////// + +FSP_FILE_SYSTEM_INTERFACE AirfsInterface = +{ + ApiGetVolumeInfo, + ApiSetVolumeLabel, + ApiGetSecurityByName, + ApiCreate, + ApiOpen, + ApiOverwrite, + ApiCleanup, + ApiClose, + ApiRead, + ApiWrite, + ApiFlush, + ApiGetFileInfo, + ApiSetBasicInfo, + ApiSetFileSize, + ApiCanDelete, + ApiRename, + ApiGetSecurity, + ApiSetSecurity, + ApiReadDirectory, + ApiResolveReparsePoints, + ApiGetReparsePoint, + ApiSetReparsePoint, + ApiDeleteReparsePoint, + ApiGetStreamInfo, + ApiGetDirInfoByName, + ApiControl, +}; + +////////////////////////////////////////////////////////////////////// + +void AirfsDelete(AIRFS_ Airfs) +{ + FspFileSystemDelete(Airfs->FileSystem); + StorageShutdown(Airfs); +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS AirfsCreate( + PWSTR StorageFileName, + PWSTR MapName, + ULONG Flags, + ULONG FileInfoTimeout, + UINT64 VolumeSize, + PWSTR FileSystemName, + PWSTR VolumePrefix, + PWSTR RootSddl, + AIRFS_ *PAirfs) +{ + NTSTATUS Result; + BOOLEAN CaseInsensitive = !!(Flags & AirfsCaseInsensitive); + BOOLEAN FlushAndPurgeOnCleanup = !!(Flags & AirfsFlushAndPurgeOnCleanup); + PWSTR DevicePath = AirfsNet == (Flags & AirfsDeviceMask) ? + L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME; + AIRFS_ Airfs; + PSECURITY_DESCRIPTOR RootSecurity = 0; + ULONG RootSecuritySize; + + *PAirfs = 0; + + boolean StorageFileExists = *StorageFileName && (_waccess(StorageFileName, 0) != -1); + + Result = StorageStartup(Airfs, MapName, StorageFileName, VolumeSize); + if (Result) return Result; + + boolean ShouldFormat = !StorageFileExists || memcmp(Airfs->Signature, "Airfs\0\0\0", 8); + + if (ShouldFormat) + { + memcpy(Airfs->Signature,"Airfs\0\0\0" "\1\0\0\0" "\0\0\0\0", 16); + + if (!RootSddl) + RootSddl = L"O:BAG:BAD:P(A;;FA;;;SY)(A;;FA;;;BA)(A;;FA;;;WD)"; + if (!ConvertStringSecurityDescriptorToSecurityDescriptorW(RootSddl, SDDL_REVISION_1, + &RootSecurity, &RootSecuritySize)) + return GetLastErrorAsStatus(); + + Airfs->VolumeSize = ROUND_DOWN(VolumeSize, ALLOCATION_UNIT); + Airfs->CaseInsensitive = CaseInsensitive; + Airfs->VolumeLabelLength = sizeof L"AIRFS" - sizeof WCHAR; + memcpy(Airfs->VolumeLabel, L"AIRFS", Airfs->VolumeLabelLength); + + FSP_FSCTL_VOLUME_PARAMS V; + memset(&V, 0, sizeof V); + V.Version = sizeof FSP_FSCTL_VOLUME_PARAMS; + V.SectorSize = SECTOR_SIZE; + V.SectorsPerAllocationUnit = SECTORS_PER_ALLOCATION_UNIT; + V.VolumeCreationTime = SystemTime(); + V.VolumeSerialNumber = (UINT32)(SystemTime() / (10000 * 1000)); + V.FileInfoTimeout = FileInfoTimeout; + V.CaseSensitiveSearch = !CaseInsensitive; + V.CasePreservedNames = 1; + V.UnicodeOnDisk = 1; + V.PersistentAcls = 1; + V.ReparsePoints = 1; + V.ReparsePointsAccessCheck = 0; + V.NamedStreams = 1; + V.PostCleanupWhenModifiedOnly = 1; + V.PassQueryDirectoryFileName = 1; + V.FlushAndPurgeOnCleanup = FlushAndPurgeOnCleanup; + V.DeviceControl = 1; + wcscpy_s(V.Prefix, sizeof V.Prefix / sizeof WCHAR, VolumePrefix); + wcscpy_s(V.FileSystemName, sizeof V.FileSystemName / sizeof WCHAR, + FileSystemName ? FileSystemName : L"-AIRFS"); + Airfs->VolumeParams = V; + + // Set up the available storage in chunks. + Airfs->FreeSize = 0; + Airfs->Available = 0; + uint64_t to = 4096; + for (;;) + { + uint64_t fm = to + sizeof int32_t; + to = fm + MAXIMUM_ALLOCSIZE; + if (to > Airfs->VolumeSize - MINIMUM_ALLOCSIZE) to = Airfs->VolumeSize; + int32_t Size = (int32_t)( to - fm ); + char* Addr = (char*)Airfs + fm;// + sizeof int32_t; + NODE_ NewItem = (NODE_) Addr; + ((int32_t*)NewItem)[-1] = Size; + Attach(Airfs->Available, NewItem, SizeCmp, &Size); + Airfs->FreeSize += Size; + if (to == Airfs->VolumeSize) break; + } + + // Create the root directory. + Airfs->Root = 0; + NODE_ RootNode; + Result = CreateNode(Airfs, L"", &RootNode); + if (!NT_SUCCESS(Result)) + { + AirfsDelete(Airfs); + LocalFree(RootSecurity); + return Result; + } + RootNode->P = RootNode->L = RootNode->R = RootNode->E = RootNode->Parent = 0; + RootNode->FileInfo.FileAttributes = FILE_ATTRIBUTE_DIRECTORY; + RootNode->SecurityDescriptor = StorageAllocate(Airfs, RootSecuritySize); + if (!RootNode->SecurityDescriptor) + { + DeleteNode(Airfs, RootNode); + AirfsDelete(Airfs); + LocalFree(RootSecurity); + return STATUS_INSUFFICIENT_RESOURCES; + } + RootNode->SecurityDescriptorSize = RootSecuritySize; + memcpy(RootNode->SecurityDescriptor.Address(), RootSecurity, RootSecuritySize); + Airfs->Root = RootNode; + ReferenceNode(RootNode); + LocalFree(RootSecurity); + } + + Result = FspFileSystemCreate(DevicePath, &Airfs->VolumeParams, &AirfsInterface, &Airfs->FileSystem); + if (!NT_SUCCESS(Result)) + { + LocalFree(RootSecurity); + return Result; + } + + Airfs->FileSystem->UserContext = Airfs; + + *PAirfs = Airfs; + + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) +{ + wchar_t **argp, **arge; + ULONG DebugFlags = 0; + PWSTR DebugLogFile = 0; + ULONG Flags = AirfsDisk; + ULONG OtherFlags = 0; + ULONG FileInfoTimeout = INFINITE; + PWSTR StorageFileName = L""; + PWSTR MapName = L""; + UINT64 VolumeSize = 16LL * 1024 * 1024; + PWSTR FileSystemName = 0; + PWSTR MountPoint = 0; + PWSTR VolumePrefix = L""; + PWSTR RootSddl = 0; + HANDLE DebugLogHandle = INVALID_HANDLE_VALUE; + AIRFS_ Airfs = 0; + NTSTATUS Result; + + for (argp = argv + 1, arge = argv + argc; arge > argp; argp++) + { + if (L'-' != argp[0][0]) + break; + switch (argp[0][1]) + { + case L'?': goto usage; + case L'd': ARG_TO_4(DebugFlags); break; + case L'D': ARG_TO_S(DebugLogFile); break; + case L'f': OtherFlags = AirfsFlushAndPurgeOnCleanup; break; + case L'F': ARG_TO_S(FileSystemName); break; + case L'i': OtherFlags = AirfsCaseInsensitive; break; + case L'm': ARG_TO_S(MountPoint); break; + case L'N': ARG_TO_S(StorageFileName); break; + case L'n': ARG_TO_S(MapName); break; + case L'S': ARG_TO_S(RootSddl); break; + case L's': ARG_TO_8(VolumeSize); break; + case L't': ARG_TO_4(FileInfoTimeout); break; + case L'u': + ARG_TO_S(VolumePrefix); + if (*VolumePrefix) Flags = AirfsNet; + break; + default: + goto usage; + } + } + + if (arge > argp) + goto usage; + + if (AirfsDisk == Flags && !MountPoint) + goto usage; + + if (DebugLogFile) + { + if (!wcscmp(L"-", DebugLogFile)) + DebugLogHandle = GetStdHandle(STD_ERROR_HANDLE); + else + DebugLogHandle = CreateFileW( + DebugLogFile, + FILE_APPEND_DATA, + FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, + OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + 0); + if (INVALID_HANDLE_VALUE == DebugLogHandle) + { + FAIL(L"cannot open debug log file"); + goto usage; + } + + FspDebugLogSetHandle(DebugLogHandle); + } + + Result = AirfsCreate( + StorageFileName, + MapName, + Flags | OtherFlags, + FileInfoTimeout, + VolumeSize, + FileSystemName, + VolumePrefix, + RootSddl, + &Airfs); + + if (!NT_SUCCESS(Result)) + { + FAIL(L"cannot create AIRFS"); + goto exit; + } + + FspFileSystemSetDebugLog(Airfs->FileSystem, DebugFlags); + + if (MountPoint && L'\0' != MountPoint[0]) + { + Result = FspFileSystemSetMountPoint(Airfs->FileSystem, + L'*' == MountPoint[0] && L'\0' == MountPoint[1] ? 0 : MountPoint); + if (!NT_SUCCESS(Result)) + { + FAIL(L"cannot mount AIRFS"); + goto exit; + } + } + + Result = FspFileSystemStartDispatcher(Airfs->FileSystem, 0); + if (!NT_SUCCESS(Result)) + { + FAIL(L"cannot start AIRFS"); + goto exit; + } + + MountPoint = FspFileSystemMountPoint(Airfs->FileSystem); + + WCHAR buffer[1024]; + _snwprintf_s(buffer, 1024, L"%S%S%s%S%s -t %ld -s %lld%S%s%S%s%S%s", + PROGNAME, + *StorageFileName ? " -N " : "", *StorageFileName ? StorageFileName : L"", + *MapName ? " -n " : "", *MapName ? MapName : L"", + FileInfoTimeout, VolumeSize, + RootSddl ? " -S " : "", RootSddl ? RootSddl : L"", + *VolumePrefix ? " -u " : "", *VolumePrefix ? VolumePrefix : L"", + MountPoint ? " -m " : "", MountPoint ? MountPoint : L""); + INFO(buffer); + + Service->UserContext = Airfs; + Result = STATUS_SUCCESS; + + exit: + + if (!NT_SUCCESS(Result) && Airfs) + AirfsDelete(Airfs); + return Result; + + usage: + + static wchar_t usage[] = L"" + "usage: %s OPTIONS\n" + "\n" + "options:\n" + " -d DebugFlags [-1: enable all debug logs]\n" + " -D DebugLogFile [file path; use - for stderr]\n" + " -f [flush and purge cache on cleanup]\n" + " -F FileSystemName\n" + " -i [case insensitive file system]\n" + " -m MountPoint [X:|* (required if no UNC prefix)]\n" + " -n MapName [(ex) \"Local\\Airfs\"]\n" + " -N StorageFileName [\"\": in memory only]\n" + " -s VolumeSize [bytes]\n" + " -S RootSddl [file rights: FA, etc; NO generic rights: GA, etc.]\n" + " -t FileInfoTimeout [millis]\n" + " -u \\Server\\Share [UNC prefix (single backslash)]\n"; + + FAIL(usage, L"" PROGNAME); + + return STATUS_UNSUCCESSFUL; +} + +////////////////////////////////////////////////////////////////////// + +NTSTATUS SvcStop(FSP_SERVICE *Service) +{ + AIRFS_ Airfs = (AIRFS_) Service->UserContext; + FspFileSystemStopDispatcher(Airfs->FileSystem); + AirfsDelete(Airfs); + return STATUS_SUCCESS; +} + +////////////////////////////////////////////////////////////////////// + +int wmain(int argc, wchar_t **argv) +{ + if (!NT_SUCCESS(FspLoad(0))) + return ERROR_DELAY_LOAD_FAILED; + + return FspServiceRun(L"" PROGNAME, SvcStart, SvcStop, 0); +} + +////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// diff --git a/3rd_party/winfsp-1.10/samples/airfs/airfs.sln b/3rd_party/winfsp-1.10/samples/airfs/airfs.sln new file mode 100644 index 00000000..b0dd506b --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/airfs/airfs.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "airfs", "airfs.vcxproj", "{CA441CE7-C4DE-4B5E-AA72-D4D483413EF0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CA441CE7-C4DE-4B5E-AA72-D4D483413EF0}.Debug|x64.ActiveCfg = Debug|x64 + {CA441CE7-C4DE-4B5E-AA72-D4D483413EF0}.Debug|x64.Build.0 = Debug|x64 + {CA441CE7-C4DE-4B5E-AA72-D4D483413EF0}.Debug|x86.ActiveCfg = Debug|Win32 + {CA441CE7-C4DE-4B5E-AA72-D4D483413EF0}.Debug|x86.Build.0 = Debug|Win32 + {CA441CE7-C4DE-4B5E-AA72-D4D483413EF0}.Release|x64.ActiveCfg = Release|x64 + {CA441CE7-C4DE-4B5E-AA72-D4D483413EF0}.Release|x64.Build.0 = Release|x64 + {CA441CE7-C4DE-4B5E-AA72-D4D483413EF0}.Release|x86.ActiveCfg = Release|Win32 + {CA441CE7-C4DE-4B5E-AA72-D4D483413EF0}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3rd_party/winfsp-1.10/samples/airfs/airfs.vcxproj b/3rd_party/winfsp-1.10/samples/airfs/airfs.vcxproj new file mode 100644 index 00000000..aa326b62 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/airfs/airfs.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {CA441CE7-C4DE-4B5E-AA72-D4D483413EF0} + Win32Proj + airfs + $(LatestTargetPlatformVersion) + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + + + + + + + diff --git a/3rd_party/winfsp-1.10/samples/airfs/airfs.vcxproj.filters b/3rd_party/winfsp-1.10/samples/airfs/airfs.vcxproj.filters new file mode 100644 index 00000000..69468e85 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/airfs/airfs.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source + + + Source + + + + + Source + + + diff --git a/3rd_party/winfsp-1.10/samples/airfs/common.h b/3rd_party/winfsp-1.10/samples/airfs/common.h new file mode 100644 index 00000000..2476d07e --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/airfs/common.h @@ -0,0 +1,210 @@ +/** + * @file common.h + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ +/* + * Airfs is based on Memfs with changes contributed by John Oberschelp. + * The contributed changes are under joint copyright by Bill Zissimopoulos + * and John Oberschelp per the Contributor Agreement found at the + * root of this project. + */ + +#include +#include +#include +#include +#include + +#define PROGNAME "airfs" +#define ROUND_UP( bytes, units ) (((bytes) + (units) - 1) / (units) * (units)) +#define ROUND_DOWN( bytes, units ) (((bytes) ) / (units) * (units)) +#define MINIMUM_ALLOCSIZE 196 +#define MAXIMUM_ALLOCSIZE ROUND_DOWN(10*1024*1024, MINIMUM_ALLOCSIZE) +#define SECTOR_SIZE 512 +#define SECTORS_PER_ALLOCATION_UNIT 1 +#define ALLOCATION_UNIT ( SECTOR_SIZE * SECTORS_PER_ALLOCATION_UNIT ) +#define INFO(format, ...) FspServiceLog(EVENTLOG_INFORMATION_TYPE , format, __VA_ARGS__) +#define WARN(format, ...) FspServiceLog(EVENTLOG_WARNING_TYPE , format, __VA_ARGS__) +#define FAIL(format, ...) FspServiceLog(EVENTLOG_ERROR_TYPE , format, __VA_ARGS__) +#define AIRFS_MAX_PATH 512 +#define FILEBLOCK_OVERHEAD 40 // size of ( P + E + L + R + FileOffset ) = 8 * 5 = 40 +#define ARG_TO_S(v) if (arge > ++argp) v = *argp; else goto usage +#define ARG_TO_4(v) if (arge > ++argp) v = (int32_t) wcstoll_default(*argp, v); else goto usage +#define ARG_TO_8(v) if (arge > ++argp) v = wcstoll_default(*argp, v); else goto usage + +enum StorageFileAccessType {ZERO=0,READ,WRITE}; +enum Neighbor {LT=-2,LE=-1,EQ=0,GE=1,GT=2}; + +struct NODE; +typedef NODE* NODE_; + +typedef int CompareFunction (void* key, NODE_); + +inline NTSTATUS GetLastErrorAsStatus() +{ + return FspNtStatusFromWin32(GetLastError()); +} + +inline UINT64 SystemTime() +{ + FILETIME FileTime; + GetSystemTimeAsFileTime(&FileTime); + return ((PLARGE_INTEGER)&FileTime)->QuadPart; +} + +static int64_t wcstoll_default(wchar_t *w, int64_t deflt) +{ + wchar_t *endp; + int64_t i = wcstoll(w, &endp, 0); + return L'\0' != w[0] && L'\0' == *endp ? i : deflt; +} + +////////////////////////////////////////////////////////////////////// +// +// Where Class: This class manages an offset within our memory-mapped +// volume to another location within our memory-mapped volume. Because it is +// a self-relative offset, this delta is constant regardless of where in +// memory the file system is mapped, so we can always reobtain its address. +// A delta of 0 is the special case for "null". +// + +template class Where +{ + int64_t delta; + + public: + + Where() = default; + ~Where() = default; + Where(T t) : delta( t ?( (char*)t -(char*)this ):0) {} + Where(Where& w) : delta( w.delta?( ((char*)&w+w.delta)-(char*)this ):0) {} + + operator bool () { return delta != 0; } + operator T () { return (T) ( delta?( (char*)this+delta ):0); } + T operator -> () { return (T) ( delta?( (char*)this+delta ):0); } + operator void* () { return (void*)( delta?( (char*)this+delta ):0); } + + bool operator == (Where& rhs) { return (char*)this+delta == (char*)&rhs+rhs.delta; } + bool operator != (Where& rhs) { return (char*)this+delta != (char*)&rhs+rhs.delta; } + bool operator == (T rhs) { return (char*)this+delta == (char*)rhs; } + bool operator != (T rhs) { return (char*)this+delta != (char*)rhs; } + + Where& operator = (Where& rhs) { delta = rhs.delta?( ((char*)&rhs+rhs.delta) - ((char*)this) ):0; return *this; } + Where& operator = (void* rhs) { delta = rhs ?( (char*)rhs - ((char*)this) ):0; return *this; } + + char* Address () { return (char*)this+delta; } +}; + +////////////////////////////////////////////////////////////////////// +// +// The header for an Airfs volume +// + +typedef struct +{ + char Signature[8]; // Airfs\0\0\0 + char MapFormatVersion[4]; // Major.Minor.Patch.Build + char filler[4]; + Where Root; + Where Available; + UINT64 VolumeSize; + UINT64 FreeSize; + WCHAR VolumeLabel[32]; + UINT16 VolumeLabelLength; + UINT16 filler1,filler2,filler3; + UINT32 CaseInsensitive; + UINT32 filler4; + int64_t VolumeLength; + FSP_FSCTL_VOLUME_PARAMS VolumeParams; + FSP_FILE_SYSTEM *FileSystem; + HANDLE MapFileHandle; + HANDLE MapHandle; +} AIRFS, *AIRFS_; + +////////////////////////////////////////////////////////////////////// +// +// Information per file or directory +// +struct NODE +{ + Where P,L,R,E; // Sorted sibling tree: Parent, Left, Right, and Equal + union + { + Where Name; + int64_t FileOffset; + }; + Where Parent; + Where Children; + FSP_FSCTL_FILE_INFO FileInfo; + uint64_t SecurityDescriptorSize; + Where SecurityDescriptor; + Where FileBlocks; + uint64_t ReparseDataSize; + Where ReparseData; + volatile LONG RefCount; + Where Streams; + BOOLEAN IsAStream; +}; + +////////////////////////////////////////////////////////////////////// + +class SpinLock +{ + LONG C; // Counter + HANDLE S; // Semaphore + + public: + + SpinLock() { C = 0; S = CreateSemaphore(NULL, 0, 1, NULL); } + ~SpinLock() { CloseHandle(S); } + + void Acquire() { if (_InterlockedIncrement(&C) > 1) WaitForSingleObject(S, INFINITE); } + void Release() { if (_InterlockedDecrement(&C) > 0) ReleaseSemaphore(S, 1, NULL); } +}; + +////////////////////////////////////////////////////////////////////// + +void Airprint (const char * format, ...); + +int SizeCmp (void* key, NODE_); +int ExactNameCmp (void* key, NODE_); +int CaselessNameCmp (void* key, NODE_); + +NODE_ Find (Where &root, void* key, CompareFunction); +NODE_ Near (Where &root, void* key, CompareFunction, Neighbor); +void Attach (Where &root, NODE_ attach, CompareFunction, void* key); +void Detach (Where &root, NODE_ detach); +NODE_ First (NODE_ start); +NODE_ Last (NODE_ start); +NODE_ Next (NODE_); +NODE_ Prev (NODE_); + +NTSTATUS StorageStartup (AIRFS_ &, WCHAR* MapName, WCHAR* StorageFileName, int64_t Length); +NTSTATUS StorageShutdown (AIRFS_); +void* StorageAllocate (AIRFS_, int64_t RequestedSize); +void* StorageReallocate (AIRFS_, void* Reallocate, int64_t RequestedSize); +void StorageFree (AIRFS_, void* Release); +NTSTATUS StorageSetFileCapacity (AIRFS_, NODE_, int64_t MinimumRequiredCapacity); +void StorageAccessFile (StorageFileAccessType, NODE_, int64_t Offset, int64_t NumBytes, char* Address); + +static_assert(AIRFS_MAX_PATH > MAX_PATH, "AIRFS_MAX_PATH must be greater than MAX_PATH."); +static_assert(sizeof NODE + sizeof int32_t == MINIMUM_ALLOCSIZE, "MINIMUM_ALLOCSIZE should be 196."); + +////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// diff --git a/3rd_party/winfsp-1.10/samples/airfs/persistence.cpp b/3rd_party/winfsp-1.10/samples/airfs/persistence.cpp new file mode 100644 index 00000000..39e83b36 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/airfs/persistence.cpp @@ -0,0 +1,594 @@ +/** + * @file persistence.cpp + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ +/* + * Airfs is based on Memfs with changes contributed by John Oberschelp. + * The contributed changes are under joint copyright by Bill Zissimopoulos + * and John Oberschelp per the Contributor Agreement found at the + * root of this project. + */ +/* + * Airfs uses a memory-mapped file per volume to achieve persistence. + * The primary advantage of this is that volume loads and saves are automatic. + * The two primary disadvantages, and our workarounds are: + * 1. We can't use standard containers or memory management, + * so the below Rubbertree and Storage functions are used instead. + * 2. Each process will map the volume to an arbitrary address, + * so Where offsets are used in place of pointers. + */ + +#include "common.h" + +SpinLock StorageLock, AirprintLock, SetLock; + +int SizeCmp ( void* key, NODE_ x) +{ + return *(int32_t*)key - ((int32_t*)x)[-1]; +} + +int BlockCmp ( void* key, NODE_ x) +{ + int64_t left = *(int64_t*)key; + int64_t right = x->FileOffset; + return left == right ? 0 : (left < right ? -1 : 1); +} + +int CaselessNameCmp ( void* key, NODE_ x) +{ + WCHAR* c1 = (WCHAR*) key; + WCHAR* c2 = x->Name; + return _wcsicmp(c1,c2); +} + +int ExactNameCmp ( void* key, NODE_ x) +{ + WCHAR* c1 = (WCHAR*) key; + WCHAR* c2 = x->Name; + return wcscmp(c1,c2); +} + +////////////////////////////////////////////////////////////////////// + +void Airprint (const char * format, ...) +{ + AirprintLock.Acquire(); + va_list args; + va_start(args, format); + char szBuffer[512]; + sprintf_s(szBuffer, 511, "Airfs %5.5f ----", SystemTime() / 10'000'000.0); + vsnprintf(szBuffer+25, 511-25, format, args); + OutputDebugStringA(szBuffer); + va_end(args); + AirprintLock.Release(); +} + +////////////////////////////////////////////////////////////////////// +// +// Rubbertree (because it is flexible!) +// Implements a sorted set of elements, using a binary tree. +// Has a function, Near, that finds nodes at or adjacent to a key. +// Attach, Find, and Near use splay to improve random access times. +// First, Last, Next, and Prev do not, to improve sequential access times. +// Replacing each Where with NODE_ would make this a pointer-based tree. +// In addition to Left, Right, and Parent references, each node has an Equal +// reference that may be used to keep "equivalent" nodes. This is used by +// our memory heap manager's tree of available memory blocks, sorted by size. + +//-------------------------------------------------------------------- + +inline void rotateL(Where &root, NODE_ x) +{ + NODE_ y = x->R, p = x->P; + if (x->R = y->L) y->L->P = x; + if (!(y->P = p)) + root = y; + else + { + if (x == p->L) p->L = y; + else p->R = y; + } + (y->L = x)->P = y; +} + +//-------------------------------------------------------------------- + +inline void rotateR(Where &root, NODE_ y) +{ + NODE_ x = y->L, p = y->P; + if (y->L = x->R) x->R->P = y; + if (!(x->P = p)) + root = x; + else + { + if (y == p->L) p->L = x; + else p->R = x; + } + (x->R = y)->P = x; +} + +//-------------------------------------------------------------------- + +static void splay(Where &root, NODE_ x) +{ + while (NODE_ p = x->P) + { + if (!p->P) + { + if (p->L == x) rotateR(root, p); + else rotateL(root, p); + } + else + { + if (p == p->P->R) + { + if (p->R == x) rotateL(root, p->P); + else rotateR(root, p); + rotateL(root, x->P); + } + else + { + if (p->L == x) rotateR(root, p->P); + else rotateL(root, p); + rotateR(root, x->P); + } + } + } +} + +//-------------------------------------------------------------------- + +inline int seek(Where &root, NODE_ &x, void* key, CompareFunction CMP) +{ + x = root; + for (;;) + { + int diff = CMP(key, x); + if (diff < 0) + { + if (!x->L) return -1; + x = x->L; + } + else if (diff > 0) + { + if (!x->R) return 1; + x = x->R; + } + else return 0; + } +} + +//-------------------------------------------------------------------- + +inline NODE_ next(NODE_ x) +{ + if (x->R) { x = x->R; while (x->L) x = x->L; return x; } + NODE_ p = x->P; + while (p && x == p->R) { x = p; p = p->P; } + return p; +} + +//-------------------------------------------------------------------- + +inline NODE_ prev(NODE_ x) +{ + if (x->L) { x = x->L; while (x->R) x = x->R; return x; } + NODE_ p = x->P; + while (p && x == p->L) { x = p; p = p->P; } + return p; +} + +//-------------------------------------------------------------------- + +NODE_ First(NODE_ x) +{ + SetLock.Acquire(); + if (x) while (x->L) x = x->L; + SetLock.Release(); + return x; +} + +//-------------------------------------------------------------------- + +NODE_ Last(NODE_ x) +{ + SetLock.Acquire(); + if (x) while (x->R) x = x->R; + SetLock.Release(); + return x; +} + +//-------------------------------------------------------------------- + +NODE_ Next(NODE_ x) +{ + SetLock.Acquire(); + x = next(x); + SetLock.Release(); + return x; +} + +//-------------------------------------------------------------------- + +NODE_ Prev(NODE_ x) +{ + SetLock.Acquire(); + x = prev(x); + SetLock.Release(); + return x; +} + +//-------------------------------------------------------------------- + +NODE_ Near(Where &root, void* key, CompareFunction CMP, Neighbor want) +{ + // Return a node relative to (just <, <=, ==, >=, or >) a key. + if (!root) return 0; + SetLock.Acquire(); + NODE_ x; + int dir = seek(root, x, key, CMP); + if ((dir == 0 && want == GT) || (dir > 0 && want >= GE)) x = next(x); + else + if ((dir == 0 && want == LT) || (dir < 0 && want <= LE)) x = prev(x); + else + if (dir != 0 && want == EQ) x = 0; + if (x) splay(root, x); + SetLock.Release(); + return x; +} + +//-------------------------------------------------------------------- + +NODE_ Find(Where &root, void* key, CompareFunction CMP) +{ + if (!root) return 0; + SetLock.Acquire(); + NODE_ x; + int direction = seek(root, x, key, CMP); + splay(root, x); + SetLock.Release(); + return direction?0:x; +} + +//-------------------------------------------------------------------- + +void Attach(Where &root, NODE_ x, CompareFunction CMP, void* key) +{ + SetLock.Acquire(); + if (!root) + { + root = x; + x->P = x->L = x->R = x->E = 0; + SetLock.Release(); + return; + } + NODE_ f; + int diff = seek(root, f, key, CMP); + if (!diff) + { + if (x->L = f->L) x->L->P = x; + if (x->R = f->R) x->R->P = x; + NODE_ p = f->P; + if (x->P = p) { if (p->L == f) p->L = x; else p->R = x; } + else root = x; + (x->E = f)->P = x; + f->L = f->R = 0; + splay(root, x); + SetLock.Release(); + return; + } + if (diff < 0) f->L = x; else f->R = x; + x->P = f; + x->L = x->R = x->E = 0; + splay(root, x); + SetLock.Release(); +} + +//-------------------------------------------------------------------- + +void Detach(Where &root, NODE_ x) +{ + SetLock.Acquire(); + NODE_ e = x->E, p = x->P; + if (p && p->E == x) { if (p->E = e) e->P = p; } + else if (e) + { + if (e->L = x->L) e->L->P = e; + if (e->R = x->R) e->R->P = e; + if (e->P = p) { if (p->L == x) p->L = e; else p->R = e; } + else root = e; + } + else if (!x->L) + { + if (p) { if ( p->L == x) p->L = x->R; else p->R = x->R; } + else root = x->R; + if (x->R) x->R->P = p; + } + else if (!x->R) + { + if (p) { if ( p->L == x) p->L = x->L; else p->R = x->L; } + else root = x->L; + if (x->L) x->L->P = p; + } + else + { + e = x->L; + if (e->R) + { + do { e = e->R; } while (e->R); + if (e->P->R = e->L) e->L->P = e->P; + (e->L = x->L)->P = e; + } + (e->R = x->R)->P = e; + if (e->P = x->P) { if (e->P->L == x) e->P->L = e; else e->P->R = e; } + else root = e; + } + SetLock.Release(); +} + +////////////////////////////////////////////////////////////////////// +// +// Storage Functions for our memory-mapped file-based persistent volumes + +//-------------------------------------------------------------------- + +void* StorageAllocate(AIRFS_ Airfs, int64_t RequestedSize) +{ + if (!RequestedSize) return 0; + if (RequestedSize + sizeof int32_t > MAXIMUM_ALLOCSIZE) return 0; + + StorageLock.Acquire(); + int32_t RoundedSize = (int32_t) ROUND_UP(RequestedSize, MINIMUM_ALLOCSIZE - sizeof int32_t); + int32_t SplitableSize = RoundedSize + MINIMUM_ALLOCSIZE; + + // See if we have a freed node of the size we requested. + NODE_ NewItem = Near(Airfs->Available, &RoundedSize, SizeCmp, GE); + if (NewItem) + { + int32_t FoundSize = ((int32_t*)NewItem)[-1]; + if (FoundSize < SplitableSize) + { + Detach(Airfs->Available, NewItem); + Airfs->FreeSize -= FoundSize; + StorageLock.Release(); + return NewItem; + } + } + + // If not, see if we can downsize a larger freed element. + NewItem = Near(Airfs->Available, &SplitableSize, SizeCmp, GE); + if (NewItem) + { + int32_t FoundSize = ((int32_t*)NewItem)[-1]; + Detach(Airfs->Available, NewItem); + Airfs->FreeSize -= FoundSize; + char* Addr = (char*)NewItem + RoundedSize + sizeof int32_t; + NODE_ Remainder = (NODE_) Addr; + int32_t RemainderSize = FoundSize - (RoundedSize + sizeof int32_t); + ((int32_t*)Remainder)[-1] = RemainderSize; + Attach(Airfs->Available, Remainder, SizeCmp, &RemainderSize); + Airfs->FreeSize += RemainderSize; + ((int32_t*)NewItem)[-1] = RoundedSize; + StorageLock.Release(); + return NewItem; + } + + // If not, give up. + StorageLock.Release(); + return 0; +} + +//-------------------------------------------------------------------- + +void* StorageReallocate(AIRFS_ Airfs, void* OldAlloc, int64_t RequestedSize) +{ + if (!OldAlloc) + { + return StorageAllocate(Airfs, RequestedSize); + } + + if (!RequestedSize) + { + StorageFree(Airfs, OldAlloc); + return 0; + } + + int32_t OldSize = ((int32_t*)OldAlloc)[-1]; + void* NewAlloc = StorageAllocate(Airfs, RequestedSize); + if (!NewAlloc) return 0; + memcpy(NewAlloc, OldAlloc, min(RequestedSize, OldSize)); + StorageFree(Airfs, OldAlloc); + return NewAlloc; +} + +//-------------------------------------------------------------------- + +void StorageFree(AIRFS_ Airfs, void* r) +{ + if (!r) return; + StorageLock.Acquire(); + NODE_ release = (NODE_) r; + int32_t Size = ((int32_t*)r)[-1]; + Attach(Airfs->Available, release, SizeCmp, &Size); + Airfs->FreeSize += Size; + StorageLock.Release(); +} + +//-------------------------------------------------------------------- + +void StorageAccessFile(StorageFileAccessType Type, NODE_ Node, int64_t AccessOffset, int64_t NumBytes, char* MemoryAddress) +{ + StorageLock.Acquire(); + + NODE_ Block = Near(Node->FileBlocks, &AccessOffset, BlockCmp, LE); + for (;;) + { + int32_t BlockSize = ((int32_t*)Block)[-1]; + int64_t BlockOffset = Block->FileOffset; + int64_t BlockIndex = AccessOffset - BlockOffset + FILEBLOCK_OVERHEAD; + int64_t BlockNum = min(BlockSize-BlockIndex, NumBytes); + + switch (Type) + { + case ZERO : { memset((char*)Block + BlockIndex, 0, BlockNum); break; } + case READ : { memcpy(MemoryAddress, (char*)Block + BlockIndex, BlockNum); break; } + case WRITE : { memcpy((char*)Block + BlockIndex, MemoryAddress, BlockNum); break; } + } + NumBytes -= BlockNum; + if (!NumBytes) break; + MemoryAddress += BlockNum; + AccessOffset += BlockNum; + Block = Next(Block); + } + + StorageLock.Release(); +} + +//-------------------------------------------------------------------- + +NTSTATUS StorageSetFileCapacity(AIRFS_ Airfs, NODE_ Node, int64_t minimumRequiredCapacity) +{ + StorageLock.Acquire(); + + int64_t TargetCapacity = ROUND_UP(minimumRequiredCapacity, ALLOCATION_UNIT); + NODE_ Block = Last(Node->FileBlocks); + int32_t BlockSize = Block ? ((int32_t*)Block)[-1] : 0; + int64_t CurrentCapacity = Block ? Block->FileOffset + BlockSize - FILEBLOCK_OVERHEAD: 0; + int64_t Add = TargetCapacity - CurrentCapacity; + + while (Add > 0) + { + // Add a block if we can, preferably as large or larger than we need. + Add += FILEBLOCK_OVERHEAD; + Block = Near(Airfs->Available, &Add, SizeCmp, GE); + if (!Block) Block = Near(Airfs->Available, &Add, SizeCmp, LT); + Add -= FILEBLOCK_OVERHEAD; + if (Block) + { + Detach(Airfs->Available, Block); + BlockSize = ((int32_t*)Block)[-1]; + Airfs->FreeSize -= BlockSize; + Block->FileOffset = CurrentCapacity; + Attach(Node->FileBlocks, Block, BlockCmp, &CurrentCapacity); + CurrentCapacity += BlockSize - FILEBLOCK_OVERHEAD; + Add -= BlockSize - FILEBLOCK_OVERHEAD; + continue; + } + + StorageLock.Release(); + return STATUS_INSUFFICIENT_RESOURCES; + } + + // Throw away any trailing blocks that are no longer needed. + while (Add < 0) + { + Block = Last(Node->FileBlocks); + BlockSize = ((int32_t*)Block)[-1]; + if (BlockSize - FILEBLOCK_OVERHEAD > -Add) break; + Add += BlockSize - FILEBLOCK_OVERHEAD; + Detach(Node->FileBlocks, Block); + Attach(Airfs->Available, Block, SizeCmp, &BlockSize); + Airfs->FreeSize += BlockSize; + } + + // Possibly downsize the last block. + if (Add < 0) + { + Block = Last(Node->FileBlocks); + int32_t OldBlockSize = ((int32_t*)Block)[-1]; + int32_t NewBlockSize = OldBlockSize - (int32_t) ROUND_DOWN(-Add, MINIMUM_ALLOCSIZE); + if (NewBlockSize < MINIMUM_ALLOCSIZE) NewBlockSize = MINIMUM_ALLOCSIZE; + int32_t RemainderBlockSize = OldBlockSize - NewBlockSize - sizeof int32_t; + if (RemainderBlockSize >= MINIMUM_ALLOCSIZE) // i.e. if not too near the end + { + char* Addr = (char*)Block + NewBlockSize + sizeof int32_t; + NODE_ Remainder = (NODE_) Addr; + ((int32_t*)Remainder)[-1] = RemainderBlockSize; + Attach(Airfs->Available, Remainder, SizeCmp, &RemainderBlockSize); + Airfs->FreeSize += RemainderBlockSize; + ((int32_t*)Block)[-1] = NewBlockSize; + } + } + + StorageLock.Release(); + return 0; +} + +//-------------------------------------------------------------------- + +NTSTATUS StorageStartup(AIRFS_ &Airfs, WCHAR* MapName, WCHAR* StorageFileName, int64_t VolumeLength) +{ + HANDLE MapFileHandle = INVALID_HANDLE_VALUE; + Airfs = 0; + + // Open. + if (*StorageFileName) + { + MapFileHandle = CreateFileW(StorageFileName, GENERIC_READ|GENERIC_WRITE|GENERIC_EXECUTE, 0, NULL, OPEN_ALWAYS, NULL, NULL); + if (MapFileHandle == INVALID_HANDLE_VALUE) return GetLastErrorAsStatus(); + } + + // Map. + HANDLE MapHandle = CreateFileMappingW(MapFileHandle, NULL, PAGE_EXECUTE_READWRITE, VolumeLength>>32, VolumeLength & 0xFFFFFFFF, MapName); + if (!MapHandle) return GetLastErrorAsStatus(); + + // Point. + char* MappedAddress = (char*) MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, VolumeLength); + if (!MappedAddress) return GetLastErrorAsStatus(); + + // Keep. + Airfs = (AIRFS_) MappedAddress; + Airfs->MapFileHandle = MapFileHandle; + Airfs->MapHandle = MapHandle; + Airfs->VolumeLength = VolumeLength; + + return 0; +} + +//-------------------------------------------------------------------- + +NTSTATUS StorageShutdown(AIRFS_ Airfs) +{ + BOOL Ok; + NTSTATUS Result = 0; + HANDLE M = Airfs->MapHandle; + HANDLE F = Airfs->MapFileHandle; + + Ok = FlushViewOfFile(Airfs, 0); if (!Ok && !Result) Result = GetLastErrorAsStatus(); + if (F != INVALID_HANDLE_VALUE) + { + Ok = FlushFileBuffers(F); if (!Ok && !Result) Result = GetLastErrorAsStatus(); + // TODO: Set and write a flag something like Airfs->UpdatesCompleted here? + } + Ok = UnmapViewOfFile(Airfs); if (!Ok && !Result) Result = GetLastErrorAsStatus(); + + if (M) + { + Ok = CloseHandle(M); if (!Ok && !Result) Result = GetLastErrorAsStatus(); + } + if (F != INVALID_HANDLE_VALUE) + { + Ok = CloseHandle(F); if (!Ok && !Result) Result = GetLastErrorAsStatus(); + } + + return Result; +} + +////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// diff --git a/3rd_party/winfsp-1.10/samples/memfs-dotnet/Program.cs b/3rd_party/winfsp-1.10/samples/memfs-dotnet/Program.cs new file mode 100644 index 00000000..fd61e385 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-dotnet/Program.cs @@ -0,0 +1,1526 @@ +/** + * @file Program.cs + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#define MEMFS_SLOWIO + +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Security.AccessControl; +using System.Threading; +#if MEMFS_SLOWIO +using System.Threading.Tasks; +#endif + +using Fsp; +using VolumeInfo = Fsp.Interop.VolumeInfo; +using FileInfo = Fsp.Interop.FileInfo; + +namespace memfs +{ + class Path + { + public static String GetDirectoryName(String Path) + { + int Index = Path.LastIndexOf('\\'); + if (0 > Index) + return Path; + else if (0 == Index) + return "\\"; + else + return Path.Substring(0, Index); + } + + public static String GetFileName(String Path) + { + int Index = Path.LastIndexOf('\\'); + if (0 > Index) + return Path; + else + return Path.Substring(Index + 1); + } + } + + struct EaValueData + { + public Byte[] EaValue; + public Boolean NeedEa; + } + + class FileNode + { + public FileNode(String FileName) + { + this.FileName = FileName; + FileInfo.CreationTime = + FileInfo.LastAccessTime = + FileInfo.LastWriteTime = + FileInfo.ChangeTime = (UInt64)DateTime.Now.ToFileTimeUtc(); + FileInfo.IndexNumber = IndexNumber++; + } + public FileInfo GetFileInfo() + { + if (null == MainFileNode) + return this.FileInfo; + else + { + FileInfo FileInfo = MainFileNode.FileInfo; + FileInfo.FileAttributes &= ~(UInt32)FileAttributes.Directory; + /* named streams cannot be directories */ + FileInfo.AllocationSize = this.FileInfo.AllocationSize; + FileInfo.FileSize = this.FileInfo.FileSize; + return FileInfo; + } + } + public SortedDictionary GetEaMap(Boolean Force) + { + FileNode FileNode = null == MainFileNode ? this : MainFileNode; + if (null == EaMap && Force) + EaMap = new SortedDictionary(StringComparer.OrdinalIgnoreCase); + return EaMap; + } + + private static UInt64 IndexNumber = 1; + public String FileName; + public FileInfo FileInfo; + public Byte[] FileSecurity; + public Byte[] FileData; + public Byte[] ReparseData; + private SortedDictionary EaMap; + public FileNode MainFileNode; + public int OpenCount; + } + + class FileNodeMap + { + public FileNodeMap(Boolean CaseInsensitive) + { + this.CaseInsensitive = CaseInsensitive; + StringComparer Comparer = CaseInsensitive ? + StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal; + Set = new SortedSet(Comparer); + Map = new Dictionary(Comparer); + } + public UInt32 Count() + { + return (UInt32)Map.Count; + } + public FileNode Get(String FileName) + { + FileNode FileNode; + return Map.TryGetValue(FileName, out FileNode) ? FileNode : null; + } + public FileNode GetMain(String FileName) + { + int Index = FileName.IndexOf(':'); + if (0 > Index) + return null; + FileNode FileNode; + return Map.TryGetValue(FileName.Substring(0, Index), out FileNode) ? FileNode : null; + } + public FileNode GetParent(String FileName, ref Int32 Result) + { + FileNode FileNode; + Map.TryGetValue(Path.GetDirectoryName(FileName), out FileNode); + if (null == FileNode) + { + Result = FileSystemBase.STATUS_OBJECT_PATH_NOT_FOUND; + return null; + } + if (0 == (FileNode.FileInfo.FileAttributes & (UInt32)FileAttributes.Directory)) + { + Result = FileSystemBase.STATUS_NOT_A_DIRECTORY; + return null; + } + return FileNode; + } + public void TouchParent(FileNode FileNode) + { + if ("\\" == FileNode.FileName) + return; + Int32 Result = FileSystemBase.STATUS_SUCCESS; + FileNode Parent = GetParent(FileNode.FileName, ref Result); + if (null == Parent) + return; + Parent.FileInfo.LastAccessTime = + Parent.FileInfo.LastWriteTime = + Parent.FileInfo.ChangeTime = (UInt64)DateTime.Now.ToFileTimeUtc(); + } + public void Insert(FileNode FileNode) + { + Set.Add(FileNode.FileName); + Map.Add(FileNode.FileName, FileNode); + TouchParent(FileNode); + } + public void Remove(FileNode FileNode) + { + if (Set.Remove(FileNode.FileName)) + { + Map.Remove(FileNode.FileName); + TouchParent(FileNode); + } + } + public Boolean HasChild(FileNode FileNode) + { + foreach (String Name in GetChildrenFileNames(FileNode, null)) + return true; + return false; + } + public IEnumerable GetChildrenFileNames(FileNode FileNode, String Marker) + { + String MinName = "\\"; + String MaxName = "]"; + if ("\\" != FileNode.FileName) + { + MinName = FileNode.FileName + "\\"; + MaxName = FileNode.FileName + "]"; + } + if (null != Marker) + MinName += Marker; + foreach (String Name in Set.GetViewBetween(MinName, MaxName)) + if (Name != MinName && + Name.Length > MaxName.Length && -1 == Name.IndexOfAny(Delimiters, MaxName.Length)) + yield return Name; + } + public IEnumerable GetStreamFileNames(FileNode FileNode) + { + String MinName = FileNode.FileName + ":"; + String MaxName = FileNode.FileName + ";"; + foreach (String Name in Set.GetViewBetween(MinName, MaxName)) + if (Name.Length > MinName.Length) + yield return Name; + } + public IEnumerable GetDescendantFileNames(FileNode FileNode) + { + yield return FileNode.FileName; + String MinName = FileNode.FileName + ":"; + String MaxName = FileNode.FileName + ";"; + foreach (String Name in Set.GetViewBetween(MinName, MaxName)) + if (Name.Length > MinName.Length) + yield return Name; + MinName = "\\"; + MaxName = "]"; + if ("\\" != FileNode.FileName) + { + MinName = FileNode.FileName + "\\"; + MaxName = FileNode.FileName + "]"; + } + foreach (String Name in Set.GetViewBetween(MinName, MaxName)) + if (Name.Length > MinName.Length) + yield return Name; + } + + private static readonly Char[] Delimiters = new Char[] { '\\', ':' }; + public Boolean CaseInsensitive; + private SortedSet Set; + private Dictionary Map; + } + + class Memfs : FileSystemBase + { + private FileSystemHost Host; + public const UInt16 MEMFS_SECTOR_SIZE = 512; + public const UInt16 MEMFS_SECTORS_PER_ALLOCATION_UNIT = 1; + + public Memfs( + Boolean CaseInsensitive, UInt32 MaxFileNodes, UInt32 MaxFileSize, String RootSddl, + UInt64 SlowioMaxDelay, UInt64 SlowioPercentDelay, UInt64 SlowioRarefyDelay) + { + this.FileNodeMap = new FileNodeMap(CaseInsensitive); + this.MaxFileNodes = MaxFileNodes; + this.MaxFileSize = MaxFileSize; + this.SlowioMaxDelay = SlowioMaxDelay; + this.SlowioPercentDelay = SlowioPercentDelay; + this.SlowioRarefyDelay = SlowioRarefyDelay; + + /* + * Create root directory. + */ + + FileNode RootNode = new FileNode("\\"); + RootNode.FileInfo.FileAttributes = (UInt32)FileAttributes.Directory; + if (null == RootSddl) + RootSddl = "O:BAG:BAD:P(A;;FA;;;SY)(A;;FA;;;BA)(A;;FA;;;WD)"; + RawSecurityDescriptor RootSecurityDescriptor = new RawSecurityDescriptor(RootSddl); + RootNode.FileSecurity = new Byte[RootSecurityDescriptor.BinaryLength]; + RootSecurityDescriptor.GetBinaryForm(RootNode.FileSecurity, 0); + + FileNodeMap.Insert(RootNode); + } + + public override Int32 Init(Object Host0) + { + Host = (FileSystemHost)Host0; + Host.SectorSize = Memfs.MEMFS_SECTOR_SIZE; + Host.SectorsPerAllocationUnit = Memfs.MEMFS_SECTORS_PER_ALLOCATION_UNIT; + Host.VolumeCreationTime = (UInt64)DateTime.Now.ToFileTimeUtc(); + Host.VolumeSerialNumber = (UInt32)(Host.VolumeCreationTime / (10000 * 1000)); + Host.CaseSensitiveSearch = !FileNodeMap.CaseInsensitive; + Host.CasePreservedNames = true; + Host.UnicodeOnDisk = true; + Host.PersistentAcls = true; + Host.ReparsePoints = true; + Host.ReparsePointsAccessCheck = false; + Host.NamedStreams = true; + Host.PostCleanupWhenModifiedOnly = true; + Host.PassQueryDirectoryFileName = true; + Host.ExtendedAttributes = true; + Host.WslFeatures = true; + Host.RejectIrpPriorToTransact0 = true; + Host.SupportsPosixUnlinkRename = true; + return STATUS_SUCCESS; + } + +#if MEMFS_SLOWIO + public override int Mounted(object Host) + { + SlowioTasksRunning = 0; + return STATUS_SUCCESS; + } + + public override void Unmounted(object Host) + { + while (SlowioTasksRunning != 0) + Thread.Sleep(1000); + } +#endif + + public override Int32 GetVolumeInfo( + out VolumeInfo VolumeInfo) + { + VolumeInfo = default(VolumeInfo); + VolumeInfo.TotalSize = MaxFileNodes * (UInt64)MaxFileSize; + VolumeInfo.FreeSize = (MaxFileNodes - FileNodeMap.Count()) * (UInt64)MaxFileSize; + VolumeInfo.SetVolumeLabel(VolumeLabel); + return STATUS_SUCCESS; + } + + public override Int32 SetVolumeLabel( + String VolumeLabel, + out VolumeInfo VolumeInfo) + { + this.VolumeLabel = VolumeLabel; + return GetVolumeInfo(out VolumeInfo); + } + + public override Int32 GetSecurityByName( + String FileName, + out UInt32 FileAttributes/* or ReparsePointIndex */, + ref Byte[] SecurityDescriptor) + { + FileNode FileNode = FileNodeMap.Get(FileName); + if (null == FileNode) + { + Int32 Result = STATUS_OBJECT_NAME_NOT_FOUND; + if (FindReparsePoint(FileName, out FileAttributes)) + Result = STATUS_REPARSE; + else + FileNodeMap.GetParent(FileName, ref Result); + return Result; + } + + UInt32 FileAttributesMask = ~(UInt32)0; + if (null != FileNode.MainFileNode) + { + FileAttributesMask = ~(UInt32)System.IO.FileAttributes.Directory; + FileNode = FileNode.MainFileNode; + } + FileAttributes = FileNode.FileInfo.FileAttributes & FileAttributesMask; + if (null != SecurityDescriptor) + SecurityDescriptor = FileNode.FileSecurity; + + return STATUS_SUCCESS; + } + + public override Int32 CreateEx( + String FileName, + UInt32 CreateOptions, + UInt32 GrantedAccess, + UInt32 FileAttributes, + Byte[] SecurityDescriptor, + UInt64 AllocationSize, + IntPtr ExtraBuffer, + UInt32 ExtraLength, + Boolean ExtraBufferIsReparsePoint, + out Object FileNode0, + out Object FileDesc, + out FileInfo FileInfo, + out String NormalizedName) + { + FileNode0 = default(Object); + FileDesc = default(Object); + FileInfo = default(FileInfo); + NormalizedName = default(String); + + FileNode FileNode; + FileNode ParentNode; + Int32 Result = STATUS_SUCCESS; + + FileNode = FileNodeMap.Get(FileName); + if (null != FileNode) + return STATUS_OBJECT_NAME_COLLISION; + ParentNode = FileNodeMap.GetParent(FileName, ref Result); + if (null == ParentNode) + return Result; + + if (0 != (CreateOptions & FILE_DIRECTORY_FILE)) + AllocationSize = 0; + if (FileNodeMap.Count() >= MaxFileNodes) + return STATUS_CANNOT_MAKE; + if (AllocationSize > MaxFileSize) + return STATUS_DISK_FULL; + + if ("\\" != ParentNode.FileName) + /* normalize name */ + FileName = ParentNode.FileName + "\\" + Path.GetFileName(FileName); + FileNode = new FileNode(FileName); + FileNode.MainFileNode = FileNodeMap.GetMain(FileName); + FileNode.FileInfo.FileAttributes = 0 != (FileAttributes & (UInt32)System.IO.FileAttributes.Directory) ? + FileAttributes : FileAttributes | (UInt32)System.IO.FileAttributes.Archive; + FileNode.FileSecurity = SecurityDescriptor; + if (IntPtr.Zero != ExtraBuffer) + { + if (!ExtraBufferIsReparsePoint) + { + Result = SetEaEntries(FileNode, null, ExtraBuffer, ExtraLength); + if (0 > Result) + return Result; + } + else + { + Byte[] ReparseData = MakeReparsePoint(ExtraBuffer, ExtraLength); + FileNode.FileInfo.FileAttributes |= (UInt32)System.IO.FileAttributes.ReparsePoint; + FileNode.FileInfo.ReparseTag = GetReparseTag(ReparseData); + FileNode.ReparseData = ReparseData; + } + } + if (0 != AllocationSize) + { + Result = SetFileSizeInternal(FileNode, AllocationSize, true); + if (0 > Result) + return Result; + } + FileNodeMap.Insert(FileNode); + + Interlocked.Increment(ref FileNode.OpenCount); + FileNode0 = FileNode; + FileInfo = FileNode.GetFileInfo(); + NormalizedName = FileNode.FileName; + + return STATUS_SUCCESS; + } + + public override Int32 Open( + String FileName, + UInt32 CreateOptions, + UInt32 GrantedAccess, + out Object FileNode0, + out Object FileDesc, + out FileInfo FileInfo, + out String NormalizedName) + { + FileNode0 = default(Object); + FileDesc = default(Object); + FileInfo = default(FileInfo); + NormalizedName = default(String); + + FileNode FileNode; + Int32 Result; + + FileNode = FileNodeMap.Get(FileName); + if (null == FileNode) + { + Result = STATUS_OBJECT_NAME_NOT_FOUND; + FileNodeMap.GetParent(FileName, ref Result); + return Result; + } + + if (0 != (CreateOptions & FILE_NO_EA_KNOWLEDGE) && + null == FileNode.MainFileNode) + { + SortedDictionary EaMap = FileNode.GetEaMap(false); + if (null != EaMap) + { + foreach (KeyValuePair Pair in EaMap) + if (Pair.Value.NeedEa) + return STATUS_ACCESS_DENIED; + } + } + + Interlocked.Increment(ref FileNode.OpenCount); + FileNode0 = FileNode; + FileInfo = FileNode.GetFileInfo(); + NormalizedName = FileNode.FileName; + + return STATUS_SUCCESS; + } + + public override Int32 OverwriteEx( + Object FileNode0, + Object FileDesc, + UInt32 FileAttributes, + Boolean ReplaceFileAttributes, + UInt64 AllocationSize, + IntPtr Ea, + UInt32 EaLength, + out FileInfo FileInfo) + { + FileInfo = default(FileInfo); + + FileNode FileNode = (FileNode)FileNode0; + Int32 Result; + + List StreamFileNames = new List(FileNodeMap.GetStreamFileNames(FileNode)); + foreach (String StreamFileName in StreamFileNames) + { + FileNode StreamNode = FileNodeMap.Get(StreamFileName); + if (null == StreamNode) + continue; /* should not happen */ + if (0 == StreamNode.OpenCount) + FileNodeMap.Remove(StreamNode); + } + + SortedDictionary EaMap = FileNode.GetEaMap(false); + if (null != EaMap) + { + EaMap.Clear(); + FileNode.FileInfo.EaSize = 0; + } + if (IntPtr.Zero != Ea) + { + Result = SetEaEntries(FileNode, null, Ea, EaLength); + if (0 > Result) + return Result; + } + + Result = SetFileSizeInternal(FileNode, AllocationSize, true); + if (0 > Result) + return Result; + if (ReplaceFileAttributes) + FileNode.FileInfo.FileAttributes = FileAttributes | (UInt32)System.IO.FileAttributes.Archive; + else + FileNode.FileInfo.FileAttributes |= FileAttributes | (UInt32)System.IO.FileAttributes.Archive; + FileNode.FileInfo.FileSize = 0; + FileNode.FileInfo.LastAccessTime = + FileNode.FileInfo.LastWriteTime = + FileNode.FileInfo.ChangeTime = (UInt64)DateTime.Now.ToFileTimeUtc(); + + FileInfo = FileNode.GetFileInfo(); + + return STATUS_SUCCESS; + } + + public override void Cleanup( + Object FileNode0, + Object FileDesc, + String FileName, + UInt32 Flags) + { + FileNode FileNode = (FileNode)FileNode0; + FileNode MainFileNode = null != FileNode.MainFileNode ? + FileNode.MainFileNode : FileNode; + + if (0 != (Flags & CleanupSetArchiveBit)) + { + if (0 == (MainFileNode.FileInfo.FileAttributes & (UInt32)FileAttributes.Directory)) + MainFileNode.FileInfo.FileAttributes |= (UInt32)FileAttributes.Archive; + } + + if (0 != (Flags & (CleanupSetLastAccessTime | CleanupSetLastWriteTime | CleanupSetChangeTime))) + { + UInt64 SystemTime = (UInt64)DateTime.Now.ToFileTimeUtc(); + + if (0 != (Flags & CleanupSetLastAccessTime)) + MainFileNode.FileInfo.LastAccessTime = SystemTime; + if (0 != (Flags & CleanupSetLastWriteTime)) + MainFileNode.FileInfo.LastWriteTime = SystemTime; + if (0 != (Flags & CleanupSetChangeTime)) + MainFileNode.FileInfo.ChangeTime = SystemTime; + } + + if (0 != (Flags & CleanupSetAllocationSize)) + { + UInt64 AllocationUnit = MEMFS_SECTOR_SIZE * MEMFS_SECTORS_PER_ALLOCATION_UNIT; + UInt64 AllocationSize = (FileNode.FileInfo.FileSize + AllocationUnit - 1) / + AllocationUnit * AllocationUnit; + SetFileSizeInternal(FileNode, AllocationSize, true); + } + + if (0 != (Flags & CleanupDelete) && !FileNodeMap.HasChild(FileNode)) + { + List StreamFileNames = new List(FileNodeMap.GetStreamFileNames(FileNode)); + foreach (String StreamFileName in StreamFileNames) + { + FileNode StreamNode = FileNodeMap.Get(StreamFileName); + if (null == StreamNode) + continue; /* should not happen */ + FileNodeMap.Remove(StreamNode); + } + FileNodeMap.Remove(FileNode); + } + } + + public override void Close( + Object FileNode0, + Object FileDesc) + { + FileNode FileNode = (FileNode)FileNode0; + Interlocked.Decrement(ref FileNode.OpenCount); + } + +#if MEMFS_SLOWIO + private UInt64 Hash(UInt64 X) + { + X = (X ^ (X >> 30)) * 0xbf58476d1ce4e5b9ul; + X = (X ^ (X >> 27)) * 0x94d049bb133111ebul; + X = X ^ (X >> 31); + return X; + } + + private static int Spin = 0; + + private UInt64 PseudoRandom(UInt64 To) + { + /* John Oberschelp's PRNG */ + Interlocked.Increment(ref Spin); + return Hash((UInt64)Spin) % To; + } + + private bool SlowioReturnPending() + { + if (0 == SlowioMaxDelay) + { + return false; + } + return PseudoRandom(100) < SlowioPercentDelay; + } + + private void SlowioSnooze() + { + double Millis = PseudoRandom(SlowioMaxDelay + 1) >> (int) PseudoRandom(SlowioRarefyDelay + 1); + Thread.Sleep(TimeSpan.FromMilliseconds(Millis)); + } + + private void SlowioReadTask( + Object FileNode0, + IntPtr Buffer, + UInt64 Offset, + UInt64 EndOffset, + UInt64 RequestHint) + { + SlowioSnooze(); + + UInt32 BytesTransferred = (UInt32)(EndOffset - Offset); + FileNode FileNode = (FileNode)FileNode0; + Marshal.Copy(FileNode.FileData, (int)Offset, Buffer, (int)BytesTransferred); + + Host.SendReadResponse(RequestHint, STATUS_SUCCESS, BytesTransferred); + Interlocked.Decrement(ref SlowioTasksRunning); + } + + private void SlowioWriteTask( + Object FileNode0, + IntPtr Buffer, + UInt64 Offset, + UInt64 EndOffset, + UInt64 RequestHint) + { + SlowioSnooze(); + + UInt32 BytesTransferred = (UInt32)(EndOffset - Offset); + FileNode FileNode = (FileNode)FileNode0; + FileInfo FileInfo = FileNode.GetFileInfo(); + Marshal.Copy(Buffer, FileNode.FileData, (int)Offset, (int)BytesTransferred); + + Host.SendWriteResponse(RequestHint, STATUS_SUCCESS, BytesTransferred, ref FileInfo); + Interlocked.Decrement(ref SlowioTasksRunning); + } + + private void SlowioReadDirectoryTask( + Object FileNode0, + Object FileDesc, + String Pattern, + String Marker, + IntPtr Buffer, + UInt32 Length, + UInt64 RequestHint) + { + SlowioSnooze(); + + UInt32 BytesTransferred; + var Status = SeekableReadDirectory(FileNode0, FileDesc, Pattern, Marker, Buffer, Length, out BytesTransferred); + + Host.SendReadDirectoryResponse(RequestHint, Status, BytesTransferred); + Interlocked.Decrement(ref SlowioTasksRunning); + } +#endif + + public override Int32 Read( + Object FileNode0, + Object FileDesc, + IntPtr Buffer, + UInt64 Offset, + UInt32 Length, + out UInt32 BytesTransferred) + { + FileNode FileNode = (FileNode)FileNode0; + UInt64 EndOffset; + + if (Offset >= FileNode.FileInfo.FileSize) + { + BytesTransferred = default(UInt32); + return STATUS_END_OF_FILE; + } + + EndOffset = Offset + Length; + if (EndOffset > FileNode.FileInfo.FileSize) + EndOffset = FileNode.FileInfo.FileSize; + +#if MEMFS_SLOWIO + if (SlowioReturnPending()) + { + var Hint = Host.GetOperationRequestHint(); + try + { + Interlocked.Increment(ref SlowioTasksRunning); + Task.Run(() => SlowioReadTask(FileNode0, Buffer, Offset, EndOffset, Hint)).ConfigureAwait(false); + + BytesTransferred = 0; + return STATUS_PENDING; + } + catch (Exception) + { + Interlocked.Decrement(ref SlowioTasksRunning); + } + } +#endif + + BytesTransferred = (UInt32)(EndOffset - Offset); + Marshal.Copy(FileNode.FileData, (int)Offset, Buffer, (int)BytesTransferred); + + return STATUS_SUCCESS; + } + + public override Int32 Write( + Object FileNode0, + Object FileDesc, + IntPtr Buffer, + UInt64 Offset, + UInt32 Length, + Boolean WriteToEndOfFile, + Boolean ConstrainedIo, + out UInt32 BytesTransferred, + out FileInfo FileInfo) + { + FileNode FileNode = (FileNode)FileNode0; + UInt64 EndOffset; + + if (ConstrainedIo) + { + if (Offset >= FileNode.FileInfo.FileSize) + { + BytesTransferred = default(UInt32); + FileInfo = default(FileInfo); + return STATUS_SUCCESS; + } + EndOffset = Offset + Length; + if (EndOffset > FileNode.FileInfo.FileSize) + EndOffset = FileNode.FileInfo.FileSize; + } + else + { + if (WriteToEndOfFile) + Offset = FileNode.FileInfo.FileSize; + EndOffset = Offset + Length; + if (EndOffset > FileNode.FileInfo.FileSize) + { + Int32 Result = SetFileSizeInternal(FileNode, EndOffset, false); + if (0 > Result) + { + BytesTransferred = default(UInt32); + FileInfo = default(FileInfo); + return Result; + } + } + } + +#if MEMFS_SLOWIO + if (SlowioReturnPending()) + { + var hint = Host.GetOperationRequestHint(); + try + { + Interlocked.Increment(ref SlowioTasksRunning); + Task.Run(() => SlowioWriteTask(FileNode0, Buffer, Offset, EndOffset, hint)).ConfigureAwait(false); + + BytesTransferred = 0; + FileInfo = default(FileInfo); + return STATUS_PENDING; + } + catch (Exception) + { + Interlocked.Decrement(ref SlowioTasksRunning); + } + } +#endif + + BytesTransferred = (UInt32)(EndOffset - Offset); + Marshal.Copy(Buffer, FileNode.FileData, (int)Offset, (int)BytesTransferred); + + FileInfo = FileNode.GetFileInfo(); + + return STATUS_SUCCESS; + } + + public override Int32 Flush( + Object FileNode0, + Object FileDesc, + out FileInfo FileInfo) + { + FileNode FileNode = (FileNode)FileNode0; + + /* nothing to flush, since we do not cache anything */ + FileInfo = null != FileNode ? FileNode.GetFileInfo() : default(FileInfo); + + return STATUS_SUCCESS; + } + + public override Int32 GetFileInfo( + Object FileNode0, + Object FileDesc, + out FileInfo FileInfo) + { + FileNode FileNode = (FileNode)FileNode0; + + FileInfo = FileNode.GetFileInfo(); + + return STATUS_SUCCESS; + } + + public override Int32 SetBasicInfo( + Object FileNode0, + Object FileDesc, + UInt32 FileAttributes, + UInt64 CreationTime, + UInt64 LastAccessTime, + UInt64 LastWriteTime, + UInt64 ChangeTime, + out FileInfo FileInfo) + { + FileNode FileNode = (FileNode)FileNode0; + + if (null != FileNode.MainFileNode) + FileNode = FileNode.MainFileNode; + + if (unchecked((UInt32)(-1)) != FileAttributes) + FileNode.FileInfo.FileAttributes = FileAttributes; + if (0 != CreationTime) + FileNode.FileInfo.CreationTime = CreationTime; + if (0 != LastAccessTime) + FileNode.FileInfo.LastAccessTime = LastAccessTime; + if (0 != LastWriteTime) + FileNode.FileInfo.LastWriteTime = LastWriteTime; + if (0 != ChangeTime) + FileNode.FileInfo.ChangeTime = ChangeTime; + + FileInfo = FileNode.GetFileInfo(); + + return STATUS_SUCCESS; + } + + public override Int32 SetFileSize( + Object FileNode0, + Object FileDesc, + UInt64 NewSize, + Boolean SetAllocationSize, + out FileInfo FileInfo) + { + FileNode FileNode = (FileNode)FileNode0; + Int32 Result; + + Result = SetFileSizeInternal(FileNode, NewSize, SetAllocationSize); + FileInfo = 0 <= Result ? FileNode.GetFileInfo() : default(FileInfo); + + return STATUS_SUCCESS; + } + + private Int32 SetFileSizeInternal( + FileNode FileNode, + UInt64 NewSize, + Boolean SetAllocationSize) + { + if (SetAllocationSize) + { + if (FileNode.FileInfo.AllocationSize != NewSize) + { + if (NewSize > MaxFileSize) + return STATUS_DISK_FULL; + + byte[] FileData = null; + if (0 != NewSize) + try + { + FileData = new byte[NewSize]; + } + catch + { + return STATUS_INSUFFICIENT_RESOURCES; + } + int CopyLength = (int)Math.Min(FileNode.FileInfo.AllocationSize, NewSize); + if (0 != CopyLength) + Array.Copy(FileNode.FileData, FileData, CopyLength); + + FileNode.FileData = FileData; + FileNode.FileInfo.AllocationSize = NewSize; + if (FileNode.FileInfo.FileSize > NewSize) + FileNode.FileInfo.FileSize = NewSize; + } + } + else + { + if (FileNode.FileInfo.FileSize != NewSize) + { + if (FileNode.FileInfo.AllocationSize < NewSize) + { + UInt64 AllocationUnit = MEMFS_SECTOR_SIZE * MEMFS_SECTORS_PER_ALLOCATION_UNIT; + UInt64 AllocationSize = (NewSize + AllocationUnit - 1) / AllocationUnit * AllocationUnit; + Int32 Result = SetFileSizeInternal(FileNode, AllocationSize, true); + if (0 > Result) + return Result; + } + + if (FileNode.FileInfo.FileSize < NewSize) + { + int CopyLength = (int)(NewSize - FileNode.FileInfo.FileSize); + if (0 != CopyLength) + Array.Clear(FileNode.FileData, (int)FileNode.FileInfo.FileSize, CopyLength); + } + FileNode.FileInfo.FileSize = NewSize; + } + } + + return STATUS_SUCCESS; + } + + public override Int32 CanDelete( + Object FileNode0, + Object FileDesc, + String FileName) + { + FileNode FileNode = (FileNode)FileNode0; + + if (FileNodeMap.HasChild(FileNode)) + return STATUS_DIRECTORY_NOT_EMPTY; + + return STATUS_SUCCESS; + } + + public override Int32 Rename( + Object FileNode0, + Object FileDesc, + String FileName, + String NewFileName, + Boolean ReplaceIfExists) + { + FileNode FileNode = (FileNode)FileNode0; + FileNode NewFileNode; + + NewFileNode = FileNodeMap.Get(NewFileName); + if (null != NewFileNode && FileNode != NewFileNode) + { + if (!ReplaceIfExists) + return STATUS_OBJECT_NAME_COLLISION; + if (0 != (NewFileNode.FileInfo.FileAttributes & (UInt32)FileAttributes.Directory)) + return STATUS_ACCESS_DENIED; + } + + if (null != NewFileNode && FileNode != NewFileNode) + FileNodeMap.Remove(NewFileNode); + + List DescendantFileNames = new List(FileNodeMap.GetDescendantFileNames(FileNode)); + foreach (String DescendantFileName in DescendantFileNames) + { + FileNode DescendantFileNode = FileNodeMap.Get(DescendantFileName); + if (null == DescendantFileNode) + continue; /* should not happen */ + FileNodeMap.Remove(DescendantFileNode); + DescendantFileNode.FileName = + NewFileName + DescendantFileNode.FileName.Substring(FileName.Length); + FileNodeMap.Insert(DescendantFileNode); + } + + return STATUS_SUCCESS; + } + + public override Int32 GetSecurity( + Object FileNode0, + Object FileDesc, + ref Byte[] SecurityDescriptor) + { + FileNode FileNode = (FileNode)FileNode0; + + if (null != FileNode.MainFileNode) + FileNode = FileNode.MainFileNode; + + SecurityDescriptor = FileNode.FileSecurity; + + return STATUS_SUCCESS; + } + + public override Int32 SetSecurity( + Object FileNode0, + Object FileDesc, + AccessControlSections Sections, + Byte[] SecurityDescriptor) + { + FileNode FileNode = (FileNode)FileNode0; + + if (null != FileNode.MainFileNode) + FileNode = FileNode.MainFileNode; + + return ModifySecurityDescriptorEx(FileNode.FileSecurity, Sections, SecurityDescriptor, + ref FileNode.FileSecurity); + } + + public override Boolean ReadDirectoryEntry( + Object FileNode0, + Object FileDesc, + String Pattern, + String Marker, + ref Object Context, + out String FileName, + out FileInfo FileInfo) + { + FileNode FileNode = (FileNode)FileNode0; + IEnumerator Enumerator = (IEnumerator)Context; + + if (null == Enumerator) + { + List ChildrenFileNames = new List(); + if ("\\" != FileNode.FileName) + { + /* if this is not the root directory add the dot entries */ + if (null == Marker) + ChildrenFileNames.Add("."); + if (null == Marker || "." == Marker) + ChildrenFileNames.Add(".."); + } + ChildrenFileNames.AddRange(FileNodeMap.GetChildrenFileNames(FileNode, + "." != Marker && ".." != Marker ? Marker : null)); + Context = Enumerator = ChildrenFileNames.GetEnumerator(); + } + + while (Enumerator.MoveNext()) + { + String FullFileName = Enumerator.Current; + if ("." == FullFileName) + { + FileName = "."; + FileInfo = FileNode.GetFileInfo(); + return true; + } + else if (".." == FullFileName) + { + Int32 Result = STATUS_SUCCESS; + FileNode ParentNode = FileNodeMap.GetParent(FileNode.FileName, ref Result); + if (null != ParentNode) + { + FileName = ".."; + FileInfo = ParentNode.GetFileInfo(); + return true; + } + } + else + { + FileNode ChildFileNode = FileNodeMap.Get(FullFileName); + if (null != ChildFileNode) + { + FileName = Path.GetFileName(FullFileName); + FileInfo = ChildFileNode.GetFileInfo(); + return true; + } + } + } + + FileName = default(String); + FileInfo = default(FileInfo); + return false; + } + +#if MEMFS_SLOWIO + public override int ReadDirectory( + Object FileNode0, + Object FileDesc, + String Pattern, + String Marker, + IntPtr Buffer, + UInt32 Length, + out UInt32 BytesTransferred) + { + if (SlowioReturnPending()) + { + var Hint = Host.GetOperationRequestHint(); + try + { + Interlocked.Increment(ref SlowioTasksRunning); + Task.Run(() => SlowioReadDirectoryTask(FileNode0, FileDesc, Pattern, Marker, Buffer, Length, Hint)); + BytesTransferred = 0; + + return STATUS_PENDING; + } + catch (Exception) + { + Interlocked.Decrement(ref SlowioTasksRunning); + } + } + + return SeekableReadDirectory(FileNode0, FileDesc, Pattern, Marker, Buffer, Length, out BytesTransferred); + } +#endif + + public override int GetDirInfoByName( + Object ParentNode0, + Object FileDesc, + String FileName, + out String NormalizedName, + out FileInfo FileInfo) + { + FileNode ParentNode = (FileNode)ParentNode0; + FileNode FileNode; + + FileName = + ParentNode.FileName + + ("\\" == ParentNode.FileName ? "" : "\\") + + Path.GetFileName(FileName); + + FileNode = FileNodeMap.Get(FileName); + if (null == FileNode) + { + NormalizedName = default(String); + FileInfo = default(FileInfo); + return STATUS_OBJECT_NAME_NOT_FOUND; + } + + NormalizedName = Path.GetFileName(FileNode.FileName); + FileInfo = FileNode.FileInfo; + + return STATUS_SUCCESS; + } + + public override Int32 GetReparsePointByName( + String FileName, + Boolean IsDirectory, + ref Byte[] ReparseData) + { + FileNode FileNode; + + FileNode = FileNodeMap.Get(FileName); + if (null == FileNode) + return STATUS_OBJECT_NAME_NOT_FOUND; + + if (0 == (FileNode.FileInfo.FileAttributes & (UInt32)FileAttributes.ReparsePoint)) + return STATUS_NOT_A_REPARSE_POINT; + + ReparseData = FileNode.ReparseData; + + return STATUS_SUCCESS; + } + + public override Int32 GetReparsePoint( + Object FileNode0, + Object FileDesc, + String FileName, + ref Byte[] ReparseData) + { + FileNode FileNode = (FileNode)FileNode0; + + if (null != FileNode.MainFileNode) + FileNode = FileNode.MainFileNode; + + if (0 == (FileNode.FileInfo.FileAttributes & (UInt32)FileAttributes.ReparsePoint)) + return STATUS_NOT_A_REPARSE_POINT; + + ReparseData = FileNode.ReparseData; + + return STATUS_SUCCESS; + } + + public override Int32 SetReparsePoint( + Object FileNode0, + Object FileDesc, + String FileName, + Byte[] ReparseData) + { + FileNode FileNode = (FileNode)FileNode0; + + if (null != FileNode.MainFileNode) + FileNode = FileNode.MainFileNode; + + if (FileNodeMap.HasChild(FileNode)) + return STATUS_DIRECTORY_NOT_EMPTY; + + if (null != FileNode.ReparseData) + { + Int32 Result = CanReplaceReparsePoint(FileNode.ReparseData, ReparseData); + if (0 > Result) + return Result; + } + + FileNode.FileInfo.FileAttributes |= (UInt32)FileAttributes.ReparsePoint; + FileNode.FileInfo.ReparseTag = GetReparseTag(ReparseData); + FileNode.ReparseData = ReparseData; + + return STATUS_SUCCESS; + } + + public override Int32 DeleteReparsePoint( + Object FileNode0, + Object FileDesc, + String FileName, + Byte[] ReparseData) + { + FileNode FileNode = (FileNode)FileNode0; + + if (null != FileNode.MainFileNode) + FileNode = FileNode.MainFileNode; + + if (null != FileNode.ReparseData) + { + Int32 Result = CanReplaceReparsePoint(FileNode.ReparseData, ReparseData); + if (0 > Result) + return Result; + } + else + return STATUS_NOT_A_REPARSE_POINT; + + FileNode.FileInfo.FileAttributes &= ~(UInt32)FileAttributes.ReparsePoint; + FileNode.FileInfo.ReparseTag = 0; + FileNode.ReparseData = null; + + return STATUS_SUCCESS; + } + + public override Boolean GetStreamEntry( + Object FileNode0, + Object FileDesc, + ref Object Context, + out String StreamName, + out UInt64 StreamSize, + out UInt64 StreamAllocationSize) + { + FileNode FileNode = (FileNode)FileNode0; + IEnumerator Enumerator = (IEnumerator)Context; + + if (null == Enumerator) + { + if (null != FileNode.MainFileNode) + FileNode = FileNode.MainFileNode; + + List StreamFileNames = new List(); + if (0 == (FileNode.FileInfo.FileAttributes & (UInt32)FileAttributes.Directory)) + StreamFileNames.Add(FileNode.FileName); + StreamFileNames.AddRange(FileNodeMap.GetStreamFileNames(FileNode)); + Context = Enumerator = StreamFileNames.GetEnumerator(); + } + + while (Enumerator.MoveNext()) + { + String FullFileName = Enumerator.Current; + FileNode StreamFileNode = FileNodeMap.Get(FullFileName); + if (null != StreamFileNode) + { + int Index = FullFileName.IndexOf(':'); + if (0 > Index) + StreamName = ""; + else + StreamName = FullFileName.Substring(Index + 1); + StreamSize = StreamFileNode.FileInfo.FileSize; + StreamAllocationSize = StreamFileNode.FileInfo.AllocationSize; + return true; + } + } + + StreamName = default(String); + StreamSize = default(UInt64); + StreamAllocationSize = default(UInt64); + return false; + } + public override Boolean GetEaEntry( + Object FileNode0, + Object FileDesc, + ref Object Context, + out String EaName, + out Byte[] EaValue, + out Boolean NeedEa) + { + FileNode FileNode = (FileNode)FileNode0; + IEnumerator> Enumerator = + (IEnumerator>)Context; + + if (null == Enumerator) + { + SortedDictionary EaMap = FileNode.GetEaMap(false); + if (null == EaMap) + { + EaName = default(String); + EaValue = default(Byte[]); + NeedEa = default(Boolean); + return false; + } + + Context = Enumerator = EaMap.GetEnumerator(); + } + + while (Enumerator.MoveNext()) + { + KeyValuePair Pair = Enumerator.Current; + EaName = Pair.Key; + EaValue = Pair.Value.EaValue; + NeedEa = Pair.Value.NeedEa; + return true; + } + + EaName = default(String); + EaValue = default(Byte[]); + NeedEa = default(Boolean); + return false; + } + public override Int32 SetEaEntry( + Object FileNode0, + Object FileDesc, + ref Object Context, + String EaName, + Byte[] EaValue, + Boolean NeedEa) + { + FileNode FileNode = (FileNode)FileNode0; + SortedDictionary EaMap = FileNode.GetEaMap(true); + EaValueData Data; + UInt32 EaSizePlus = 0, EaSizeMinus = 0; + if (EaMap.TryGetValue(EaName, out Data)) + { + EaSizeMinus = GetEaEntrySize(EaName, Data.EaValue, Data.NeedEa); + EaMap.Remove(EaName); + } + if (null != EaValue) + { + Data.EaValue = EaValue; + Data.NeedEa = NeedEa; + EaMap[EaName] = Data; + EaSizePlus = GetEaEntrySize(EaName, EaValue, NeedEa); + } + FileNode.FileInfo.EaSize = FileNode.FileInfo.EaSize + EaSizePlus - EaSizeMinus; + return STATUS_SUCCESS; + } + + private FileNodeMap FileNodeMap; + private UInt32 MaxFileNodes; + private UInt32 MaxFileSize; + private UInt64 SlowioMaxDelay; + private UInt64 SlowioPercentDelay; + private UInt64 SlowioRarefyDelay; + private volatile Int32 SlowioTasksRunning; + private String VolumeLabel; + } + + class MemfsService : Service + { + private class CommandLineUsageException : Exception + { + public CommandLineUsageException(String Message = null) : base(Message) + { + HasMessage = null != Message; + } + + public bool HasMessage; + } + + private const String PROGNAME = "memfs-dotnet"; + + public MemfsService() : base("MemfsService") + { + } + protected override void OnStart(String[] Args) + { + try + { + Boolean CaseInsensitive = false; + String DebugLogFile = null; + UInt32 DebugFlags = 0; + UInt32 FileInfoTimeout = unchecked((UInt32)(-1)); + UInt32 MaxFileNodes = 1024; + UInt32 MaxFileSize = 16 * 1024 * 1024; + UInt32 SlowioMaxDelay = 0; + UInt32 SlowioPercentDelay = 0; + UInt32 SlowioRarefyDelay = 0; + String FileSystemName = null; + String VolumePrefix = null; + String MountPoint = null; + String RootSddl = null; + FileSystemHost Host = null; + Memfs Memfs = null; + int I; + + for (I = 1; Args.Length > I; I++) + { + String Arg = Args[I]; + if ('-' != Arg[0]) + break; + switch (Arg[1]) + { + case '?': + throw new CommandLineUsageException(); + case 'D': + argtos(Args, ref I, ref DebugLogFile); + break; + case 'd': + argtol(Args, ref I, ref DebugFlags); + break; + case 'F': + argtos(Args, ref I, ref FileSystemName); + break; + case 'i': + CaseInsensitive = true; + break; + case 'm': + argtos(Args, ref I, ref MountPoint); + break; + case 'M': + argtol(Args, ref I, ref SlowioMaxDelay); + break; + case 'n': + argtol(Args, ref I, ref MaxFileNodes); + break; + case 'P': + argtol(Args, ref I, ref SlowioPercentDelay); + break; + case 'R': + argtol(Args, ref I, ref SlowioRarefyDelay); + break; + case 'S': + argtos(Args, ref I, ref RootSddl); + break; + case 's': + argtol(Args, ref I, ref MaxFileSize); + break; + case 't': + argtol(Args, ref I, ref FileInfoTimeout); + break; + case 'u': + argtos(Args, ref I, ref VolumePrefix); + break; + default: + throw new CommandLineUsageException(); + } + } + + if (Args.Length > I) + throw new CommandLineUsageException(); + + if ((null == VolumePrefix || 0 == VolumePrefix.Length) && null == MountPoint) + throw new CommandLineUsageException(); + + if (null != DebugLogFile) + if (0 > FileSystemHost.SetDebugLogFile(DebugLogFile)) + throw new CommandLineUsageException("cannot open debug log file"); + + Host = new FileSystemHost(Memfs = new Memfs( + CaseInsensitive, MaxFileNodes, MaxFileSize, RootSddl, + SlowioMaxDelay, SlowioPercentDelay, SlowioRarefyDelay)); + Host.FileInfoTimeout = FileInfoTimeout; + Host.Prefix = VolumePrefix; + Host.FileSystemName = null != FileSystemName ? FileSystemName : "-MEMFS"; + if (0 > Host.Mount(MountPoint, null, false, DebugFlags)) + throw new IOException("cannot mount file system"); + MountPoint = Host.MountPoint(); + _Host = Host; + + Log(EVENTLOG_INFORMATION_TYPE, String.Format("{0} -t {1} -n {2} -s {3}{4}{5}{6}{7}{8}{9}", + PROGNAME, (Int32)FileInfoTimeout, MaxFileNodes, MaxFileSize, + null != RootSddl ? " -S " : "", null != RootSddl ? RootSddl : "", + null != VolumePrefix && 0 < VolumePrefix.Length ? " -u " : "", + null != VolumePrefix && 0 < VolumePrefix.Length ? VolumePrefix : "", + null != MountPoint ? " -m " : "", null != MountPoint ? MountPoint : "")); + } + catch (CommandLineUsageException ex) + { + Log(EVENTLOG_ERROR_TYPE, String.Format( + "{0}" + + "usage: {1} OPTIONS\n" + + "\n" + + "options:\n" + + " -d DebugFlags [-1: enable all debug logs]\n" + + " -D DebugLogFile [file path; use - for stderr]\n" + + " -i [case insensitive file system]\n" + + " -t FileInfoTimeout [millis]\n" + + " -n MaxFileNodes\n" + + " -s MaxFileSize [bytes]\n" + + " -M MaxDelay [maximum slow IO delay in millis]\n" + + " -P PercentDelay [percent of slow IO to make pending]\n" + + " -R RarefyDelay [adjust the rarity of pending slow IO]\n" + + " -F FileSystemName\n" + + " -S RootSddl [file rights: FA, etc; NO generic rights: GA, etc.]\n" + + " -u \\Server\\Share [UNC prefix (single backslash)]\n" + + " -m MountPoint [X:|* (required if no UNC prefix)]\n", + ex.HasMessage ? ex.Message + "\n" : "", + PROGNAME)); + throw; + } + catch (Exception ex) + { + Log(EVENTLOG_ERROR_TYPE, String.Format("{0}", ex.Message)); + throw; + } + } + protected override void OnStop() + { + _Host.Unmount(); + _Host = null; + } + + private static void argtos(String[] Args, ref int I, ref String V) + { + if (Args.Length > ++I) + V = Args[I]; + else + throw new CommandLineUsageException(); + } + private static void argtol(String[] Args, ref int I, ref UInt32 V) + { + Int32 R; + if (Args.Length > ++I) + V = Int32.TryParse(Args[I], out R) ? (UInt32)R : V; + else + throw new CommandLineUsageException(); + } + + private FileSystemHost _Host; + } + + class Program + { + static void Main(string[] args) + { + Environment.ExitCode = new MemfsService().Run(); + } + } +} diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse/Makefile b/3rd_party/winfsp-1.10/samples/memfs-fuse/Makefile new file mode 100644 index 00000000..45f131f3 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse/Makefile @@ -0,0 +1,18 @@ +usage: + @echo "make cygfuse|winfsp-fuse" 1>&2 + @echo "" 1>&2 + @echo " cygfuse Link with CYGFUSE" 1>&2 + @echo " winfsp-fuse Link with WinFsp-FUSE" 1>&2 + @exit 2 + +cygfuse: memfs-cygfuse + +winfsp-fuse: memfs-winfsp-fuse + +memfs-cygfuse: memfs-fuse.cpp + g++ $^ -o $@ -g -Wall -std=gnu++17 `pkg-config fuse --cflags --libs` + +memfs-winfsp-fuse: export PKG_CONFIG_PATH=$(PWD)/winfsp.install/lib +memfs-winfsp-fuse: memfs-fuse.cpp + ln -nsf "`regtool --wow32 get '/HKLM/Software/WinFsp/InstallDir' | cygpath -au -f -`" winfsp.install + g++ $^ -o $@ -g -Wall -std=gnu++17 `pkg-config fuse --cflags --libs` diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse/README.md b/3rd_party/winfsp-1.10/samples/memfs-fuse/README.md new file mode 100644 index 00000000..87994104 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse/README.md @@ -0,0 +1,7 @@ +`Memfs-fuse` is an in-memory FUSE file system. + +It can be built with the following tools: + +- Using Visual Studio (`memfs-fuse.sln`). +- Using Cygwin GCC and linking directly with the WinFsp DLL (`make winfsp-fuse`). +- Using Cygwin GCC and linking to CYGFUSE (`make cygfuse`). diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse/compat.h b/3rd_party/winfsp-1.10/samples/memfs-fuse/compat.h new file mode 100644 index 00000000..30c4b7ee --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse/compat.h @@ -0,0 +1,104 @@ +/** + * @file compat.h + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef COMPAT_H_INCLUDED +#define COMPAT_H_INCLUDED + +#if defined(_WIN32) && defined(FSP_FUSE_SYM) +#include +#undef fuse_main +#define fuse_main(argc, argv, ops, data)\ + (FspLoad(0), fuse_main_real(argc, argv, ops, sizeof *(ops), data)) +#endif + +#if !defined(_WIN32) && !defined(fuse_stat) + +#define fuse_uid_t uid_t +#define fuse_gid_t gid_t +#define fuse_pid_t pid_t + +#define fuse_dev_t dev_t +#define fuse_mode_t mode_t +#define fuse_nlink_t nlink_t +#define fuse_off_t off_t + +#define fuse_fsblkcnt_t fsblkcnt_t +#define fuse_fsfilcnt_t fsfilcnt_t +#define fuse_blksize_t blksize_t +#define fuse_blkcnt_t blkcnt_t + +#define fuse_timespec timespec + +#define fuse_stat stat + +#define fuse_statvfs statvfs + +#define fuse_flock flock + +#define fuse_iovec iovec + +#endif + +#if !defined(S_IFMT) +#define S_IFMT 0170000 +#endif +#if !defined(S_IFDIR) +#define S_IFDIR 0040000 +#endif +#if !defined(S_IFCHR) +#define S_IFCHR 0020000 +#endif +#if !defined(S_IFBLK) +#define S_IFBLK 0060000 +#endif +#if !defined(S_IFREG) +#define S_IFREG 0100000 +#endif +#if !defined(S_IFLNK) +#define S_IFLNK 0120000 +#endif +#if !defined(S_IFSOCK) +#define S_IFSOCK 0140000 +#endif +#if !defined(S_IFIFO) +#define S_IFIFO 0010000 +#endif + +#if defined(__APPLE__) +#define st_atim st_atimespec +#define st_ctim st_ctimespec +#define st_mtim st_mtimespec +#endif + +#if defined(__APPLE__) || defined(__linux__) || defined(__CYGWIN__) +#include +#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(_WIN32) +#define XATTR_CREATE 1 +#define XATTR_REPLACE 2 +#endif + +#if !defined(ENOATTR) +#define ENOATTR ENODATA +#elif !defined(ENODATA) +#define ENODATA ENOATTR +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.cpp b/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.cpp new file mode 100644 index 00000000..0666d072 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.cpp @@ -0,0 +1,693 @@ +/** + * @file memfs-fuse.c + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "compat.h" + +class memfs +{ +public: + memfs() : _ino(1), _root(std::make_shared(_ino, S_IFDIR | 00777, 0, 0)) + { + } + + int main(int argc, char *argv[]) + { + static fuse_operations ops = + { + getattr, + 0, // getdir + readlink, + mknod, + mkdir, + unlink, + rmdir, + symlink, + rename, + link, + chmod, + chown, + truncate, + 0, // utime + open, + read, + write, + statfs, + flush, + release, + 0, // fsync + setxattr, + getxattr, + listxattr, + removexattr, + opendir, + readdir, + releasedir, + 0, // fsyncdir + init, + 0, // destroy + 0, // access + 0, // create + ftruncate, + fgetattr, + 0, // lock + utimens, + 0, // bmap + 0, // flag_nullpath_ok + 0, // flag_nopath + 0, // flag_utime_omit_ok + 0, // flag_reserved + 0, // ioctl + 0, // poll + 0, // write_buf + 0, // read_buf + 0, // flock + 0, // fallocate + 0, // reserved00 + 0, // reserved01 + 0, // reserved02 + 0, // statfs_x + 0, // setvolname + 0, // exchange + 0, // getxtimes + 0, // setbkuptime + 0, // setchgtime + setcrtime, +#if defined(FSP_FUSE_USE_STAT_EX) + chflags, +#else + 0, // chflags +#endif + 0, // setattr_x + 0, // fsetattr_x + }; + return fuse_main(argc, argv, &ops, this); + } + +private: + struct node_t + { + node_t(fuse_ino_t ino, fuse_mode_t mode, fuse_uid_t uid, fuse_gid_t gid, fuse_dev_t dev = 0) + : stat() + { + stat.st_ino = ino; + stat.st_mode = mode; + stat.st_nlink = 1; + stat.st_uid = uid; + stat.st_gid = gid; + stat.st_rdev = dev; + stat.st_atim = stat.st_mtim = stat.st_ctim = stat.st_birthtim = now(); + } + + void resize(size_t size, bool capacity) + { + if (capacity) + { + const size_t unit = 64 * 1024; + size_t newcap = (size + unit - 1) / unit * unit; + size_t oldcap = data.capacity(); + if (newcap > oldcap) + data.reserve(newcap); + else if (newcap < oldcap) + { + data.resize(newcap); + data.shrink_to_fit(); + } + } + data.resize(size); + stat.st_size = size; + } + + struct fuse_stat stat; + std::vector data; + std::unordered_map> childmap; + std::unordered_map> xattrmap; + }; + + static fuse_timespec now() + { + using namespace std::chrono; + auto now = system_clock::now(); + auto sec = floor(now); + auto nsec = floor(now) - floor(sec); + return fuse_timespec + { + static_cast(sec.time_since_epoch().count()), + /* std::chrono epoch is UNIX epoch in C++20 */ + static_cast(nsec.count()), + }; + } + + static memfs *getself() + { + return static_cast(fuse_get_context()->private_data); + } + + static int getattr(const char *path, struct fuse_stat *stbuf) + { + return fgetattr(path, stbuf, nullptr); + } + + static int fgetattr(const char *path, struct fuse_stat *stbuf, struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + *stbuf = node->stat; + return 0; + } + + static int readlink(const char *path, char *buf, size_t size) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (S_IFLNK != (node->stat.st_mode & S_IFMT)) + return EINVAL; + size = (std::min)(size - 1, node->data.size()); + std::memcpy(buf, node->data.data(), size); + buf[size] = '\0'; + return 0; + } + + static int mknod(const char *path, fuse_mode_t mode, fuse_dev_t dev) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->make_node(path, mode, dev); + } + + static int mkdir(const char *path, fuse_mode_t mode) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->make_node(path, S_IFDIR | (mode & 07777), 0); + } + + static int unlink(const char *path) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->remove_node(path, false); + } + + static int rmdir(const char *path) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->remove_node(path, true); + } + + static int symlink(const char *dstpath, const char *srcpath) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->make_node(srcpath, S_IFLNK | 00777, 0, dstpath); + } + + static int rename(const char *oldpath, const char *newpath) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto oldlookup = self->lookup_node(oldpath); + auto oldprnt = std::get<0>(oldlookup); + auto oldname = std::get<1>(oldlookup); + auto oldnode = std::get<2>(oldlookup); + if (!oldnode) + return -ENOENT; + auto newlookup = self->lookup_node(newpath); + auto newprnt = std::get<0>(newlookup); + auto newname = std::get<1>(newlookup); + auto newnode = std::get<2>(newlookup); + if (!newprnt) + return -ENOENT; + if (newname.empty()) + // guard against directory loop creation + return -EINVAL; + if (oldprnt == newprnt && oldname == newname) + return 0; + if (newnode) + { + if (int errc = self->remove_node(newpath, S_IFDIR == (oldnode->stat.st_mode & S_IFMT))) + return errc; + } + oldprnt->childmap.erase(oldname); + newprnt->childmap[newname] = oldnode; + return 0; + } + + static int link(const char *oldpath, const char *newpath) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto oldlookup = self->lookup_node(oldpath); + auto oldnode = std::get<2>(oldlookup); + if (!oldnode) + return -ENOENT; + auto newlookup = self->lookup_node(newpath); + auto newprnt = std::get<0>(newlookup); + auto newname = std::get<1>(newlookup); + auto newnode = std::get<2>(newlookup); + if (!newprnt) + return -ENOENT; + if (newnode) + return -EEXIST; + oldnode->stat.st_nlink++; + newprnt->childmap[newname] = oldnode; + oldnode->stat.st_ctim = newprnt->stat.st_ctim = newprnt->stat.st_mtim = now(); + return 0; + } + + static int chmod(const char *path, fuse_mode_t mode) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + node->stat.st_mode = (node->stat.st_mode & S_IFMT) | (mode & 07777); + node->stat.st_ctim = now(); + return 0; + } + + static int chown(const char *path, fuse_uid_t uid, fuse_gid_t gid) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (-1 != uid) + node->stat.st_uid = uid; + if (-1 != gid) + node->stat.st_gid = gid; + node->stat.st_ctim = now(); + return 0; + } + + static int truncate(const char *path, fuse_off_t size) + { + return ftruncate(path, size, nullptr); + } + + static int ftruncate(const char *path, fuse_off_t size, + struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + if (SIZE_MAX < size) + return -EFBIG; + node->resize(static_cast(size), true); + node->stat.st_ctim = node->stat.st_mtim = now(); +#if defined(FSP_FUSE_USE_STAT_EX) + node->stat.st_flags |= UF_ARCHIVE; +#endif + return 0; + } + + static int open(const char *path, struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->open_node(path, false, fi); + } + + static int read(const char *path, char *buf, size_t size, fuse_off_t off, + struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + fuse_off_t endoff = (std::min)( + off + static_cast(size), static_cast(node->data.size())); + if (off > endoff) + return 0; + std::memcpy(buf, node->data.data() + off, static_cast(endoff - off)); + node->stat.st_atim = now(); + return static_cast(endoff - off); + } + + static int write(const char *path, const char *buf, size_t size, fuse_off_t off, + struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + fuse_off_t endoff = off + static_cast(size); + if (SIZE_MAX < endoff) + return -EFBIG; + if (node->data.size() < endoff) + node->resize(static_cast(endoff), true); + std::memcpy(node->data.data() + off, buf, static_cast(endoff - off)); + node->stat.st_ctim = node->stat.st_mtim = now(); +#if defined(FSP_FUSE_USE_STAT_EX) + node->stat.st_flags |= UF_ARCHIVE; +#endif + return static_cast(endoff - off); + } + + static int statfs(const char *path, struct fuse_statvfs *stbuf) + { + std::memset(stbuf, 0, sizeof *stbuf); + return 0; + } + + static int flush(const char *path, struct fuse_file_info *fi) + { + return -ENOSYS; + } + + static int release(const char *path, struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->close_node(fi); + } + + static int setxattr(const char *path, const char *name0, const char *value, size_t size, + int flags) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (0 == std::strcmp("com.apple.ResourceFork", name0)) + return -ENOTSUP; + std::string name = name0; + if (XATTR_CREATE == flags) + { + if (node->xattrmap.end() != node->xattrmap.find(name)) + return -EEXIST; + } + else if (XATTR_REPLACE == flags) + { + if (node->xattrmap.end() == node->xattrmap.find(name)) + return -ENOATTR; + } + node->xattrmap[name].assign(value, value + size); + return 0; + } + + static int getxattr(const char *path, const char *name0, char *value, size_t size) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (0 == std::strcmp("com.apple.ResourceFork", name0)) + return -ENOTSUP; + std::string name = name0; + auto iter = node->xattrmap.find(name); + if (node->xattrmap.end() == iter) + return -ENOATTR; + if (0 != size) + { + if (iter->second.size() > size) + return -ERANGE; + std::memcpy(value, iter->second.data(), iter->second.size()); + } + return static_cast(iter->second.size()); + } + + static int listxattr(const char *path, char *namebuf, size_t size) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + size_t copysize = 0; + for (auto elem : node->xattrmap) + { + size_t namesize = elem.first.size() + 1; + if (0 != size) + { + if (copysize + namesize > size) + return -ERANGE; + std::memcpy(namebuf + copysize, elem.first.c_str(), namesize); + copysize += namesize; + } + } + return static_cast(copysize); + } + + static int removexattr(const char *path, const char *name0) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (0 == std::strcmp("com.apple.ResourceFork", name0)) + return -ENOTSUP; + std::string name = name0; + return node->xattrmap.erase(name) ? 0 : -ENOATTR; + } + + static int opendir(const char *path, struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->open_node(path, true, fi); + } + + static int readdir(const char *path, void *buf, fuse_fill_dir_t filler, fuse_off_t off, + struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + filler(buf, ".", &node->stat, 0); + filler(buf, "..", nullptr, 0); + for (auto elem : node->childmap) + if (0 != filler(buf, elem.first.c_str(), &elem.second->stat, 0)) + break; + return 0; + } + + static int releasedir(const char *path, struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->close_node(fi); + } + + static void *init(struct fuse_conn_info *conn) + { +#if defined(FSP_FUSE_CAP_READDIR_PLUS) + conn->want |= (conn->capable & FSP_FUSE_CAP_READDIR_PLUS); +#endif + +#if defined(FSP_FUSE_USE_STAT_EX) && defined(FSP_FUSE_CAP_STAT_EX) + conn->want |= (conn->capable & FSP_FUSE_CAP_STAT_EX); +#endif + + return getself(); + } + + static int utimens(const char *path, const struct fuse_timespec tmsp[2]) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (tmsp) + { + node->stat.st_ctim = now(); + node->stat.st_atim = tmsp[0]; + node->stat.st_mtim = tmsp[1]; + } + else + node->stat.st_ctim = node->stat.st_atim = node->stat.st_mtim = now(); + return 0; + } + + static int setcrtime(const char *path, const struct fuse_timespec *tmsp) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (tmsp) + { + node->stat.st_ctim = now(); + node->stat.st_birthtim = tmsp[0]; + } + else + node->stat.st_ctim = node->stat.st_birthtim = now(); + return 0; + } + +#if defined(FSP_FUSE_USE_STAT_EX) + static int chflags(const char *path, uint32_t flags) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + node->stat.st_flags = flags; + node->stat.st_ctim = now(); + return 0; + } +#endif + + std::tuple, std::string, std::shared_ptr> + lookup_node(const char *path, node_t *ancestor = nullptr) + { + auto prnt = _root; + std::string name; + auto node = prnt; + for (const char *part = path, *p; *part; part = p + !!(*p)) + { + for (p = part; *p && '/' != *p; p++) + ; + if (part == p) + continue; + prnt = node; + if (!node) + break; + name.assign(part, p); + auto iter = node->childmap.find(name); + node = node->childmap.end() != iter ? iter->second : nullptr; + if (ancestor && node.get() == ancestor) + { + name.assign(""); // special case loop condition + break; + } + } + return std::make_tuple(prnt, name, node); + } + + int make_node(const char *path, fuse_mode_t mode, fuse_dev_t dev, const char *data = nullptr) + { + auto lookup = lookup_node(path); + auto prnt = std::get<0>(lookup); + auto name = std::get<1>(lookup); + auto node = std::get<2>(lookup); + if (!prnt) + return -ENOENT; + if (node) + return -EEXIST; + fuse_context *context = fuse_get_context(); + node = std::make_shared(++_ino, mode, context->uid, context->gid, dev); +#if defined(FSP_FUSE_USE_STAT_EX) + if (S_IFDIR != (mode & S_IFMT)) + node->stat.st_flags |= UF_ARCHIVE; +#endif + if (data) + { + node->resize(std::strlen(data), false); + std::memcpy(node->data.data(), data, node->data.size()); + } + prnt->childmap[name] = node; + prnt->stat.st_ctim = prnt->stat.st_mtim = node->stat.st_ctim; + return 0; + } + + int remove_node(const char *path, bool dir) + { + auto lookup = lookup_node(path); + auto prnt = std::get<0>(lookup); + auto name = std::get<1>(lookup); + auto node = std::get<2>(lookup); + if (!node) + return -ENOENT; + if (!dir && S_IFDIR == (node->stat.st_mode & S_IFMT)) + return -EISDIR; + if (dir && S_IFDIR != (node->stat.st_mode & S_IFMT)) + return -ENOTDIR; + if (0 < node->childmap.size()) + return -ENOTEMPTY; + node->stat.st_nlink--; + prnt->childmap.erase(name); + node->stat.st_ctim = prnt->stat.st_ctim = prnt->stat.st_mtim = now(); + return 0; + } + + int open_node(const char *path, bool dir, struct fuse_file_info *fi) + { + auto node = std::get<2>(lookup_node(path)); + if (!node) + return -ENOENT; + if (!dir && S_IFDIR == (node->stat.st_mode & S_IFMT)) + return -EISDIR; + if (dir && S_IFDIR != (node->stat.st_mode & S_IFMT)) + return -ENOTDIR; + // A file descriptor is a raw pointer to a shared_ptr. + // This has the effect of incrementing the shared_ptr + // refcount, thus keeping an open node around even + // if the node is unlinked. + fi->fh = (uint64_t)(uintptr_t)new std::shared_ptr(node); + return 0; + } + + int close_node(struct fuse_file_info *fi) + { + delete (std::shared_ptr *)(uintptr_t)fi->fh; + return 0; + } + + std::shared_ptr get_node(const char *path, struct fuse_file_info *fi = nullptr) + { + if (!fi) + return std::get<2>(lookup_node(path)); + else + return *(std::shared_ptr *)(uintptr_t)fi->fh; + } + +private: + std::mutex _mutex; + fuse_ino_t _ino; + std::shared_ptr _root; +}; + +int main(int argc, char *argv[]) +{ + return memfs().main(argc, argv); +} diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.sln b/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.sln new file mode 100644 index 00000000..7d83d50e --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "memfs-fuse", "memfs-fuse.vcxproj", "{CF538F42-C714-4653-B351-E72FD7B0B217}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CF538F42-C714-4653-B351-E72FD7B0B217}.Debug|x64.ActiveCfg = Debug|x64 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Debug|x64.Build.0 = Debug|x64 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Debug|x86.ActiveCfg = Debug|Win32 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Debug|x86.Build.0 = Debug|Win32 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Release|x64.ActiveCfg = Release|x64 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Release|x64.Build.0 = Release|x64 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Release|x86.ActiveCfg = Release|Win32 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.vcxproj b/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.vcxproj new file mode 100644 index 00000000..d78f0e8d --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.vcxproj @@ -0,0 +1,189 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {CF538F42-C714-4653-B351-E72FD7B0B217} + Win32Proj + memfsfuse + $(LatestTargetPlatformVersion) + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + + + + Level3 + Disabled + FSP_FUSE_USE_STAT_EX;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreadedDebug + 4018 + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + Level3 + Disabled + FSP_FUSE_USE_STAT_EX;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreadedDebug + 4018 + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + FSP_FUSE_USE_STAT_EX;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4018 + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + FSP_FUSE_USE_STAT_EX;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4018 + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + + + + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.vcxproj.filters b/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.vcxproj.filters new file mode 100644 index 00000000..b9259675 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse/memfs-fuse.vcxproj.filters @@ -0,0 +1,19 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source + + + + + Source + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse3/Makefile b/3rd_party/winfsp-1.10/samples/memfs-fuse3/Makefile new file mode 100644 index 00000000..90e69286 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse3/Makefile @@ -0,0 +1,18 @@ +usage: + @echo "make cygfuse3|winfsp-fuse3" 1>&2 + @echo "" 1>&2 + @echo " cygfuse3 Link with CYGFUSE3" 1>&2 + @echo " winfsp-fuse3 Link with WinFsp-FUSE3" 1>&2 + @exit 2 + +cygfuse3: memfs-cygfuse3 + +winfsp-fuse3: memfs-winfsp-fuse3 + +memfs-cygfuse3: memfs-fuse3.cpp + g++ $^ -o $@ -g -Wall -std=gnu++17 `pkg-config fuse3 --cflags --libs` + +memfs-winfsp-fuse3: export PKG_CONFIG_PATH=$(PWD)/winfsp.install/lib +memfs-winfsp-fuse3: memfs-fuse3.cpp + ln -nsf "`regtool --wow32 get '/HKLM/Software/WinFsp/InstallDir' | cygpath -au -f -`" winfsp.install + g++ $^ -o $@ -g -Wall -std=gnu++17 `pkg-config fuse3 --cflags --libs` diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse3/README.md b/3rd_party/winfsp-1.10/samples/memfs-fuse3/README.md new file mode 100644 index 00000000..ccfc716e --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse3/README.md @@ -0,0 +1,7 @@ +`Memfs-fuse3` is an in-memory FUSE3 file system. + +It can be built with the following tools: + +- Using Visual Studio (`memfs-fuse3.sln`). +- Using Cygwin GCC and linking directly with the WinFsp DLL (`make winfsp-fuse3`). +- Using Cygwin GCC and linking to CYGFUSE3 (`make cygfuse3`). diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse3/compat.h b/3rd_party/winfsp-1.10/samples/memfs-fuse3/compat.h new file mode 100644 index 00000000..30c4b7ee --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse3/compat.h @@ -0,0 +1,104 @@ +/** + * @file compat.h + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef COMPAT_H_INCLUDED +#define COMPAT_H_INCLUDED + +#if defined(_WIN32) && defined(FSP_FUSE_SYM) +#include +#undef fuse_main +#define fuse_main(argc, argv, ops, data)\ + (FspLoad(0), fuse_main_real(argc, argv, ops, sizeof *(ops), data)) +#endif + +#if !defined(_WIN32) && !defined(fuse_stat) + +#define fuse_uid_t uid_t +#define fuse_gid_t gid_t +#define fuse_pid_t pid_t + +#define fuse_dev_t dev_t +#define fuse_mode_t mode_t +#define fuse_nlink_t nlink_t +#define fuse_off_t off_t + +#define fuse_fsblkcnt_t fsblkcnt_t +#define fuse_fsfilcnt_t fsfilcnt_t +#define fuse_blksize_t blksize_t +#define fuse_blkcnt_t blkcnt_t + +#define fuse_timespec timespec + +#define fuse_stat stat + +#define fuse_statvfs statvfs + +#define fuse_flock flock + +#define fuse_iovec iovec + +#endif + +#if !defined(S_IFMT) +#define S_IFMT 0170000 +#endif +#if !defined(S_IFDIR) +#define S_IFDIR 0040000 +#endif +#if !defined(S_IFCHR) +#define S_IFCHR 0020000 +#endif +#if !defined(S_IFBLK) +#define S_IFBLK 0060000 +#endif +#if !defined(S_IFREG) +#define S_IFREG 0100000 +#endif +#if !defined(S_IFLNK) +#define S_IFLNK 0120000 +#endif +#if !defined(S_IFSOCK) +#define S_IFSOCK 0140000 +#endif +#if !defined(S_IFIFO) +#define S_IFIFO 0010000 +#endif + +#if defined(__APPLE__) +#define st_atim st_atimespec +#define st_ctim st_ctimespec +#define st_mtim st_mtimespec +#endif + +#if defined(__APPLE__) || defined(__linux__) || defined(__CYGWIN__) +#include +#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(_WIN32) +#define XATTR_CREATE 1 +#define XATTR_REPLACE 2 +#endif + +#if !defined(ENOATTR) +#define ENOATTR ENODATA +#elif !defined(ENODATA) +#define ENODATA ENOATTR +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.cpp b/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.cpp new file mode 100644 index 00000000..2a92a4a0 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.cpp @@ -0,0 +1,619 @@ +/** + * @file memfs-fuse3.c + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "compat.h" + +class memfs +{ +public: + memfs() : _ino(1), _root(std::make_shared(_ino, S_IFDIR | 00777, 0, 0)) + { + } + + int main(int argc, char *argv[]) + { + static fuse_operations ops = + { + getattr, + readlink, + mknod, + mkdir, + unlink, + rmdir, + symlink, + rename, + link, + chmod, + chown, + truncate, + open, + read, + write, + statfs, + flush, + release, + 0, // fsync + setxattr, + getxattr, + listxattr, + removexattr, + opendir, + readdir, + releasedir, + 0, // fsyncdir + init, + 0, // destroy + 0, // access + 0, // create + 0, // lock + utimens, + 0, // bmap +#if 0 + ioctl, +#endif + }; + return fuse_main(argc, argv, &ops, this); + } + +private: + struct node_t + { + node_t(fuse_ino_t ino, fuse_mode_t mode, fuse_uid_t uid, fuse_gid_t gid, fuse_dev_t dev = 0) + : stat() + { + stat.st_ino = ino; + stat.st_mode = mode; + stat.st_nlink = 1; + stat.st_uid = uid; + stat.st_gid = gid; + stat.st_rdev = dev; + stat.st_atim = stat.st_mtim = stat.st_ctim = now(); + } + + void resize(size_t size, bool capacity) + { + if (capacity) + { + const size_t unit = 64 * 1024; + size_t newcap = (size + unit - 1) / unit * unit; + size_t oldcap = data.capacity(); + if (newcap > oldcap) + data.reserve(newcap); + else if (newcap < oldcap) + { + data.resize(newcap); + data.shrink_to_fit(); + } + } + data.resize(size); + stat.st_size = size; + } + + struct fuse_stat stat; + std::vector data; + std::unordered_map> childmap; + std::unordered_map> xattrmap; + }; + + static fuse_timespec now() + { + using namespace std::chrono; + auto now = system_clock::now(); + auto sec = floor(now); + auto nsec = floor(now) - floor(sec); + return fuse_timespec + { + static_cast(sec.time_since_epoch().count()), + /* std::chrono epoch is UNIX epoch in C++20 */ + static_cast(nsec.count()), + }; + } + + static memfs *getself() + { + return static_cast(fuse_get_context()->private_data); + } + + static int getattr(const char *path, struct fuse_stat *stbuf, struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + *stbuf = node->stat; + return 0; + } + + static int readlink(const char *path, char *buf, size_t size) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (S_IFLNK != (node->stat.st_mode & S_IFMT)) + return EINVAL; + size = (std::min)(size - 1, node->data.size()); + std::memcpy(buf, node->data.data(), size); + buf[size] = '\0'; + return 0; + } + + static int mknod(const char *path, fuse_mode_t mode, fuse_dev_t dev) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->make_node(path, mode, dev); + } + + static int mkdir(const char *path, fuse_mode_t mode) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->make_node(path, S_IFDIR | (mode & 07777), 0); + } + + static int unlink(const char *path) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->remove_node(path, false); + } + + static int rmdir(const char *path) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->remove_node(path, true); + } + + static int symlink(const char *dstpath, const char *srcpath) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->make_node(srcpath, S_IFLNK | 00777, 0, dstpath); + } + + static int rename(const char *oldpath, const char *newpath, unsigned int flags) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto oldlookup = self->lookup_node(oldpath); + auto oldprnt = std::get<0>(oldlookup); + auto oldname = std::get<1>(oldlookup); + auto oldnode = std::get<2>(oldlookup); + if (!oldnode) + return -ENOENT; + auto newlookup = self->lookup_node(newpath); + auto newprnt = std::get<0>(newlookup); + auto newname = std::get<1>(newlookup); + auto newnode = std::get<2>(newlookup); + if (!newprnt) + return -ENOENT; + if (newname.empty()) + // guard against directory loop creation + return -EINVAL; + if (oldprnt == newprnt && oldname == newname) + return 0; + if (newnode) + { + if (int errc = self->remove_node(newpath, S_IFDIR == (oldnode->stat.st_mode & S_IFMT))) + return errc; + } + oldprnt->childmap.erase(oldname); + newprnt->childmap[newname] = oldnode; + return 0; + } + + static int link(const char *oldpath, const char *newpath) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto oldlookup = self->lookup_node(oldpath); + auto oldnode = std::get<2>(oldlookup); + if (!oldnode) + return -ENOENT; + auto newlookup = self->lookup_node(newpath); + auto newprnt = std::get<0>(newlookup); + auto newname = std::get<1>(newlookup); + auto newnode = std::get<2>(newlookup); + if (!newprnt) + return -ENOENT; + if (newnode) + return -EEXIST; + oldnode->stat.st_nlink++; + newprnt->childmap[newname] = oldnode; + oldnode->stat.st_ctim = newprnt->stat.st_ctim = newprnt->stat.st_mtim = now(); + return 0; + } + + static int chmod(const char *path, fuse_mode_t mode, + struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + node->stat.st_mode = (node->stat.st_mode & S_IFMT) | (mode & 07777); + node->stat.st_ctim = now(); + return 0; + } + + static int chown(const char *path, fuse_uid_t uid, fuse_gid_t gid, + struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + if (-1 != uid) + node->stat.st_uid = uid; + if (-1 != gid) + node->stat.st_gid = gid; + node->stat.st_ctim = now(); + return 0; + } + + static int truncate(const char *path, fuse_off_t size, + struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + if (SIZE_MAX < size) + return -EFBIG; + node->resize(static_cast(size), true); + node->stat.st_ctim = node->stat.st_mtim = now(); + return 0; + } + + static int open(const char *path, struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->open_node(path, false, fi); + } + + static int read(const char *path, char *buf, size_t size, fuse_off_t off, + struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + fuse_off_t endoff = (std::min)( + off + static_cast(size), static_cast(node->data.size())); + if (off > endoff) + return 0; + std::memcpy(buf, node->data.data() + off, static_cast(endoff - off)); + node->stat.st_atim = now(); + return static_cast(endoff - off); + } + + static int write(const char *path, const char *buf, size_t size, fuse_off_t off, + struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + fuse_off_t endoff = off + static_cast(size); + if (SIZE_MAX < endoff) + return -EFBIG; + if (node->data.size() < endoff) + node->resize(static_cast(endoff), true); + std::memcpy(node->data.data() + off, buf, static_cast(endoff - off)); + node->stat.st_ctim = node->stat.st_mtim = now(); + return static_cast(endoff - off); + } + + static int statfs(const char *path, struct fuse_statvfs *stbuf) + { + std::memset(stbuf, 0, sizeof *stbuf); + return 0; + } + + static int flush(const char *path, struct fuse_file_info *fi) + { + return -ENOSYS; + } + + static int release(const char *path, struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->close_node(fi); + } + + static int setxattr(const char *path, const char *name0, const char *value, size_t size, + int flags) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (0 == std::strcmp("com.apple.ResourceFork", name0)) + return -ENOTSUP; + std::string name = name0; + if (XATTR_CREATE == flags) + { + if (node->xattrmap.end() != node->xattrmap.find(name)) + return -EEXIST; + } + else if (XATTR_REPLACE == flags) + { + if (node->xattrmap.end() == node->xattrmap.find(name)) + return -ENOATTR; + } + node->xattrmap[name].assign(value, value + size); + return 0; + } + + static int getxattr(const char *path, const char *name0, char *value, size_t size) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (0 == std::strcmp("com.apple.ResourceFork", name0)) + return -ENOTSUP; + std::string name = name0; + auto iter = node->xattrmap.find(name); + if (node->xattrmap.end() == iter) + return -ENOATTR; + if (0 != size) + { + if (iter->second.size() > size) + return -ERANGE; + std::memcpy(value, iter->second.data(), iter->second.size()); + } + return static_cast(iter->second.size()); + } + + static int listxattr(const char *path, char *namebuf, size_t size) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + size_t copysize = 0; + for (auto elem : node->xattrmap) + { + size_t namesize = elem.first.size() + 1; + if (0 != size) + { + if (copysize + namesize > size) + return -ERANGE; + std::memcpy(namebuf + copysize, elem.first.c_str(), namesize); + copysize += namesize; + } + } + return static_cast(copysize); + } + + static int removexattr(const char *path, const char *name0) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path); + if (!node) + return -ENOENT; + if (0 == std::strcmp("com.apple.ResourceFork", name0)) + return -ENOTSUP; + std::string name = name0; + return node->xattrmap.erase(name) ? 0 : -ENOATTR; + } + + static int opendir(const char *path, struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->open_node(path, true, fi); + } + + static int readdir(const char *path, void *buf, fuse_fill_dir_t filler, fuse_off_t off, + struct fuse_file_info *fi, enum fuse_readdir_flags) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + filler(buf, ".", &node->stat, 0, FUSE_FILL_DIR_PLUS); + filler(buf, "..", nullptr, 0, FUSE_FILL_DIR_PLUS); + for (auto elem : node->childmap) + if (0 != filler(buf, elem.first.c_str(), &elem.second->stat, 0, FUSE_FILL_DIR_PLUS)) + break; + return 0; + } + + static int releasedir(const char *path, struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + return self->close_node(fi); + } + + static void *init(struct fuse_conn_info *conn, + struct fuse_config *conf) + { + conn->want |= (conn->capable & FUSE_CAP_READDIRPLUS); + return getself(); + } + + static int utimens(const char *path, const struct fuse_timespec tmsp[2], + struct fuse_file_info *fi) + { + auto self = getself(); + std::lock_guard lock(self->_mutex); + auto node = self->get_node(path, fi); + if (!node) + return -ENOENT; + if (tmsp) + { + node->stat.st_ctim = now(); + node->stat.st_atim = tmsp[0]; + node->stat.st_mtim = tmsp[1]; + } + else + node->stat.st_ctim = node->stat.st_atim = node->stat.st_mtim = now(); + return 0; + } + +#if 0 + static int ioctl(const char *path, int cmd, void *arg, struct fuse_file_info *fi, + unsigned int flags, void *data) + { + return -ENOSYS; + } +#endif + + std::tuple, std::string, std::shared_ptr> + lookup_node(const char *path, node_t *ancestor = nullptr) + { + auto prnt = _root; + std::string name; + auto node = prnt; + for (const char *part = path, *p; *part; part = p + !!(*p)) + { + for (p = part; *p && '/' != *p; p++) + ; + if (part == p) + continue; + prnt = node; + if (!node) + break; + name.assign(part, p); + auto iter = node->childmap.find(name); + node = node->childmap.end() != iter ? iter->second : nullptr; + if (ancestor && node.get() == ancestor) + { + name.assign(""); // special case loop condition + break; + } + } + return std::make_tuple(prnt, name, node); + } + + int make_node(const char *path, fuse_mode_t mode, fuse_dev_t dev, const char *data = nullptr) + { + auto lookup = lookup_node(path); + auto prnt = std::get<0>(lookup); + auto name = std::get<1>(lookup); + auto node = std::get<2>(lookup); + if (!prnt) + return -ENOENT; + if (node) + return -EEXIST; + fuse_context *context = fuse_get_context(); + node = std::make_shared(++_ino, mode, context->uid, context->gid, dev); + if (data) + { + node->resize(std::strlen(data), false); + std::memcpy(node->data.data(), data, node->data.size()); + } + prnt->childmap[name] = node; + prnt->stat.st_ctim = prnt->stat.st_mtim = node->stat.st_ctim; + return 0; + } + + int remove_node(const char *path, bool dir) + { + auto lookup = lookup_node(path); + auto prnt = std::get<0>(lookup); + auto name = std::get<1>(lookup); + auto node = std::get<2>(lookup); + if (!node) + return -ENOENT; + if (!dir && S_IFDIR == (node->stat.st_mode & S_IFMT)) + return -EISDIR; + if (dir && S_IFDIR != (node->stat.st_mode & S_IFMT)) + return -ENOTDIR; + if (0 < node->childmap.size()) + return -ENOTEMPTY; + node->stat.st_nlink--; + prnt->childmap.erase(name); + node->stat.st_ctim = prnt->stat.st_ctim = prnt->stat.st_mtim = now(); + return 0; + } + + int open_node(const char *path, bool dir, struct fuse_file_info *fi) + { + auto node = std::get<2>(lookup_node(path)); + if (!node) + return -ENOENT; + if (!dir && S_IFDIR == (node->stat.st_mode & S_IFMT)) + return -EISDIR; + if (dir && S_IFDIR != (node->stat.st_mode & S_IFMT)) + return -ENOTDIR; + // A file descriptor is a raw pointer to a shared_ptr. + // This has the effect of incrementing the shared_ptr + // refcount, thus keeping an open node around even + // if the node is unlinked. + fi->fh = (uint64_t)(uintptr_t)new std::shared_ptr(node); + return 0; + } + + int close_node(struct fuse_file_info *fi) + { + delete (std::shared_ptr *)(uintptr_t)fi->fh; + return 0; + } + + std::shared_ptr get_node(const char *path, struct fuse_file_info *fi = nullptr) + { + if (!fi) + return std::get<2>(lookup_node(path)); + else + return *(std::shared_ptr *)(uintptr_t)fi->fh; + } + +private: + std::mutex _mutex; + fuse_ino_t _ino; + std::shared_ptr _root; +}; + +int main(int argc, char *argv[]) +{ + return memfs().main(argc, argv); +} diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.sln b/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.sln new file mode 100644 index 00000000..f7312476 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "memfs-fuse3", "memfs-fuse3.vcxproj", "{CF538F42-C714-4653-B351-E72FD7B0B217}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CF538F42-C714-4653-B351-E72FD7B0B217}.Debug|x64.ActiveCfg = Debug|x64 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Debug|x64.Build.0 = Debug|x64 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Debug|x86.ActiveCfg = Debug|Win32 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Debug|x86.Build.0 = Debug|Win32 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Release|x64.ActiveCfg = Release|x64 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Release|x64.Build.0 = Release|x64 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Release|x86.ActiveCfg = Release|Win32 + {CF538F42-C714-4653-B351-E72FD7B0B217}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.vcxproj b/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.vcxproj new file mode 100644 index 00000000..21ad10a3 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.vcxproj @@ -0,0 +1,189 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {CF538F42-C714-4653-B351-E72FD7B0B217} + Win32Proj + memfsfuse3 + $(LatestTargetPlatformVersion) + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse3;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreadedDebug + 4018 + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse3;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreadedDebug + 4018 + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse3;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4018 + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse3;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4018 + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + + + + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.vcxproj.filters b/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.vcxproj.filters new file mode 100644 index 00000000..dfeda1ce --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs-fuse3/memfs-fuse3.vcxproj.filters @@ -0,0 +1,19 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source + + + + + Source + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/memfs/memfs-main.c b/3rd_party/winfsp-1.10/samples/memfs/memfs-main.c new file mode 100644 index 00000000..b5b6e0d5 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs/memfs-main.c @@ -0,0 +1,241 @@ +/** + * @file memfs-main.c + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#include +#include "memfs.h" + +#define PROGNAME "memfs" + +#define info(format, ...) FspServiceLog(EVENTLOG_INFORMATION_TYPE, format, __VA_ARGS__) +#define warn(format, ...) FspServiceLog(EVENTLOG_WARNING_TYPE, format, __VA_ARGS__) +#define fail(format, ...) FspServiceLog(EVENTLOG_ERROR_TYPE, format, __VA_ARGS__) + +#define argtos(v) if (arge > ++argp) v = *argp; else goto usage +#define argtol(v) if (arge > ++argp) v = wcstol_deflt(*argp, v); else goto usage + +static ULONG wcstol_deflt(wchar_t *w, ULONG deflt) +{ + wchar_t *endp; + ULONG ul = wcstol(w, &endp, 0); + return L'\0' != w[0] && L'\0' == *endp ? ul : deflt; +} + +NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) +{ + wchar_t **argp, **arge; + ULONG DebugFlags = 0; + PWSTR DebugLogFile = 0; + ULONG Flags = MemfsDisk; + ULONG OtherFlags = 0; + ULONG FileInfoTimeout = INFINITE; + ULONG MaxFileNodes = 1024; + ULONG MaxFileSize = 16 * 1024 * 1024; + ULONG SlowioMaxDelay = 0; /* -M: maximum slow IO delay in millis */ + ULONG SlowioPercentDelay = 0; /* -P: percent of slow IO to make pending */ + ULONG SlowioRarefyDelay = 0; /* -R: adjust the rarity of pending slow IO */ + PWSTR FileSystemName = 0; + PWSTR MountPoint = 0; + PWSTR VolumePrefix = 0; + PWSTR RootSddl = 0; + HANDLE DebugLogHandle = INVALID_HANDLE_VALUE; + MEMFS *Memfs = 0; + NTSTATUS Result; + + for (argp = argv + 1, arge = argv + argc; arge > argp; argp++) + { + if (L'-' != argp[0][0]) + break; + switch (argp[0][1]) + { + case L'?': + goto usage; + case L'd': + argtol(DebugFlags); + break; + case L'D': + argtos(DebugLogFile); + break; + case L'f': + OtherFlags = MemfsFlushAndPurgeOnCleanup; + break; + case L'F': + argtos(FileSystemName); + break; + case L'i': + OtherFlags = MemfsCaseInsensitive; + break; + case L'm': + argtos(MountPoint); + break; + case L'M': + argtol(SlowioMaxDelay); + break; + case L'n': + argtol(MaxFileNodes); + break; + case L'P': + argtol(SlowioPercentDelay); + break; + case L'R': + argtol(SlowioRarefyDelay); + break; + case L'S': + argtos(RootSddl); + break; + case L's': + argtol(MaxFileSize); + break; + case L't': + argtol(FileInfoTimeout); + break; + case L'u': + argtos(VolumePrefix); + if (0 != VolumePrefix && L'\0' != VolumePrefix[0]) + Flags = MemfsNet; + break; + default: + goto usage; + } + } + + if (arge > argp) + goto usage; + + if (MemfsDisk == Flags && 0 == MountPoint) + goto usage; + + if (0 != DebugLogFile) + { + if (0 == wcscmp(L"-", DebugLogFile)) + DebugLogHandle = GetStdHandle(STD_ERROR_HANDLE); + else + DebugLogHandle = CreateFileW( + DebugLogFile, + FILE_APPEND_DATA, + FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, + OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + 0); + if (INVALID_HANDLE_VALUE == DebugLogHandle) + { + fail(L"cannot open debug log file"); + goto usage; + } + + FspDebugLogSetHandle(DebugLogHandle); + } + + Result = MemfsCreateFunnel( + Flags | OtherFlags, + FileInfoTimeout, + MaxFileNodes, + MaxFileSize, + SlowioMaxDelay, + SlowioPercentDelay, + SlowioRarefyDelay, + FileSystemName, + VolumePrefix, + RootSddl, + &Memfs); + if (!NT_SUCCESS(Result)) + { + fail(L"cannot create MEMFS"); + goto exit; + } + + FspFileSystemSetDebugLog(MemfsFileSystem(Memfs), DebugFlags); + + if (0 != MountPoint && L'\0' != MountPoint[0]) + { + Result = FspFileSystemSetMountPoint(MemfsFileSystem(Memfs), + L'*' == MountPoint[0] && L'\0' == MountPoint[1] ? 0 : MountPoint); + if (!NT_SUCCESS(Result)) + { + fail(L"cannot mount MEMFS"); + goto exit; + } + } + + Result = MemfsStart(Memfs); + if (!NT_SUCCESS(Result)) + { + fail(L"cannot start MEMFS"); + goto exit; + } + + MountPoint = FspFileSystemMountPoint(MemfsFileSystem(Memfs)); + + info(L"%s -t %ld -n %ld -s %ld%s%s%s%s%s%s", + L"" PROGNAME, FileInfoTimeout, MaxFileNodes, MaxFileSize, + RootSddl ? L" -S " : L"", RootSddl ? RootSddl : L"", + 0 != VolumePrefix && L'\0' != VolumePrefix[0] ? L" -u " : L"", + 0 != VolumePrefix && L'\0' != VolumePrefix[0] ? VolumePrefix : L"", + MountPoint ? L" -m " : L"", MountPoint ? MountPoint : L""); + + Service->UserContext = Memfs; + Result = STATUS_SUCCESS; + +exit: + if (!NT_SUCCESS(Result) && 0 != Memfs) + MemfsDelete(Memfs); + + return Result; + +usage: + static wchar_t usage[] = L"" + "usage: %s OPTIONS\n" + "\n" + "options:\n" + " -d DebugFlags [-1: enable all debug logs]\n" + " -D DebugLogFile [file path; use - for stderr]\n" + " -i [case insensitive file system]\n" + " -f [flush and purge cache on cleanup]\n" + " -t FileInfoTimeout [millis]\n" + " -n MaxFileNodes\n" + " -s MaxFileSize [bytes]\n" + " -M MaxDelay [maximum slow IO delay in millis]\n" + " -P PercentDelay [percent of slow IO to make pending]\n" + " -R RarefyDelay [adjust the rarity of pending slow IO]\n" + " -F FileSystemName\n" + " -S RootSddl [file rights: FA, etc; NO generic rights: GA, etc.]\n" + " -u \\Server\\Share [UNC prefix (single backslash)]\n" + " -m MountPoint [X:|* (required if no UNC prefix)]\n"; + + fail(usage, L"" PROGNAME); + + return STATUS_UNSUCCESSFUL; +} + +NTSTATUS SvcStop(FSP_SERVICE *Service) +{ + MEMFS *Memfs = Service->UserContext; + + MemfsStop(Memfs); + MemfsDelete(Memfs); + + return STATUS_SUCCESS; +} + +int wmain(int argc, wchar_t **argv) +{ + return FspServiceRun(L"" PROGNAME, SvcStart, SvcStop, 0); +} diff --git a/3rd_party/winfsp-1.10/samples/memfs/memfs.cpp b/3rd_party/winfsp-1.10/samples/memfs/memfs.cpp new file mode 100644 index 00000000..f72534b9 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs/memfs.cpp @@ -0,0 +1,2509 @@ +/** + * @file memfs.cpp + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#undef _DEBUG +#include "memfs.h" +#include +#include +#include +#include +#include + +/* SLOWIO */ +#include + +#define MEMFS_MAX_PATH 512 +FSP_FSCTL_STATIC_ASSERT(MEMFS_MAX_PATH > MAX_PATH, + "MEMFS_MAX_PATH must be greater than MAX_PATH."); + +/* + * Define the MEMFS_STANDALONE macro when building MEMFS as a standalone file system. + * This macro should be defined in the Visual Studio project settings, Makefile, etc. + */ +//#define MEMFS_STANDALONE + +/* + * Define the MEMFS_NAME_NORMALIZATION macro to include name normalization support. + */ +#define MEMFS_NAME_NORMALIZATION + +/* + * Define the MEMFS_REPARSE_POINTS macro to include reparse points support. + */ +#define MEMFS_REPARSE_POINTS + +/* + * Define the MEMFS_NAMED_STREAMS macro to include named streams support. + */ +#define MEMFS_NAMED_STREAMS + +/* + * Define the MEMFS_DIRINFO_BY_NAME macro to include GetDirInfoByName. + */ +#define MEMFS_DIRINFO_BY_NAME + +/* + * Define the MEMFS_SLOWIO macro to include delayed I/O response support. + */ +#define MEMFS_SLOWIO + +/* + * Define the MEMFS_CONTROL macro to include DeviceControl support. + */ +#define MEMFS_CONTROL + +/* + * Define the MEMFS_EA macro to include extended attributes support. + */ +#define MEMFS_EA + +/* + * Define the MEMFS_WSL macro to include WSLinux support. + */ +#define MEMFS_WSL + +/* + * Define the MEMFS_REJECT_EARLY_IRP macro to reject IRP's sent + * to the file system prior to the dispatcher being started. + */ +#if defined(MEMFS_STANDALONE) +#define MEMFS_REJECT_EARLY_IRP +#endif + +/* + * Define the DEBUG_BUFFER_CHECK macro on Windows 8 or above. This includes + * a check for the Write buffer to ensure that it is read-only. + * + * Since ProcessBuffer support in the FSD, this is no longer a guarantee. + */ +#if !defined(NDEBUG) +//#define DEBUG_BUFFER_CHECK +#endif + +#define MEMFS_SECTOR_SIZE 512 +#define MEMFS_SECTORS_PER_ALLOCATION_UNIT 1 + +/* + * Large Heap Support + */ + +typedef struct +{ + DWORD Options; + SIZE_T InitialSize; + SIZE_T MaximumSize; + SIZE_T Alignment; +} LARGE_HEAP_INITIALIZE_PARAMS; +static INIT_ONCE LargeHeapInitOnce = INIT_ONCE_STATIC_INIT; +static HANDLE LargeHeap; +static SIZE_T LargeHeapAlignment; +static BOOL WINAPI LargeHeapInitOnceF( + PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context) +{ + LARGE_HEAP_INITIALIZE_PARAMS *Params = (LARGE_HEAP_INITIALIZE_PARAMS *)Parameter; + LargeHeap = HeapCreate(Params->Options, Params->InitialSize, Params->MaximumSize); + LargeHeapAlignment = 0 != Params->Alignment ? + FSP_FSCTL_ALIGN_UP(Params->Alignment, 4096) : + 16 * 4096; + return TRUE; +} +static inline +BOOLEAN LargeHeapInitialize( + DWORD Options, + SIZE_T InitialSize, + SIZE_T MaximumSize, + SIZE_T Alignment) +{ + LARGE_HEAP_INITIALIZE_PARAMS Params; + Params.Options = Options; + Params.InitialSize = InitialSize; + Params.MaximumSize = MaximumSize; + Params.Alignment = Alignment; + InitOnceExecuteOnce(&LargeHeapInitOnce, LargeHeapInitOnceF, &Params, 0); + return 0 != LargeHeap; +} +static inline +PVOID LargeHeapAlloc(SIZE_T Size) +{ + return HeapAlloc(LargeHeap, 0, FSP_FSCTL_ALIGN_UP(Size, LargeHeapAlignment)); +} +static inline +PVOID LargeHeapRealloc(PVOID Pointer, SIZE_T Size) +{ + if (0 != Pointer) + { + if (0 != Size) + return HeapReAlloc(LargeHeap, 0, Pointer, FSP_FSCTL_ALIGN_UP(Size, LargeHeapAlignment)); + else + return HeapFree(LargeHeap, 0, Pointer), 0; + } + else + { + if (0 != Size) + return HeapAlloc(LargeHeap, 0, FSP_FSCTL_ALIGN_UP(Size, LargeHeapAlignment)); + else + return 0; + } +} +static inline +VOID LargeHeapFree(PVOID Pointer) +{ + if (0 != Pointer) + HeapFree(LargeHeap, 0, Pointer); +} + +/* + * MEMFS + */ + +static inline +UINT64 MemfsGetSystemTime(VOID) +{ + FILETIME FileTime; + GetSystemTimeAsFileTime(&FileTime); + return ((PLARGE_INTEGER)&FileTime)->QuadPart; +} + +static inline +int MemfsFileNameCompare(PWSTR a, int alen, PWSTR b, int blen, BOOLEAN CaseInsensitive) +{ + PWSTR p, endp, partp, q, endq, partq; + WCHAR c, d; + int plen, qlen, len, res; + + if (-1 == alen) + alen = lstrlenW(a); + if (-1 == blen) + blen = lstrlenW(b); + + for (p = a, endp = p + alen, q = b, endq = q + blen; endp > p && endq > q;) + { + c = d = 0; + for (; endp > p && (L':' == *p || L'\\' == *p); p++) + c = *p; + for (; endq > q && (L':' == *q || L'\\' == *q); q++) + d = *q; + + if (L':' == c) + c = 1; + else if (L'\\' == c) + c = 2; + if (L':' == d) + d = 1; + else if (L'\\' == d) + d = 2; + + res = c - d; + if (0 != res) + return res; + + for (partp = p; endp > p && L':' != *p && L'\\' != *p; p++) + ; + for (partq = q; endq > q && L':' != *q && L'\\' != *q; q++) + ; + + plen = (int)(p - partp); + qlen = (int)(q - partq); + + len = plen < qlen ? plen : qlen; + + if (CaseInsensitive) + { + res = CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, partp, plen, partq, qlen); + if (0 != res) + res -= 2; + else + res = _wcsnicmp(partp, partq, len); + } + else + res = wcsncmp(partp, partq, len); + + if (0 == res) + res = plen - qlen; + + if (0 != res) + return res; + } + + return -(endp <= p) + (endq <= q); +} + +static inline +BOOLEAN MemfsFileNameHasPrefix(PWSTR a, PWSTR b, BOOLEAN CaseInsensitive) +{ + int alen = (int)wcslen(a); + int blen = (int)wcslen(b); + + return alen >= blen && 0 == MemfsFileNameCompare(a, blen, b, blen, CaseInsensitive) && + (alen == blen || (1 == blen && L'\\' == b[0]) || +#if defined(MEMFS_NAMED_STREAMS) + (L'\\' == a[blen] || L':' == a[blen])); +#else + (L'\\' == a[blen])); +#endif +} + +#if defined(MEMFS_EA) +static inline +int MemfsEaNameCompare(PSTR a, PSTR b) +{ + /* EA names are always case-insensitive in MEMFS (to be inline with NTFS) */ + + int res; + + res = CompareStringA(LOCALE_INVARIANT, NORM_IGNORECASE, a, -1, b, -1); + if (0 != res) + res -= 2; + else + res = _stricmp(a, b); + + return res; +} + +struct MEMFS_FILE_NODE_EA_LESS +{ + MEMFS_FILE_NODE_EA_LESS() + { + } + bool operator()(PSTR a, PSTR b) const + { + return 0 > MemfsEaNameCompare(a, b); + } +}; +typedef std::map MEMFS_FILE_NODE_EA_MAP; +#endif + +typedef struct _MEMFS_FILE_NODE +{ + WCHAR FileName[MEMFS_MAX_PATH]; + FSP_FSCTL_FILE_INFO FileInfo; + SIZE_T FileSecuritySize; + PVOID FileSecurity; + PVOID FileData; +#if defined(MEMFS_REPARSE_POINTS) + SIZE_T ReparseDataSize; + PVOID ReparseData; +#endif +#if defined(MEMFS_EA) + MEMFS_FILE_NODE_EA_MAP *EaMap; +#endif + volatile LONG RefCount; +#if defined(MEMFS_NAMED_STREAMS) + struct _MEMFS_FILE_NODE *MainFileNode; +#endif +} MEMFS_FILE_NODE; + +struct MEMFS_FILE_NODE_LESS +{ + MEMFS_FILE_NODE_LESS(BOOLEAN CaseInsensitive) : CaseInsensitive(CaseInsensitive) + { + } + bool operator()(PWSTR a, PWSTR b) const + { + return 0 > MemfsFileNameCompare(a, -1, b, -1, CaseInsensitive); + } + BOOLEAN CaseInsensitive; +}; +typedef std::map MEMFS_FILE_NODE_MAP; + +typedef struct _MEMFS +{ + FSP_FILE_SYSTEM *FileSystem; + MEMFS_FILE_NODE_MAP *FileNodeMap; + ULONG MaxFileNodes; + ULONG MaxFileSize; +#ifdef MEMFS_SLOWIO + ULONG SlowioMaxDelay; + ULONG SlowioPercentDelay; + ULONG SlowioRarefyDelay; + volatile LONG SlowioThreadsRunning; +#endif + UINT16 VolumeLabelLength; + WCHAR VolumeLabel[32]; +} MEMFS; + +static inline +NTSTATUS MemfsFileNodeCreate(PWSTR FileName, MEMFS_FILE_NODE **PFileNode) +{ + static UINT64 IndexNumber = 1; + MEMFS_FILE_NODE *FileNode; + + *PFileNode = 0; + + FileNode = (MEMFS_FILE_NODE *)malloc(sizeof *FileNode); + if (0 == FileNode) + return STATUS_INSUFFICIENT_RESOURCES; + + memset(FileNode, 0, sizeof *FileNode); + wcscpy_s(FileNode->FileName, sizeof FileNode->FileName / sizeof(WCHAR), FileName); + FileNode->FileInfo.CreationTime = + FileNode->FileInfo.LastAccessTime = + FileNode->FileInfo.LastWriteTime = + FileNode->FileInfo.ChangeTime = MemfsGetSystemTime(); + FileNode->FileInfo.IndexNumber = IndexNumber++; + + *PFileNode = FileNode; + + return STATUS_SUCCESS; +} + +#if defined(MEMFS_EA) +static inline +VOID MemfsFileNodeDeleteEaMap(MEMFS_FILE_NODE *FileNode) +{ + if (0 != FileNode->EaMap) + { + for (MEMFS_FILE_NODE_EA_MAP::iterator p = FileNode->EaMap->begin(), q = FileNode->EaMap->end(); + p != q; ++p) + free(p->second); + delete FileNode->EaMap; + FileNode->EaMap = 0; + FileNode->FileInfo.EaSize = 0; + } +} +#endif + +static inline +VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode) +{ +#if defined(MEMFS_EA) + MemfsFileNodeDeleteEaMap(FileNode); +#endif +#if defined(MEMFS_REPARSE_POINTS) + free(FileNode->ReparseData); +#endif + LargeHeapFree(FileNode->FileData); + free(FileNode->FileSecurity); + free(FileNode); +} + +static inline +VOID MemfsFileNodeReference(MEMFS_FILE_NODE *FileNode) +{ + InterlockedIncrement(&FileNode->RefCount); +} + +static inline +VOID MemfsFileNodeDereference(MEMFS_FILE_NODE *FileNode) +{ + if (0 == InterlockedDecrement(&FileNode->RefCount)) + MemfsFileNodeDelete(FileNode); +} + +static inline +VOID MemfsFileNodeGetFileInfo(MEMFS_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo) +{ +#if defined(MEMFS_NAMED_STREAMS) + if (0 == FileNode->MainFileNode) + *FileInfo = FileNode->FileInfo; + else + { + *FileInfo = FileNode->MainFileNode->FileInfo; + FileInfo->FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY; + /* named streams cannot be directories */ + FileInfo->AllocationSize = FileNode->FileInfo.AllocationSize; + FileInfo->FileSize = FileNode->FileInfo.FileSize; + } +#else + *FileInfo = FileNode->FileInfo; +#endif +} + +#if defined(MEMFS_EA) +static inline +NTSTATUS MemfsFileNodeGetEaMap(MEMFS_FILE_NODE *FileNode, MEMFS_FILE_NODE_EA_MAP **PEaMap) +{ +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; +#endif + + *PEaMap = FileNode->EaMap; + if (0 != *PEaMap) + return STATUS_SUCCESS; + + try + { + *PEaMap = FileNode->EaMap = new MEMFS_FILE_NODE_EA_MAP(MEMFS_FILE_NODE_EA_LESS()); + return STATUS_SUCCESS; + } + catch (...) + { + *PEaMap = 0; + return STATUS_INSUFFICIENT_RESOURCES; + } +} + +static inline +NTSTATUS MemfsFileNodeSetEa( + FSP_FILE_SYSTEM *FileSystem, PVOID Context, + PFILE_FULL_EA_INFORMATION Ea) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)Context; + MEMFS_FILE_NODE_EA_MAP *EaMap; + FILE_FULL_EA_INFORMATION *FileNodeEa = 0; + MEMFS_FILE_NODE_EA_MAP::iterator p; + ULONG EaSizePlus = 0, EaSizeMinus = 0; + NTSTATUS Result; + + Result = MemfsFileNodeGetEaMap(FileNode, &EaMap); + if (!NT_SUCCESS(Result)) + return Result; + + if (0 != Ea->EaValueLength) + { + EaSizePlus = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + + Ea->EaNameLength + 1 + Ea->EaValueLength; + FileNodeEa = (FILE_FULL_EA_INFORMATION *)malloc(EaSizePlus); + if (0 == FileNodeEa) + return STATUS_INSUFFICIENT_RESOURCES; + memcpy(FileNodeEa, Ea, EaSizePlus); + FileNodeEa->NextEntryOffset = 0; + + EaSizePlus = FspFileSystemGetEaPackedSize(Ea); + } + + p = EaMap->find(Ea->EaName); + if (p != EaMap->end()) + { + EaSizeMinus = FspFileSystemGetEaPackedSize(Ea); + + free(p->second); + EaMap->erase(p); + } + + if (0 != Ea->EaValueLength) + { + try + { + EaMap->insert(MEMFS_FILE_NODE_EA_MAP::value_type(FileNodeEa->EaName, FileNodeEa)); + } + catch (...) + { + free(FileNodeEa); + return STATUS_INSUFFICIENT_RESOURCES; + } + } + + FileNode->FileInfo.EaSize = FileNode->FileInfo.EaSize + EaSizePlus - EaSizeMinus; + + return STATUS_SUCCESS; +} + +static inline +BOOLEAN MemfsFileNodeNeedEa(MEMFS_FILE_NODE *FileNode) +{ +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; +#endif + + if (0 != FileNode->EaMap) + { + for (MEMFS_FILE_NODE_EA_MAP::iterator p = FileNode->EaMap->begin(), q = FileNode->EaMap->end(); + p != q; ++p) + if (0 != (p->second->Flags & FILE_NEED_EA)) + return TRUE; + } + + return FALSE; +} + +static inline +BOOLEAN MemfsFileNodeEnumerateEa(MEMFS_FILE_NODE *FileNode, + BOOLEAN (*EnumFn)(PFILE_FULL_EA_INFORMATION Ea, PVOID), PVOID Context) +{ +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; +#endif + + if (0 != FileNode->EaMap) + { + for (MEMFS_FILE_NODE_EA_MAP::iterator p = FileNode->EaMap->begin(), q = FileNode->EaMap->end(); + p != q; ++p) + if (!EnumFn(p->second, Context)) + return FALSE; + } + + return TRUE; +} +#endif + +static inline +VOID MemfsFileNodeMapDump(MEMFS_FILE_NODE_MAP *FileNodeMap) +{ + for (MEMFS_FILE_NODE_MAP::iterator p = FileNodeMap->begin(), q = FileNodeMap->end(); p != q; ++p) + FspDebugLog("%c %04lx %6lu %S\n", + FILE_ATTRIBUTE_DIRECTORY & p->second->FileInfo.FileAttributes ? 'd' : 'f', + (ULONG)p->second->FileInfo.FileAttributes, + (ULONG)p->second->FileInfo.FileSize, + p->second->FileName); +} + +static inline +BOOLEAN MemfsFileNodeMapIsCaseInsensitive(MEMFS_FILE_NODE_MAP *FileNodeMap) +{ + return FileNodeMap->key_comp().CaseInsensitive; +} + +static inline +NTSTATUS MemfsFileNodeMapCreate(BOOLEAN CaseInsensitive, MEMFS_FILE_NODE_MAP **PFileNodeMap) +{ + *PFileNodeMap = 0; + try + { + *PFileNodeMap = new MEMFS_FILE_NODE_MAP(MEMFS_FILE_NODE_LESS(CaseInsensitive)); + return STATUS_SUCCESS; + } + catch (...) + { + return STATUS_INSUFFICIENT_RESOURCES; + } +} + +static inline +VOID MemfsFileNodeMapDelete(MEMFS_FILE_NODE_MAP *FileNodeMap) +{ + for (MEMFS_FILE_NODE_MAP::iterator p = FileNodeMap->begin(), q = FileNodeMap->end(); p != q; ++p) + MemfsFileNodeDelete(p->second); + + delete FileNodeMap; +} + +static inline +SIZE_T MemfsFileNodeMapCount(MEMFS_FILE_NODE_MAP *FileNodeMap) +{ + return FileNodeMap->size(); +} + +static inline +MEMFS_FILE_NODE *MemfsFileNodeMapGet(MEMFS_FILE_NODE_MAP *FileNodeMap, PWSTR FileName) +{ + MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->find(FileName); + if (iter == FileNodeMap->end()) + return 0; + return iter->second; +} + +#if defined(MEMFS_NAMED_STREAMS) +static inline +MEMFS_FILE_NODE *MemfsFileNodeMapGetMain(MEMFS_FILE_NODE_MAP *FileNodeMap, PWSTR FileName0) +{ + WCHAR FileName[MEMFS_MAX_PATH]; + wcscpy_s(FileName, sizeof FileName / sizeof(WCHAR), FileName0); + PWSTR StreamName = wcschr(FileName, L':'); + if (0 == StreamName) + return 0; + StreamName[0] = L'\0'; + MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->find(FileName); + if (iter == FileNodeMap->end()) + return 0; + return iter->second; +} +#endif + +static inline +MEMFS_FILE_NODE *MemfsFileNodeMapGetParent(MEMFS_FILE_NODE_MAP *FileNodeMap, PWSTR FileName0, + PNTSTATUS PResult) +{ + WCHAR Root[2] = L"\\"; + PWSTR Remain, Suffix; + WCHAR FileName[MEMFS_MAX_PATH]; + wcscpy_s(FileName, sizeof FileName / sizeof(WCHAR), FileName0); + FspPathSuffix(FileName, &Remain, &Suffix, Root); + MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->find(Remain); + FspPathCombine(FileName, Suffix); + if (iter == FileNodeMap->end()) + { + *PResult = STATUS_OBJECT_PATH_NOT_FOUND; + return 0; + } + if (0 == (iter->second->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + *PResult = STATUS_NOT_A_DIRECTORY; + return 0; + } + return iter->second; +} + +static inline +VOID MemfsFileNodeMapTouchParent(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_FILE_NODE *FileNode) +{ + NTSTATUS Result; + MEMFS_FILE_NODE *Parent; + if (L'\\' == FileNode->FileName[0] && L'\0' == FileNode->FileName[1]) + return; + Parent = MemfsFileNodeMapGetParent(FileNodeMap, FileNode->FileName, &Result); + if (0 == Parent) + return; + Parent->FileInfo.LastAccessTime = + Parent->FileInfo.LastWriteTime = + Parent->FileInfo.ChangeTime = MemfsGetSystemTime(); +} + +static inline +NTSTATUS MemfsFileNodeMapInsert(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_FILE_NODE *FileNode, + PBOOLEAN PInserted) +{ + *PInserted = 0; + try + { + *PInserted = FileNodeMap->insert(MEMFS_FILE_NODE_MAP::value_type(FileNode->FileName, FileNode)).second; + if (*PInserted) + { + MemfsFileNodeReference(FileNode); + MemfsFileNodeMapTouchParent(FileNodeMap, FileNode); + } + return STATUS_SUCCESS; + } + catch (...) + { + return STATUS_INSUFFICIENT_RESOURCES; + } +} + +static inline +VOID MemfsFileNodeMapRemove(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_FILE_NODE *FileNode) +{ + if (FileNodeMap->erase(FileNode->FileName)) + { + MemfsFileNodeMapTouchParent(FileNodeMap, FileNode); + MemfsFileNodeDereference(FileNode); + } +} + +static inline +BOOLEAN MemfsFileNodeMapHasChild(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_FILE_NODE *FileNode) +{ + BOOLEAN Result = FALSE; + WCHAR Root[2] = L"\\"; + PWSTR Remain, Suffix; + MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->upper_bound(FileNode->FileName); + for (; FileNodeMap->end() != iter; ++iter) + { +#if defined(MEMFS_NAMED_STREAMS) + if (0 != wcschr(iter->second->FileName, L':')) + continue; +#endif + FspPathSuffix(iter->second->FileName, &Remain, &Suffix, Root); + Result = 0 == MemfsFileNameCompare(Remain, -1, FileNode->FileName, -1, + MemfsFileNodeMapIsCaseInsensitive(FileNodeMap)); + FspPathCombine(iter->second->FileName, Suffix); + break; + } + return Result; +} + +static inline +BOOLEAN MemfsFileNodeMapEnumerateChildren(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_FILE_NODE *FileNode, + PWSTR PrevFileName0, BOOLEAN (*EnumFn)(MEMFS_FILE_NODE *, PVOID), PVOID Context) +{ + WCHAR Root[2] = L"\\"; + PWSTR Remain, Suffix; + MEMFS_FILE_NODE_MAP::iterator iter; + BOOLEAN IsDirectoryChild; + if (0 != PrevFileName0) + { + WCHAR PrevFileName[MEMFS_MAX_PATH + 256]; + size_t Length0 = wcslen(FileNode->FileName); + size_t Length1 = 1 != Length0 || L'\\' != FileNode->FileName[0]; + size_t Length2 = wcslen(PrevFileName0); + assert(MEMFS_MAX_PATH + 256 > Length0 + Length1 + Length2); + memcpy(PrevFileName, FileNode->FileName, Length0 * sizeof(WCHAR)); + memcpy(PrevFileName + Length0, L"\\", Length1 * sizeof(WCHAR)); + memcpy(PrevFileName + Length0 + Length1, PrevFileName0, Length2 * sizeof(WCHAR)); + PrevFileName[Length0 + Length1 + Length2] = L'\0'; + iter = FileNodeMap->upper_bound(PrevFileName); + } + else + iter = FileNodeMap->upper_bound(FileNode->FileName); + for (; FileNodeMap->end() != iter; ++iter) + { + if (!MemfsFileNameHasPrefix(iter->second->FileName, FileNode->FileName, + MemfsFileNodeMapIsCaseInsensitive(FileNodeMap))) + break; + FspPathSuffix(iter->second->FileName, &Remain, &Suffix, Root); + IsDirectoryChild = 0 == MemfsFileNameCompare(Remain, -1, FileNode->FileName, -1, + MemfsFileNodeMapIsCaseInsensitive(FileNodeMap)); +#if defined(MEMFS_NAMED_STREAMS) + IsDirectoryChild = IsDirectoryChild && 0 == wcschr(Suffix, L':'); +#endif + FspPathCombine(iter->second->FileName, Suffix); + if (IsDirectoryChild) + { + if (!EnumFn(iter->second, Context)) + return FALSE; + } + } + return TRUE; +} + +#if defined(MEMFS_NAMED_STREAMS) +static inline +BOOLEAN MemfsFileNodeMapEnumerateNamedStreams(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_FILE_NODE *FileNode, + BOOLEAN (*EnumFn)(MEMFS_FILE_NODE *, PVOID), PVOID Context) +{ + MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->upper_bound(FileNode->FileName); + for (; FileNodeMap->end() != iter; ++iter) + { + if (!MemfsFileNameHasPrefix(iter->second->FileName, FileNode->FileName, + MemfsFileNodeMapIsCaseInsensitive(FileNodeMap))) + break; + if (L':' != iter->second->FileName[wcslen(FileNode->FileName)]) + break; + if (!EnumFn(iter->second, Context)) + return FALSE; + } + return TRUE; +} +#endif + +static inline +BOOLEAN MemfsFileNodeMapEnumerateDescendants(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_FILE_NODE *FileNode, + BOOLEAN (*EnumFn)(MEMFS_FILE_NODE *, PVOID), PVOID Context) +{ + WCHAR Root[2] = L"\\"; + MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->lower_bound(FileNode->FileName); + for (; FileNodeMap->end() != iter; ++iter) + { + if (!MemfsFileNameHasPrefix(iter->second->FileName, FileNode->FileName, + MemfsFileNodeMapIsCaseInsensitive(FileNodeMap))) + break; + if (!EnumFn(iter->second, Context)) + return FALSE; + } + return TRUE; +} + +typedef struct _MEMFS_FILE_NODE_MAP_ENUM_CONTEXT +{ + BOOLEAN Reference; + MEMFS_FILE_NODE **FileNodes; + ULONG Capacity, Count; +} MEMFS_FILE_NODE_MAP_ENUM_CONTEXT; + +static inline +BOOLEAN MemfsFileNodeMapEnumerateFn(MEMFS_FILE_NODE *FileNode, PVOID Context0) +{ + MEMFS_FILE_NODE_MAP_ENUM_CONTEXT *Context = (MEMFS_FILE_NODE_MAP_ENUM_CONTEXT *)Context0; + + if (Context->Capacity <= Context->Count) + { + ULONG Capacity = 0 != Context->Capacity ? Context->Capacity * 2 : 16; + PVOID P = realloc(Context->FileNodes, Capacity * sizeof Context->FileNodes[0]); + if (0 == P) + { + FspDebugLog(__FUNCTION__ ": cannot allocate memory; aborting\n"); + abort(); + } + + Context->FileNodes = (MEMFS_FILE_NODE **)P; + Context->Capacity = Capacity; + } + + Context->FileNodes[Context->Count++] = FileNode; + if (Context->Reference) + MemfsFileNodeReference(FileNode); + + return TRUE; +} + +static inline +VOID MemfsFileNodeMapEnumerateFree(MEMFS_FILE_NODE_MAP_ENUM_CONTEXT *Context) +{ + if (Context->Reference) + { + for (ULONG Index = 0; Context->Count > Index; Index++) + { + MEMFS_FILE_NODE *FileNode = Context->FileNodes[Index]; + MemfsFileNodeDereference(FileNode); + } + } + free(Context->FileNodes); +} + +#ifdef MEMFS_SLOWIO +/* + * SLOWIO + * + * This is included for two uses: + * + * 1) For testing winfsp, by allowing memfs to act more like a non-ram file system, + * with some IO taking many milliseconds, and some IO completion delayed. + * + * 2) As sample code for how to use winfsp's STATUS_PENDING capabilities. + * + */ + +static inline UINT64 Hash(UINT64 x) +{ + x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9ull; + x = (x ^ (x >> 27)) * 0x94d049bb133111ebull; + x = x ^ (x >> 31); + return x; +} + +static inline ULONG PseudoRandom(ULONG to) +{ + /* John Oberschelp's PRNG */ + static UINT64 spin = 0; + InterlockedIncrement(&spin); + return Hash(spin) % to; +} + +static inline BOOLEAN SlowioReturnPending(FSP_FILE_SYSTEM *FileSystem) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + if (0 == Memfs->SlowioMaxDelay) + return FALSE; + return PseudoRandom(100) < Memfs->SlowioPercentDelay; +} + +static inline VOID SlowioSnooze(FSP_FILE_SYSTEM *FileSystem) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + if (0 == Memfs->SlowioMaxDelay) + return; + ULONG millis = PseudoRandom(Memfs->SlowioMaxDelay + 1) >> PseudoRandom(Memfs->SlowioRarefyDelay + 1); + Sleep(millis); +} + +void SlowioReadThread( + FSP_FILE_SYSTEM *FileSystem, + MEMFS_FILE_NODE *FileNode, + PVOID Buffer, + UINT64 Offset, + UINT64 EndOffset, + UINT64 RequestHint) +{ + SlowioSnooze(FileSystem); + + memcpy(Buffer, (PUINT8)FileNode->FileData + Offset, (size_t)(EndOffset - Offset)); + UINT32 BytesTransferred = (ULONG)(EndOffset - Offset); + + FSP_FSCTL_TRANSACT_RSP ResponseBuf; + memset(&ResponseBuf, 0, sizeof ResponseBuf); + ResponseBuf.Size = sizeof ResponseBuf; + ResponseBuf.Kind = FspFsctlTransactReadKind; + ResponseBuf.Hint = RequestHint; // IRP that is being completed + ResponseBuf.IoStatus.Status = STATUS_SUCCESS; + ResponseBuf.IoStatus.Information = BytesTransferred; // bytes read + FspFileSystemSendResponse(FileSystem, &ResponseBuf); + + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + InterlockedDecrement(&Memfs->SlowioThreadsRunning); +} + +void SlowioWriteThread( + FSP_FILE_SYSTEM *FileSystem, + MEMFS_FILE_NODE *FileNode, + PVOID Buffer, + UINT64 Offset, + UINT64 EndOffset, + UINT64 RequestHint) +{ + SlowioSnooze(FileSystem); + + memcpy((PUINT8)FileNode->FileData + Offset, Buffer, (size_t)(EndOffset - Offset)); + UINT32 BytesTransferred = (ULONG)(EndOffset - Offset); + + FSP_FSCTL_TRANSACT_RSP ResponseBuf; + memset(&ResponseBuf, 0, sizeof ResponseBuf); + ResponseBuf.Size = sizeof ResponseBuf; + ResponseBuf.Kind = FspFsctlTransactWriteKind; + ResponseBuf.Hint = RequestHint; // IRP that is being completed + ResponseBuf.IoStatus.Status = STATUS_SUCCESS; + ResponseBuf.IoStatus.Information = BytesTransferred; // bytes written + MemfsFileNodeGetFileInfo(FileNode, &ResponseBuf.Rsp.Write.FileInfo); + FspFileSystemSendResponse(FileSystem, &ResponseBuf); + + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + InterlockedDecrement(&Memfs->SlowioThreadsRunning); +} + +void SlowioReadDirectoryThread( + FSP_FILE_SYSTEM *FileSystem, + ULONG BytesTransferred, + UINT64 RequestHint) +{ + SlowioSnooze(FileSystem); + + FSP_FSCTL_TRANSACT_RSP ResponseBuf; + memset(&ResponseBuf, 0, sizeof ResponseBuf); + ResponseBuf.Size = sizeof ResponseBuf; + ResponseBuf.Kind = FspFsctlTransactQueryDirectoryKind; + ResponseBuf.Hint = RequestHint; // IRP that is being completed + ResponseBuf.IoStatus.Status = STATUS_SUCCESS; + ResponseBuf.IoStatus.Information = BytesTransferred; // bytes of directory info read + FspFileSystemSendResponse(FileSystem, &ResponseBuf); + + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + InterlockedDecrement(&Memfs->SlowioThreadsRunning); +} +#endif + +/* + * FSP_FILE_SYSTEM_INTERFACE + */ + +#if defined(MEMFS_REPARSE_POINTS) +static NTSTATUS GetReparsePointByName( + FSP_FILE_SYSTEM *FileSystem, PVOID Context, + PWSTR FileName, BOOLEAN IsDirectory, PVOID Buffer, PSIZE_T PSize); +#endif + +static NTSTATUS SetFileSizeInternal(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, UINT64 NewSize, BOOLEAN SetAllocationSize); + +static NTSTATUS GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_VOLUME_INFO *VolumeInfo) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + + VolumeInfo->TotalSize = Memfs->MaxFileNodes * (UINT64)Memfs->MaxFileSize; + VolumeInfo->FreeSize = (Memfs->MaxFileNodes - MemfsFileNodeMapCount(Memfs->FileNodeMap)) * + (UINT64)Memfs->MaxFileSize; + VolumeInfo->VolumeLabelLength = Memfs->VolumeLabelLength; + memcpy(VolumeInfo->VolumeLabel, Memfs->VolumeLabel, Memfs->VolumeLabelLength); + + return STATUS_SUCCESS; +} + +static NTSTATUS SetVolumeLabel(FSP_FILE_SYSTEM *FileSystem, + PWSTR VolumeLabel, + FSP_FSCTL_VOLUME_INFO *VolumeInfo) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + + Memfs->VolumeLabelLength = (UINT16)(wcslen(VolumeLabel) * sizeof(WCHAR)); + if (Memfs->VolumeLabelLength > sizeof Memfs->VolumeLabel) + Memfs->VolumeLabelLength = sizeof Memfs->VolumeLabel; + memcpy(Memfs->VolumeLabel, VolumeLabel, Memfs->VolumeLabelLength); + + VolumeInfo->TotalSize = Memfs->MaxFileNodes * Memfs->MaxFileSize; + VolumeInfo->FreeSize = + (Memfs->MaxFileNodes - MemfsFileNodeMapCount(Memfs->FileNodeMap)) * Memfs->MaxFileSize; + VolumeInfo->VolumeLabelLength = Memfs->VolumeLabelLength; + memcpy(VolumeInfo->VolumeLabel, Memfs->VolumeLabel, Memfs->VolumeLabelLength); + + return STATUS_SUCCESS; +} + +static NTSTATUS GetSecurityByName(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, PUINT32 PFileAttributes, + PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode; + NTSTATUS Result; + + FileNode = MemfsFileNodeMapGet(Memfs->FileNodeMap, FileName); + if (0 == FileNode) + { + Result = STATUS_OBJECT_NAME_NOT_FOUND; + +#if defined(MEMFS_REPARSE_POINTS) + if (FspFileSystemFindReparsePoint(FileSystem, GetReparsePointByName, 0, + FileName, PFileAttributes)) + Result = STATUS_REPARSE; + else +#endif + MemfsFileNodeMapGetParent(Memfs->FileNodeMap, FileName, &Result); + + return Result; + } + +#if defined(MEMFS_NAMED_STREAMS) + UINT32 FileAttributesMask = ~(UINT32)0; + if (0 != FileNode->MainFileNode) + { + FileAttributesMask = ~(UINT32)FILE_ATTRIBUTE_DIRECTORY; + FileNode = FileNode->MainFileNode; + } + + if (0 != PFileAttributes) + *PFileAttributes = FileNode->FileInfo.FileAttributes & FileAttributesMask; +#else + if (0 != PFileAttributes) + *PFileAttributes = FileNode->FileInfo.FileAttributes; +#endif + + if (0 != PSecurityDescriptorSize) + { + if (FileNode->FileSecuritySize > *PSecurityDescriptorSize) + { + *PSecurityDescriptorSize = FileNode->FileSecuritySize; + return STATUS_BUFFER_OVERFLOW; + } + + *PSecurityDescriptorSize = FileNode->FileSecuritySize; + if (0 != SecurityDescriptor) + memcpy(SecurityDescriptor, FileNode->FileSecurity, FileNode->FileSecuritySize); + } + + return STATUS_SUCCESS; +} + +static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess, + UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, +#if defined(MEMFS_EA) || defined(MEMFS_WSL) + PVOID ExtraBuffer, ULONG ExtraLength, BOOLEAN ExtraBufferIsReparsePoint, +#endif + PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; +#if defined(MEMFS_NAME_NORMALIZATION) + WCHAR FileNameBuf[MEMFS_MAX_PATH]; +#endif + MEMFS_FILE_NODE *FileNode; + MEMFS_FILE_NODE *ParentNode; + NTSTATUS Result; + BOOLEAN Inserted; + + if (MEMFS_MAX_PATH <= wcslen(FileName)) + return STATUS_OBJECT_NAME_INVALID; + + if (CreateOptions & FILE_DIRECTORY_FILE) + AllocationSize = 0; + + FileNode = MemfsFileNodeMapGet(Memfs->FileNodeMap, FileName); + if (0 != FileNode) + return STATUS_OBJECT_NAME_COLLISION; + + ParentNode = MemfsFileNodeMapGetParent(Memfs->FileNodeMap, FileName, &Result); + if (0 == ParentNode) + return Result; + + if (MemfsFileNodeMapCount(Memfs->FileNodeMap) >= Memfs->MaxFileNodes) + return STATUS_CANNOT_MAKE; + + if (AllocationSize > Memfs->MaxFileSize) + return STATUS_DISK_FULL; + +#if defined(MEMFS_NAME_NORMALIZATION) + if (MemfsFileNodeMapIsCaseInsensitive(Memfs->FileNodeMap)) + { + WCHAR Root[2] = L"\\"; + PWSTR Remain, Suffix; + size_t RemainLength, BSlashLength, SuffixLength; + + FspPathSuffix(FileName, &Remain, &Suffix, Root); + assert(0 == MemfsFileNameCompare(Remain, -1, ParentNode->FileName, -1, TRUE)); + FspPathCombine(FileName, Suffix); + + RemainLength = wcslen(ParentNode->FileName); + BSlashLength = 1 < RemainLength; + SuffixLength = wcslen(Suffix); + if (MEMFS_MAX_PATH <= RemainLength + BSlashLength + SuffixLength) + return STATUS_OBJECT_NAME_INVALID; + + memcpy(FileNameBuf, ParentNode->FileName, RemainLength * sizeof(WCHAR)); + memcpy(FileNameBuf + RemainLength, L"\\", BSlashLength * sizeof(WCHAR)); + memcpy(FileNameBuf + RemainLength + BSlashLength, Suffix, (SuffixLength + 1) * sizeof(WCHAR)); + + FileName = FileNameBuf; + } +#endif + + Result = MemfsFileNodeCreate(FileName, &FileNode); + if (!NT_SUCCESS(Result)) + return Result; + +#if defined(MEMFS_NAMED_STREAMS) + FileNode->MainFileNode = MemfsFileNodeMapGetMain(Memfs->FileNodeMap, FileName); +#endif + + FileNode->FileInfo.FileAttributes = (FileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? + FileAttributes : FileAttributes | FILE_ATTRIBUTE_ARCHIVE; + + if (0 != SecurityDescriptor) + { + FileNode->FileSecuritySize = GetSecurityDescriptorLength(SecurityDescriptor); + FileNode->FileSecurity = (PSECURITY_DESCRIPTOR)malloc(FileNode->FileSecuritySize); + if (0 == FileNode->FileSecurity) + { + MemfsFileNodeDelete(FileNode); + return STATUS_INSUFFICIENT_RESOURCES; + } + memcpy(FileNode->FileSecurity, SecurityDescriptor, FileNode->FileSecuritySize); + } + +#if defined(MEMFS_EA) || defined(MEMFS_WSL) + if (0 != ExtraBuffer) + { +#if defined(MEMFS_EA) + if (!ExtraBufferIsReparsePoint) + { + Result = FspFileSystemEnumerateEa(FileSystem, MemfsFileNodeSetEa, FileNode, + (PFILE_FULL_EA_INFORMATION)ExtraBuffer, ExtraLength); + if (!NT_SUCCESS(Result)) + { + MemfsFileNodeDelete(FileNode); + return Result; + } + } +#endif +#if defined(MEMFS_WSL) + if (ExtraBufferIsReparsePoint) + { +#if defined(MEMFS_REPARSE_POINTS) + FileNode->ReparseDataSize = ExtraLength; + FileNode->ReparseData = malloc(ExtraLength); + if (0 == FileNode->ReparseData && 0 != ExtraLength) + { + MemfsFileNodeDelete(FileNode); + return STATUS_INSUFFICIENT_RESOURCES; + } + + FileNode->FileInfo.FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT; + FileNode->FileInfo.ReparseTag = *(PULONG)ExtraBuffer; + /* the first field in a reparse buffer is the reparse tag */ + memcpy(FileNode->ReparseData, ExtraBuffer, ExtraLength); +#else + MemfsFileNodeDelete(FileNode); + return STATUS_INVALID_PARAMETER; +#endif + } +#endif + } +#endif + + FileNode->FileInfo.AllocationSize = AllocationSize; + if (0 != FileNode->FileInfo.AllocationSize) + { + FileNode->FileData = LargeHeapAlloc((size_t)FileNode->FileInfo.AllocationSize); + if (0 == FileNode->FileData) + { + MemfsFileNodeDelete(FileNode); + return STATUS_INSUFFICIENT_RESOURCES; + } + } + + Result = MemfsFileNodeMapInsert(Memfs->FileNodeMap, FileNode, &Inserted); + if (!NT_SUCCESS(Result) || !Inserted) + { + MemfsFileNodeDelete(FileNode); + if (NT_SUCCESS(Result)) + Result = STATUS_OBJECT_NAME_COLLISION; /* should not happen! */ + return Result; + } + + MemfsFileNodeReference(FileNode); + *PFileNode = FileNode; + MemfsFileNodeGetFileInfo(FileNode, FileInfo); + +#if defined(MEMFS_NAME_NORMALIZATION) + if (MemfsFileNodeMapIsCaseInsensitive(Memfs->FileNodeMap)) + { + FSP_FSCTL_OPEN_FILE_INFO *OpenFileInfo = FspFileSystemGetOpenFileInfo(FileInfo); + + wcscpy_s(OpenFileInfo->NormalizedName, OpenFileInfo->NormalizedNameSize / sizeof(WCHAR), + FileNode->FileName); + OpenFileInfo->NormalizedNameSize = (UINT16)(wcslen(FileNode->FileName) * sizeof(WCHAR)); + } +#endif + + return STATUS_SUCCESS; +} + +static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess, + PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode; + NTSTATUS Result; + + if (MEMFS_MAX_PATH <= wcslen(FileName)) + return STATUS_OBJECT_NAME_INVALID; + + FileNode = MemfsFileNodeMapGet(Memfs->FileNodeMap, FileName); + if (0 == FileNode) + { + Result = STATUS_OBJECT_NAME_NOT_FOUND; + MemfsFileNodeMapGetParent(Memfs->FileNodeMap, FileName, &Result); + return Result; + } + +#if defined(MEMFS_EA) + /* if the OP specified no EA's check the need EA count, but only if accessing main stream */ + if (0 != (CreateOptions & FILE_NO_EA_KNOWLEDGE) +#if defined(MEMFS_NAMED_STREAMS) + && (0 == FileNode->MainFileNode) +#endif + ) + { + if (MemfsFileNodeNeedEa(FileNode)) + { + Result = STATUS_ACCESS_DENIED; + return Result; + } + } +#endif + + MemfsFileNodeReference(FileNode); + *PFileNode = FileNode; + MemfsFileNodeGetFileInfo(FileNode, FileInfo); + +#if defined(MEMFS_NAME_NORMALIZATION) + if (MemfsFileNodeMapIsCaseInsensitive(Memfs->FileNodeMap)) + { + FSP_FSCTL_OPEN_FILE_INFO *OpenFileInfo = FspFileSystemGetOpenFileInfo(FileInfo); + + wcscpy_s(OpenFileInfo->NormalizedName, OpenFileInfo->NormalizedNameSize / sizeof(WCHAR), + FileNode->FileName); + OpenFileInfo->NormalizedNameSize = (UINT16)(wcslen(FileNode->FileName) * sizeof(WCHAR)); + } +#endif + + return STATUS_SUCCESS; +} + +static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize, +#if defined(MEMFS_EA) + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength, +#endif + FSP_FSCTL_FILE_INFO *FileInfo) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + NTSTATUS Result; + +#if defined(MEMFS_NAMED_STREAMS) + MEMFS_FILE_NODE_MAP_ENUM_CONTEXT Context = { TRUE }; + ULONG Index; + + MemfsFileNodeMapEnumerateNamedStreams(Memfs->FileNodeMap, FileNode, + MemfsFileNodeMapEnumerateFn, &Context); + for (Index = 0; Context.Count > Index; Index++) + { + LONG RefCount = Context.FileNodes[Index]->RefCount; + MemoryBarrier(); + if (2 >= RefCount) + MemfsFileNodeMapRemove(Memfs->FileNodeMap, Context.FileNodes[Index]); + } + MemfsFileNodeMapEnumerateFree(&Context); +#endif + +#if defined(MEMFS_EA) + MemfsFileNodeDeleteEaMap(FileNode); + if (0 != Ea) + { + Result = FspFileSystemEnumerateEa(FileSystem, MemfsFileNodeSetEa, FileNode, Ea, EaLength); + if (!NT_SUCCESS(Result)) + return Result; + } +#endif + + Result = SetFileSizeInternal(FileSystem, FileNode, AllocationSize, TRUE); + if (!NT_SUCCESS(Result)) + return Result; + + if (ReplaceFileAttributes) + FileNode->FileInfo.FileAttributes = FileAttributes | FILE_ATTRIBUTE_ARCHIVE; + else + FileNode->FileInfo.FileAttributes |= FileAttributes | FILE_ATTRIBUTE_ARCHIVE; + + FileNode->FileInfo.FileSize = 0; + FileNode->FileInfo.LastAccessTime = + FileNode->FileInfo.LastWriteTime = + FileNode->FileInfo.ChangeTime = MemfsGetSystemTime(); + + MemfsFileNodeGetFileInfo(FileNode, FileInfo); + + return STATUS_SUCCESS; +} + +static VOID Cleanup(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, PWSTR FileName, ULONG Flags) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; +#if defined(MEMFS_NAMED_STREAMS) + MEMFS_FILE_NODE *MainFileNode = 0 != FileNode->MainFileNode ? + FileNode->MainFileNode : FileNode; +#else + MEMFS_FILE_NODE *MainFileNode = FileNode; +#endif + + assert(0 != Flags); /* FSP_FSCTL_VOLUME_PARAMS::PostCleanupWhenModifiedOnly ensures this */ + + if (Flags & FspCleanupSetArchiveBit) + { + if (0 == (MainFileNode->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + MainFileNode->FileInfo.FileAttributes |= FILE_ATTRIBUTE_ARCHIVE; + } + + if (Flags & (FspCleanupSetLastAccessTime | FspCleanupSetLastWriteTime | FspCleanupSetChangeTime)) + { + UINT64 SystemTime = MemfsGetSystemTime(); + + if (Flags & FspCleanupSetLastAccessTime) + MainFileNode->FileInfo.LastAccessTime = SystemTime; + if (Flags & FspCleanupSetLastWriteTime) + MainFileNode->FileInfo.LastWriteTime = SystemTime; + if (Flags & FspCleanupSetChangeTime) + MainFileNode->FileInfo.ChangeTime = SystemTime; + } + + if (Flags & FspCleanupSetAllocationSize) + { + UINT64 AllocationUnit = MEMFS_SECTOR_SIZE * MEMFS_SECTORS_PER_ALLOCATION_UNIT; + UINT64 AllocationSize = (FileNode->FileInfo.FileSize + AllocationUnit - 1) / + AllocationUnit * AllocationUnit; + + SetFileSizeInternal(FileSystem, FileNode, AllocationSize, TRUE); + } + + if ((Flags & FspCleanupDelete) && !MemfsFileNodeMapHasChild(Memfs->FileNodeMap, FileNode)) + { +#if defined(MEMFS_NAMED_STREAMS) + MEMFS_FILE_NODE_MAP_ENUM_CONTEXT Context = { FALSE }; + ULONG Index; + + MemfsFileNodeMapEnumerateNamedStreams(Memfs->FileNodeMap, FileNode, + MemfsFileNodeMapEnumerateFn, &Context); + for (Index = 0; Context.Count > Index; Index++) + MemfsFileNodeMapRemove(Memfs->FileNodeMap, Context.FileNodes[Index]); + MemfsFileNodeMapEnumerateFree(&Context); +#endif + + MemfsFileNodeMapRemove(Memfs->FileNodeMap, FileNode); + } +} + +static VOID Close(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + + MemfsFileNodeDereference(FileNode); +} + +static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, PVOID Buffer, UINT64 Offset, ULONG Length, + PULONG PBytesTransferred) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + UINT64 EndOffset; + + if (Offset >= FileNode->FileInfo.FileSize) + return STATUS_END_OF_FILE; + + EndOffset = Offset + Length; + if (EndOffset > FileNode->FileInfo.FileSize) + EndOffset = FileNode->FileInfo.FileSize; + +#ifdef MEMFS_SLOWIO + if (SlowioReturnPending(FileSystem)) + { + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + try + { + InterlockedIncrement(&Memfs->SlowioThreadsRunning); + std::thread(SlowioReadThread, + FileSystem, FileNode, Buffer, Offset, EndOffset, + FspFileSystemGetOperationContext()->Request->Hint). + detach(); + return STATUS_PENDING; + } + catch (...) + { + InterlockedDecrement(&Memfs->SlowioThreadsRunning); + } + } + SlowioSnooze(FileSystem); +#endif + + memcpy(Buffer, (PUINT8)FileNode->FileData + Offset, (size_t)(EndOffset - Offset)); + + *PBytesTransferred = (ULONG)(EndOffset - Offset); + + return STATUS_SUCCESS; +} + +static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, PVOID Buffer, UINT64 Offset, ULONG Length, + BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo, + PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo) +{ +#if defined(DEBUG_BUFFER_CHECK) + SYSTEM_INFO SystemInfo; + GetSystemInfo(&SystemInfo); + for (PUINT8 P = (PUINT8)Buffer, EndP = P + Length; EndP > P; P += SystemInfo.dwPageSize) + __try + { + *P = *P | 0; + assert(!IsWindows8OrGreater()); + /* only on Windows 8 we can make the buffer read-only! */ + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + /* ignore! */ + } +#endif + + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + UINT64 EndOffset; + NTSTATUS Result; + + if (ConstrainedIo) + { + if (Offset >= FileNode->FileInfo.FileSize) + return STATUS_SUCCESS; + EndOffset = Offset + Length; + if (EndOffset > FileNode->FileInfo.FileSize) + EndOffset = FileNode->FileInfo.FileSize; + } + else + { + if (WriteToEndOfFile) + Offset = FileNode->FileInfo.FileSize; + EndOffset = Offset + Length; + if (EndOffset > FileNode->FileInfo.FileSize) + { + Result = SetFileSizeInternal(FileSystem, FileNode, EndOffset, FALSE); + if (!NT_SUCCESS(Result)) + return Result; + } + } + +#ifdef MEMFS_SLOWIO + if (SlowioReturnPending(FileSystem)) + { + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + try + { + InterlockedIncrement(&Memfs->SlowioThreadsRunning); + std::thread(SlowioWriteThread, + FileSystem, FileNode, Buffer, Offset, EndOffset, + FspFileSystemGetOperationContext()->Request->Hint). + detach(); + return STATUS_PENDING; + } + catch (...) + { + InterlockedDecrement(&Memfs->SlowioThreadsRunning); + } + } + SlowioSnooze(FileSystem); +#endif + + memcpy((PUINT8)FileNode->FileData + Offset, Buffer, (size_t)(EndOffset - Offset)); + + *PBytesTransferred = (ULONG)(EndOffset - Offset); + MemfsFileNodeGetFileInfo(FileNode, FileInfo); + + return STATUS_SUCCESS; +} + +NTSTATUS Flush(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + + /* nothing to flush, since we do not cache anything */ + + if (0 != FileNode) + { +#if 0 +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode->MainFileNode->FileInfo.LastAccessTime = + FileNode->MainFileNode->FileInfo.LastWriteTime = + FileNode->MainFileNode->FileInfo.ChangeTime = MemfsGetSystemTime(); + else +#endif + FileNode->FileInfo.LastAccessTime = + FileNode->FileInfo.LastWriteTime = + FileNode->FileInfo.ChangeTime = MemfsGetSystemTime(); +#endif + + MemfsFileNodeGetFileInfo(FileNode, FileInfo); + } + + return STATUS_SUCCESS; +} + +static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + + MemfsFileNodeGetFileInfo(FileNode, FileInfo); + + return STATUS_SUCCESS; +} + +static NTSTATUS SetBasicInfo(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, UINT32 FileAttributes, + UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; +#endif + + if (INVALID_FILE_ATTRIBUTES != FileAttributes) + FileNode->FileInfo.FileAttributes = FileAttributes; + if (0 != CreationTime) + FileNode->FileInfo.CreationTime = CreationTime; + if (0 != LastAccessTime) + FileNode->FileInfo.LastAccessTime = LastAccessTime; + if (0 != LastWriteTime) + FileNode->FileInfo.LastWriteTime = LastWriteTime; + if (0 != ChangeTime) + FileNode->FileInfo.ChangeTime = ChangeTime; + + MemfsFileNodeGetFileInfo(FileNode, FileInfo); + + return STATUS_SUCCESS; +} + +static NTSTATUS SetFileSizeInternal(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, UINT64 NewSize, BOOLEAN SetAllocationSize) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + + if (SetAllocationSize) + { + if (FileNode->FileInfo.AllocationSize != NewSize) + { + if (NewSize > Memfs->MaxFileSize) + return STATUS_DISK_FULL; + + PVOID FileData = LargeHeapRealloc(FileNode->FileData, (size_t)NewSize); + if (0 == FileData && 0 != NewSize) + return STATUS_INSUFFICIENT_RESOURCES; + + FileNode->FileData = FileData; + + FileNode->FileInfo.AllocationSize = NewSize; + if (FileNode->FileInfo.FileSize > NewSize) + FileNode->FileInfo.FileSize = NewSize; + } + } + else + { + if (FileNode->FileInfo.FileSize != NewSize) + { + if (FileNode->FileInfo.AllocationSize < NewSize) + { + UINT64 AllocationUnit = MEMFS_SECTOR_SIZE * MEMFS_SECTORS_PER_ALLOCATION_UNIT; + UINT64 AllocationSize = (NewSize + AllocationUnit - 1) / AllocationUnit * AllocationUnit; + + NTSTATUS Result = SetFileSizeInternal(FileSystem, FileNode, AllocationSize, TRUE); + if (!NT_SUCCESS(Result)) + return Result; + } + + if (FileNode->FileInfo.FileSize < NewSize) + memset((PUINT8)FileNode->FileData + FileNode->FileInfo.FileSize, 0, + (size_t)(NewSize - FileNode->FileInfo.FileSize)); + FileNode->FileInfo.FileSize = NewSize; + } + } + + return STATUS_SUCCESS; +} + +static NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, UINT64 NewSize, BOOLEAN SetAllocationSize, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + NTSTATUS Result; + + Result = SetFileSizeInternal(FileSystem, FileNode0, NewSize, SetAllocationSize); + if (!NT_SUCCESS(Result)) + return Result; + + MemfsFileNodeGetFileInfo(FileNode, FileInfo); + + return STATUS_SUCCESS; +} + +static NTSTATUS CanDelete(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, PWSTR FileName) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + + if (MemfsFileNodeMapHasChild(Memfs->FileNodeMap, FileNode)) + return STATUS_DIRECTORY_NOT_EMPTY; + + return STATUS_SUCCESS; +} + +static NTSTATUS Rename(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, + PWSTR FileName, PWSTR NewFileName, BOOLEAN ReplaceIfExists) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + MEMFS_FILE_NODE *NewFileNode, *DescendantFileNode; + MEMFS_FILE_NODE_MAP_ENUM_CONTEXT Context = { TRUE }; + ULONG Index, FileNameLen, NewFileNameLen; + BOOLEAN Inserted; + NTSTATUS Result; + + NewFileNode = MemfsFileNodeMapGet(Memfs->FileNodeMap, NewFileName); + if (0 != NewFileNode && FileNode != NewFileNode) + { + if (!ReplaceIfExists) + { + Result = STATUS_OBJECT_NAME_COLLISION; + goto exit; + } + + if (NewFileNode->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + Result = STATUS_ACCESS_DENIED; + goto exit; + } + } + + MemfsFileNodeMapEnumerateDescendants(Memfs->FileNodeMap, FileNode, + MemfsFileNodeMapEnumerateFn, &Context); + + FileNameLen = (ULONG)wcslen(FileNode->FileName); + NewFileNameLen = (ULONG)wcslen(NewFileName); + for (Index = 0; Context.Count > Index; Index++) + { + DescendantFileNode = Context.FileNodes[Index]; + if (MEMFS_MAX_PATH <= wcslen(DescendantFileNode->FileName) - FileNameLen + NewFileNameLen) + { + Result = STATUS_OBJECT_NAME_INVALID; + goto exit; + } + } + + if (0 != NewFileNode) + { + MemfsFileNodeReference(NewFileNode); + MemfsFileNodeMapRemove(Memfs->FileNodeMap, NewFileNode); + MemfsFileNodeDereference(NewFileNode); + } + + for (Index = 0; Context.Count > Index; Index++) + { + DescendantFileNode = Context.FileNodes[Index]; + MemfsFileNodeMapRemove(Memfs->FileNodeMap, DescendantFileNode); + memmove(DescendantFileNode->FileName + NewFileNameLen, + DescendantFileNode->FileName + FileNameLen, + (wcslen(DescendantFileNode->FileName) + 1 - FileNameLen) * sizeof(WCHAR)); + memcpy(DescendantFileNode->FileName, NewFileName, NewFileNameLen * sizeof(WCHAR)); + Result = MemfsFileNodeMapInsert(Memfs->FileNodeMap, DescendantFileNode, &Inserted); + if (!NT_SUCCESS(Result)) + { + FspDebugLog(__FUNCTION__ ": cannot insert into FileNodeMap; aborting\n"); + abort(); + } + assert(Inserted); + } + + Result = STATUS_SUCCESS; + +exit: + MemfsFileNodeMapEnumerateFree(&Context); + + return Result; +} + +static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, + PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; +#endif + + if (FileNode->FileSecuritySize > *PSecurityDescriptorSize) + { + *PSecurityDescriptorSize = FileNode->FileSecuritySize; + return STATUS_BUFFER_OVERFLOW; + } + + *PSecurityDescriptorSize = FileNode->FileSecuritySize; + if (0 != SecurityDescriptor) + memcpy(SecurityDescriptor, FileNode->FileSecurity, FileNode->FileSecuritySize); + + return STATUS_SUCCESS; +} + +static NTSTATUS SetSecurity(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, + SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + PSECURITY_DESCRIPTOR NewSecurityDescriptor, FileSecurity; + SIZE_T FileSecuritySize; + NTSTATUS Result; + +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; +#endif + + Result = FspSetSecurityDescriptor( + FileNode->FileSecurity, + SecurityInformation, + ModificationDescriptor, + &NewSecurityDescriptor); + if (!NT_SUCCESS(Result)) + return Result; + + FileSecuritySize = GetSecurityDescriptorLength(NewSecurityDescriptor); + FileSecurity = (PSECURITY_DESCRIPTOR)malloc(FileSecuritySize); + if (0 == FileSecurity) + { + FspDeleteSecurityDescriptor(NewSecurityDescriptor, (NTSTATUS (*)())FspSetSecurityDescriptor); + return STATUS_INSUFFICIENT_RESOURCES; + } + memcpy(FileSecurity, NewSecurityDescriptor, FileSecuritySize); + FspDeleteSecurityDescriptor(NewSecurityDescriptor, (NTSTATUS (*)())FspSetSecurityDescriptor); + + free(FileNode->FileSecurity); + FileNode->FileSecuritySize = FileSecuritySize; + FileNode->FileSecurity = FileSecurity; + + return STATUS_SUCCESS; +} + +typedef struct _MEMFS_READ_DIRECTORY_CONTEXT +{ + PVOID Buffer; + ULONG Length; + PULONG PBytesTransferred; +} MEMFS_READ_DIRECTORY_CONTEXT; + +static BOOLEAN AddDirInfo(MEMFS_FILE_NODE *FileNode, PWSTR FileName, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred) +{ + UINT8 DirInfoBuf[sizeof(FSP_FSCTL_DIR_INFO) + sizeof FileNode->FileName]; + FSP_FSCTL_DIR_INFO *DirInfo = (FSP_FSCTL_DIR_INFO *)DirInfoBuf; + WCHAR Root[2] = L"\\"; + PWSTR Remain, Suffix; + + if (0 == FileName) + { + FspPathSuffix(FileNode->FileName, &Remain, &Suffix, Root); + FileName = Suffix; + FspPathCombine(FileNode->FileName, Suffix); + } + + memset(DirInfo->Padding, 0, sizeof DirInfo->Padding); + DirInfo->Size = (UINT16)(sizeof(FSP_FSCTL_DIR_INFO) + wcslen(FileName) * sizeof(WCHAR)); + DirInfo->FileInfo = FileNode->FileInfo; + memcpy(DirInfo->FileNameBuf, FileName, DirInfo->Size - sizeof(FSP_FSCTL_DIR_INFO)); + + return FspFileSystemAddDirInfo(DirInfo, Buffer, Length, PBytesTransferred); +} + +static BOOLEAN ReadDirectoryEnumFn(MEMFS_FILE_NODE *FileNode, PVOID Context0) +{ + MEMFS_READ_DIRECTORY_CONTEXT *Context = (MEMFS_READ_DIRECTORY_CONTEXT *)Context0; + + return AddDirInfo(FileNode, 0, + Context->Buffer, Context->Length, Context->PBytesTransferred); +} + +static NTSTATUS ReadDirectory(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, PWSTR Pattern, PWSTR Marker, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred) +{ + assert(0 == Pattern); + + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + MEMFS_FILE_NODE *ParentNode; + MEMFS_READ_DIRECTORY_CONTEXT Context; + NTSTATUS Result; + + Context.Buffer = Buffer; + Context.Length = Length; + Context.PBytesTransferred = PBytesTransferred; + + if (L'\0' != FileNode->FileName[1]) + { + /* if this is not the root directory add the dot entries */ + + ParentNode = MemfsFileNodeMapGetParent(Memfs->FileNodeMap, FileNode->FileName, &Result); + if (0 == ParentNode) + return Result; + + if (0 == Marker) + { + if (!AddDirInfo(FileNode, L".", Buffer, Length, PBytesTransferred)) + return STATUS_SUCCESS; + } + if (0 == Marker || (L'.' == Marker[0] && L'\0' == Marker[1])) + { + if (!AddDirInfo(ParentNode, L"..", Buffer, Length, PBytesTransferred)) + return STATUS_SUCCESS; + Marker = 0; + } + } + + if (MemfsFileNodeMapEnumerateChildren(Memfs->FileNodeMap, FileNode, Marker, + ReadDirectoryEnumFn, &Context)) + FspFileSystemAddDirInfo(0, Buffer, Length, PBytesTransferred); + +#ifdef MEMFS_SLOWIO + if (SlowioReturnPending(FileSystem)) + { + try + { + InterlockedIncrement(&Memfs->SlowioThreadsRunning); + std::thread(SlowioReadDirectoryThread, + FileSystem, *PBytesTransferred, + FspFileSystemGetOperationContext()->Request->Hint). + detach(); + return STATUS_PENDING; + } + catch (...) + { + InterlockedDecrement(&Memfs->SlowioThreadsRunning); + } + } + SlowioSnooze(FileSystem); +#endif + + return STATUS_SUCCESS; +} + +#if defined(MEMFS_DIRINFO_BY_NAME) +static NTSTATUS GetDirInfoByName(FSP_FILE_SYSTEM *FileSystem, + PVOID ParentNode0, PWSTR FileName, + FSP_FSCTL_DIR_INFO *DirInfo) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *ParentNode = (MEMFS_FILE_NODE *)ParentNode0; + MEMFS_FILE_NODE *FileNode; + WCHAR FileNameBuf[MEMFS_MAX_PATH]; + size_t ParentLength, BSlashLength, FileNameLength; + WCHAR Root[2] = L"\\"; + PWSTR Remain, Suffix; + + ParentLength = wcslen(ParentNode->FileName); + BSlashLength = 1 < ParentLength; + FileNameLength = wcslen(FileName); + if (MEMFS_MAX_PATH <= ParentLength + BSlashLength + FileNameLength) + return STATUS_OBJECT_NAME_NOT_FOUND; //STATUS_OBJECT_NAME_INVALID? + + memcpy(FileNameBuf, ParentNode->FileName, ParentLength * sizeof(WCHAR)); + memcpy(FileNameBuf + ParentLength, L"\\", BSlashLength * sizeof(WCHAR)); + memcpy(FileNameBuf + ParentLength + BSlashLength, FileName, (FileNameLength + 1) * sizeof(WCHAR)); + + FileName = FileNameBuf; + + FileNode = MemfsFileNodeMapGet(Memfs->FileNodeMap, FileName); + if (0 == FileNode) + return STATUS_OBJECT_NAME_NOT_FOUND; + + FspPathSuffix(FileNode->FileName, &Remain, &Suffix, Root); + FileName = Suffix; + FspPathCombine(FileNode->FileName, Suffix); + + //memset(DirInfo->Padding, 0, sizeof DirInfo->Padding); + DirInfo->Size = (UINT16)(sizeof(FSP_FSCTL_DIR_INFO) + wcslen(FileName) * sizeof(WCHAR)); + DirInfo->FileInfo = FileNode->FileInfo; + memcpy(DirInfo->FileNameBuf, FileName, DirInfo->Size - sizeof(FSP_FSCTL_DIR_INFO)); + + return STATUS_SUCCESS; +} +#endif + +#if defined(MEMFS_REPARSE_POINTS) +static NTSTATUS ResolveReparsePoints(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 ReparsePointIndex, BOOLEAN ResolveLastPathComponent, + PIO_STATUS_BLOCK PIoStatus, PVOID Buffer, PSIZE_T PSize) +{ + return FspFileSystemResolveReparsePoints(FileSystem, GetReparsePointByName, 0, + FileName, ReparsePointIndex, ResolveLastPathComponent, + PIoStatus, Buffer, PSize); +} + +static NTSTATUS GetReparsePointByName( + FSP_FILE_SYSTEM *FileSystem, PVOID Context, + PWSTR FileName, BOOLEAN IsDirectory, PVOID Buffer, PSIZE_T PSize) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode; + +#if defined(MEMFS_NAMED_STREAMS) + /* GetReparsePointByName will never receive a named stream */ + assert(0 == wcschr(FileName, L':')); +#endif + + FileNode = MemfsFileNodeMapGet(Memfs->FileNodeMap, FileName); + if (0 == FileNode) + return STATUS_OBJECT_NAME_NOT_FOUND; + + if (0 == (FileNode->FileInfo.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) + return STATUS_NOT_A_REPARSE_POINT; + + if (0 != Buffer) + { + if (FileNode->ReparseDataSize > *PSize) + return STATUS_BUFFER_TOO_SMALL; + + *PSize = FileNode->ReparseDataSize; + memcpy(Buffer, FileNode->ReparseData, FileNode->ReparseDataSize); + } + + return STATUS_SUCCESS; +} + +static NTSTATUS GetReparsePoint(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, + PWSTR FileName, PVOID Buffer, PSIZE_T PSize) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; +#endif + + if (0 == (FileNode->FileInfo.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) + return STATUS_NOT_A_REPARSE_POINT; + + if (FileNode->ReparseDataSize > *PSize) + return STATUS_BUFFER_TOO_SMALL; + + *PSize = FileNode->ReparseDataSize; + memcpy(Buffer, FileNode->ReparseData, FileNode->ReparseDataSize); + + return STATUS_SUCCESS; +} + +static NTSTATUS SetReparsePoint(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, + PWSTR FileName, PVOID Buffer, SIZE_T Size) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + PVOID ReparseData; + NTSTATUS Result; + +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; +#endif + + if (MemfsFileNodeMapHasChild(Memfs->FileNodeMap, FileNode)) + return STATUS_DIRECTORY_NOT_EMPTY; + + if (0 != FileNode->ReparseData) + { + Result = FspFileSystemCanReplaceReparsePoint( + FileNode->ReparseData, FileNode->ReparseDataSize, + Buffer, Size); + if (!NT_SUCCESS(Result)) + return Result; + } + + ReparseData = realloc(FileNode->ReparseData, Size); + if (0 == ReparseData && 0 != Size) + return STATUS_INSUFFICIENT_RESOURCES; + + FileNode->FileInfo.FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT; + FileNode->FileInfo.ReparseTag = *(PULONG)Buffer; + /* the first field in a reparse buffer is the reparse tag */ + FileNode->ReparseDataSize = Size; + FileNode->ReparseData = ReparseData; + memcpy(FileNode->ReparseData, Buffer, Size); + + return STATUS_SUCCESS; +} + +static NTSTATUS DeleteReparsePoint(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, + PWSTR FileName, PVOID Buffer, SIZE_T Size) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + NTSTATUS Result; + +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; +#endif + + if (0 != FileNode->ReparseData) + { + Result = FspFileSystemCanReplaceReparsePoint( + FileNode->ReparseData, FileNode->ReparseDataSize, + Buffer, Size); + if (!NT_SUCCESS(Result)) + return Result; + } + else + return STATUS_NOT_A_REPARSE_POINT; + + free(FileNode->ReparseData); + + FileNode->FileInfo.FileAttributes &= ~FILE_ATTRIBUTE_REPARSE_POINT; + FileNode->FileInfo.ReparseTag = 0; + FileNode->ReparseDataSize = 0; + FileNode->ReparseData = 0; + + return STATUS_SUCCESS; +} +#endif + +#if defined(MEMFS_NAMED_STREAMS) +typedef struct _MEMFS_GET_STREAM_INFO_CONTEXT +{ + PVOID Buffer; + ULONG Length; + PULONG PBytesTransferred; +} MEMFS_GET_STREAM_INFO_CONTEXT; + +static BOOLEAN AddStreamInfo(MEMFS_FILE_NODE *FileNode, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred) +{ + UINT8 StreamInfoBuf[sizeof(FSP_FSCTL_STREAM_INFO) + sizeof FileNode->FileName]; + FSP_FSCTL_STREAM_INFO *StreamInfo = (FSP_FSCTL_STREAM_INFO *)StreamInfoBuf; + PWSTR StreamName; + + StreamName = wcschr(FileNode->FileName, L':'); + if (0 != StreamName) + StreamName++; + else + StreamName = L""; + + StreamInfo->Size = (UINT16)(sizeof(FSP_FSCTL_STREAM_INFO) + wcslen(StreamName) * sizeof(WCHAR)); + StreamInfo->StreamSize = FileNode->FileInfo.FileSize; + StreamInfo->StreamAllocationSize = FileNode->FileInfo.AllocationSize; + memcpy(StreamInfo->StreamNameBuf, StreamName, StreamInfo->Size - sizeof(FSP_FSCTL_STREAM_INFO)); + + return FspFileSystemAddStreamInfo(StreamInfo, Buffer, Length, PBytesTransferred); +} + +static BOOLEAN GetStreamInfoEnumFn(MEMFS_FILE_NODE *FileNode, PVOID Context0) +{ + MEMFS_GET_STREAM_INFO_CONTEXT *Context = (MEMFS_GET_STREAM_INFO_CONTEXT *)Context0; + + return AddStreamInfo(FileNode, + Context->Buffer, Context->Length, Context->PBytesTransferred); +} + +static NTSTATUS GetStreamInfo(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, PVOID Buffer, ULONG Length, + PULONG PBytesTransferred) +{ + MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + MEMFS_GET_STREAM_INFO_CONTEXT Context; + + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; + + Context.Buffer = Buffer; + Context.Length = Length; + Context.PBytesTransferred = PBytesTransferred; + + if (0 == (FileNode->FileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + !AddStreamInfo(FileNode, Buffer, Length, PBytesTransferred)) + return STATUS_SUCCESS; + + if (MemfsFileNodeMapEnumerateNamedStreams(Memfs->FileNodeMap, FileNode, GetStreamInfoEnumFn, &Context)) + FspFileSystemAddStreamInfo(0, Buffer, Length, PBytesTransferred); + + /* ???: how to handle out of response buffer condition? */ + + return STATUS_SUCCESS; +} +#endif + +#if defined(MEMFS_CONTROL) +static NTSTATUS Control(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode, UINT32 ControlCode, + PVOID InputBuffer, ULONG InputBufferLength, + PVOID OutputBuffer, ULONG OutputBufferLength, PULONG PBytesTransferred) +{ + /* MEMFS also supports encryption! See below :) */ + if (CTL_CODE(0x8000 + 'M', 'R', METHOD_BUFFERED, FILE_ANY_ACCESS) == ControlCode) + { + if (OutputBufferLength != InputBufferLength) + return STATUS_INVALID_PARAMETER; + + for (PUINT8 P = (PUINT8)InputBuffer, Q = (PUINT8)OutputBuffer, EndP = P + InputBufferLength; + EndP > P; P++, Q++) + { + if (('A' <= *P && *P <= 'M') || ('a' <= *P && *P <= 'm')) + *Q = *P + 13; + else + if (('N' <= *P && *P <= 'Z') || ('n' <= *P && *P <= 'z')) + *Q = *P - 13; + else + *Q = *P; + } + + *PBytesTransferred = InputBufferLength; + return STATUS_SUCCESS; + } + + return STATUS_INVALID_DEVICE_REQUEST; +} +#endif + +#if defined(MEMFS_EA) +typedef struct _MEMFS_GET_EA_CONTEXT +{ + PFILE_FULL_EA_INFORMATION Ea; + ULONG EaLength; + PULONG PBytesTransferred; +} MEMFS_GET_EA_CONTEXT; + +static BOOLEAN GetEaEnumFn(PFILE_FULL_EA_INFORMATION Ea, PVOID Context0) +{ + MEMFS_GET_EA_CONTEXT *Context = (MEMFS_GET_EA_CONTEXT *)Context0; + + return FspFileSystemAddEa(Ea, + Context->Ea, Context->EaLength, Context->PBytesTransferred); +} + +static NTSTATUS GetEa(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength, PULONG PBytesTransferred) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + MEMFS_GET_EA_CONTEXT Context; + + Context.Ea = Ea; + Context.EaLength = EaLength; + Context.PBytesTransferred = PBytesTransferred; + + if (MemfsFileNodeEnumerateEa(FileNode, GetEaEnumFn, &Context)) + FspFileSystemAddEa(0, Ea, EaLength, PBytesTransferred); + + return STATUS_SUCCESS; +} + +static NTSTATUS SetEa(FSP_FILE_SYSTEM *FileSystem, + PVOID FileNode0, + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + NTSTATUS Result; + + Result = FspFileSystemEnumerateEa(FileSystem, MemfsFileNodeSetEa, FileNode, Ea, EaLength); + if (!NT_SUCCESS(Result)) + return Result; + + MemfsFileNodeGetFileInfo(FileNode, FileInfo); + + return STATUS_SUCCESS; +} +#endif + +static FSP_FILE_SYSTEM_INTERFACE MemfsInterface = +{ + GetVolumeInfo, + SetVolumeLabel, + GetSecurityByName, +#if defined(MEMFS_EA) || defined(MEMFS_WSL) + 0, +#else + Create, +#endif + Open, +#if defined(MEMFS_EA) + 0, +#else + Overwrite, +#endif + Cleanup, + Close, + Read, + Write, + Flush, + GetFileInfo, + SetBasicInfo, + SetFileSize, + CanDelete, + Rename, + GetSecurity, + SetSecurity, + ReadDirectory, +#if defined(MEMFS_REPARSE_POINTS) + ResolveReparsePoints, + GetReparsePoint, + SetReparsePoint, + DeleteReparsePoint, +#else + 0, + 0, + 0, + 0, +#endif +#if defined(MEMFS_NAMED_STREAMS) + GetStreamInfo, +#else + 0, +#endif +#if defined(MEMFS_DIRINFO_BY_NAME) + GetDirInfoByName, +#else + 0, +#endif +#if defined(MEMFS_CONTROL) + Control, +#else + 0, +#endif + 0, +#if defined(MEMFS_EA) || defined(MEMFS_WSL) + Create, +#endif +#if defined(MEMFS_EA) + Overwrite, + GetEa, + SetEa, +#else + 0, + 0, + 0, +#endif +}; + +/* + * Public API + */ + +NTSTATUS MemfsCreateFunnel( + ULONG Flags, + ULONG FileInfoTimeout, + ULONG MaxFileNodes, + ULONG MaxFileSize, + ULONG SlowioMaxDelay, + ULONG SlowioPercentDelay, + ULONG SlowioRarefyDelay, + PWSTR FileSystemName, + PWSTR VolumePrefix, + PWSTR RootSddl, + MEMFS **PMemfs) +{ + NTSTATUS Result; + FSP_FSCTL_VOLUME_PARAMS VolumeParams; + BOOLEAN CaseInsensitive = !!(Flags & MemfsCaseInsensitive); + BOOLEAN FlushAndPurgeOnCleanup = !!(Flags & MemfsFlushAndPurgeOnCleanup); + BOOLEAN SupportsPosixUnlinkRename = !(Flags & MemfsLegacyUnlinkRename); + PWSTR DevicePath = MemfsNet == (Flags & MemfsDeviceMask) ? + L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME; + UINT64 AllocationUnit; + MEMFS *Memfs; + MEMFS_FILE_NODE *RootNode; + PSECURITY_DESCRIPTOR RootSecurity; + ULONG RootSecuritySize; + BOOLEAN Inserted; + + *PMemfs = 0; + + Result = MemfsHeapConfigure(0, 0, 0); + if (!NT_SUCCESS(Result)) + return Result; + + if (0 == RootSddl) + RootSddl = L"O:BAG:BAD:P(A;;FA;;;SY)(A;;FA;;;BA)(A;;FA;;;WD)"; + if (!ConvertStringSecurityDescriptorToSecurityDescriptorW(RootSddl, SDDL_REVISION_1, + &RootSecurity, &RootSecuritySize)) + return FspNtStatusFromWin32(GetLastError()); + + Memfs = (MEMFS *)malloc(sizeof *Memfs); + if (0 == Memfs) + { + LocalFree(RootSecurity); + return STATUS_INSUFFICIENT_RESOURCES; + } + + memset(Memfs, 0, sizeof *Memfs); + Memfs->MaxFileNodes = MaxFileNodes; + AllocationUnit = MEMFS_SECTOR_SIZE * MEMFS_SECTORS_PER_ALLOCATION_UNIT; + Memfs->MaxFileSize = (ULONG)((MaxFileSize + AllocationUnit - 1) / AllocationUnit * AllocationUnit); + +#ifdef MEMFS_SLOWIO + Memfs->SlowioMaxDelay = SlowioMaxDelay; + Memfs->SlowioPercentDelay = SlowioPercentDelay; + Memfs->SlowioRarefyDelay = SlowioRarefyDelay; +#endif + + Result = MemfsFileNodeMapCreate(CaseInsensitive, &Memfs->FileNodeMap); + if (!NT_SUCCESS(Result)) + { + free(Memfs); + LocalFree(RootSecurity); + return Result; + } + + memset(&VolumeParams, 0, sizeof VolumeParams); + VolumeParams.Version = sizeof FSP_FSCTL_VOLUME_PARAMS; + VolumeParams.SectorSize = MEMFS_SECTOR_SIZE; + VolumeParams.SectorsPerAllocationUnit = MEMFS_SECTORS_PER_ALLOCATION_UNIT; + VolumeParams.VolumeCreationTime = MemfsGetSystemTime(); + VolumeParams.VolumeSerialNumber = (UINT32)(MemfsGetSystemTime() / (10000 * 1000)); + VolumeParams.FileInfoTimeout = FileInfoTimeout; + VolumeParams.CaseSensitiveSearch = !CaseInsensitive; + VolumeParams.CasePreservedNames = 1; + VolumeParams.UnicodeOnDisk = 1; + VolumeParams.PersistentAcls = 1; + VolumeParams.ReparsePoints = 1; + VolumeParams.ReparsePointsAccessCheck = 0; +#if defined(MEMFS_NAMED_STREAMS) + VolumeParams.NamedStreams = 1; +#endif + VolumeParams.PostCleanupWhenModifiedOnly = 1; +#if defined(MEMFS_DIRINFO_BY_NAME) + VolumeParams.PassQueryDirectoryFileName = 1; +#endif + VolumeParams.FlushAndPurgeOnCleanup = FlushAndPurgeOnCleanup; +#if defined(MEMFS_CONTROL) + VolumeParams.DeviceControl = 1; +#endif +#if defined(MEMFS_EA) + VolumeParams.ExtendedAttributes = 1; +#endif +#if defined(MEMFS_WSL) + VolumeParams.WslFeatures = 1; +#endif + VolumeParams.AllowOpenInKernelMode = 1; +#if defined(MEMFS_REJECT_EARLY_IRP) + VolumeParams.RejectIrpPriorToTransact0 = 1; +#endif + VolumeParams.SupportsPosixUnlinkRename = SupportsPosixUnlinkRename; + if (0 != VolumePrefix) + wcscpy_s(VolumeParams.Prefix, sizeof VolumeParams.Prefix / sizeof(WCHAR), VolumePrefix); + wcscpy_s(VolumeParams.FileSystemName, sizeof VolumeParams.FileSystemName / sizeof(WCHAR), + 0 != FileSystemName ? FileSystemName : L"-MEMFS"); + + Result = FspFileSystemCreate(DevicePath, &VolumeParams, &MemfsInterface, &Memfs->FileSystem); + if (!NT_SUCCESS(Result)) + { + MemfsFileNodeMapDelete(Memfs->FileNodeMap); + free(Memfs); + LocalFree(RootSecurity); + return Result; + } + + Memfs->FileSystem->UserContext = Memfs; + Memfs->VolumeLabelLength = sizeof L"MEMFS" - sizeof(WCHAR); + memcpy(Memfs->VolumeLabel, L"MEMFS", Memfs->VolumeLabelLength); + +#if 0 + FspFileSystemSetOperationGuardStrategy(Memfs->FileSystem, + FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_COARSE); +#endif + + /* + * Create root directory. + */ + + Result = MemfsFileNodeCreate(L"\\", &RootNode); + if (!NT_SUCCESS(Result)) + { + MemfsDelete(Memfs); + LocalFree(RootSecurity); + return Result; + } + + RootNode->FileInfo.FileAttributes = FILE_ATTRIBUTE_DIRECTORY; + + RootNode->FileSecurity = malloc(RootSecuritySize); + if (0 == RootNode->FileSecurity) + { + MemfsFileNodeDelete(RootNode); + MemfsDelete(Memfs); + LocalFree(RootSecurity); + return STATUS_INSUFFICIENT_RESOURCES; + } + RootNode->FileSecuritySize = RootSecuritySize; + memcpy(RootNode->FileSecurity, RootSecurity, RootSecuritySize); + + Result = MemfsFileNodeMapInsert(Memfs->FileNodeMap, RootNode, &Inserted); + if (!NT_SUCCESS(Result)) + { + MemfsFileNodeDelete(RootNode); + MemfsDelete(Memfs); + LocalFree(RootSecurity); + return Result; + } + + LocalFree(RootSecurity); + + *PMemfs = Memfs; + + return STATUS_SUCCESS; +} + +VOID MemfsDelete(MEMFS *Memfs) +{ + FspFileSystemDelete(Memfs->FileSystem); + + MemfsFileNodeMapDelete(Memfs->FileNodeMap); + + free(Memfs); +} + +NTSTATUS MemfsStart(MEMFS *Memfs) +{ +#ifdef MEMFS_SLOWIO + Memfs->SlowioThreadsRunning = 0; +#endif + + return FspFileSystemStartDispatcher(Memfs->FileSystem, 0); +} + +VOID MemfsStop(MEMFS *Memfs) +{ + FspFileSystemStopDispatcher(Memfs->FileSystem); + +#ifdef MEMFS_SLOWIO + while (Memfs->SlowioThreadsRunning) + Sleep(1); +#endif +} + +FSP_FILE_SYSTEM *MemfsFileSystem(MEMFS *Memfs) +{ + return Memfs->FileSystem; +} + +NTSTATUS MemfsHeapConfigure(SIZE_T InitialSize, SIZE_T MaximumSize, SIZE_T Alignment) +{ + return LargeHeapInitialize(0, InitialSize, MaximumSize, LargeHeapAlignment) ? + STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES; +} diff --git a/3rd_party/winfsp-1.10/samples/memfs/memfs.h b/3rd_party/winfsp-1.10/samples/memfs/memfs.h new file mode 100644 index 00000000..d3e66334 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/memfs/memfs.h @@ -0,0 +1,79 @@ +/** + * @file memfs.h + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef MEMFS_H_INCLUDED +#define MEMFS_H_INCLUDED + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _MEMFS MEMFS; + +enum +{ + MemfsDisk = 0x00000000, + MemfsNet = 0x00000001, + MemfsDeviceMask = 0x0000000f, + MemfsCaseInsensitive = 0x80000000, + MemfsFlushAndPurgeOnCleanup = 0x40000000, + MemfsLegacyUnlinkRename = 0x20000000, +}; + +#define MemfsCreate(Flags, FileInfoTimeout, MaxFileNodes, MaxFileSize, VolumePrefix, RootSddl, PMemfs)\ + MemfsCreateFunnel(\ + Flags,\ + FileInfoTimeout,\ + MaxFileNodes,\ + MaxFileSize,\ + 0/*SlowioMaxDelay*/,\ + 0/*SlowioPercentDelay*/,\ + 0/*SlowioRarefyDelay*/,\ + 0/*FileSystemName*/,\ + VolumePrefix,\ + RootSddl,\ + PMemfs) +NTSTATUS MemfsCreateFunnel( + ULONG Flags, + ULONG FileInfoTimeout, + ULONG MaxFileNodes, + ULONG MaxFileSize, + ULONG SlowioMaxDelay, + ULONG SlowioPercentDelay, + ULONG SlowioRarefyDelay, + PWSTR FileSystemName, + PWSTR VolumePrefix, + PWSTR RootSddl, + MEMFS **PMemfs); +VOID MemfsDelete(MEMFS *Memfs); +NTSTATUS MemfsStart(MEMFS *Memfs); +VOID MemfsStop(MEMFS *Memfs); +FSP_FILE_SYSTEM *MemfsFileSystem(MEMFS *Memfs); + +NTSTATUS MemfsHeapConfigure(SIZE_T InitialSize, SIZE_T MaximumSize, SIZE_T Alignment); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/3rd_party/winfsp-1.10/samples/notifyfs-dotnet/Program.cs b/3rd_party/winfsp-1.10/samples/notifyfs-dotnet/Program.cs new file mode 100644 index 00000000..ec0211cc --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/notifyfs-dotnet/Program.cs @@ -0,0 +1,394 @@ +/** + * @file Program.cs + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Security.AccessControl; +using System.Text; +using System.Threading; + +using Fsp; +using VolumeInfo = Fsp.Interop.VolumeInfo; +using FileInfo = Fsp.Interop.FileInfo; +using NotifyInfo = Fsp.Interop.NotifyInfo; +using NotifyAction = Fsp.Interop.NotifyAction; +using NotifyFilter = Fsp.Interop.NotifyFilter; + +namespace notifyfs +{ + class Notifyfs : FileSystemBase + { + public override Int32 Init(Object Host) + { + _Host = (FileSystemHost)Host; + _Host.SectorSize = ALLOCATION_UNIT; + _Host.SectorsPerAllocationUnit = 1; + _Host.FileInfoTimeout = 1000; + _Host.CaseSensitiveSearch = false; + _Host.CasePreservedNames = true; + _Host.UnicodeOnDisk = true; + _Host.PersistentAcls = false; + _Host.PostCleanupWhenModifiedOnly = true; + _Host.VolumeCreationTime = 0; + _Host.VolumeSerialNumber = 0; + + return STATUS_SUCCESS; + } + public override Int32 Mounted(Object Host) + { + _Timer = new Timer(this.Tick, null, 0, 1000); + + return STATUS_SUCCESS; + } + public override void Unmounted(Object Host) + { + WaitHandle Event = new ManualResetEvent(false); + _Timer.Dispose(Event); + Event.WaitOne(); + } + public override Int32 GetVolumeInfo( + out VolumeInfo VolumeInfo) + { + VolumeInfo = default(VolumeInfo); + + return STATUS_SUCCESS; + } + public override Int32 GetSecurityByName( + String FileName, + out UInt32 FileAttributes/* or ReparsePointIndex */, + ref Byte[] SecurityDescriptor) + { + int Index = FileLookup(FileName); + if (-1 == Index) + { + FileAttributes = default(UInt32); + return STATUS_OBJECT_NAME_NOT_FOUND; + } + + FileAttributes = 0 == Index ? (UInt32)System.IO.FileAttributes.Directory : 0; + if (null != SecurityDescriptor) + SecurityDescriptor = DefaultSecurity; + + return STATUS_SUCCESS; + } + public override Int32 Open( + String FileName, + UInt32 CreateOptions, + UInt32 GrantedAccess, + out Object FileNode, + out Object FileDesc, + out FileInfo FileInfo, + out String NormalizedName) + { + FileNode = default(Object); + FileDesc = default(Object); + FileInfo = default(FileInfo); + NormalizedName = default(String); + + int Index = FileLookup(FileName); + if (-1 == Index) + return STATUS_OBJECT_NAME_NOT_FOUND; + + FileNode = Index; + FillFileInfo(Index, out FileInfo); + + return STATUS_SUCCESS; + } + public override Int32 Read( + Object FileNode, + Object FileDesc, + IntPtr Buffer, + UInt64 Offset, + UInt32 Length, + out UInt32 BytesTransferred) + { + int Index = (int)FileNode; + UInt64 EndOffset; + Byte[] Contents = FileContents(Index); + + if (Offset >= (UInt64)Contents.Length) + { + BytesTransferred = 0; + return STATUS_END_OF_FILE; + } + + EndOffset = Offset + Length; + if (EndOffset > (UInt64)Contents.Length) + EndOffset = (UInt64)Contents.Length; + + BytesTransferred = (UInt32)(EndOffset - Offset); + Marshal.Copy(Contents, (int)Offset, Buffer, (int)BytesTransferred); + + return STATUS_SUCCESS; + } + public override Int32 GetFileInfo( + Object FileNode, + Object FileDesc, + out FileInfo FileInfo) + { + int Index = (int)FileNode; + + FillFileInfo(Index, out FileInfo); + + return STATUS_SUCCESS; + } + public override Boolean ReadDirectoryEntry( + Object FileNode, + Object FileDesc, + String Pattern, + String Marker, + ref Object Context, + out String FileName, + out FileInfo FileInfo) + { + IEnumerator Enumerator = (IEnumerator)Context; + + if (null == Enumerator) + { + List ChildrenFileNames = new List(); + for (int Index = 1, Count = FileCount(); Count >= Index; Index++) + ChildrenFileNames.Add(String.Format("{0}", Index)); + Context = Enumerator = ChildrenFileNames.GetEnumerator(); + } + + while (Enumerator.MoveNext()) + { + FileName = Enumerator.Current; + FillFileInfo(int.Parse(FileName), out FileInfo); + return true; + } + + FileName = default(String); + FileInfo = default(FileInfo); + return false; + } + + private static int CountFromTicks(int Ticks) + { + /* + * The formula below produces the periodic sequence: + * 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, + * 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, + * ... + */ + int div10 = (Ticks % 20) / 10; + int mod10 = Ticks % 10; + int mdv10 = 1 - div10; + int mmd10 = 10 - mod10; + return mdv10 * mod10 + div10 * mmd10; + } + private int FileCount() + { + int Ticks = Thread.VolatileRead(ref _Ticks); + return CountFromTicks(Ticks); + } + private int FileLookup(String FileName) + { + FileName = FileName.Substring(1); + if ("" == FileName) + return 0; /* root */ + int Count = FileCount(); + Boolean Valid = int.TryParse(FileName, out int Index); + if (!Valid || 0 >= Index || Index > Count) + return -1; /* not found */ + return Index; /* regular file named 1, 2, ..., Count */ + } + private static Byte[] FileContents(int Index) + { + if (0 == Index) + return EmptyByteArray; + return Encoding.UTF8.GetBytes(String.Format("{0}\n", Index)); + } + private static void FillFileInfo(int Index, out FileInfo FileInfo) + { + FileInfo = default(FileInfo); + FileInfo.FileAttributes = 0 == Index ? (UInt32)System.IO.FileAttributes.Directory : 0; + FileInfo.FileSize = (UInt64)FileContents(Index).Length; + FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1) + / ALLOCATION_UNIT * ALLOCATION_UNIT; + FileInfo.CreationTime = + FileInfo.LastAccessTime = + FileInfo.LastWriteTime = + FileInfo.ChangeTime = (UInt64)DateTime.Now.ToFileTimeUtc(); + } + private void Tick(Object Context) + { + int Ticks = Interlocked.Increment(ref _Ticks); + int OldCount = CountFromTicks(Ticks - 1); + int NewCount = CountFromTicks(Ticks); + NotifyInfo[] NotifyInfo = new NotifyInfo[1]; + + if (OldCount < NewCount) + { + NotifyInfo[0].FileName = String.Format("\\{0}", NewCount); + NotifyInfo[0].Action = NotifyAction.Added; + NotifyInfo[0].Filter = NotifyFilter.ChangeFileName; + Console.Error.WriteLine("CREATE \\{0}", NewCount); + } + else if (OldCount > NewCount) + { + NotifyInfo[0].FileName = String.Format("\\{0}", OldCount); + NotifyInfo[0].Action = NotifyAction.Removed; + NotifyInfo[0].Filter = NotifyFilter.ChangeFileName; + Console.Error.WriteLine("REMOVE \\{0}", OldCount); + } + + if (OldCount != NewCount) + { + if (STATUS_SUCCESS == _Host.NotifyBegin(500)) + { + _Host.Notify(NotifyInfo); + _Host.NotifyEnd(); + } + } + } + + static Notifyfs() + { + RawSecurityDescriptor RootSecurityDescriptor = new RawSecurityDescriptor( + "O:BAG:BAD:P(A;;FA;;;SY)(A;;FA;;;BA)(A;;FA;;;WD)"); + DefaultSecurity = new Byte[RootSecurityDescriptor.BinaryLength]; + RootSecurityDescriptor.GetBinaryForm(DefaultSecurity, 0); + } + + private const int ALLOCATION_UNIT = 4096; + private static readonly Byte[] EmptyByteArray = new Byte[0]; + private static readonly Byte[] DefaultSecurity; + private FileSystemHost _Host; + private Timer _Timer; + private int _Ticks; + } + + class NotifyfsService : Service + { + private class CommandLineUsageException : Exception + { + public CommandLineUsageException(String Message = null) : base(Message) + { + HasMessage = null != Message; + } + + public bool HasMessage; + } + + private const String PROGNAME = "notifyfs-dotnet"; + + public NotifyfsService() : base("NotifyfsService") + { + } + + protected override void OnStart(String[] Args) + { + try + { + String VolumePrefix = null; + String MountPoint = null; + FileSystemHost Host = null; + Notifyfs Notifyfs = null; + int I; + + for (I = 1; Args.Length > I; I++) + { + String Arg = Args[I]; + if ('-' != Arg[0]) + break; + switch (Arg[1]) + { + case '?': + throw new CommandLineUsageException(); + case 'm': + argtos(Args, ref I, ref MountPoint); + break; + case 'u': + argtos(Args, ref I, ref VolumePrefix); + break; + default: + throw new CommandLineUsageException(); + } + } + + if (Args.Length > I) + throw new CommandLineUsageException(); + + if (null == MountPoint) + throw new CommandLineUsageException(); + + FileSystemHost.SetDebugLogFile("-"); + + Host = new FileSystemHost(Notifyfs = new Notifyfs()); + Host.Prefix = VolumePrefix; + if (0 > Host.Mount(MountPoint)) + throw new IOException("cannot mount file system"); + MountPoint = Host.MountPoint(); + _Host = Host; + + Log(EVENTLOG_INFORMATION_TYPE, String.Format("{0}{1}{2} -m {3}", + PROGNAME, + null != VolumePrefix && 0 < VolumePrefix.Length ? " -u " : "", + null != VolumePrefix && 0 < VolumePrefix.Length ? VolumePrefix : "", + MountPoint)); + } + catch (CommandLineUsageException ex) + { + Log(EVENTLOG_ERROR_TYPE, String.Format( + "{0}" + + "usage: {1} OPTIONS\n" + + "\n" + + "options:\n" + + " -u \\Server\\Share [UNC prefix (single backslash)]\n" + + " -m MountPoint [X:|*|directory]\n", + ex.HasMessage ? ex.Message + "\n" : "", + PROGNAME)); + throw; + } + catch (Exception ex) + { + Log(EVENTLOG_ERROR_TYPE, String.Format("{0}", ex.Message)); + throw; + } + } + protected override void OnStop() + { + _Host.Unmount(); + _Host = null; + } + + private static void argtos(String[] Args, ref int I, ref String V) + { + if (Args.Length > ++I) + V = Args[I]; + else + throw new CommandLineUsageException(); + } + + private FileSystemHost _Host; + } + + class Program + { + static void Main(string[] args) + { + Environment.ExitCode = new NotifyfsService().Run(); + } + } +} diff --git a/3rd_party/winfsp-1.10/samples/notifyfs-dotnet/notifyfs-dotnet.csproj b/3rd_party/winfsp-1.10/samples/notifyfs-dotnet/notifyfs-dotnet.csproj new file mode 100644 index 00000000..2b71840a --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/notifyfs-dotnet/notifyfs-dotnet.csproj @@ -0,0 +1,77 @@ + + + + + Debug + AnyCPU + {DA7C383A-D10F-4FB0-BDCB-E7A7C5D068AA} + Exe + notifyfs + notifyfs-dotnet + v4.5.2 + 512 + true + true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + AnyCPU + true + full + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\ + $(BaseIntermediateOutputPath)$(Configuration)\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\ + $(BaseIntermediateOutputPath)$(Configuration)\ + TRACE + prompt + 4 + + + + + + + + $(MSBuildProgramFiles32)\WinFsp\bin\winfsp-msil.dll + + + + + False + Microsoft .NET Framework 4.5.2 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/notifyfs-dotnet/notifyfs-dotnet.sln b/3rd_party/winfsp-1.10/samples/notifyfs-dotnet/notifyfs-dotnet.sln new file mode 100644 index 00000000..d131b1de --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/notifyfs-dotnet/notifyfs-dotnet.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30717.126 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "notifyfs-dotnet", "notifyfs-dotnet.csproj", "{DA7C383A-D10F-4FB0-BDCB-E7A7C5D068AA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DA7C383A-D10F-4FB0-BDCB-E7A7C5D068AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DA7C383A-D10F-4FB0-BDCB-E7A7C5D068AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA7C383A-D10F-4FB0-BDCB-E7A7C5D068AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DA7C383A-D10F-4FB0-BDCB-E7A7C5D068AA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {18D87005-09CA-40CF-9B51-139B486AB8D0} + EndGlobalSection +EndGlobal diff --git a/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.c b/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.c new file mode 100644 index 00000000..12e58024 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.c @@ -0,0 +1,508 @@ +/** + * @file notifyfs.c + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#include +#include + +#define DEBUGFLAGS 0 +//#define DEBUGFLAGS -1 + +#define PROGNAME "notifyfs" +#define ALLOCATION_UNIT 4096 + +#define info(format, ...) FspServiceLog(EVENTLOG_INFORMATION_TYPE, format, __VA_ARGS__) +#define warn(format, ...) FspServiceLog(EVENTLOG_WARNING_TYPE, format, __VA_ARGS__) +#define fail(format, ...) FspServiceLog(EVENTLOG_ERROR_TYPE, format, __VA_ARGS__) + +typedef struct +{ + FSP_FILE_SYSTEM *FileSystem; + PTP_TIMER Timer; + UINT32 Ticks; +} NOTIFYFS; + +static PSECURITY_DESCRIPTOR DefaultSecurity; +static ULONG DefaultSecuritySize; + +static UINT32 CountFromTicks(UINT32 Ticks) +{ + /* + * The formula below produces the periodic sequence: + * 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, + * 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, + * ... + */ + UINT32 div10 = (Ticks % 20) / 10; + UINT32 mod10 = Ticks % 10; + UINT32 mdv10 = 1 - div10; + UINT32 mmd10 = 10 - mod10; + return mdv10 * mod10 + div10 * mmd10; +} + +static UINT32 FileCount(NOTIFYFS *Notifyfs) +{ + UINT32 Ticks = InterlockedOr(&Notifyfs->Ticks, 0); + return CountFromTicks(Ticks); +} + +static UINT32 FileLookup(NOTIFYFS *Notifyfs, PWSTR FileName) +{ + FileName++; + PWSTR Endp; + UINT32 Count = FileCount(Notifyfs); + UINT32 Index = wcstoul(FileName, &Endp, 10); + if ('\0' != *Endp || (FileName != Endp && (0 == Index || Index > Count))) + return -1; /* not found */ + if (FileName == Endp) + return 0; /* root */ + return Index; /* regular file named 1, 2, ..., Count */ +} + +static UINT32 FileContents(UINT32 Index, WCHAR P[32]) +{ + WCHAR Buffer[32]; + if (0 == P) + P = Buffer; + if (0 == Index) + P[0] = '\0'; + else + wsprintfW(P, L"%u\n", (unsigned)Index); + return lstrlenW(P); +} + +static VOID FillFileInfo(UINT32 Index, FSP_FSCTL_FILE_INFO *FileInfo) +{ + FILETIME SystemTime; + + GetSystemTimeAsFileTime(&SystemTime); + + memset(FileInfo, 0, sizeof FileInfo); + FileInfo->FileAttributes = 0 == Index ? FILE_ATTRIBUTE_DIRECTORY : 0; + FileInfo->FileSize = FileContents(Index, 0); + FileInfo->AllocationSize = (FileInfo->FileSize + ALLOCATION_UNIT - 1) + / ALLOCATION_UNIT * ALLOCATION_UNIT; + FileInfo->CreationTime = + FileInfo->LastAccessTime = + FileInfo->LastWriteTime = + FileInfo->ChangeTime = *(PUINT64)&SystemTime; +} + +static BOOLEAN AddDirInfo(PWSTR FileName, UINT32 Index, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred) +{ + union + { + UINT8 B[FIELD_OFFSET(FSP_FSCTL_DIR_INFO, FileNameBuf) + MAX_PATH * sizeof(WCHAR)]; + FSP_FSCTL_DIR_INFO D; + } DirInfoBuf; + FSP_FSCTL_DIR_INFO *DirInfo = &DirInfoBuf.D; + + memset(DirInfo->Padding, 0, sizeof DirInfo->Padding); + if (0 != FileName) + lstrcpyW(DirInfo->FileNameBuf, FileName); + else + wsprintfW(DirInfo->FileNameBuf, L"%u", (unsigned)Index); + DirInfo->Size = (UINT16)(sizeof(FSP_FSCTL_DIR_INFO) + wcslen(DirInfo->FileNameBuf) * sizeof(WCHAR)); + FillFileInfo(Index, &DirInfo->FileInfo); + + return FspFileSystemAddDirInfo(DirInfo, Buffer, Length, PBytesTransferred); +} + +static NTSTATUS GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_VOLUME_INFO *VolumeInfo) +{ + memset(VolumeInfo, 0, sizeof *VolumeInfo); + + return STATUS_SUCCESS; +} + +static NTSTATUS GetSecurityByName(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, PUINT32 PFileAttributes, + PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) +{ + NOTIFYFS *Notifyfs = (NOTIFYFS *)FileSystem->UserContext; + UINT32 Index; + + Index = FileLookup(Notifyfs, FileName); + if (-1 == Index) + return STATUS_OBJECT_NAME_NOT_FOUND; + + if (0 != PFileAttributes) + *PFileAttributes = 0 == Index ? FILE_ATTRIBUTE_DIRECTORY : 0; + + if (0 != PSecurityDescriptorSize) + { + if (DefaultSecuritySize > *PSecurityDescriptorSize) + { + *PSecurityDescriptorSize = DefaultSecuritySize; + return STATUS_BUFFER_OVERFLOW; + } + + *PSecurityDescriptorSize = DefaultSecuritySize; + if (0 != SecurityDescriptor) + memcpy(SecurityDescriptor, DefaultSecurity, DefaultSecuritySize); + } + + return STATUS_SUCCESS; +} + +static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess, + UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, + PVOID *PFileContext, FSP_FSCTL_FILE_INFO *FileInfo) +{ + return STATUS_INVALID_DEVICE_REQUEST; +} + +static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess, + PVOID *PFileContext, FSP_FSCTL_FILE_INFO *FileInfo) +{ + NOTIFYFS *Notifyfs = (NOTIFYFS *)FileSystem->UserContext; + FSP_FSCTL_TRANSACT_FULL_CONTEXT *FullContext = (PVOID)PFileContext; + UINT32 Index; + + Index = FileLookup(Notifyfs, FileName); + if (-1 == Index) + return STATUS_OBJECT_NAME_NOT_FOUND; + + FullContext->UserContext = Index; + FullContext->UserContext2 = 0; + + FillFileInfo(Index, FileInfo); + + return STATUS_SUCCESS; +} + +static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + return STATUS_INVALID_DEVICE_REQUEST; +} + +static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PVOID Buffer, UINT64 Offset, ULONG Length, + PULONG PBytesTransferred) +{ + NOTIFYFS *Notifyfs = (NOTIFYFS *)FileSystem->UserContext; + FSP_FSCTL_TRANSACT_FULL_CONTEXT *FullContext = FileContext; + UINT32 Index = (UINT32)FullContext->UserContext; + UINT64 EndOffset; + WCHAR ContentBuf[32]; + UINT32 ContentLen; + + ContentLen = FileContents(Index, ContentBuf); + + if (Offset >= ContentLen) + return STATUS_END_OF_FILE; + + EndOffset = Offset + Length; + if (EndOffset > ContentLen) + EndOffset = ContentLen; + + memcpy(Buffer, (PUINT8)ContentBuf + Offset, (size_t)(EndOffset - Offset)); + + *PBytesTransferred = (ULONG)(EndOffset - Offset); + + return STATUS_SUCCESS; +} + +static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + NOTIFYFS *Notifyfs = (NOTIFYFS *)FileSystem->UserContext; + FSP_FSCTL_TRANSACT_FULL_CONTEXT *FullContext = FileContext; + UINT32 Index = (UINT32)FullContext->UserContext; + + FillFileInfo(Index, FileInfo); + + return STATUS_SUCCESS; +} + +static NTSTATUS ReadDirectory(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PWSTR Pattern, PWSTR Marker, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred) +{ + NOTIFYFS *Notifyfs = (NOTIFYFS *)FileSystem->UserContext; + UINT32 Count = FileCount(Notifyfs); + UINT32 Index; + + Index = 0 == Marker ? 1 : wcstoul(Marker, 0, 10) + 1; + for (; Count >= Index; Index++) + if (!AddDirInfo(0, Index, Buffer, Length, PBytesTransferred)) + break; + FspFileSystemAddDirInfo(0, Buffer, Length, PBytesTransferred); + + return STATUS_SUCCESS; +} + +static FSP_FILE_SYSTEM_INTERFACE NotifyfsInterface = +{ + .GetVolumeInfo = GetVolumeInfo, + .GetSecurityByName = GetSecurityByName, + .Create = Create, + .Open = Open, + .Overwrite = Overwrite, + .Read = Read, + .GetFileInfo = GetFileInfo, + .ReadDirectory = ReadDirectory, +}; + +static VOID CALLBACK NotifyfsTick(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_TIMER Timer) +{ + NOTIFYFS *Notifyfs = Context; + UINT32 Ticks = InterlockedIncrement(&Notifyfs->Ticks); + UINT32 OldCount = CountFromTicks(Ticks - 1); + UINT32 NewCount = CountFromTicks(Ticks); + union + { + UINT8 B[FIELD_OFFSET(FSP_FSCTL_NOTIFY_INFO, FileNameBuf) + MAX_PATH * sizeof(WCHAR)]; + FSP_FSCTL_NOTIFY_INFO V; + } NotifyInfoBuf; + FSP_FSCTL_NOTIFY_INFO *NotifyInfo = &NotifyInfoBuf.V; + + memset(NotifyInfo, 0, sizeof NotifyInfo); + if (OldCount < NewCount) + { + wsprintfW(NotifyInfo->FileNameBuf, L"\\%u", (unsigned)NewCount); + NotifyInfo->Size = (UINT16)(sizeof(FSP_FSCTL_NOTIFY_INFO) + + wcslen(NotifyInfo->FileNameBuf) * sizeof(WCHAR)); + NotifyInfo->Action = FILE_ACTION_ADDED; + NotifyInfo->Filter = FILE_NOTIFY_CHANGE_FILE_NAME; + FspDebugLog("CREATE \\%u\n", (unsigned)NewCount); + } + else if (OldCount > NewCount) + { + wsprintfW(NotifyInfo->FileNameBuf, L"\\%u", (unsigned)OldCount); + NotifyInfo->Size = (UINT16)(sizeof(FSP_FSCTL_NOTIFY_INFO) + + wcslen(NotifyInfo->FileNameBuf) * sizeof(WCHAR)); + NotifyInfo->Action = FILE_ACTION_REMOVED; + NotifyInfo->Filter = FILE_NOTIFY_CHANGE_FILE_NAME; + FspDebugLog("REMOVE \\%u\n", (unsigned)OldCount); + } + + if (OldCount != NewCount) + { + if (STATUS_SUCCESS == FspFileSystemNotifyBegin(Notifyfs->FileSystem, 500)) + { + FspFileSystemNotify(Notifyfs->FileSystem, NotifyInfo, NotifyInfo->Size); + FspFileSystemNotifyEnd(Notifyfs->FileSystem); + } + } +} + +static VOID NotifyfsDelete(NOTIFYFS *Notifyfs); + +static NTSTATUS NotifyfsCreate(PWSTR VolumePrefix, PWSTR MountPoint, NOTIFYFS **PNotifyfs) +{ + FSP_FSCTL_VOLUME_PARAMS VolumeParams; + NOTIFYFS *Notifyfs = 0; + INT64 TimerDue; + NTSTATUS Result; + + *PNotifyfs = 0; + + if (!ConvertStringSecurityDescriptorToSecurityDescriptorW( + L"O:BAG:BAD:P(A;;FA;;;SY)(A;;FA;;;BA)(A;;FA;;;WD)", SDDL_REVISION_1, + &DefaultSecurity, &DefaultSecuritySize)) + { + Result = FspNtStatusFromWin32(GetLastError()); + goto exit; + } + + Notifyfs = malloc(sizeof *Notifyfs); + if (0 == Notifyfs) + { + Result = STATUS_INSUFFICIENT_RESOURCES; + goto exit; + } + memset(Notifyfs, 0, sizeof *Notifyfs); + + memset(&VolumeParams, 0, sizeof VolumeParams); + VolumeParams.SectorSize = ALLOCATION_UNIT; + VolumeParams.SectorsPerAllocationUnit = 1; + VolumeParams.VolumeCreationTime = 0; + VolumeParams.VolumeSerialNumber = 0; + VolumeParams.FileInfoTimeout = 1000; + VolumeParams.CaseSensitiveSearch = 0; + VolumeParams.CasePreservedNames = 1; + VolumeParams.UnicodeOnDisk = 1; + VolumeParams.PersistentAcls = 0; + VolumeParams.PostCleanupWhenModifiedOnly = 1; + VolumeParams.UmFileContextIsFullContext = 1; + if (0 != VolumePrefix) + wcscpy_s(VolumeParams.Prefix, sizeof VolumeParams.Prefix / sizeof(WCHAR), VolumePrefix); + wcscpy_s(VolumeParams.FileSystemName, sizeof VolumeParams.FileSystemName / sizeof(WCHAR), + L"" PROGNAME); + + Result = FspFileSystemCreate( + VolumeParams.Prefix[0] ? L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME, + &VolumeParams, + &NotifyfsInterface, + &Notifyfs->FileSystem); + if (!NT_SUCCESS(Result)) + goto exit; + Notifyfs->FileSystem->UserContext = Notifyfs; + + FspFileSystemSetDebugLog(Notifyfs->FileSystem, DEBUGFLAGS); + + Result = FspFileSystemSetMountPoint(Notifyfs->FileSystem, MountPoint); + if (!NT_SUCCESS(Result)) + goto exit; + + Notifyfs->Timer = CreateThreadpoolTimer(NotifyfsTick, Notifyfs, 0); + if (0 == Notifyfs->Timer) + { + Result = FspNtStatusFromWin32(GetLastError()); + goto exit; + } + + TimerDue = -1000; + SetThreadpoolTimer(Notifyfs->Timer, (PVOID)&TimerDue, 1000, 0); + + Result = STATUS_SUCCESS; + +exit: + if (NT_SUCCESS(Result)) + *PNotifyfs = Notifyfs; + else if (0 != Notifyfs) + NotifyfsDelete(Notifyfs); + + return Result; +} + +static VOID NotifyfsDelete(NOTIFYFS *Notifyfs) +{ + if (0 != Notifyfs->Timer) + { + SetThreadpoolTimer(Notifyfs->Timer, 0, 0, 0); + WaitForThreadpoolTimerCallbacks(Notifyfs->Timer, TRUE); + CloseThreadpoolTimer(Notifyfs->Timer); + } + + if (0 != Notifyfs->FileSystem) + FspFileSystemDelete(Notifyfs->FileSystem); + + free(Notifyfs); +} + +static NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) +{ +#define argtos(v) if (arge > ++argp) v = *argp; else goto usage + + wchar_t **argp, **arge; + PWSTR VolumePrefix = 0; + PWSTR MountPoint = 0; + NOTIFYFS *Notifyfs = 0; + NTSTATUS Result; + + for (argp = argv + 1, arge = argv + argc; arge > argp; argp++) + { + if (L'-' != argp[0][0]) + break; + switch (argp[0][1]) + { + case L'?': + goto usage; + case L'm': + argtos(MountPoint); + break; + case L'u': + argtos(VolumePrefix); + break; + default: + goto usage; + } + } + + if (arge > argp) + goto usage; + + if (0 == MountPoint) + goto usage; + + FspDebugLogSetHandle(GetStdHandle(STD_ERROR_HANDLE)); + + Result = NotifyfsCreate(VolumePrefix, MountPoint, &Notifyfs); + if (!NT_SUCCESS(Result)) + { + fail(L"cannot create file system"); + goto exit; + } + + Result = FspFileSystemStartDispatcher(Notifyfs->FileSystem, 0); + if (!NT_SUCCESS(Result)) + { + fail(L"cannot start file system"); + goto exit; + } + + MountPoint = FspFileSystemMountPoint(Notifyfs->FileSystem); + + info(L"%s%s%s -m %s", + L"" PROGNAME, + 0 != VolumePrefix && L'\0' != VolumePrefix[0] ? L" -u " : L"", + 0 != VolumePrefix && L'\0' != VolumePrefix[0] ? VolumePrefix : L"", + MountPoint); + + Service->UserContext = Notifyfs; + Result = STATUS_SUCCESS; + +exit: + if (!NT_SUCCESS(Result) && 0 != Notifyfs) + NotifyfsDelete(Notifyfs); + + return Result; + +usage:; + static wchar_t usage[] = L"" + "usage: %s OPTIONS\n" + "\n" + "options:\n" + " -u \\Server\\Share [UNC prefix (single backslash)]\n" + " -m MountPoint [X:|*|directory]\n"; + + fail(usage, L"" PROGNAME); + + return STATUS_UNSUCCESSFUL; + +#undef argtos +} + +static NTSTATUS SvcStop(FSP_SERVICE *Service) +{ + NOTIFYFS *Notifyfs = Service->UserContext; + + FspFileSystemStopDispatcher(Notifyfs->FileSystem); + NotifyfsDelete(Notifyfs); + + return STATUS_SUCCESS; +} + +int wmain(int argc, wchar_t **argv) +{ + if (!NT_SUCCESS(FspLoad(0))) + return ERROR_DELAY_LOAD_FAILED; + + return FspServiceRun(L"" PROGNAME, SvcStart, SvcStop, 0); +} diff --git a/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.sln b/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.sln new file mode 100644 index 00000000..93b88953 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30717.126 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "notifyfs", "notifyfs.vcxproj", "{4BA1DED0-4268-408A-A4E2-8E1A6D55A99C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4BA1DED0-4268-408A-A4E2-8E1A6D55A99C}.Debug|x64.ActiveCfg = Debug|x64 + {4BA1DED0-4268-408A-A4E2-8E1A6D55A99C}.Debug|x64.Build.0 = Debug|x64 + {4BA1DED0-4268-408A-A4E2-8E1A6D55A99C}.Debug|x86.ActiveCfg = Debug|Win32 + {4BA1DED0-4268-408A-A4E2-8E1A6D55A99C}.Debug|x86.Build.0 = Debug|Win32 + {4BA1DED0-4268-408A-A4E2-8E1A6D55A99C}.Release|x64.ActiveCfg = Release|x64 + {4BA1DED0-4268-408A-A4E2-8E1A6D55A99C}.Release|x64.Build.0 = Release|x64 + {4BA1DED0-4268-408A-A4E2-8E1A6D55A99C}.Release|x86.ActiveCfg = Release|Win32 + {4BA1DED0-4268-408A-A4E2-8E1A6D55A99C}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3CD0763B-2BFD-4D73-9539-13273788C41E} + EndGlobalSection +EndGlobal diff --git a/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.vcxproj b/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.vcxproj new file mode 100644 index 00000000..dbc6ce6a --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.vcxproj @@ -0,0 +1,175 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {4ba1ded0-4268-408a-a4e2-8e1a6d55a99c} + notifyfs + $(LatestTargetPlatformVersion) + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.vcxproj.filters b/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.vcxproj.filters new file mode 100644 index 00000000..fb8d0ba8 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/notifyfs/notifyfs.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/passthrough-dotnet/Program.cs b/3rd_party/winfsp-1.10/samples/passthrough-dotnet/Program.cs new file mode 100644 index 00000000..53f69c19 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-dotnet/Program.cs @@ -0,0 +1,859 @@ +/** + * @file Program.cs + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +using System; +using System.Collections; +using System.IO; +using System.Runtime.InteropServices; +using System.Security.AccessControl; + +using Fsp; +using VolumeInfo = Fsp.Interop.VolumeInfo; +using FileInfo = Fsp.Interop.FileInfo; + +namespace passthrough +{ + class Ptfs : FileSystemBase + { + protected const int ALLOCATION_UNIT = 4096; + + protected static void ThrowIoExceptionWithHResult(Int32 HResult) + { + throw new IOException(null, HResult); + } + protected static void ThrowIoExceptionWithWin32(Int32 Error) + { + ThrowIoExceptionWithHResult(unchecked((Int32)(0x80070000 | Error))); + } + protected static void ThrowIoExceptionWithNtStatus(Int32 Status) + { + ThrowIoExceptionWithWin32((Int32)Win32FromNtStatus(Status)); + } + + protected class FileDesc + { + public FileStream Stream; + public DirectoryInfo DirInfo; + public DictionaryEntry[] FileSystemInfos; + + public FileDesc(FileStream Stream) + { + this.Stream = Stream; + } + public FileDesc(DirectoryInfo DirInfo) + { + this.DirInfo = DirInfo; + } + public static void GetFileInfoFromFileSystemInfo( + FileSystemInfo Info, + out FileInfo FileInfo) + { + FileInfo.FileAttributes = (UInt32)Info.Attributes; + FileInfo.ReparseTag = 0; + FileInfo.FileSize = Info is System.IO.FileInfo ? + (UInt64)((System.IO.FileInfo)Info).Length : 0; + FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1) + / ALLOCATION_UNIT * ALLOCATION_UNIT; + FileInfo.CreationTime = (UInt64)Info.CreationTimeUtc.ToFileTimeUtc(); + FileInfo.LastAccessTime = (UInt64)Info.LastAccessTimeUtc.ToFileTimeUtc(); + FileInfo.LastWriteTime = (UInt64)Info.LastWriteTimeUtc.ToFileTimeUtc(); + FileInfo.ChangeTime = FileInfo.LastWriteTime; + FileInfo.IndexNumber = 0; + FileInfo.HardLinks = 0; + } + public Int32 GetFileInfo(out FileInfo FileInfo) + { + if (null != Stream) + { + BY_HANDLE_FILE_INFORMATION Info; + if (!GetFileInformationByHandle(Stream.SafeFileHandle.DangerousGetHandle(), + out Info)) + ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error()); + FileInfo.FileAttributes = Info.dwFileAttributes; + FileInfo.ReparseTag = 0; + FileInfo.FileSize = (UInt64)Stream.Length; + FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1) + / ALLOCATION_UNIT * ALLOCATION_UNIT; + FileInfo.CreationTime = Info.ftCreationTime; + FileInfo.LastAccessTime = Info.ftLastAccessTime; + FileInfo.LastWriteTime = Info.ftLastWriteTime; + FileInfo.ChangeTime = FileInfo.LastWriteTime; + FileInfo.IndexNumber = 0; + FileInfo.HardLinks = 0; + } + else + GetFileInfoFromFileSystemInfo(DirInfo, out FileInfo); + return STATUS_SUCCESS; + } + public void SetBasicInfo( + UInt32 FileAttributes, + UInt64 CreationTime, + UInt64 LastAccessTime, + UInt64 LastWriteTime) + { + if (0 == FileAttributes) + FileAttributes = (UInt32)System.IO.FileAttributes.Normal; + if (null != Stream) + { + FILE_BASIC_INFO Info = default(FILE_BASIC_INFO); + if (unchecked((UInt32)(-1)) != FileAttributes) + Info.FileAttributes = FileAttributes; + if (0 != CreationTime) + Info.CreationTime = CreationTime; + if (0 != LastAccessTime) + Info.LastAccessTime = LastAccessTime; + if (0 != LastWriteTime) + Info.LastWriteTime = LastWriteTime; + if (!SetFileInformationByHandle(Stream.SafeFileHandle.DangerousGetHandle(), + 0/*FileBasicInfo*/, ref Info, (UInt32)Marshal.SizeOf(Info))) + ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error()); + } + else + { + if (unchecked((UInt32)(-1)) != FileAttributes) + DirInfo.Attributes = (System.IO.FileAttributes)FileAttributes; + if (0 != CreationTime) + DirInfo.CreationTimeUtc = DateTime.FromFileTimeUtc((Int64)CreationTime); + if (0 != LastAccessTime) + DirInfo.LastAccessTimeUtc = DateTime.FromFileTimeUtc((Int64)LastAccessTime); + if (0 != LastWriteTime) + DirInfo.LastWriteTimeUtc = DateTime.FromFileTimeUtc((Int64)LastWriteTime); + } + } + public UInt32 GetFileAttributes() + { + FileInfo FileInfo; + GetFileInfo(out FileInfo); + return FileInfo.FileAttributes; + } + public void SetFileAttributes(UInt32 FileAttributes) + { + SetBasicInfo(FileAttributes, 0, 0, 0); + } + public Byte[] GetSecurityDescriptor() + { + if (null != Stream) + return Stream.GetAccessControl().GetSecurityDescriptorBinaryForm(); + else + return DirInfo.GetAccessControl().GetSecurityDescriptorBinaryForm(); + } + public void SetSecurityDescriptor(AccessControlSections Sections, Byte[] SecurityDescriptor) + { + Int32 SecurityInformation = 0; + if (0 != (Sections & AccessControlSections.Owner)) + SecurityInformation |= 1/*OWNER_SECURITY_INFORMATION*/; + if (0 != (Sections & AccessControlSections.Group)) + SecurityInformation |= 2/*GROUP_SECURITY_INFORMATION*/; + if (0 != (Sections & AccessControlSections.Access)) + SecurityInformation |= 4/*DACL_SECURITY_INFORMATION*/; + if (0 != (Sections & AccessControlSections.Audit)) + SecurityInformation |= 8/*SACL_SECURITY_INFORMATION*/; + if (null != Stream) + { + if (!SetKernelObjectSecurity(Stream.SafeFileHandle.DangerousGetHandle(), + SecurityInformation, SecurityDescriptor)) + ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error()); + } + else + { + if (!SetFileSecurityW(DirInfo.FullName, + SecurityInformation, SecurityDescriptor)) + ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error()); + } + } + public void SetDisposition(Boolean Safe) + { + if (null != Stream) + { + FILE_DISPOSITION_INFO Info; + Info.DeleteFile = true; + if (!SetFileInformationByHandle(Stream.SafeFileHandle.DangerousGetHandle(), + 4/*FileDispositionInfo*/, ref Info, (UInt32)Marshal.SizeOf(Info))) + if (!Safe) + ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error()); + } + else + try + { + DirInfo.Delete(); + } + catch (Exception ex) + { + if (!Safe) + ThrowIoExceptionWithHResult(ex.HResult); + } + } + public static void Rename(String FileName, String NewFileName, Boolean ReplaceIfExists) + { + if (!MoveFileExW(FileName, NewFileName, ReplaceIfExists ? 1U/*MOVEFILE_REPLACE_EXISTING*/ : 0)) + ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error()); + } + + /* interop */ + [StructLayout(LayoutKind.Sequential, Pack = 4)] + private struct BY_HANDLE_FILE_INFORMATION + { + public UInt32 dwFileAttributes; + public UInt64 ftCreationTime; + public UInt64 ftLastAccessTime; + public UInt64 ftLastWriteTime; + public UInt32 dwVolumeSerialNumber; + public UInt32 nFileSizeHigh; + public UInt32 nFileSizeLow; + public UInt32 nNumberOfLinks; + public UInt32 nFileIndexHigh; + public UInt32 nFileIndexLow; + } + [StructLayout(LayoutKind.Sequential)] + private struct FILE_BASIC_INFO + { + public UInt64 CreationTime; + public UInt64 LastAccessTime; + public UInt64 LastWriteTime; + public UInt64 ChangeTime; + public UInt32 FileAttributes; + } + [StructLayout(LayoutKind.Sequential)] + private struct FILE_DISPOSITION_INFO + { + public Boolean DeleteFile; + } + [DllImport("kernel32.dll", SetLastError = true)] + private static extern Boolean GetFileInformationByHandle( + IntPtr hFile, + out BY_HANDLE_FILE_INFORMATION lpFileInformation); + [DllImport("kernel32.dll", SetLastError = true)] + private static extern Boolean SetFileInformationByHandle( + IntPtr hFile, + Int32 FileInformationClass, + ref FILE_BASIC_INFO lpFileInformation, + UInt32 dwBufferSize); + [DllImport("kernel32.dll", SetLastError = true)] + private static extern Boolean SetFileInformationByHandle( + IntPtr hFile, + Int32 FileInformationClass, + ref FILE_DISPOSITION_INFO lpFileInformation, + UInt32 dwBufferSize); + [DllImport("kernel32.dll", SetLastError = true)] + private static extern Boolean MoveFileExW( + [MarshalAs(UnmanagedType.LPWStr)] String lpExistingFileName, + [MarshalAs(UnmanagedType.LPWStr)] String lpNewFileName, + UInt32 dwFlags); + [DllImport("advapi32.dll", SetLastError = true)] + private static extern Boolean SetFileSecurityW( + [MarshalAs(UnmanagedType.LPWStr)] String FileName, + Int32 SecurityInformation, + Byte[] SecurityDescriptor); + [DllImport("advapi32.dll", SetLastError = true)] + private static extern Boolean SetKernelObjectSecurity( + IntPtr Handle, + Int32 SecurityInformation, + Byte[] SecurityDescriptor); + } + + private class DirectoryEntryComparer : IComparer + { + public int Compare(object x, object y) + { + return String.Compare( + (String)((DictionaryEntry)x).Key, + (String)((DictionaryEntry)y).Key); + } + } + private static DirectoryEntryComparer _DirectoryEntryComparer = + new DirectoryEntryComparer(); + + public Ptfs(String Path0) + { + _Path = Path.GetFullPath(Path0); + if (_Path.EndsWith("\\")) + _Path = _Path.Substring(0, _Path.Length - 1); + } + public String ConcatPath(String FileName) + { + return _Path + FileName; + } + public override Int32 ExceptionHandler(Exception ex) + { + Int32 HResult = ex.HResult; /* needs Framework 4.5 */ + if (0x80070000 == (HResult & 0xFFFF0000)) + return NtStatusFromWin32((UInt32)HResult & 0xFFFF); + return STATUS_UNEXPECTED_IO_ERROR; + } + public override Int32 Init(Object Host0) + { + FileSystemHost Host = (FileSystemHost)Host0; + Host.SectorSize = ALLOCATION_UNIT; + Host.SectorsPerAllocationUnit = 1; + Host.MaxComponentLength = 255; + Host.FileInfoTimeout = 1000; + Host.CaseSensitiveSearch = false; + Host.CasePreservedNames = true; + Host.UnicodeOnDisk = true; + Host.PersistentAcls = true; + Host.PostCleanupWhenModifiedOnly = true; + Host.PassQueryDirectoryPattern = true; + Host.FlushAndPurgeOnCleanup = true; + Host.VolumeCreationTime = (UInt64)File.GetCreationTimeUtc(_Path).ToFileTimeUtc(); + Host.VolumeSerialNumber = 0; + return STATUS_SUCCESS; + } + public override Int32 GetVolumeInfo( + out VolumeInfo VolumeInfo) + { + VolumeInfo = default(VolumeInfo); + try + { + DriveInfo Info = new DriveInfo(_Path); + VolumeInfo.TotalSize = (UInt64)Info.TotalSize; + VolumeInfo.FreeSize = (UInt64)Info.TotalFreeSpace; + } + catch (ArgumentException) + { + /* + * DriveInfo only supports drives and does not support UNC paths. + * It would be better to use GetDiskFreeSpaceEx here. + */ + } + return STATUS_SUCCESS; + } + public override Int32 GetSecurityByName( + String FileName, + out UInt32 FileAttributes/* or ReparsePointIndex */, + ref Byte[] SecurityDescriptor) + { + FileName = ConcatPath(FileName); + System.IO.FileInfo Info = new System.IO.FileInfo(FileName); + FileAttributes = (UInt32)Info.Attributes; + if (null != SecurityDescriptor) + SecurityDescriptor = Info.GetAccessControl().GetSecurityDescriptorBinaryForm(); + return STATUS_SUCCESS; + } + public override Int32 Create( + String FileName, + UInt32 CreateOptions, + UInt32 GrantedAccess, + UInt32 FileAttributes, + Byte[] SecurityDescriptor, + UInt64 AllocationSize, + out Object FileNode, + out Object FileDesc0, + out FileInfo FileInfo, + out String NormalizedName) + { + FileDesc FileDesc = null; + try + { + FileName = ConcatPath(FileName); + if (0 == (CreateOptions & FILE_DIRECTORY_FILE)) + { + FileSecurity Security = null; + if (null != SecurityDescriptor) + { + Security = new FileSecurity(); + Security.SetSecurityDescriptorBinaryForm(SecurityDescriptor); + } + FileDesc = new FileDesc( + new FileStream( + FileName, + FileMode.CreateNew, + (FileSystemRights)GrantedAccess | FileSystemRights.WriteAttributes, + FileShare.Read | FileShare.Write | FileShare.Delete, + 4096, + 0, + Security)); + FileDesc.SetFileAttributes(FileAttributes | (UInt32)System.IO.FileAttributes.Archive); + } + else + { + if (Directory.Exists(FileName)) + ThrowIoExceptionWithNtStatus(STATUS_OBJECT_NAME_COLLISION); + DirectorySecurity Security = null; + if (null != SecurityDescriptor) + { + Security = new DirectorySecurity(); + Security.SetSecurityDescriptorBinaryForm(SecurityDescriptor); + } + FileDesc = new FileDesc( + Directory.CreateDirectory(FileName, Security)); + FileDesc.SetFileAttributes(FileAttributes); + } + FileNode = default(Object); + FileDesc0 = FileDesc; + NormalizedName = default(String); + return FileDesc.GetFileInfo(out FileInfo); + } + catch + { + if (null != FileDesc && null != FileDesc.Stream) + FileDesc.Stream.Dispose(); + throw; + } + } + public override Int32 Open( + String FileName, + UInt32 CreateOptions, + UInt32 GrantedAccess, + out Object FileNode, + out Object FileDesc0, + out FileInfo FileInfo, + out String NormalizedName) + { + FileDesc FileDesc = null; + try + { + FileName = ConcatPath(FileName); + if (!Directory.Exists(FileName)) + { + FileDesc = new FileDesc( + new FileStream( + FileName, + FileMode.Open, + (FileSystemRights)GrantedAccess, + FileShare.Read | FileShare.Write | FileShare.Delete, + 4096, + 0)); + } + else + { + FileDesc = new FileDesc( + new DirectoryInfo(FileName)); + } + FileNode = default(Object); + FileDesc0 = FileDesc; + NormalizedName = default(String); + return FileDesc.GetFileInfo(out FileInfo); + } + catch + { + if (null != FileDesc && null != FileDesc.Stream) + FileDesc.Stream.Dispose(); + throw; + } + } + public override Int32 Overwrite( + Object FileNode, + Object FileDesc0, + UInt32 FileAttributes, + Boolean ReplaceFileAttributes, + UInt64 AllocationSize, + out FileInfo FileInfo) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + if (ReplaceFileAttributes) + FileDesc.SetFileAttributes(FileAttributes | + (UInt32)System.IO.FileAttributes.Archive); + else if (0 != FileAttributes) + FileDesc.SetFileAttributes(FileDesc.GetFileAttributes() | FileAttributes | + (UInt32)System.IO.FileAttributes.Archive); + FileDesc.Stream.SetLength(0); + return FileDesc.GetFileInfo(out FileInfo); + } + public override void Cleanup( + Object FileNode, + Object FileDesc0, + String FileName, + UInt32 Flags) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + if (0 != (Flags & CleanupDelete)) + { + FileDesc.SetDisposition(true); + if (null != FileDesc.Stream) + FileDesc.Stream.Dispose(); + } + } + public override void Close( + Object FileNode, + Object FileDesc0) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + if (null != FileDesc.Stream) + FileDesc.Stream.Dispose(); + } + public override Int32 Read( + Object FileNode, + Object FileDesc0, + IntPtr Buffer, + UInt64 Offset, + UInt32 Length, + out UInt32 PBytesTransferred) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + if (Offset >= (UInt64)FileDesc.Stream.Length) + ThrowIoExceptionWithNtStatus(STATUS_END_OF_FILE); + Byte[] Bytes = new byte[Length]; + FileDesc.Stream.Seek((Int64)Offset, SeekOrigin.Begin); + PBytesTransferred = (UInt32)FileDesc.Stream.Read(Bytes, 0, Bytes.Length); + Marshal.Copy(Bytes, 0, Buffer, Bytes.Length); + return STATUS_SUCCESS; + } + public override Int32 Write( + Object FileNode, + Object FileDesc0, + IntPtr Buffer, + UInt64 Offset, + UInt32 Length, + Boolean WriteToEndOfFile, + Boolean ConstrainedIo, + out UInt32 PBytesTransferred, + out FileInfo FileInfo) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + if (ConstrainedIo) + { + if (Offset >= (UInt64)FileDesc.Stream.Length) + { + PBytesTransferred = default(UInt32); + FileInfo = default(FileInfo); + return STATUS_SUCCESS; + } + if (Offset + Length > (UInt64)FileDesc.Stream.Length) + Length = (UInt32)((UInt64)FileDesc.Stream.Length - Offset); + } + Byte[] Bytes = new byte[Length]; + Marshal.Copy(Buffer, Bytes, 0, Bytes.Length); + if (!WriteToEndOfFile) + FileDesc.Stream.Seek((Int64)Offset, SeekOrigin.Begin); + FileDesc.Stream.Write(Bytes, 0, Bytes.Length); + PBytesTransferred = (UInt32)Bytes.Length; + return FileDesc.GetFileInfo(out FileInfo); + } + public override Int32 Flush( + Object FileNode, + Object FileDesc0, + out FileInfo FileInfo) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + if (null == FileDesc) + { + /* we do not flush the whole volume, so just return SUCCESS */ + FileInfo = default(FileInfo); + return STATUS_SUCCESS; + } + FileDesc.Stream.Flush(true); + return FileDesc.GetFileInfo(out FileInfo); + } + public override Int32 GetFileInfo( + Object FileNode, + Object FileDesc0, + out FileInfo FileInfo) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + return FileDesc.GetFileInfo(out FileInfo); + } + public override Int32 SetBasicInfo( + Object FileNode, + Object FileDesc0, + UInt32 FileAttributes, + UInt64 CreationTime, + UInt64 LastAccessTime, + UInt64 LastWriteTime, + UInt64 ChangeTime, + out FileInfo FileInfo) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + FileDesc.SetBasicInfo(FileAttributes, CreationTime, LastAccessTime, LastWriteTime); + return FileDesc.GetFileInfo(out FileInfo); + } + public override Int32 SetFileSize( + Object FileNode, + Object FileDesc0, + UInt64 NewSize, + Boolean SetAllocationSize, + out FileInfo FileInfo) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + if (!SetAllocationSize || (UInt64)FileDesc.Stream.Length > NewSize) + { + /* + * "FileInfo.FileSize > NewSize" explanation: + * Ptfs does not support allocation size. However if the new AllocationSize + * is less than the current FileSize we must truncate the file. + */ + FileDesc.Stream.SetLength((Int64)NewSize); + } + return FileDesc.GetFileInfo(out FileInfo); + } + public override Int32 CanDelete( + Object FileNode, + Object FileDesc0, + String FileName) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + FileDesc.SetDisposition(false); + return STATUS_SUCCESS; + } + public override Int32 Rename( + Object FileNode, + Object FileDesc0, + String FileName, + String NewFileName, + Boolean ReplaceIfExists) + { + FileName = ConcatPath(FileName); + NewFileName = ConcatPath(NewFileName); + FileDesc.Rename(FileName, NewFileName, ReplaceIfExists); + return STATUS_SUCCESS; + } + public override Int32 GetSecurity( + Object FileNode, + Object FileDesc0, + ref Byte[] SecurityDescriptor) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + SecurityDescriptor = FileDesc.GetSecurityDescriptor(); + return STATUS_SUCCESS; + } + public override Int32 SetSecurity( + Object FileNode, + Object FileDesc0, + AccessControlSections Sections, + Byte[] SecurityDescriptor) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + FileDesc.SetSecurityDescriptor(Sections, SecurityDescriptor); + return STATUS_SUCCESS; + } + public override Boolean ReadDirectoryEntry( + Object FileNode, + Object FileDesc0, + String Pattern, + String Marker, + ref Object Context, + out String FileName, + out FileInfo FileInfo) + { + FileDesc FileDesc = (FileDesc)FileDesc0; + if (null == FileDesc.FileSystemInfos) + { + if (null != Pattern) + Pattern = Pattern.Replace('<', '*').Replace('>', '?').Replace('"', '.'); + else + Pattern = "*"; + IEnumerable Enum = FileDesc.DirInfo.EnumerateFileSystemInfos(Pattern); + SortedList List = new SortedList(); + if (null != FileDesc.DirInfo && null != FileDesc.DirInfo.Parent) + { + List.Add(".", FileDesc.DirInfo); + List.Add("..", FileDesc.DirInfo.Parent); + } + foreach (FileSystemInfo Info in Enum) + List.Add(Info.Name, Info); + FileDesc.FileSystemInfos = new DictionaryEntry[List.Count]; + List.CopyTo(FileDesc.FileSystemInfos, 0); + } + int Index; + if (null == Context) + { + Index = 0; + if (null != Marker) + { + Index = Array.BinarySearch(FileDesc.FileSystemInfos, + new DictionaryEntry(Marker, null), + _DirectoryEntryComparer); + if (0 <= Index) + Index++; + else + Index = ~Index; + } + } + else + Index = (int)Context; + if (FileDesc.FileSystemInfos.Length > Index) + { + Context = Index + 1; + FileName = (String)FileDesc.FileSystemInfos[Index].Key; + FileDesc.GetFileInfoFromFileSystemInfo( + (FileSystemInfo)FileDesc.FileSystemInfos[Index].Value, + out FileInfo); + return true; + } + else + { + FileName = default(String); + FileInfo = default(FileInfo); + return false; + } + } + + private String _Path; + } + + class PtfsService : Service + { + private class CommandLineUsageException : Exception + { + public CommandLineUsageException(String Message = null) : base(Message) + { + HasMessage = null != Message; + } + + public bool HasMessage; + } + + private const String PROGNAME = "passthrough-dotnet"; + + public PtfsService() : base("PtfsService") + { + } + + protected override void OnStart(String[] Args) + { + try + { + String DebugLogFile = null; + UInt32 DebugFlags = 0; + String VolumePrefix = null; + String PassThrough = null; + String MountPoint = null; + IntPtr DebugLogHandle = (IntPtr)(-1); + FileSystemHost Host = null; + Ptfs Ptfs = null; + int I; + + for (I = 1; Args.Length > I; I++) + { + String Arg = Args[I]; + if ('-' != Arg[0]) + break; + switch (Arg[1]) + { + case '?': + throw new CommandLineUsageException(); + case 'd': + argtol(Args, ref I, ref DebugFlags); + break; + case 'D': + argtos(Args, ref I, ref DebugLogFile); + break; + case 'm': + argtos(Args, ref I, ref MountPoint); + break; + case 'p': + argtos(Args, ref I, ref PassThrough); + break; + case 'u': + argtos(Args, ref I, ref VolumePrefix); + break; + default: + throw new CommandLineUsageException(); + } + } + + if (Args.Length > I) + throw new CommandLineUsageException(); + + if (null == PassThrough && null != VolumePrefix) + { + I = VolumePrefix.IndexOf('\\'); + if (-1 != I && VolumePrefix.Length > I && '\\' != VolumePrefix[I + 1]) + { + I = VolumePrefix.IndexOf('\\', I + 1); + if (-1 != I && + VolumePrefix.Length > I + 1 && + ( + ('A' <= VolumePrefix[I + 1] && VolumePrefix[I + 1] <= 'Z') || + ('a' <= VolumePrefix[I + 1] && VolumePrefix[I + 1] <= 'z') + ) && + '$' == VolumePrefix[I + 2]) + { + PassThrough = String.Format("{0}:{1}", VolumePrefix[I + 1], VolumePrefix.Substring(I + 3)); + } + } + } + + if (null == PassThrough || null == MountPoint) + throw new CommandLineUsageException(); + + if (null != DebugLogFile) + if (0 > FileSystemHost.SetDebugLogFile(DebugLogFile)) + throw new CommandLineUsageException("cannot open debug log file"); + + Host = new FileSystemHost(Ptfs = new Ptfs(PassThrough)); + Host.Prefix = VolumePrefix; + if (0 > Host.Mount(MountPoint, null, true, DebugFlags)) + throw new IOException("cannot mount file system"); + MountPoint = Host.MountPoint(); + _Host = Host; + + Log(EVENTLOG_INFORMATION_TYPE, String.Format("{0}{1}{2} -p {3} -m {4}", + PROGNAME, + null != VolumePrefix && 0 < VolumePrefix.Length ? " -u " : "", + null != VolumePrefix && 0 < VolumePrefix.Length ? VolumePrefix : "", + PassThrough, + MountPoint)); + } + catch (CommandLineUsageException ex) + { + Log(EVENTLOG_ERROR_TYPE, String.Format( + "{0}" + + "usage: {1} OPTIONS\n" + + "\n" + + "options:\n" + + " -d DebugFlags [-1: enable all debug logs]\n" + + " -D DebugLogFile [file path; use - for stderr]\n" + + " -u \\Server\\Share [UNC prefix (single backslash)]\n" + + " -p Directory [directory to expose as pass through file system]\n" + + " -m MountPoint [X:|*|directory]\n", + ex.HasMessage ? ex.Message + "\n" : "", + PROGNAME)); + throw; + } + catch (Exception ex) + { + Log(EVENTLOG_ERROR_TYPE, String.Format("{0}", ex.Message)); + throw; + } + } + protected override void OnStop() + { + _Host.Unmount(); + _Host = null; + } + + private static void argtos(String[] Args, ref int I, ref String V) + { + if (Args.Length > ++I) + V = Args[I]; + else + throw new CommandLineUsageException(); + } + private static void argtol(String[] Args, ref int I, ref UInt32 V) + { + Int32 R; + if (Args.Length > ++I) + V = Int32.TryParse(Args[I], out R) ? (UInt32)R : V; + else + throw new CommandLineUsageException(); + } + + private FileSystemHost _Host; + } + + class Program + { + static void Main(string[] args) + { + Environment.ExitCode = new PtfsService().Run(); + } + } +} diff --git a/3rd_party/winfsp-1.10/samples/passthrough-dotnet/passthrough-dotnet.csproj b/3rd_party/winfsp-1.10/samples/passthrough-dotnet/passthrough-dotnet.csproj new file mode 100644 index 00000000..b9c7e15c --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-dotnet/passthrough-dotnet.csproj @@ -0,0 +1,84 @@ + + + + + Debug + AnyCPU + {6EC13EBC-BD7E-4997-9B29-49D5F06103A6} + Exe + passthrough + passthrough-dotnet + v4.5.2 + 512 + true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + AnyCPU + true + full + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\ + $(BaseIntermediateOutputPath)$(Configuration)\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\ + $(BaseIntermediateOutputPath)$(Configuration)\ + TRACE + prompt + 4 + + + + + False + $(MSBuildProgramFiles32)\WinFsp\bin\winfsp-msil.dll + + + + + + + + False + Microsoft .NET Framework 4.5.2 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/passthrough-dotnet/passthrough-dotnet.sln b/3rd_party/winfsp-1.10/samples/passthrough-dotnet/passthrough-dotnet.sln new file mode 100644 index 00000000..7f940a60 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-dotnet/passthrough-dotnet.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "passthrough-dotnet", "passthrough-dotnet.csproj", "{6EC13EBC-BD7E-4997-9B29-49D5F06103A6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6EC13EBC-BD7E-4997-9B29-49D5F06103A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6EC13EBC-BD7E-4997-9B29-49D5F06103A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EC13EBC-BD7E-4997-9B29-49D5F06103A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6EC13EBC-BD7E-4997-9B29-49D5F06103A6}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse/Makefile b/3rd_party/winfsp-1.10/samples/passthrough-fuse/Makefile new file mode 100644 index 00000000..3d403593 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse/Makefile @@ -0,0 +1,18 @@ +usage: + @echo "make cygfuse|winfsp-fuse" 1>&2 + @echo "" 1>&2 + @echo " cygfuse Link with CYGFUSE" 1>&2 + @echo " winfsp-fuse Link with WinFsp-FUSE" 1>&2 + @exit 2 + +cygfuse: passthrough-cygfuse + +winfsp-fuse: passthrough-winfsp-fuse + +passthrough-cygfuse: passthrough-fuse.c + gcc $^ -o $@ -g -Wall `pkg-config fuse --cflags --libs` + +passthrough-winfsp-fuse: export PKG_CONFIG_PATH=$(PWD)/winfsp.install/lib +passthrough-winfsp-fuse: passthrough-fuse.c + ln -nsf "`regtool --wow32 get '/HKLM/Software/WinFsp/InstallDir' | cygpath -au -f -`" winfsp.install + gcc $^ -o $@ -g -Wall `pkg-config fuse --cflags --libs` diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse/README.md b/3rd_party/winfsp-1.10/samples/passthrough-fuse/README.md new file mode 100644 index 00000000..e7f43f27 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse/README.md @@ -0,0 +1,7 @@ +`Passthrough-fuse` is a simple FUSE file system that passes all file system operations to an underlying file system. + +It can be built with the following tools: + +- Using Visual Studio (`winfsp.sln`). +- Using Cygwin GCC and linking directly with the WinFsp DLL (`make winfsp-fuse`). +- Using Cygwin GCC and linking to CYGFUSE (`make cygfuse`). diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.c b/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.c new file mode 100644 index 00000000..5cad0897 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.c @@ -0,0 +1,417 @@ +/** + * @file passthrough-fuse.c + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#include +#include +#include +#include +#include + +#include + +#if defined(_WIN64) || defined(_WIN32) +#include "winposix.h" +#else +#include +#include +#endif + +#define PTFS_UTIMENS + +#define FSNAME "passthrough" +#define PROGNAME "passthrough-fuse" + +#define concat_path(ptfs, fn, fp) (sizeof fp > (unsigned)snprintf(fp, sizeof fp, "%s%s", ptfs->rootdir, fn)) + +#define fi_dirbit (0x8000000000000000ULL) +#define fi_fh(fi, MASK) ((fi)->fh & (MASK)) +#define fi_setfh(fi, FH, MASK) ((fi)->fh = (intptr_t)(FH) | (MASK)) +#define fi_fd(fi) (fi_fh(fi, fi_dirbit) ? \ + dirfd((DIR *)(intptr_t)fi_fh(fi, ~fi_dirbit)) : (int)fi_fh(fi, ~fi_dirbit)) +#define fi_dirp(fi) ((DIR *)(intptr_t)fi_fh(fi, ~fi_dirbit)) +#define fi_setfd(fi, fd) (fi_setfh(fi, fd, 0)) +#define fi_setdirp(fi, dirp) (fi_setfh(fi, dirp, fi_dirbit)) + +#define ptfs_impl_fullpath(n) \ + char full ## n[PATH_MAX]; \ + if (!concat_path(((PTFS *)fuse_get_context()->private_data), n, full ## n))\ + return -ENAMETOOLONG; \ + n = full ## n + +typedef struct +{ + const char *rootdir; +} PTFS; + +static int ptfs_getattr(const char *path, struct fuse_stat *stbuf) +{ + ptfs_impl_fullpath(path); + + return -1 != lstat(path, stbuf) ? 0 : -errno; +} + +static int ptfs_mkdir(const char *path, fuse_mode_t mode) +{ + ptfs_impl_fullpath(path); + + return -1 != mkdir(path, mode) ? 0 : -errno; +} + +static int ptfs_unlink(const char *path) +{ + ptfs_impl_fullpath(path); + + return -1 != unlink(path) ? 0 : -errno; +} + +static int ptfs_rmdir(const char *path) +{ + ptfs_impl_fullpath(path); + + return -1 != rmdir(path) ? 0 : -errno; +} + +static int ptfs_rename(const char *oldpath, const char *newpath) +{ + ptfs_impl_fullpath(newpath); + ptfs_impl_fullpath(oldpath); + + return -1 != rename(oldpath, newpath) ? 0 : -errno; +} + +static int ptfs_chmod(const char *path, fuse_mode_t mode) +{ + ptfs_impl_fullpath(path); + + return -1 != chmod(path, mode) ? 0 : -errno; +} + +static int ptfs_chown(const char *path, fuse_uid_t uid, fuse_gid_t gid) +{ + ptfs_impl_fullpath(path); + + return -1 != lchown(path, uid, gid) ? 0 : -errno; +} + +static int ptfs_truncate(const char *path, fuse_off_t size) +{ + ptfs_impl_fullpath(path); + + return -1 != truncate(path, size) ? 0 : -errno; +} + +#if !defined(PTFS_UTIMENS) +static int ptfs_utime(const char *path, struct fuse_utimbuf *timbuf) +{ + ptfs_impl_fullpath(path); + + return -1 != utime(path, timbuf) ? 0 : -errno; +} +#endif + +static int ptfs_open(const char *path, struct fuse_file_info *fi) +{ + ptfs_impl_fullpath(path); + + int fd; + return -1 != (fd = open(path, fi->flags)) ? (fi_setfd(fi, fd), 0) : -errno; +} + +static int ptfs_read(const char *path, char *buf, size_t size, fuse_off_t off, + struct fuse_file_info *fi) +{ + int fd = fi_fd(fi); + + int nb; + return -1 != (nb = pread(fd, buf, size, off)) ? nb : -errno; +} + +static int ptfs_write(const char *path, const char *buf, size_t size, fuse_off_t off, + struct fuse_file_info *fi) +{ + int fd = fi_fd(fi); + + int nb; + return -1 != (nb = pwrite(fd, buf, size, off)) ? nb : -errno; +} + +static int ptfs_statfs(const char *path, struct fuse_statvfs *stbuf) +{ + ptfs_impl_fullpath(path); + + return -1 != statvfs(path, stbuf) ? 0 : -errno; +} + +static int ptfs_release(const char *path, struct fuse_file_info *fi) +{ + int fd = fi_fd(fi); + + close(fd); + return 0; +} + +static int ptfs_fsync(const char *path, int datasync, struct fuse_file_info *fi) +{ + int fd = fi_fd(fi); + + return -1 != fsync(fd) ? 0 : -errno; +} + +static int ptfs_setxattr(const char *path, const char *name, const char *value, size_t size, int flags) +{ + ptfs_impl_fullpath(path); + + return -1 != lsetxattr(path, name, value, size, flags) ? 0 : -errno; +} + +static int ptfs_getxattr(const char *path, const char *name, char *value, size_t size) +{ + ptfs_impl_fullpath(path); + + int nb; + return -1 != (nb = lgetxattr(path, name, value, size)) ? nb : -errno; +} + +static int ptfs_listxattr(const char *path, char *namebuf, size_t size) +{ + ptfs_impl_fullpath(path); + + int nb; + return -1 != (nb = llistxattr(path, namebuf, size)) ? nb : -errno; +} + +static int ptfs_removexattr(const char *path, const char *name) +{ + ptfs_impl_fullpath(path); + + return -1 != lremovexattr(path, name) ? 0 : -errno; +} + +static int ptfs_opendir(const char *path, struct fuse_file_info *fi) +{ + ptfs_impl_fullpath(path); + + DIR *dirp; + return 0 != (dirp = opendir(path)) ? (fi_setdirp(fi, dirp), 0) : -errno; +} + +static int ptfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, fuse_off_t off, + struct fuse_file_info *fi) +{ + DIR *dirp = fi_dirp(fi); + struct dirent *de; + + rewinddir(dirp); + for (;;) + { + errno = 0; + if (0 == (de = readdir(dirp))) + break; +#if defined(_WIN64) || defined(_WIN32) + if (0 != filler(buf, de->d_name, &de->d_stat, 0)) +#else + if (0 != filler(buf, de->d_name, 0, 0)) +#endif + return -ENOMEM; + } + + return -errno; +} + +static int ptfs_releasedir(const char *path, struct fuse_file_info *fi) +{ + DIR *dirp = fi_dirp(fi); + + return -1 != closedir(dirp) ? 0 : -errno; +} + +static void *ptfs_init(struct fuse_conn_info *conn) +{ +#if defined(_WIN64) || defined(_WIN32) +#if defined(FSP_FUSE_CAP_READDIR_PLUS) + conn->want |= (conn->capable & FSP_FUSE_CAP_READDIR_PLUS); +#endif + +#if defined(FSP_FUSE_USE_STAT_EX) && defined(FSP_FUSE_CAP_STAT_EX) + conn->want |= (conn->capable & FSP_FUSE_CAP_STAT_EX); +#endif + +#if defined(FSP_FUSE_CAP_CASE_INSENSITIVE) + conn->want |= (conn->capable & FSP_FUSE_CAP_CASE_INSENSITIVE); +#endif +#endif + + return fuse_get_context()->private_data; +} + +static int ptfs_create(const char *path, fuse_mode_t mode, struct fuse_file_info *fi) +{ + ptfs_impl_fullpath(path); + + int fd; + return -1 != (fd = open(path, fi->flags, mode)) ? (fi_setfd(fi, fd), 0) : -errno; +} + +static int ptfs_ftruncate(const char *path, fuse_off_t off, struct fuse_file_info *fi) +{ + int fd = fi_fd(fi); + + return -1 != ftruncate(fd, off) ? 0 : -errno; +} + +static int ptfs_fgetattr(const char *path, struct fuse_stat *stbuf, struct fuse_file_info *fi) +{ + int fd = fi_fd(fi); + + return -1 != fstat(fd, stbuf) ? 0 : -errno; +} + +#if defined(PTFS_UTIMENS) +static int ptfs_utimens(const char *path, const struct fuse_timespec tv[2]) +{ + ptfs_impl_fullpath(path); + + return -1 != utimensat(AT_FDCWD, path, tv, AT_SYMLINK_NOFOLLOW) ? 0 : -errno; +} +#endif + +#if defined(_WIN64) || defined(_WIN32) +static int ptfs_setcrtime(const char *path, const struct fuse_timespec *tv) +{ + ptfs_impl_fullpath(path); + + return -1 != setcrtime(path, tv) ? 0 : -errno; +} +#endif + +#if defined(FSP_FUSE_USE_STAT_EX) +static int ptfs_chflags(const char *path, uint32_t flags) +{ + ptfs_impl_fullpath(path); + + return -1 != lchflags(path, flags) ? 0 : -errno; +} +#endif + +static struct fuse_operations ptfs_ops = +{ + .getattr = ptfs_getattr, + .mkdir = ptfs_mkdir, + .unlink = ptfs_unlink, + .rmdir = ptfs_rmdir, + .rename = ptfs_rename, + .chmod = ptfs_chmod, + .chown = ptfs_chown, + .truncate = ptfs_truncate, +#if !defined(PTFS_UTIMENS) + .utime = ptfs_utime, +#endif + .open = ptfs_open, + .read = ptfs_read, + .write = ptfs_write, + .statfs = ptfs_statfs, + .release = ptfs_release, + .fsync = ptfs_fsync, + .setxattr = ptfs_setxattr, + .getxattr = ptfs_getxattr, + .listxattr = ptfs_listxattr, + .removexattr = ptfs_removexattr, + .opendir = ptfs_opendir, + .readdir = ptfs_readdir, + .releasedir = ptfs_releasedir, + .init = ptfs_init, + .create = ptfs_create, + .ftruncate = ptfs_ftruncate, + .fgetattr = ptfs_fgetattr, +#if defined(PTFS_UTIMENS) + .utimens = ptfs_utimens, +#endif +#if defined(_WIN64) || defined(_WIN32) + .setcrtime = ptfs_setcrtime, +#endif +#if defined(FSP_FUSE_USE_STAT_EX) + .chflags = ptfs_chflags, +#endif +}; + +static void usage(void) +{ + fprintf(stderr, "usage: " PROGNAME " [FUSE options] rootdir mountpoint\n"); + exit(2); +} + +int main(int argc, char *argv[]) +{ + PTFS ptfs = { 0 }; + + if (3 <= argc && '-' != argv[argc - 2][0] && '-' != argv[argc - 1][0]) + { + ptfs.rootdir = realpath(argv[argc - 2], 0); /* memory freed at process end */ + argv[argc - 2] = argv[argc - 1]; + argc--; + } + +#if defined(_WIN64) || defined(_WIN32) + /* + * When building for Windows (rather than Cygwin or POSIX OS) + * allow the path to be specified using the --VolumePrefix + * switch using the syntax \\passthrough-fuse\C$\Path. This + * allows us to run the file system under the WinFsp.Launcher + * and start it using commands like: + * + * net use z: \\passthrough-fuse\C$\Path + */ + if (0 == ptfs.rootdir) + for (int argi = 1; argc > argi; argi++) + { + int strncmp(const char *a, const char *b, size_t length); + char *strchr(const char *s, int c); + char *p = 0; + + if (0 == strncmp("--UNC=", argv[argi], sizeof "--UNC=" - 1)) + p = argv[argi] + sizeof "--UNC=" - 1; + else if (0 == strncmp("--VolumePrefix=", argv[argi], sizeof "--VolumePrefix=" - 1)) + p = argv[argi] + sizeof "--VolumePrefix=" - 1; + + if (0 != p && '\\' != p[1]) + { + p = strchr(p + 1, '\\'); + if (0 != p && + ( + ('A' <= p[1] && p[1] <= 'Z') || + ('a' <= p[1] && p[1] <= 'z') + ) && + '$' == p[2]) + { + p[2] = ':'; + ptfs.rootdir = realpath(p + 1, 0); /* memory freed at process end */ + p[2] = '$'; + break; + } + } + } +#endif + + if (0 == ptfs.rootdir) + usage(); + + return fuse_main(argc, argv, &ptfs_ops, &ptfs); +} diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.sln b/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.sln new file mode 100644 index 00000000..83a5c6c8 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "passthrough-fuse", "passthrough-fuse.vcxproj", "{C753851C-142F-4AAD-B2F7-CBF905C2A600}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C753851C-142F-4AAD-B2F7-CBF905C2A600}.Debug|x64.ActiveCfg = Debug|x64 + {C753851C-142F-4AAD-B2F7-CBF905C2A600}.Debug|x64.Build.0 = Debug|x64 + {C753851C-142F-4AAD-B2F7-CBF905C2A600}.Debug|x86.ActiveCfg = Debug|Win32 + {C753851C-142F-4AAD-B2F7-CBF905C2A600}.Debug|x86.Build.0 = Debug|Win32 + {C753851C-142F-4AAD-B2F7-CBF905C2A600}.Release|x64.ActiveCfg = Release|x64 + {C753851C-142F-4AAD-B2F7-CBF905C2A600}.Release|x64.Build.0 = Release|x64 + {C753851C-142F-4AAD-B2F7-CBF905C2A600}.Release|x86.ActiveCfg = Release|Win32 + {C753851C-142F-4AAD-B2F7-CBF905C2A600}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.vcxproj b/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.vcxproj new file mode 100644 index 00000000..bdca6304 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.vcxproj @@ -0,0 +1,190 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {C753851C-142F-4AAD-B2F7-CBF905C2A600} + Win32Proj + passthroughfuse + $(LatestTargetPlatformVersion) + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + + + + Level3 + Disabled + FSP_FUSE_USE_STAT_EX;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4996 + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + Level3 + Disabled + FSP_FUSE_USE_STAT_EX;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4996 + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + FSP_FUSE_USE_STAT_EX;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4996 + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + FSP_FUSE_USE_STAT_EX;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4996 + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + + + + + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.vcxproj.filters b/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.vcxproj.filters new file mode 100644 index 00000000..d5920b89 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse/passthrough-fuse.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source + + + Source + + + + + Source + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse/winposix.c b/3rd_party/winfsp-1.10/samples/passthrough-fuse/winposix.c new file mode 100644 index 00000000..54097142 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse/winposix.c @@ -0,0 +1,892 @@ +/** + * @file winposix.c + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +/* + * This is a very simple Windows POSIX layer. It handles all the POSIX + * file API's required to implement passthrough-fuse in POSIX, however + * the API handling is rather unsophisticated. + * + * Ways to improve it: use the FspPosix* API's to properly handle + * file names and security. + */ + +#include +#include +#include +#include "winposix.h" + +#pragma comment(lib, "ntdll.lib") + +typedef struct _FILE_GET_EA_INFORMATION +{ + ULONG NextEntryOffset; + UCHAR EaNameLength; + CHAR EaName[1]; +} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION; + +NTSYSAPI NTSTATUS NTAPI NtQueryEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan); +NTSYSAPI NTSTATUS NTAPI NtSetEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID EaBuffer, + IN ULONG EaBufferSize); +#define NEXT_EA(Ea, EaEnd) \ + (0 != (Ea)->NextEntryOffset ? (PVOID)((PUINT8)(Ea) + (Ea)->NextEntryOffset) : (EaEnd)) + +struct _DIR +{ + HANDLE h, fh; + struct dirent de; + char path[]; +}; + +#if defined(FSP_FUSE_USE_STAT_EX) +static inline uint32_t MapFileAttributesToFlags(UINT32 FileAttributes) +{ + uint32_t flags = 0; + + if (FileAttributes & FILE_ATTRIBUTE_READONLY) + flags |= FSP_FUSE_UF_READONLY; + if (FileAttributes & FILE_ATTRIBUTE_HIDDEN) + flags |= FSP_FUSE_UF_HIDDEN; + if (FileAttributes & FILE_ATTRIBUTE_SYSTEM) + flags |= FSP_FUSE_UF_SYSTEM; + if (FileAttributes & FILE_ATTRIBUTE_ARCHIVE) + flags |= FSP_FUSE_UF_ARCHIVE; + + return flags; +} + +static inline UINT32 MapFlagsToFileAttributes(uint32_t flags) +{ + UINT32 FileAttributes = 0; + + if (flags & FSP_FUSE_UF_READONLY) + FileAttributes |= FILE_ATTRIBUTE_READONLY; + if (flags & FSP_FUSE_UF_HIDDEN) + FileAttributes |= FILE_ATTRIBUTE_HIDDEN; + if (flags & FSP_FUSE_UF_SYSTEM) + FileAttributes |= FILE_ATTRIBUTE_SYSTEM; + if (flags & FSP_FUSE_UF_ARCHIVE) + FileAttributes |= FILE_ATTRIBUTE_ARCHIVE; + + return FileAttributes; +} +#endif + +static int maperror(int winerrno); + +static inline void *error0(void) +{ + errno = maperror(GetLastError()); + return 0; +} + +static inline int error(void) +{ + errno = maperror(GetLastError()); + return -1; +} + +char *realpath(const char *path, char *resolved) +{ + char *result; + + if (0 == resolved) + { + result = malloc(PATH_MAX); /* sets errno */ + if (0 == result) + return 0; + } + else + result = resolved; + + int err = 0; + DWORD len = GetFullPathNameA(path, PATH_MAX, result, 0); + if (0 == len) + err = GetLastError(); + else if (PATH_MAX < len) + err = ERROR_INVALID_PARAMETER; + + if (0 == err) + { + HANDLE h = CreateFileA(result, + FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE != h) + CloseHandle(h); + else + err = GetLastError(); + } + + if (0 != err) + { + if (result != resolved) + free(result); + + errno = maperror(err); + result = 0; + } + + return result; +} + +int statvfs(const char *path, struct fuse_statvfs *stbuf) +{ + char root[PATH_MAX]; + DWORD + VolumeSerialNumber, + MaxComponentLength, + SectorsPerCluster, + BytesPerSector, + NumberOfFreeClusters, + TotalNumberOfClusters; + + if (!GetVolumePathNameA(path, root, PATH_MAX) || + !GetVolumeInformationA(root, 0, 0, &VolumeSerialNumber, &MaxComponentLength, 0, 0, 0) || + !GetDiskFreeSpaceA(root, &SectorsPerCluster, &BytesPerSector, + &NumberOfFreeClusters, &TotalNumberOfClusters)) + { + return error(); + } + + memset(stbuf, 0, sizeof *stbuf); + stbuf->f_bsize = SectorsPerCluster * BytesPerSector; + stbuf->f_frsize = SectorsPerCluster * BytesPerSector; + stbuf->f_blocks = TotalNumberOfClusters; + stbuf->f_bfree = NumberOfFreeClusters; + stbuf->f_bavail = TotalNumberOfClusters; + stbuf->f_fsid = VolumeSerialNumber; + stbuf->f_namemax = MaxComponentLength; + + return 0; +} + +int open(const char *path, int oflag, ...) +{ + static DWORD da[] = { GENERIC_READ, GENERIC_WRITE, GENERIC_READ | GENERIC_WRITE, 0 }; + static DWORD cd[] = { OPEN_EXISTING, OPEN_ALWAYS, TRUNCATE_EXISTING, CREATE_ALWAYS }; + DWORD DesiredAccess = 0 == (oflag & _O_APPEND) ? + da[oflag & (_O_RDONLY | _O_WRONLY | _O_RDWR)] : + (da[oflag & (_O_RDONLY | _O_WRONLY | _O_RDWR)] & ~FILE_WRITE_DATA) | FILE_APPEND_DATA; + DWORD CreationDisposition = (_O_CREAT | _O_EXCL) == (oflag & (_O_CREAT | _O_EXCL)) ? + CREATE_NEW : + cd[(oflag & (_O_CREAT | _O_TRUNC)) >> 8]; + + HANDLE h = CreateFileA(path, + DesiredAccess, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0/* default security */, + CreationDisposition, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, 0); + + if (INVALID_HANDLE_VALUE == h) + return error(); + + return (int)(intptr_t)h; +} + +int fstat(int fd, struct fuse_stat *stbuf) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + BY_HANDLE_FILE_INFORMATION FileInfo; + + if (!GetFileInformationByHandle(h, &FileInfo)) + return error(); + + memset(stbuf, 0, sizeof *stbuf); + stbuf->st_mode = 0777 | + ((FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 0040000/* S_IFDIR */ : 0); + stbuf->st_nlink = 1; + stbuf->st_size = ((UINT64)FileInfo.nFileSizeHigh << 32) | ((UINT64)FileInfo.nFileSizeLow); + FspPosixFileTimeToUnixTime(*(PUINT64)&FileInfo.ftCreationTime, (void *)&stbuf->st_birthtim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FileInfo.ftLastAccessTime, (void *)&stbuf->st_atim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FileInfo.ftLastWriteTime, (void *)&stbuf->st_mtim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FileInfo.ftLastWriteTime, (void *)&stbuf->st_ctim); +#if defined(FSP_FUSE_USE_STAT_EX) + stbuf->st_flags = MapFileAttributesToFlags(FileInfo.dwFileAttributes); +#endif + + return 0; +} + +int ftruncate(int fd, fuse_off_t size) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + FILE_END_OF_FILE_INFO EndOfFileInfo; + + EndOfFileInfo.EndOfFile.QuadPart = size; + + if (!SetFileInformationByHandle(h, FileEndOfFileInfo, &EndOfFileInfo, sizeof EndOfFileInfo)) + return error(); + + return 0; +} + +int pread(int fd, void *buf, size_t nbyte, fuse_off_t offset) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + OVERLAPPED Overlapped = { 0 }; + DWORD BytesTransferred; + + Overlapped.Offset = (DWORD)offset; + Overlapped.OffsetHigh = (DWORD)(offset >> 32); + + if (!ReadFile(h, buf, (DWORD)nbyte, &BytesTransferred, &Overlapped)) + { + if (ERROR_HANDLE_EOF == GetLastError()) + return 0; + return error(); + } + + return BytesTransferred; +} + +int pwrite(int fd, const void *buf, size_t nbyte, fuse_off_t offset) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + OVERLAPPED Overlapped = { 0 }; + DWORD BytesTransferred; + + Overlapped.Offset = (DWORD)offset; + Overlapped.OffsetHigh = (DWORD)(offset >> 32); + + if (!WriteFile(h, buf, (DWORD)nbyte, &BytesTransferred, &Overlapped)) + return error(); + + return BytesTransferred; +} + +int fsync(int fd) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + + if (!FlushFileBuffers(h)) + return error(); + + return 0; +} + +int close(int fd) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + + if (!CloseHandle(h)) + return error(); + + return 0; +} + +int lstat(const char *path, struct fuse_stat *stbuf) +{ + HANDLE h = CreateFileA(path, + FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + int res = fstat((int)(intptr_t)h, stbuf); + + CloseHandle(h); + + return res; +} + +int chmod(const char *path, fuse_mode_t mode) +{ + /* we do not support file security */ + return 0; +} + +int lchown(const char *path, fuse_uid_t uid, fuse_gid_t gid) +{ + /* we do not support file security */ + return 0; +} + +int lchflags(const char *path, uint32_t flags) +{ +#if defined(FSP_FUSE_USE_STAT_EX) + UINT32 FileAttributes = MapFlagsToFileAttributes(flags); + + if (0 == FileAttributes) + FileAttributes = FILE_ATTRIBUTE_NORMAL; + + if (!SetFileAttributesA(path, FileAttributes)) + return error(); +#endif + + return 0; +} + +int truncate(const char *path, fuse_off_t size) +{ + HANDLE h = CreateFileA(path, + FILE_WRITE_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + int res = ftruncate((int)(intptr_t)h, size); + + CloseHandle(h); + + return res; +} + +int utime(const char *path, const struct fuse_utimbuf *timbuf) +{ + if (0 == timbuf) + return utimensat(AT_FDCWD, path, 0, AT_SYMLINK_NOFOLLOW); + else + { + struct fuse_timespec times[2]; + times[0].tv_sec = timbuf->actime; + times[0].tv_nsec = 0; + times[1].tv_sec = timbuf->modtime; + times[1].tv_nsec = 0; + return utimensat(AT_FDCWD, path, times, AT_SYMLINK_NOFOLLOW); + } +} + +int utimensat(int dirfd, const char *path, const struct fuse_timespec times[2], int flag) +{ + /* ignore dirfd and assume that it is always AT_FDCWD */ + /* ignore flag and assume that it is always AT_SYMLINK_NOFOLLOW */ + + HANDLE h = CreateFileA(path, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + UINT64 LastAccessTime, LastWriteTime; + if (0 == times) + { + FILETIME FileTime; + GetSystemTimeAsFileTime(&FileTime); + LastAccessTime = LastWriteTime = *(PUINT64)&FileTime; + } + else + { + FspPosixUnixTimeToFileTime((void *)×[0], &LastAccessTime); + FspPosixUnixTimeToFileTime((void *)×[1], &LastWriteTime); + } + + int res = SetFileTime(h, + 0, (PFILETIME)&LastAccessTime, (PFILETIME)&LastWriteTime) ? 0 : error(); + + CloseHandle(h); + + return res; +} + +int setcrtime(const char *path, const struct fuse_timespec *tv) +{ + HANDLE h = CreateFileA(path, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + UINT64 CreationTime; + FspPosixUnixTimeToFileTime((void *)tv, &CreationTime); + + int res = SetFileTime(h, + (PFILETIME)&CreationTime, 0, 0) ? 0 : error(); + + CloseHandle(h); + + return res; +} + +int unlink(const char *path) +{ + if (!DeleteFileA(path)) + return error(); + + return 0; +} + +int rename(const char *oldpath, const char *newpath) +{ + if (!MoveFileExA(oldpath, newpath, MOVEFILE_REPLACE_EXISTING)) + return error(); + + return 0; +} + +static int lsetea(const char *path, PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength) +{ + HANDLE h = CreateFileA(path, + FILE_WRITE_EA | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + IO_STATUS_BLOCK Iosb; + NTSTATUS Status = NtSetEaFile(h, &Iosb, Ea, EaLength); + + CloseHandle(h); + + if (!NT_SUCCESS(Status)) + switch (Status) + { + case STATUS_INVALID_EA_NAME: + case STATUS_EA_LIST_INCONSISTENT: + case STATUS_EA_CORRUPT_ERROR: + case STATUS_NONEXISTENT_EA_ENTRY: + case STATUS_NO_MORE_EAS: + case STATUS_NO_EAS_ON_FILE: + errno = EINVAL; + return -1; + default: + SetLastError(RtlNtStatusToDosError(Status)); + return error(); + } + + return 0; +} + +static int lgetea(const char *path, + PFILE_GET_EA_INFORMATION GetEa, ULONG GetEaLength, + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength) +{ + HANDLE h = CreateFileA(path, + FILE_READ_EA | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + IO_STATUS_BLOCK Iosb; + NTSTATUS Status = NtQueryEaFile(h, &Iosb, Ea, EaLength, FALSE, GetEa, GetEaLength, 0, TRUE); + + CloseHandle(h); + + if (!NT_SUCCESS(Status)) + switch (Status) + { + case STATUS_INVALID_EA_NAME: + case STATUS_EA_LIST_INCONSISTENT: + case STATUS_EA_CORRUPT_ERROR: + case STATUS_NONEXISTENT_EA_ENTRY: + case STATUS_NO_MORE_EAS: + errno = EINVAL; + return -1; + case STATUS_NO_EAS_ON_FILE: + if (0 == GetEa) + return 0; + else + { + errno = ENODATA; + return -1; + } + default: + SetLastError(RtlNtStatusToDosError(Status)); + return error(); + } + else if (0 == GetEa && + (FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) > Iosb.Information || 0 == Ea->EaValueLength)) + { + errno = ENODATA; + return -1; + } + + return (ULONG)Iosb.Information; +} + +int lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags) +{ + union + { + FILE_FULL_EA_INFORMATION V; + UINT8 B[1024]; + } EaBuf; + PFILE_FULL_EA_INFORMATION Ea = &EaBuf.V; + ULONG EaLength; + + size_t namelen = strlen(name); + if (254 < namelen || 0xffff < size) + { + errno = EINVAL; + return -1; + } + + EaLength = (ULONG)(FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + namelen + 1 + size); + if (sizeof EaBuf < EaLength) + { + Ea = malloc(EaLength); /* sets errno */ + if (0 == Ea) + return -1; + } + + memset(Ea, 0, sizeof(FILE_FULL_EA_INFORMATION)); + Ea->EaNameLength = (UCHAR)namelen; + Ea->EaValueLength = (USHORT)size; + memcpy(Ea->EaName, name, namelen + 1); + memcpy(Ea->EaName + namelen + 1, value, size); + + int res = lsetea(path, Ea, EaLength); /* sets errno */ + + if (&EaBuf.V != Ea) + free(Ea); + + return res; +} + +int lgetxattr(const char *path, const char *name, void *value, size_t size0) +{ + size_t size = 0 == size0 || 0xffff < size0 ? 0xffff : size0; + union + { + FILE_GET_EA_INFORMATION V; + UINT8 B[FIELD_OFFSET(FILE_GET_EA_INFORMATION, EaName) + 255]; + } GetEaBuf; + PFILE_GET_EA_INFORMATION GetEa = &GetEaBuf.V; + union + { + FILE_FULL_EA_INFORMATION V; + UINT8 B[1024]; + } EaBuf; + PFILE_FULL_EA_INFORMATION Ea = &EaBuf.V; + ULONG GetEaLength, EaLength; + + size_t namelen = strlen(name); + if (254 < namelen) + { + errno = EINVAL; + return -1; + } + + EaLength = (ULONG)(FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + namelen + 1 + size); + if (sizeof EaBuf < EaLength) + { + Ea = malloc(EaLength); /* sets errno */ + if (0 == Ea) + return -1; + } + + GetEaLength = (ULONG)(FIELD_OFFSET(FILE_GET_EA_INFORMATION, EaName) + namelen + 1); + memset(GetEa, 0, sizeof(FILE_GET_EA_INFORMATION)); + GetEa->EaNameLength = (UCHAR)namelen; + memcpy(GetEa->EaName, name, namelen + 1); + + int res = lgetea(path, GetEa, GetEaLength, Ea, EaLength); + if (0 < res) + { + res = Ea->EaValueLength; + if (0 == size0) + ; + else if (res <= size0) + memcpy(value, Ea->EaName + Ea->EaNameLength + 1, res); + else + { + errno = ERANGE; + res = -1; + } + } + else if (0 == res) /* should not happen! */ + { + } + + if (&EaBuf.V != Ea) + free(Ea); + + return res; +} + +int llistxattr(const char *path, char *namebuf, size_t size) +{ + PFILE_FULL_EA_INFORMATION Ea = 0; + ULONG EaLength; + + EaLength = (ULONG)(FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + 254 + 1 + 0xffff); + Ea = malloc(EaLength); /* sets errno */ + if (0 == Ea) + return -1; + + int res = lgetea(path, 0, 0, Ea, EaLength); + if (0 < res) + { + PFILE_FULL_EA_INFORMATION EaEnd = (PVOID)((PUINT8)Ea + res); + res = 0; + for (PFILE_FULL_EA_INFORMATION EaPtr = Ea; EaEnd > EaPtr; EaPtr = NEXT_EA(EaPtr, EaEnd)) + res += EaPtr->EaNameLength + 1; + + if (0 == size) + ; + else if (res <= size) + { + char *p = namebuf; + for (PFILE_FULL_EA_INFORMATION EaPtr = Ea; EaEnd > EaPtr; EaPtr = NEXT_EA(EaPtr, EaEnd)) + { + memcpy(p, EaPtr->EaName, EaPtr->EaNameLength + 1); + p += EaPtr->EaNameLength + 1; + } + } + else + { + errno = ERANGE; + res = -1; + } + } + + free(Ea); + + return res; +} + +int lremovexattr(const char *path, const char *name) +{ + return lsetxattr(path, name, 0, 0, 0); +} + +int mkdir(const char *path, fuse_mode_t mode) +{ + if (!CreateDirectoryA(path, 0/* default security */)) + return error(); + + return 0; +} + +int rmdir(const char *path) +{ + if (!RemoveDirectoryA(path)) + return error(); + + return 0; +} + +DIR *opendir(const char *path) +{ + HANDLE h = CreateFileA(path, + FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error0(); + + size_t pathlen = strlen(path); + if (0 < pathlen && '/' == path[pathlen - 1]) + pathlen--; + + DIR *dirp = malloc(sizeof *dirp + pathlen + 3); /* sets errno */ + if (0 == dirp) + { + CloseHandle(h); + return 0; + } + + memset(dirp, 0, sizeof *dirp); + dirp->h = h; + dirp->fh = INVALID_HANDLE_VALUE; + memcpy(dirp->path, path, pathlen); + dirp->path[pathlen + 0] = '/'; + dirp->path[pathlen + 1] = '*'; + dirp->path[pathlen + 2] = '\0'; + + return dirp; +} + +int dirfd(DIR *dirp) +{ + return (int)(intptr_t)dirp->h; +} + +void rewinddir(DIR *dirp) +{ + if (INVALID_HANDLE_VALUE != dirp->fh) + { + FindClose(dirp->fh); + dirp->fh = INVALID_HANDLE_VALUE; + } +} + +struct dirent *readdir(DIR *dirp) +{ + WIN32_FIND_DATAA FindData; + struct fuse_stat *stbuf = &dirp->de.d_stat; + + if (INVALID_HANDLE_VALUE == dirp->fh) + { + dirp->fh = FindFirstFileA(dirp->path, &FindData); + if (INVALID_HANDLE_VALUE == dirp->fh) + return error0(); + } + else + { + if (!FindNextFileA(dirp->fh, &FindData)) + { + if (ERROR_NO_MORE_FILES == GetLastError()) + return 0; + return error0(); + } + } + + memset(stbuf, 0, sizeof *stbuf); + stbuf->st_mode = 0777 | + ((FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 0040000/* S_IFDIR */ : 0); + stbuf->st_nlink = 1; + stbuf->st_size = ((UINT64)FindData.nFileSizeHigh << 32) | ((UINT64)FindData.nFileSizeLow); + FspPosixFileTimeToUnixTime(*(PUINT64)&FindData.ftCreationTime, (void *)&stbuf->st_birthtim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FindData.ftLastAccessTime, (void *)&stbuf->st_atim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FindData.ftLastWriteTime, (void *)&stbuf->st_mtim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FindData.ftLastWriteTime, (void *)&stbuf->st_ctim); +#if defined(FSP_FUSE_USE_STAT_EX) + stbuf->st_flags = MapFileAttributesToFlags(FindData.dwFileAttributes); +#endif + + strcpy(dirp->de.d_name, FindData.cFileName); + + return &dirp->de; +} + +int closedir(DIR *dirp) +{ + if (INVALID_HANDLE_VALUE != dirp->fh) + FindClose(dirp->fh); + + CloseHandle(dirp->h); + free(dirp); + + return 0; +} + +static int maperror(int winerrno) +{ + switch (winerrno) + { + case ERROR_INVALID_FUNCTION: + return EINVAL; + case ERROR_FILE_NOT_FOUND: + return ENOENT; + case ERROR_PATH_NOT_FOUND: + return ENOENT; + case ERROR_TOO_MANY_OPEN_FILES: + return EMFILE; + case ERROR_ACCESS_DENIED: + return EACCES; + case ERROR_INVALID_HANDLE: + return EBADF; + case ERROR_ARENA_TRASHED: + return ENOMEM; + case ERROR_NOT_ENOUGH_MEMORY: + return ENOMEM; + case ERROR_INVALID_BLOCK: + return ENOMEM; + case ERROR_BAD_ENVIRONMENT: + return E2BIG; + case ERROR_BAD_FORMAT: + return ENOEXEC; + case ERROR_INVALID_ACCESS: + return EINVAL; + case ERROR_INVALID_DATA: + return EINVAL; + case ERROR_INVALID_DRIVE: + return ENOENT; + case ERROR_CURRENT_DIRECTORY: + return EACCES; + case ERROR_NOT_SAME_DEVICE: + return EXDEV; + case ERROR_NO_MORE_FILES: + return ENOENT; + case ERROR_LOCK_VIOLATION: + return EACCES; + case ERROR_BAD_NETPATH: + return ENOENT; + case ERROR_NETWORK_ACCESS_DENIED: + return EACCES; + case ERROR_BAD_NET_NAME: + return ENOENT; + case ERROR_FILE_EXISTS: + return EEXIST; + case ERROR_CANNOT_MAKE: + return EACCES; + case ERROR_FAIL_I24: + return EACCES; + case ERROR_INVALID_PARAMETER: + return EINVAL; + case ERROR_NO_PROC_SLOTS: + return EAGAIN; + case ERROR_DRIVE_LOCKED: + return EACCES; + case ERROR_BROKEN_PIPE: + return EPIPE; + case ERROR_DISK_FULL: + return ENOSPC; + case ERROR_INVALID_TARGET_HANDLE: + return EBADF; + case ERROR_WAIT_NO_CHILDREN: + return ECHILD; + case ERROR_CHILD_NOT_COMPLETE: + return ECHILD; + case ERROR_DIRECT_ACCESS_HANDLE: + return EBADF; + case ERROR_NEGATIVE_SEEK: + return EINVAL; + case ERROR_SEEK_ON_DEVICE: + return EACCES; + case ERROR_DIR_NOT_EMPTY: + return ENOTEMPTY; + case ERROR_NOT_LOCKED: + return EACCES; + case ERROR_BAD_PATHNAME: + return ENOENT; + case ERROR_MAX_THRDS_REACHED: + return EAGAIN; + case ERROR_LOCK_FAILED: + return EACCES; + case ERROR_ALREADY_EXISTS: + return EEXIST; + case ERROR_FILENAME_EXCED_RANGE: + return ENOENT; + case ERROR_NESTING_NOT_ALLOWED: + return EAGAIN; + case ERROR_NOT_ENOUGH_QUOTA: + return ENOMEM; + default: + if (ERROR_WRITE_PROTECT <= winerrno && winerrno <= ERROR_SHARING_BUFFER_EXCEEDED) + return EACCES; + else if (ERROR_INVALID_STARTING_CODESEG <= winerrno && winerrno <= ERROR_INFLOOP_IN_RELOC_CHAIN) + return ENOEXEC; + else + return EINVAL; + } +} + +long WinFspLoad(void) +{ + return FspLoad(0); +} diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse/winposix.h b/3rd_party/winfsp-1.10/samples/passthrough-fuse/winposix.h new file mode 100644 index 00000000..b9150c22 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse/winposix.h @@ -0,0 +1,86 @@ +/** + * @file winposix.h + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef WINPOSIX_H_INCLUDED +#define WINPOSIX_H_INCLUDED + +#define O_RDONLY _O_RDONLY +#define O_WRONLY _O_WRONLY +#define O_RDWR _O_RDWR +#define O_APPEND _O_APPEND +#define O_CREAT _O_CREAT +#define O_EXCL _O_EXCL +#define O_TRUNC _O_TRUNC + +#define PATH_MAX 1024 +#define AT_FDCWD -2 +#define AT_SYMLINK_NOFOLLOW 2 + +typedef struct _DIR DIR; +struct dirent +{ + struct fuse_stat d_stat; + char d_name[255]; +}; + +char *realpath(const char *path, char *resolved); + +int statvfs(const char *path, struct fuse_statvfs *stbuf); + +int open(const char *path, int oflag, ...); +int fstat(int fd, struct fuse_stat *stbuf); +int ftruncate(int fd, fuse_off_t size); +int pread(int fd, void *buf, size_t nbyte, fuse_off_t offset); +int pwrite(int fd, const void *buf, size_t nbyte, fuse_off_t offset); +int fsync(int fd); +int close(int fd); + +int lstat(const char *path, struct fuse_stat *stbuf); +int chmod(const char *path, fuse_mode_t mode); +int lchown(const char *path, fuse_uid_t uid, fuse_gid_t gid); +int lchflags(const char *path, uint32_t flags); +int truncate(const char *path, fuse_off_t size); +int utime(const char *path, const struct fuse_utimbuf *timbuf); +int utimensat(int dirfd, const char *path, const struct fuse_timespec times[2], int flag); +int setcrtime(const char *path, const struct fuse_timespec *tv); +int unlink(const char *path); +int rename(const char *oldpath, const char *newpath); + +int lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); +int lgetxattr(const char *path, const char *name, void *value, size_t size); +int llistxattr(const char *path, char *namebuf, size_t size); +int lremovexattr(const char *path, const char *name); + +int mkdir(const char *path, fuse_mode_t mode); +int rmdir(const char *path); + +DIR *opendir(const char *path); +int dirfd(DIR *dirp); +void rewinddir(DIR *dirp); +struct dirent *readdir(DIR *dirp); +int closedir(DIR *dirp); + +long WinFspLoad(void); +#undef fuse_main +#define fuse_main(argc, argv, ops, data)\ + (WinFspLoad(), fuse_main_real(argc, argv, ops, sizeof *(ops), data)) + +#endif diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse3/Makefile b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/Makefile new file mode 100644 index 00000000..e729a044 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/Makefile @@ -0,0 +1,18 @@ +usage: + @echo "make cygfuse3|winfsp-fuse3" 1>&2 + @echo "" 1>&2 + @echo " cygfuse3 Link with CYGFUSE3" 1>&2 + @echo " winfsp-fuse3 Link with WinFsp-FUSE3" 1>&2 + @exit 2 + +cygfuse3: passthrough-cygfuse3 + +winfsp-fuse3: passthrough-winfsp-fuse3 + +passthrough-cygfuse3: passthrough-fuse3.c + gcc $^ -o $@ -g -Wall `pkg-config fuse3 --cflags --libs` + +passthrough-winfsp-fuse3: export PKG_CONFIG_PATH=$(PWD)/winfsp.install/lib +passthrough-winfsp-fuse3: passthrough-fuse3.c + ln -nsf "`regtool --wow32 get '/HKLM/Software/WinFsp/InstallDir' | cygpath -au -f -`" winfsp.install + gcc $^ -o $@ -g -Wall `pkg-config fuse3 --cflags --libs` diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse3/README.md b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/README.md new file mode 100644 index 00000000..3cf08b70 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/README.md @@ -0,0 +1,7 @@ +`Passthrough-fuse3` is a simple FUSE3 file system that passes all file system operations to an underlying file system. + +It can be built with the following tools: + +- Using Visual Studio (`winfsp.sln`). +- Using Cygwin GCC and linking directly with the WinFsp DLL (`make winfsp-fuse3`). +- Using Cygwin GCC and linking to CYGFUSE3 (`make cygfuse3`). diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.c b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.c new file mode 100644 index 00000000..baa0804c --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.c @@ -0,0 +1,369 @@ +/** + * @file passthrough-fuse.c + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#include +#include +#include +#include +#include + +#include + +#if defined(_WIN64) || defined(_WIN32) +#include "winposix.h" +#else +#include +#include +#endif + +#define FSNAME "passthrough" +#define PROGNAME "passthrough-fuse" + +#define concat_path(ptfs, fn, fp) (sizeof fp > (unsigned)snprintf(fp, sizeof fp, "%s%s", ptfs->rootdir, fn)) + +#define fi_dirbit (0x8000000000000000ULL) +#define fi_fh(fi, MASK) ((fi)->fh & (MASK)) +#define fi_setfh(fi, FH, MASK) ((fi)->fh = (intptr_t)(FH) | (MASK)) +#define fi_fd(fi) (fi_fh(fi, fi_dirbit) ? \ + dirfd((DIR *)(intptr_t)fi_fh(fi, ~fi_dirbit)) : (int)fi_fh(fi, ~fi_dirbit)) +#define fi_dirp(fi) ((DIR *)(intptr_t)fi_fh(fi, ~fi_dirbit)) +#define fi_setfd(fi, fd) (fi_setfh(fi, fd, 0)) +#define fi_setdirp(fi, dirp) (fi_setfh(fi, dirp, fi_dirbit)) + +#define ptfs_impl_fullpath(n) \ + char full ## n[PATH_MAX]; \ + if (!concat_path(((PTFS *)fuse_get_context()->private_data), n, full ## n))\ + return -ENAMETOOLONG; \ + n = full ## n + +typedef struct +{ + const char *rootdir; +} PTFS; + +static int ptfs_getattr(const char *path, struct fuse_stat *stbuf, struct fuse_file_info *fi) +{ + if (0 == fi) + { + ptfs_impl_fullpath(path); + + return -1 != lstat(path, stbuf) ? 0 : -errno; + } + else + { + int fd = fi_fd(fi); + + return -1 != fstat(fd, stbuf) ? 0 : -errno; + } +} + +static int ptfs_mkdir(const char *path, fuse_mode_t mode) +{ + ptfs_impl_fullpath(path); + + return -1 != mkdir(path, mode) ? 0 : -errno; +} + +static int ptfs_unlink(const char *path) +{ + ptfs_impl_fullpath(path); + + return -1 != unlink(path) ? 0 : -errno; +} + +static int ptfs_rmdir(const char *path) +{ + ptfs_impl_fullpath(path); + + return -1 != rmdir(path) ? 0 : -errno; +} + +static int ptfs_rename(const char *oldpath, const char *newpath, unsigned int flags) +{ + ptfs_impl_fullpath(newpath); + ptfs_impl_fullpath(oldpath); + + return -1 != rename(oldpath, newpath) ? 0 : -errno; +} + +static int ptfs_chmod(const char *path, fuse_mode_t mode, struct fuse_file_info *fi) +{ + ptfs_impl_fullpath(path); + + return -1 != chmod(path, mode) ? 0 : -errno; +} + +static int ptfs_chown(const char *path, fuse_uid_t uid, fuse_gid_t gid, struct fuse_file_info *fi) +{ + ptfs_impl_fullpath(path); + + return -1 != lchown(path, uid, gid) ? 0 : -errno; +} + +static int ptfs_truncate(const char *path, fuse_off_t size, struct fuse_file_info *fi) +{ + if (0 == fi) + { + ptfs_impl_fullpath(path); + + return -1 != truncate(path, size) ? 0 : -errno; + } + else + { + int fd = fi_fd(fi); + + return -1 != ftruncate(fd, size) ? 0 : -errno; + } +} + +static int ptfs_open(const char *path, struct fuse_file_info *fi) +{ + ptfs_impl_fullpath(path); + + int fd; + return -1 != (fd = open(path, fi->flags)) ? (fi_setfd(fi, fd), 0) : -errno; +} + +static int ptfs_read(const char *path, char *buf, size_t size, fuse_off_t off, + struct fuse_file_info *fi) +{ + int fd = fi_fd(fi); + + int nb; + return -1 != (nb = pread(fd, buf, size, off)) ? nb : -errno; +} + +static int ptfs_write(const char *path, const char *buf, size_t size, fuse_off_t off, + struct fuse_file_info *fi) +{ + int fd = fi_fd(fi); + + int nb; + return -1 != (nb = pwrite(fd, buf, size, off)) ? nb : -errno; +} + +static int ptfs_statfs(const char *path, struct fuse_statvfs *stbuf) +{ + ptfs_impl_fullpath(path); + + return -1 != statvfs(path, stbuf) ? 0 : -errno; +} + +static int ptfs_release(const char *path, struct fuse_file_info *fi) +{ + int fd = fi_fd(fi); + + close(fd); + return 0; +} + +static int ptfs_fsync(const char *path, int datasync, struct fuse_file_info *fi) +{ + int fd = fi_fd(fi); + + return -1 != fsync(fd) ? 0 : -errno; +} + +static int ptfs_setxattr(const char *path, const char *name, const char *value, size_t size, int flags) +{ + ptfs_impl_fullpath(path); + + return -1 != lsetxattr(path, name, value, size, flags) ? 0 : -errno; +} + +static int ptfs_getxattr(const char *path, const char *name, char *value, size_t size) +{ + ptfs_impl_fullpath(path); + + int nb; + return -1 != (nb = lgetxattr(path, name, value, size)) ? nb : -errno; +} + +static int ptfs_listxattr(const char *path, char *namebuf, size_t size) +{ + ptfs_impl_fullpath(path); + + int nb; + return -1 != (nb = llistxattr(path, namebuf, size)) ? nb : -errno; +} + +static int ptfs_removexattr(const char *path, const char *name) +{ + ptfs_impl_fullpath(path); + + return -1 != lremovexattr(path, name) ? 0 : -errno; +} + +static int ptfs_opendir(const char *path, struct fuse_file_info *fi) +{ + ptfs_impl_fullpath(path); + + DIR *dirp; + return 0 != (dirp = opendir(path)) ? (fi_setdirp(fi, dirp), 0) : -errno; +} + +static int ptfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, fuse_off_t off, + struct fuse_file_info *fi, enum fuse_readdir_flags flags) +{ + DIR *dirp = fi_dirp(fi); + struct dirent *de; + + rewinddir(dirp); + for (;;) + { + errno = 0; + if (0 == (de = readdir(dirp))) + break; +#if defined(_WIN64) || defined(_WIN32) + if (0 != filler(buf, de->d_name, &de->d_stat, 0, FUSE_FILL_DIR_PLUS)) +#else + if (0 != filler(buf, de->d_name, 0, 0, 0)) +#endif + return -ENOMEM; + } + + return -errno; +} + +static int ptfs_releasedir(const char *path, struct fuse_file_info *fi) +{ + DIR *dirp = fi_dirp(fi); + + return -1 != closedir(dirp) ? 0 : -errno; +} + +static void *ptfs_init(struct fuse_conn_info *conn, struct fuse_config *conf) +{ + conn->want |= (conn->capable & FUSE_CAP_READDIRPLUS); + +#if defined(FSP_FUSE_CAP_CASE_INSENSITIVE) + conn->want |= (conn->capable & FSP_FUSE_CAP_CASE_INSENSITIVE); +#endif + + return fuse_get_context()->private_data; +} + +static int ptfs_create(const char *path, fuse_mode_t mode, struct fuse_file_info *fi) +{ + ptfs_impl_fullpath(path); + + int fd; + return -1 != (fd = open(path, fi->flags, mode)) ? (fi_setfd(fi, fd), 0) : -errno; +} + +static int ptfs_utimens(const char *path, const struct fuse_timespec tv[2], struct fuse_file_info *fi) +{ + ptfs_impl_fullpath(path); + + return -1 != utimensat(AT_FDCWD, path, tv, AT_SYMLINK_NOFOLLOW) ? 0 : -errno; +} + +static struct fuse_operations ptfs_ops = +{ + .getattr = ptfs_getattr, + .mkdir = ptfs_mkdir, + .unlink = ptfs_unlink, + .rmdir = ptfs_rmdir, + .rename = ptfs_rename, + .chmod = ptfs_chmod, + .chown = ptfs_chown, + .truncate = ptfs_truncate, + .open = ptfs_open, + .read = ptfs_read, + .write = ptfs_write, + .statfs = ptfs_statfs, + .release = ptfs_release, + .fsync = ptfs_fsync, + .setxattr = ptfs_setxattr, + .getxattr = ptfs_getxattr, + .listxattr = ptfs_listxattr, + .removexattr = ptfs_removexattr, + .opendir = ptfs_opendir, + .readdir = ptfs_readdir, + .releasedir = ptfs_releasedir, + .init = ptfs_init, + .create = ptfs_create, + .utimens = ptfs_utimens, +}; + +static void usage(void) +{ + fprintf(stderr, "usage: " PROGNAME " [FUSE options] rootdir mountpoint\n"); + exit(2); +} + +int main(int argc, char *argv[]) +{ + PTFS ptfs = { 0 }; + + if (3 <= argc && '-' != argv[argc - 2][0] && '-' != argv[argc - 1][0]) + { + ptfs.rootdir = realpath(argv[argc - 2], 0); /* memory freed at process end */ + argv[argc - 2] = argv[argc - 1]; + argc--; + } + +#if defined(_WIN64) || defined(_WIN32) + /* + * When building for Windows (rather than Cygwin or POSIX OS) + * allow the path to be specified using the --VolumePrefix + * switch using the syntax \\passthrough-fuse\C$\Path. This + * allows us to run the file system under the WinFsp.Launcher + * and start it using commands like: + * + * net use z: \\passthrough-fuse\C$\Path + */ + if (0 == ptfs.rootdir) + for (int argi = 1; argc > argi; argi++) + { + int strncmp(const char *a, const char *b, size_t length); + char *strchr(const char *s, int c); + char *p = 0; + + if (0 == strncmp("--UNC=", argv[argi], sizeof "--UNC=" - 1)) + p = argv[argi] + sizeof "--UNC=" - 1; + else if (0 == strncmp("--VolumePrefix=", argv[argi], sizeof "--VolumePrefix=" - 1)) + p = argv[argi] + sizeof "--VolumePrefix=" - 1; + + if (0 != p && '\\' != p[1]) + { + p = strchr(p + 1, '\\'); + if (0 != p && + ( + ('A' <= p[1] && p[1] <= 'Z') || + ('a' <= p[1] && p[1] <= 'z') + ) && + '$' == p[2]) + { + p[2] = ':'; + ptfs.rootdir = realpath(p + 1, 0); /* memory freed at process end */ + p[2] = '$'; + break; + } + } + } +#endif + + if (0 == ptfs.rootdir) + usage(); + + return fuse_main(argc, argv, &ptfs_ops, &ptfs); +} diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.sln b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.sln new file mode 100644 index 00000000..5eaced8d --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "passthrough-fuse3", "passthrough-fuse3.vcxproj", "{5E99498C-D30C-48EF-A04A-7977C0305FAC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5E99498C-D30C-48EF-A04A-7977C0305FAC}.Debug|x64.ActiveCfg = Debug|x64 + {5E99498C-D30C-48EF-A04A-7977C0305FAC}.Debug|x64.Build.0 = Debug|x64 + {5E99498C-D30C-48EF-A04A-7977C0305FAC}.Debug|x86.ActiveCfg = Debug|Win32 + {5E99498C-D30C-48EF-A04A-7977C0305FAC}.Debug|x86.Build.0 = Debug|Win32 + {5E99498C-D30C-48EF-A04A-7977C0305FAC}.Release|x64.ActiveCfg = Release|x64 + {5E99498C-D30C-48EF-A04A-7977C0305FAC}.Release|x64.Build.0 = Release|x64 + {5E99498C-D30C-48EF-A04A-7977C0305FAC}.Release|x86.ActiveCfg = Release|Win32 + {5E99498C-D30C-48EF-A04A-7977C0305FAC}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.vcxproj b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.vcxproj new file mode 100644 index 00000000..6dde9088 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.vcxproj @@ -0,0 +1,190 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {5E99498C-D30C-48EF-A04A-7977C0305FAC} + Win32Proj + passthroughfuse3 + $(LatestTargetPlatformVersion) + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse3;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4996 + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse3;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4996 + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse3;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4996 + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc\fuse3;$(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + 4996 + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + + + + + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.vcxproj.filters b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.vcxproj.filters new file mode 100644 index 00000000..fb964d9e --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/passthrough-fuse3.vcxproj.filters @@ -0,0 +1,21 @@ + + + + + {bfbcc136-ea14-4445-8f9b-1fa7f8aedc71} + + + + + Source + + + Source + + + + + Source + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse3/winposix.c b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/winposix.c new file mode 100644 index 00000000..54097142 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/winposix.c @@ -0,0 +1,892 @@ +/** + * @file winposix.c + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +/* + * This is a very simple Windows POSIX layer. It handles all the POSIX + * file API's required to implement passthrough-fuse in POSIX, however + * the API handling is rather unsophisticated. + * + * Ways to improve it: use the FspPosix* API's to properly handle + * file names and security. + */ + +#include +#include +#include +#include "winposix.h" + +#pragma comment(lib, "ntdll.lib") + +typedef struct _FILE_GET_EA_INFORMATION +{ + ULONG NextEntryOffset; + UCHAR EaNameLength; + CHAR EaName[1]; +} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION; + +NTSYSAPI NTSTATUS NTAPI NtQueryEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan); +NTSYSAPI NTSTATUS NTAPI NtSetEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID EaBuffer, + IN ULONG EaBufferSize); +#define NEXT_EA(Ea, EaEnd) \ + (0 != (Ea)->NextEntryOffset ? (PVOID)((PUINT8)(Ea) + (Ea)->NextEntryOffset) : (EaEnd)) + +struct _DIR +{ + HANDLE h, fh; + struct dirent de; + char path[]; +}; + +#if defined(FSP_FUSE_USE_STAT_EX) +static inline uint32_t MapFileAttributesToFlags(UINT32 FileAttributes) +{ + uint32_t flags = 0; + + if (FileAttributes & FILE_ATTRIBUTE_READONLY) + flags |= FSP_FUSE_UF_READONLY; + if (FileAttributes & FILE_ATTRIBUTE_HIDDEN) + flags |= FSP_FUSE_UF_HIDDEN; + if (FileAttributes & FILE_ATTRIBUTE_SYSTEM) + flags |= FSP_FUSE_UF_SYSTEM; + if (FileAttributes & FILE_ATTRIBUTE_ARCHIVE) + flags |= FSP_FUSE_UF_ARCHIVE; + + return flags; +} + +static inline UINT32 MapFlagsToFileAttributes(uint32_t flags) +{ + UINT32 FileAttributes = 0; + + if (flags & FSP_FUSE_UF_READONLY) + FileAttributes |= FILE_ATTRIBUTE_READONLY; + if (flags & FSP_FUSE_UF_HIDDEN) + FileAttributes |= FILE_ATTRIBUTE_HIDDEN; + if (flags & FSP_FUSE_UF_SYSTEM) + FileAttributes |= FILE_ATTRIBUTE_SYSTEM; + if (flags & FSP_FUSE_UF_ARCHIVE) + FileAttributes |= FILE_ATTRIBUTE_ARCHIVE; + + return FileAttributes; +} +#endif + +static int maperror(int winerrno); + +static inline void *error0(void) +{ + errno = maperror(GetLastError()); + return 0; +} + +static inline int error(void) +{ + errno = maperror(GetLastError()); + return -1; +} + +char *realpath(const char *path, char *resolved) +{ + char *result; + + if (0 == resolved) + { + result = malloc(PATH_MAX); /* sets errno */ + if (0 == result) + return 0; + } + else + result = resolved; + + int err = 0; + DWORD len = GetFullPathNameA(path, PATH_MAX, result, 0); + if (0 == len) + err = GetLastError(); + else if (PATH_MAX < len) + err = ERROR_INVALID_PARAMETER; + + if (0 == err) + { + HANDLE h = CreateFileA(result, + FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE != h) + CloseHandle(h); + else + err = GetLastError(); + } + + if (0 != err) + { + if (result != resolved) + free(result); + + errno = maperror(err); + result = 0; + } + + return result; +} + +int statvfs(const char *path, struct fuse_statvfs *stbuf) +{ + char root[PATH_MAX]; + DWORD + VolumeSerialNumber, + MaxComponentLength, + SectorsPerCluster, + BytesPerSector, + NumberOfFreeClusters, + TotalNumberOfClusters; + + if (!GetVolumePathNameA(path, root, PATH_MAX) || + !GetVolumeInformationA(root, 0, 0, &VolumeSerialNumber, &MaxComponentLength, 0, 0, 0) || + !GetDiskFreeSpaceA(root, &SectorsPerCluster, &BytesPerSector, + &NumberOfFreeClusters, &TotalNumberOfClusters)) + { + return error(); + } + + memset(stbuf, 0, sizeof *stbuf); + stbuf->f_bsize = SectorsPerCluster * BytesPerSector; + stbuf->f_frsize = SectorsPerCluster * BytesPerSector; + stbuf->f_blocks = TotalNumberOfClusters; + stbuf->f_bfree = NumberOfFreeClusters; + stbuf->f_bavail = TotalNumberOfClusters; + stbuf->f_fsid = VolumeSerialNumber; + stbuf->f_namemax = MaxComponentLength; + + return 0; +} + +int open(const char *path, int oflag, ...) +{ + static DWORD da[] = { GENERIC_READ, GENERIC_WRITE, GENERIC_READ | GENERIC_WRITE, 0 }; + static DWORD cd[] = { OPEN_EXISTING, OPEN_ALWAYS, TRUNCATE_EXISTING, CREATE_ALWAYS }; + DWORD DesiredAccess = 0 == (oflag & _O_APPEND) ? + da[oflag & (_O_RDONLY | _O_WRONLY | _O_RDWR)] : + (da[oflag & (_O_RDONLY | _O_WRONLY | _O_RDWR)] & ~FILE_WRITE_DATA) | FILE_APPEND_DATA; + DWORD CreationDisposition = (_O_CREAT | _O_EXCL) == (oflag & (_O_CREAT | _O_EXCL)) ? + CREATE_NEW : + cd[(oflag & (_O_CREAT | _O_TRUNC)) >> 8]; + + HANDLE h = CreateFileA(path, + DesiredAccess, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0/* default security */, + CreationDisposition, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, 0); + + if (INVALID_HANDLE_VALUE == h) + return error(); + + return (int)(intptr_t)h; +} + +int fstat(int fd, struct fuse_stat *stbuf) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + BY_HANDLE_FILE_INFORMATION FileInfo; + + if (!GetFileInformationByHandle(h, &FileInfo)) + return error(); + + memset(stbuf, 0, sizeof *stbuf); + stbuf->st_mode = 0777 | + ((FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 0040000/* S_IFDIR */ : 0); + stbuf->st_nlink = 1; + stbuf->st_size = ((UINT64)FileInfo.nFileSizeHigh << 32) | ((UINT64)FileInfo.nFileSizeLow); + FspPosixFileTimeToUnixTime(*(PUINT64)&FileInfo.ftCreationTime, (void *)&stbuf->st_birthtim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FileInfo.ftLastAccessTime, (void *)&stbuf->st_atim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FileInfo.ftLastWriteTime, (void *)&stbuf->st_mtim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FileInfo.ftLastWriteTime, (void *)&stbuf->st_ctim); +#if defined(FSP_FUSE_USE_STAT_EX) + stbuf->st_flags = MapFileAttributesToFlags(FileInfo.dwFileAttributes); +#endif + + return 0; +} + +int ftruncate(int fd, fuse_off_t size) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + FILE_END_OF_FILE_INFO EndOfFileInfo; + + EndOfFileInfo.EndOfFile.QuadPart = size; + + if (!SetFileInformationByHandle(h, FileEndOfFileInfo, &EndOfFileInfo, sizeof EndOfFileInfo)) + return error(); + + return 0; +} + +int pread(int fd, void *buf, size_t nbyte, fuse_off_t offset) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + OVERLAPPED Overlapped = { 0 }; + DWORD BytesTransferred; + + Overlapped.Offset = (DWORD)offset; + Overlapped.OffsetHigh = (DWORD)(offset >> 32); + + if (!ReadFile(h, buf, (DWORD)nbyte, &BytesTransferred, &Overlapped)) + { + if (ERROR_HANDLE_EOF == GetLastError()) + return 0; + return error(); + } + + return BytesTransferred; +} + +int pwrite(int fd, const void *buf, size_t nbyte, fuse_off_t offset) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + OVERLAPPED Overlapped = { 0 }; + DWORD BytesTransferred; + + Overlapped.Offset = (DWORD)offset; + Overlapped.OffsetHigh = (DWORD)(offset >> 32); + + if (!WriteFile(h, buf, (DWORD)nbyte, &BytesTransferred, &Overlapped)) + return error(); + + return BytesTransferred; +} + +int fsync(int fd) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + + if (!FlushFileBuffers(h)) + return error(); + + return 0; +} + +int close(int fd) +{ + HANDLE h = (HANDLE)(intptr_t)fd; + + if (!CloseHandle(h)) + return error(); + + return 0; +} + +int lstat(const char *path, struct fuse_stat *stbuf) +{ + HANDLE h = CreateFileA(path, + FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + int res = fstat((int)(intptr_t)h, stbuf); + + CloseHandle(h); + + return res; +} + +int chmod(const char *path, fuse_mode_t mode) +{ + /* we do not support file security */ + return 0; +} + +int lchown(const char *path, fuse_uid_t uid, fuse_gid_t gid) +{ + /* we do not support file security */ + return 0; +} + +int lchflags(const char *path, uint32_t flags) +{ +#if defined(FSP_FUSE_USE_STAT_EX) + UINT32 FileAttributes = MapFlagsToFileAttributes(flags); + + if (0 == FileAttributes) + FileAttributes = FILE_ATTRIBUTE_NORMAL; + + if (!SetFileAttributesA(path, FileAttributes)) + return error(); +#endif + + return 0; +} + +int truncate(const char *path, fuse_off_t size) +{ + HANDLE h = CreateFileA(path, + FILE_WRITE_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + int res = ftruncate((int)(intptr_t)h, size); + + CloseHandle(h); + + return res; +} + +int utime(const char *path, const struct fuse_utimbuf *timbuf) +{ + if (0 == timbuf) + return utimensat(AT_FDCWD, path, 0, AT_SYMLINK_NOFOLLOW); + else + { + struct fuse_timespec times[2]; + times[0].tv_sec = timbuf->actime; + times[0].tv_nsec = 0; + times[1].tv_sec = timbuf->modtime; + times[1].tv_nsec = 0; + return utimensat(AT_FDCWD, path, times, AT_SYMLINK_NOFOLLOW); + } +} + +int utimensat(int dirfd, const char *path, const struct fuse_timespec times[2], int flag) +{ + /* ignore dirfd and assume that it is always AT_FDCWD */ + /* ignore flag and assume that it is always AT_SYMLINK_NOFOLLOW */ + + HANDLE h = CreateFileA(path, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + UINT64 LastAccessTime, LastWriteTime; + if (0 == times) + { + FILETIME FileTime; + GetSystemTimeAsFileTime(&FileTime); + LastAccessTime = LastWriteTime = *(PUINT64)&FileTime; + } + else + { + FspPosixUnixTimeToFileTime((void *)×[0], &LastAccessTime); + FspPosixUnixTimeToFileTime((void *)×[1], &LastWriteTime); + } + + int res = SetFileTime(h, + 0, (PFILETIME)&LastAccessTime, (PFILETIME)&LastWriteTime) ? 0 : error(); + + CloseHandle(h); + + return res; +} + +int setcrtime(const char *path, const struct fuse_timespec *tv) +{ + HANDLE h = CreateFileA(path, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + UINT64 CreationTime; + FspPosixUnixTimeToFileTime((void *)tv, &CreationTime); + + int res = SetFileTime(h, + (PFILETIME)&CreationTime, 0, 0) ? 0 : error(); + + CloseHandle(h); + + return res; +} + +int unlink(const char *path) +{ + if (!DeleteFileA(path)) + return error(); + + return 0; +} + +int rename(const char *oldpath, const char *newpath) +{ + if (!MoveFileExA(oldpath, newpath, MOVEFILE_REPLACE_EXISTING)) + return error(); + + return 0; +} + +static int lsetea(const char *path, PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength) +{ + HANDLE h = CreateFileA(path, + FILE_WRITE_EA | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + IO_STATUS_BLOCK Iosb; + NTSTATUS Status = NtSetEaFile(h, &Iosb, Ea, EaLength); + + CloseHandle(h); + + if (!NT_SUCCESS(Status)) + switch (Status) + { + case STATUS_INVALID_EA_NAME: + case STATUS_EA_LIST_INCONSISTENT: + case STATUS_EA_CORRUPT_ERROR: + case STATUS_NONEXISTENT_EA_ENTRY: + case STATUS_NO_MORE_EAS: + case STATUS_NO_EAS_ON_FILE: + errno = EINVAL; + return -1; + default: + SetLastError(RtlNtStatusToDosError(Status)); + return error(); + } + + return 0; +} + +static int lgetea(const char *path, + PFILE_GET_EA_INFORMATION GetEa, ULONG GetEaLength, + PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength) +{ + HANDLE h = CreateFileA(path, + FILE_READ_EA | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error(); + + IO_STATUS_BLOCK Iosb; + NTSTATUS Status = NtQueryEaFile(h, &Iosb, Ea, EaLength, FALSE, GetEa, GetEaLength, 0, TRUE); + + CloseHandle(h); + + if (!NT_SUCCESS(Status)) + switch (Status) + { + case STATUS_INVALID_EA_NAME: + case STATUS_EA_LIST_INCONSISTENT: + case STATUS_EA_CORRUPT_ERROR: + case STATUS_NONEXISTENT_EA_ENTRY: + case STATUS_NO_MORE_EAS: + errno = EINVAL; + return -1; + case STATUS_NO_EAS_ON_FILE: + if (0 == GetEa) + return 0; + else + { + errno = ENODATA; + return -1; + } + default: + SetLastError(RtlNtStatusToDosError(Status)); + return error(); + } + else if (0 == GetEa && + (FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) > Iosb.Information || 0 == Ea->EaValueLength)) + { + errno = ENODATA; + return -1; + } + + return (ULONG)Iosb.Information; +} + +int lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags) +{ + union + { + FILE_FULL_EA_INFORMATION V; + UINT8 B[1024]; + } EaBuf; + PFILE_FULL_EA_INFORMATION Ea = &EaBuf.V; + ULONG EaLength; + + size_t namelen = strlen(name); + if (254 < namelen || 0xffff < size) + { + errno = EINVAL; + return -1; + } + + EaLength = (ULONG)(FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + namelen + 1 + size); + if (sizeof EaBuf < EaLength) + { + Ea = malloc(EaLength); /* sets errno */ + if (0 == Ea) + return -1; + } + + memset(Ea, 0, sizeof(FILE_FULL_EA_INFORMATION)); + Ea->EaNameLength = (UCHAR)namelen; + Ea->EaValueLength = (USHORT)size; + memcpy(Ea->EaName, name, namelen + 1); + memcpy(Ea->EaName + namelen + 1, value, size); + + int res = lsetea(path, Ea, EaLength); /* sets errno */ + + if (&EaBuf.V != Ea) + free(Ea); + + return res; +} + +int lgetxattr(const char *path, const char *name, void *value, size_t size0) +{ + size_t size = 0 == size0 || 0xffff < size0 ? 0xffff : size0; + union + { + FILE_GET_EA_INFORMATION V; + UINT8 B[FIELD_OFFSET(FILE_GET_EA_INFORMATION, EaName) + 255]; + } GetEaBuf; + PFILE_GET_EA_INFORMATION GetEa = &GetEaBuf.V; + union + { + FILE_FULL_EA_INFORMATION V; + UINT8 B[1024]; + } EaBuf; + PFILE_FULL_EA_INFORMATION Ea = &EaBuf.V; + ULONG GetEaLength, EaLength; + + size_t namelen = strlen(name); + if (254 < namelen) + { + errno = EINVAL; + return -1; + } + + EaLength = (ULONG)(FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + namelen + 1 + size); + if (sizeof EaBuf < EaLength) + { + Ea = malloc(EaLength); /* sets errno */ + if (0 == Ea) + return -1; + } + + GetEaLength = (ULONG)(FIELD_OFFSET(FILE_GET_EA_INFORMATION, EaName) + namelen + 1); + memset(GetEa, 0, sizeof(FILE_GET_EA_INFORMATION)); + GetEa->EaNameLength = (UCHAR)namelen; + memcpy(GetEa->EaName, name, namelen + 1); + + int res = lgetea(path, GetEa, GetEaLength, Ea, EaLength); + if (0 < res) + { + res = Ea->EaValueLength; + if (0 == size0) + ; + else if (res <= size0) + memcpy(value, Ea->EaName + Ea->EaNameLength + 1, res); + else + { + errno = ERANGE; + res = -1; + } + } + else if (0 == res) /* should not happen! */ + { + } + + if (&EaBuf.V != Ea) + free(Ea); + + return res; +} + +int llistxattr(const char *path, char *namebuf, size_t size) +{ + PFILE_FULL_EA_INFORMATION Ea = 0; + ULONG EaLength; + + EaLength = (ULONG)(FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + 254 + 1 + 0xffff); + Ea = malloc(EaLength); /* sets errno */ + if (0 == Ea) + return -1; + + int res = lgetea(path, 0, 0, Ea, EaLength); + if (0 < res) + { + PFILE_FULL_EA_INFORMATION EaEnd = (PVOID)((PUINT8)Ea + res); + res = 0; + for (PFILE_FULL_EA_INFORMATION EaPtr = Ea; EaEnd > EaPtr; EaPtr = NEXT_EA(EaPtr, EaEnd)) + res += EaPtr->EaNameLength + 1; + + if (0 == size) + ; + else if (res <= size) + { + char *p = namebuf; + for (PFILE_FULL_EA_INFORMATION EaPtr = Ea; EaEnd > EaPtr; EaPtr = NEXT_EA(EaPtr, EaEnd)) + { + memcpy(p, EaPtr->EaName, EaPtr->EaNameLength + 1); + p += EaPtr->EaNameLength + 1; + } + } + else + { + errno = ERANGE; + res = -1; + } + } + + free(Ea); + + return res; +} + +int lremovexattr(const char *path, const char *name) +{ + return lsetxattr(path, name, 0, 0, 0); +} + +int mkdir(const char *path, fuse_mode_t mode) +{ + if (!CreateDirectoryA(path, 0/* default security */)) + return error(); + + return 0; +} + +int rmdir(const char *path) +{ + if (!RemoveDirectoryA(path)) + return error(); + + return 0; +} + +DIR *opendir(const char *path) +{ + HANDLE h = CreateFileA(path, + FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == h) + return error0(); + + size_t pathlen = strlen(path); + if (0 < pathlen && '/' == path[pathlen - 1]) + pathlen--; + + DIR *dirp = malloc(sizeof *dirp + pathlen + 3); /* sets errno */ + if (0 == dirp) + { + CloseHandle(h); + return 0; + } + + memset(dirp, 0, sizeof *dirp); + dirp->h = h; + dirp->fh = INVALID_HANDLE_VALUE; + memcpy(dirp->path, path, pathlen); + dirp->path[pathlen + 0] = '/'; + dirp->path[pathlen + 1] = '*'; + dirp->path[pathlen + 2] = '\0'; + + return dirp; +} + +int dirfd(DIR *dirp) +{ + return (int)(intptr_t)dirp->h; +} + +void rewinddir(DIR *dirp) +{ + if (INVALID_HANDLE_VALUE != dirp->fh) + { + FindClose(dirp->fh); + dirp->fh = INVALID_HANDLE_VALUE; + } +} + +struct dirent *readdir(DIR *dirp) +{ + WIN32_FIND_DATAA FindData; + struct fuse_stat *stbuf = &dirp->de.d_stat; + + if (INVALID_HANDLE_VALUE == dirp->fh) + { + dirp->fh = FindFirstFileA(dirp->path, &FindData); + if (INVALID_HANDLE_VALUE == dirp->fh) + return error0(); + } + else + { + if (!FindNextFileA(dirp->fh, &FindData)) + { + if (ERROR_NO_MORE_FILES == GetLastError()) + return 0; + return error0(); + } + } + + memset(stbuf, 0, sizeof *stbuf); + stbuf->st_mode = 0777 | + ((FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 0040000/* S_IFDIR */ : 0); + stbuf->st_nlink = 1; + stbuf->st_size = ((UINT64)FindData.nFileSizeHigh << 32) | ((UINT64)FindData.nFileSizeLow); + FspPosixFileTimeToUnixTime(*(PUINT64)&FindData.ftCreationTime, (void *)&stbuf->st_birthtim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FindData.ftLastAccessTime, (void *)&stbuf->st_atim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FindData.ftLastWriteTime, (void *)&stbuf->st_mtim); + FspPosixFileTimeToUnixTime(*(PUINT64)&FindData.ftLastWriteTime, (void *)&stbuf->st_ctim); +#if defined(FSP_FUSE_USE_STAT_EX) + stbuf->st_flags = MapFileAttributesToFlags(FindData.dwFileAttributes); +#endif + + strcpy(dirp->de.d_name, FindData.cFileName); + + return &dirp->de; +} + +int closedir(DIR *dirp) +{ + if (INVALID_HANDLE_VALUE != dirp->fh) + FindClose(dirp->fh); + + CloseHandle(dirp->h); + free(dirp); + + return 0; +} + +static int maperror(int winerrno) +{ + switch (winerrno) + { + case ERROR_INVALID_FUNCTION: + return EINVAL; + case ERROR_FILE_NOT_FOUND: + return ENOENT; + case ERROR_PATH_NOT_FOUND: + return ENOENT; + case ERROR_TOO_MANY_OPEN_FILES: + return EMFILE; + case ERROR_ACCESS_DENIED: + return EACCES; + case ERROR_INVALID_HANDLE: + return EBADF; + case ERROR_ARENA_TRASHED: + return ENOMEM; + case ERROR_NOT_ENOUGH_MEMORY: + return ENOMEM; + case ERROR_INVALID_BLOCK: + return ENOMEM; + case ERROR_BAD_ENVIRONMENT: + return E2BIG; + case ERROR_BAD_FORMAT: + return ENOEXEC; + case ERROR_INVALID_ACCESS: + return EINVAL; + case ERROR_INVALID_DATA: + return EINVAL; + case ERROR_INVALID_DRIVE: + return ENOENT; + case ERROR_CURRENT_DIRECTORY: + return EACCES; + case ERROR_NOT_SAME_DEVICE: + return EXDEV; + case ERROR_NO_MORE_FILES: + return ENOENT; + case ERROR_LOCK_VIOLATION: + return EACCES; + case ERROR_BAD_NETPATH: + return ENOENT; + case ERROR_NETWORK_ACCESS_DENIED: + return EACCES; + case ERROR_BAD_NET_NAME: + return ENOENT; + case ERROR_FILE_EXISTS: + return EEXIST; + case ERROR_CANNOT_MAKE: + return EACCES; + case ERROR_FAIL_I24: + return EACCES; + case ERROR_INVALID_PARAMETER: + return EINVAL; + case ERROR_NO_PROC_SLOTS: + return EAGAIN; + case ERROR_DRIVE_LOCKED: + return EACCES; + case ERROR_BROKEN_PIPE: + return EPIPE; + case ERROR_DISK_FULL: + return ENOSPC; + case ERROR_INVALID_TARGET_HANDLE: + return EBADF; + case ERROR_WAIT_NO_CHILDREN: + return ECHILD; + case ERROR_CHILD_NOT_COMPLETE: + return ECHILD; + case ERROR_DIRECT_ACCESS_HANDLE: + return EBADF; + case ERROR_NEGATIVE_SEEK: + return EINVAL; + case ERROR_SEEK_ON_DEVICE: + return EACCES; + case ERROR_DIR_NOT_EMPTY: + return ENOTEMPTY; + case ERROR_NOT_LOCKED: + return EACCES; + case ERROR_BAD_PATHNAME: + return ENOENT; + case ERROR_MAX_THRDS_REACHED: + return EAGAIN; + case ERROR_LOCK_FAILED: + return EACCES; + case ERROR_ALREADY_EXISTS: + return EEXIST; + case ERROR_FILENAME_EXCED_RANGE: + return ENOENT; + case ERROR_NESTING_NOT_ALLOWED: + return EAGAIN; + case ERROR_NOT_ENOUGH_QUOTA: + return ENOMEM; + default: + if (ERROR_WRITE_PROTECT <= winerrno && winerrno <= ERROR_SHARING_BUFFER_EXCEEDED) + return EACCES; + else if (ERROR_INVALID_STARTING_CODESEG <= winerrno && winerrno <= ERROR_INFLOOP_IN_RELOC_CHAIN) + return ENOEXEC; + else + return EINVAL; + } +} + +long WinFspLoad(void) +{ + return FspLoad(0); +} diff --git a/3rd_party/winfsp-1.10/samples/passthrough-fuse3/winposix.h b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/winposix.h new file mode 100644 index 00000000..b9150c22 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough-fuse3/winposix.h @@ -0,0 +1,86 @@ +/** + * @file winposix.h + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#ifndef WINPOSIX_H_INCLUDED +#define WINPOSIX_H_INCLUDED + +#define O_RDONLY _O_RDONLY +#define O_WRONLY _O_WRONLY +#define O_RDWR _O_RDWR +#define O_APPEND _O_APPEND +#define O_CREAT _O_CREAT +#define O_EXCL _O_EXCL +#define O_TRUNC _O_TRUNC + +#define PATH_MAX 1024 +#define AT_FDCWD -2 +#define AT_SYMLINK_NOFOLLOW 2 + +typedef struct _DIR DIR; +struct dirent +{ + struct fuse_stat d_stat; + char d_name[255]; +}; + +char *realpath(const char *path, char *resolved); + +int statvfs(const char *path, struct fuse_statvfs *stbuf); + +int open(const char *path, int oflag, ...); +int fstat(int fd, struct fuse_stat *stbuf); +int ftruncate(int fd, fuse_off_t size); +int pread(int fd, void *buf, size_t nbyte, fuse_off_t offset); +int pwrite(int fd, const void *buf, size_t nbyte, fuse_off_t offset); +int fsync(int fd); +int close(int fd); + +int lstat(const char *path, struct fuse_stat *stbuf); +int chmod(const char *path, fuse_mode_t mode); +int lchown(const char *path, fuse_uid_t uid, fuse_gid_t gid); +int lchflags(const char *path, uint32_t flags); +int truncate(const char *path, fuse_off_t size); +int utime(const char *path, const struct fuse_utimbuf *timbuf); +int utimensat(int dirfd, const char *path, const struct fuse_timespec times[2], int flag); +int setcrtime(const char *path, const struct fuse_timespec *tv); +int unlink(const char *path); +int rename(const char *oldpath, const char *newpath); + +int lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); +int lgetxattr(const char *path, const char *name, void *value, size_t size); +int llistxattr(const char *path, char *namebuf, size_t size); +int lremovexattr(const char *path, const char *name); + +int mkdir(const char *path, fuse_mode_t mode); +int rmdir(const char *path); + +DIR *opendir(const char *path); +int dirfd(DIR *dirp); +void rewinddir(DIR *dirp); +struct dirent *readdir(DIR *dirp); +int closedir(DIR *dirp); + +long WinFspLoad(void); +#undef fuse_main +#define fuse_main(argc, argv, ops, data)\ + (WinFspLoad(), fuse_main_real(argc, argv, ops, sizeof *(ops), data)) + +#endif diff --git a/3rd_party/winfsp-1.10/samples/passthrough/passthrough.c b/3rd_party/winfsp-1.10/samples/passthrough/passthrough.c new file mode 100644 index 00000000..43c63af5 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough/passthrough.c @@ -0,0 +1,940 @@ +/** + * @file passthrough.c + * + * @copyright 2015-2021 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the GNU + * General Public License version 3 as published by the Free Software + * Foundation. + * + * Licensees holding a valid commercial license may use this software + * in accordance with the commercial license agreement provided in + * conjunction with the software. The terms and conditions of any such + * commercial license agreement shall govern, supersede, and render + * ineffective any application of the GPLv3 license to this software, + * notwithstanding of any reference thereto in the software or + * associated repository. + */ + +#include +#include + +#define PROGNAME "passthrough" +#define ALLOCATION_UNIT 4096 +#define FULLPATH_SIZE (MAX_PATH + FSP_FSCTL_TRANSACT_PATH_SIZEMAX / sizeof(WCHAR)) + +#define info(format, ...) FspServiceLog(EVENTLOG_INFORMATION_TYPE, format, __VA_ARGS__) +#define warn(format, ...) FspServiceLog(EVENTLOG_WARNING_TYPE, format, __VA_ARGS__) +#define fail(format, ...) FspServiceLog(EVENTLOG_ERROR_TYPE, format, __VA_ARGS__) + +#define ConcatPath(Ptfs, FN, FP) (0 == StringCbPrintfW(FP, sizeof FP, L"%s%s", Ptfs->Path, FN)) +#define HandleFromContext(FC) (((PTFS_FILE_CONTEXT *)(FC))->Handle) + +typedef struct +{ + FSP_FILE_SYSTEM *FileSystem; + PWSTR Path; +} PTFS; + +typedef struct +{ + HANDLE Handle; + PVOID DirBuffer; +} PTFS_FILE_CONTEXT; + +static NTSTATUS GetFileInfoInternal(HANDLE Handle, FSP_FSCTL_FILE_INFO *FileInfo) +{ + BY_HANDLE_FILE_INFORMATION ByHandleFileInfo; + + if (!GetFileInformationByHandle(Handle, &ByHandleFileInfo)) + return FspNtStatusFromWin32(GetLastError()); + + FileInfo->FileAttributes = ByHandleFileInfo.dwFileAttributes; + FileInfo->ReparseTag = 0; + FileInfo->FileSize = + ((UINT64)ByHandleFileInfo.nFileSizeHigh << 32) | (UINT64)ByHandleFileInfo.nFileSizeLow; + FileInfo->AllocationSize = (FileInfo->FileSize + ALLOCATION_UNIT - 1) + / ALLOCATION_UNIT * ALLOCATION_UNIT; + FileInfo->CreationTime = ((PLARGE_INTEGER)&ByHandleFileInfo.ftCreationTime)->QuadPart; + FileInfo->LastAccessTime = ((PLARGE_INTEGER)&ByHandleFileInfo.ftLastAccessTime)->QuadPart; + FileInfo->LastWriteTime = ((PLARGE_INTEGER)&ByHandleFileInfo.ftLastWriteTime)->QuadPart; + FileInfo->ChangeTime = FileInfo->LastWriteTime; + FileInfo->IndexNumber = 0; + FileInfo->HardLinks = 0; + + return STATUS_SUCCESS; +} + +static NTSTATUS GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_VOLUME_INFO *VolumeInfo) +{ + PTFS *Ptfs = (PTFS *)FileSystem->UserContext; + WCHAR Root[MAX_PATH]; + ULARGE_INTEGER TotalSize, FreeSize; + + if (!GetVolumePathName(Ptfs->Path, Root, MAX_PATH)) + return FspNtStatusFromWin32(GetLastError()); + + if (!GetDiskFreeSpaceEx(Root, 0, &TotalSize, &FreeSize)) + return FspNtStatusFromWin32(GetLastError()); + + VolumeInfo->TotalSize = TotalSize.QuadPart; + VolumeInfo->FreeSize = FreeSize.QuadPart; + + return STATUS_SUCCESS; +} + +static NTSTATUS SetVolumeLabel_(FSP_FILE_SYSTEM *FileSystem, + PWSTR VolumeLabel, + FSP_FSCTL_VOLUME_INFO *VolumeInfo) +{ + /* we do not support changing the volume label */ + return STATUS_INVALID_DEVICE_REQUEST; +} + +static NTSTATUS GetSecurityByName(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, PUINT32 PFileAttributes, + PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) +{ + PTFS *Ptfs = (PTFS *)FileSystem->UserContext; + WCHAR FullPath[FULLPATH_SIZE]; + HANDLE Handle; + FILE_ATTRIBUTE_TAG_INFO AttributeTagInfo; + DWORD SecurityDescriptorSizeNeeded; + NTSTATUS Result; + + if (!ConcatPath(Ptfs, FileName, FullPath)) + return STATUS_OBJECT_NAME_INVALID; + + Handle = CreateFileW(FullPath, + FILE_READ_ATTRIBUTES | READ_CONTROL, 0, 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == Handle) + { + Result = FspNtStatusFromWin32(GetLastError()); + goto exit; + } + + if (0 != PFileAttributes) + { + if (!GetFileInformationByHandleEx(Handle, + FileAttributeTagInfo, &AttributeTagInfo, sizeof AttributeTagInfo)) + { + Result = FspNtStatusFromWin32(GetLastError()); + goto exit; + } + + *PFileAttributes = AttributeTagInfo.FileAttributes; + } + + if (0 != PSecurityDescriptorSize) + { + if (!GetKernelObjectSecurity(Handle, + OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, + SecurityDescriptor, (DWORD)*PSecurityDescriptorSize, &SecurityDescriptorSizeNeeded)) + { + *PSecurityDescriptorSize = SecurityDescriptorSizeNeeded; + Result = FspNtStatusFromWin32(GetLastError()); + goto exit; + } + + *PSecurityDescriptorSize = SecurityDescriptorSizeNeeded; + } + + Result = STATUS_SUCCESS; + +exit: + if (INVALID_HANDLE_VALUE != Handle) + CloseHandle(Handle); + + return Result; +} + +static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess, + UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, + PVOID *PFileContext, FSP_FSCTL_FILE_INFO *FileInfo) +{ + PTFS *Ptfs = (PTFS *)FileSystem->UserContext; + WCHAR FullPath[FULLPATH_SIZE]; + SECURITY_ATTRIBUTES SecurityAttributes; + ULONG CreateFlags; + PTFS_FILE_CONTEXT *FileContext; + + if (!ConcatPath(Ptfs, FileName, FullPath)) + return STATUS_OBJECT_NAME_INVALID; + + FileContext = malloc(sizeof *FileContext); + if (0 == FileContext) + return STATUS_INSUFFICIENT_RESOURCES; + memset(FileContext, 0, sizeof *FileContext); + + SecurityAttributes.nLength = sizeof SecurityAttributes; + SecurityAttributes.lpSecurityDescriptor = SecurityDescriptor; + SecurityAttributes.bInheritHandle = FALSE; + + CreateFlags = FILE_FLAG_BACKUP_SEMANTICS; + if (CreateOptions & FILE_DELETE_ON_CLOSE) + CreateFlags |= FILE_FLAG_DELETE_ON_CLOSE; + + if (CreateOptions & FILE_DIRECTORY_FILE) + { + /* + * It is not widely known but CreateFileW can be used to create directories! + * It requires the specification of both FILE_FLAG_BACKUP_SEMANTICS and + * FILE_FLAG_POSIX_SEMANTICS. It also requires that FileAttributes has + * FILE_ATTRIBUTE_DIRECTORY set. + */ + CreateFlags |= FILE_FLAG_POSIX_SEMANTICS; + FileAttributes |= FILE_ATTRIBUTE_DIRECTORY; + } + else + FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY; + + if (0 == FileAttributes) + FileAttributes = FILE_ATTRIBUTE_NORMAL; + + FileContext->Handle = CreateFileW(FullPath, + GrantedAccess, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, &SecurityAttributes, + CREATE_NEW, CreateFlags | FileAttributes, 0); + if (INVALID_HANDLE_VALUE == FileContext->Handle) + { + free(FileContext); + return FspNtStatusFromWin32(GetLastError()); + } + + *PFileContext = FileContext; + + return GetFileInfoInternal(FileContext->Handle, FileInfo); +} + +static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem, + PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess, + PVOID *PFileContext, FSP_FSCTL_FILE_INFO *FileInfo) +{ + PTFS *Ptfs = (PTFS *)FileSystem->UserContext; + WCHAR FullPath[FULLPATH_SIZE]; + ULONG CreateFlags; + PTFS_FILE_CONTEXT *FileContext; + + if (!ConcatPath(Ptfs, FileName, FullPath)) + return STATUS_OBJECT_NAME_INVALID; + + FileContext = malloc(sizeof *FileContext); + if (0 == FileContext) + return STATUS_INSUFFICIENT_RESOURCES; + memset(FileContext, 0, sizeof *FileContext); + + CreateFlags = FILE_FLAG_BACKUP_SEMANTICS; + if (CreateOptions & FILE_DELETE_ON_CLOSE) + CreateFlags |= FILE_FLAG_DELETE_ON_CLOSE; + + FileContext->Handle = CreateFileW(FullPath, + GrantedAccess, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, + OPEN_EXISTING, CreateFlags, 0); + if (INVALID_HANDLE_VALUE == FileContext->Handle) + { + free(FileContext); + return FspNtStatusFromWin32(GetLastError()); + } + + *PFileContext = FileContext; + + return GetFileInfoInternal(FileContext->Handle, FileInfo); +} + +static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + HANDLE Handle = HandleFromContext(FileContext); + FILE_BASIC_INFO BasicInfo = { 0 }; + FILE_ALLOCATION_INFO AllocationInfo = { 0 }; + FILE_ATTRIBUTE_TAG_INFO AttributeTagInfo; + + if (ReplaceFileAttributes) + { + if (0 == FileAttributes) + FileAttributes = FILE_ATTRIBUTE_NORMAL; + + BasicInfo.FileAttributes = FileAttributes; + if (!SetFileInformationByHandle(Handle, + FileBasicInfo, &BasicInfo, sizeof BasicInfo)) + return FspNtStatusFromWin32(GetLastError()); + } + else if (0 != FileAttributes) + { + if (!GetFileInformationByHandleEx(Handle, + FileAttributeTagInfo, &AttributeTagInfo, sizeof AttributeTagInfo)) + return FspNtStatusFromWin32(GetLastError()); + + BasicInfo.FileAttributes = FileAttributes | AttributeTagInfo.FileAttributes; + if (BasicInfo.FileAttributes ^ FileAttributes) + { + if (!SetFileInformationByHandle(Handle, + FileBasicInfo, &BasicInfo, sizeof BasicInfo)) + return FspNtStatusFromWin32(GetLastError()); + } + } + + if (!SetFileInformationByHandle(Handle, + FileAllocationInfo, &AllocationInfo, sizeof AllocationInfo)) + return FspNtStatusFromWin32(GetLastError()); + + return GetFileInfoInternal(Handle, FileInfo); +} + +static VOID Cleanup(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PWSTR FileName, ULONG Flags) +{ + HANDLE Handle = HandleFromContext(FileContext); + + if (Flags & FspCleanupDelete) + { + CloseHandle(Handle); + + /* this will make all future uses of Handle to fail with STATUS_INVALID_HANDLE */ + HandleFromContext(FileContext) = INVALID_HANDLE_VALUE; + } +} + +static VOID Close(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext0) +{ + PTFS_FILE_CONTEXT *FileContext = FileContext0; + HANDLE Handle = HandleFromContext(FileContext); + + CloseHandle(Handle); + + FspFileSystemDeleteDirectoryBuffer(&FileContext->DirBuffer); + free(FileContext); +} + +static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PVOID Buffer, UINT64 Offset, ULONG Length, + PULONG PBytesTransferred) +{ + HANDLE Handle = HandleFromContext(FileContext); + OVERLAPPED Overlapped = { 0 }; + + Overlapped.Offset = (DWORD)Offset; + Overlapped.OffsetHigh = (DWORD)(Offset >> 32); + + if (!ReadFile(Handle, Buffer, Length, PBytesTransferred, &Overlapped)) + return FspNtStatusFromWin32(GetLastError()); + + return STATUS_SUCCESS; +} + +static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PVOID Buffer, UINT64 Offset, ULONG Length, + BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo, + PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo) +{ + HANDLE Handle = HandleFromContext(FileContext); + LARGE_INTEGER FileSize; + OVERLAPPED Overlapped = { 0 }; + + if (ConstrainedIo) + { + if (!GetFileSizeEx(Handle, &FileSize)) + return FspNtStatusFromWin32(GetLastError()); + + if (Offset >= (UINT64)FileSize.QuadPart) + return STATUS_SUCCESS; + if (Offset + Length > (UINT64)FileSize.QuadPart) + Length = (ULONG)((UINT64)FileSize.QuadPart - Offset); + } + + Overlapped.Offset = (DWORD)Offset; + Overlapped.OffsetHigh = (DWORD)(Offset >> 32); + + if (!WriteFile(Handle, Buffer, Length, PBytesTransferred, &Overlapped)) + return FspNtStatusFromWin32(GetLastError()); + + return GetFileInfoInternal(Handle, FileInfo); +} + +NTSTATUS Flush(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + HANDLE Handle = HandleFromContext(FileContext); + + /* we do not flush the whole volume, so just return SUCCESS */ + if (0 == Handle) + return STATUS_SUCCESS; + + if (!FlushFileBuffers(Handle)) + return FspNtStatusFromWin32(GetLastError()); + + return GetFileInfoInternal(Handle, FileInfo); +} + +static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + HANDLE Handle = HandleFromContext(FileContext); + + return GetFileInfoInternal(Handle, FileInfo); +} + +static NTSTATUS SetBasicInfo(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, UINT32 FileAttributes, + UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + HANDLE Handle = HandleFromContext(FileContext); + FILE_BASIC_INFO BasicInfo = { 0 }; + + if (INVALID_FILE_ATTRIBUTES == FileAttributes) + FileAttributes = 0; + else if (0 == FileAttributes) + FileAttributes = FILE_ATTRIBUTE_NORMAL; + + BasicInfo.FileAttributes = FileAttributes; + BasicInfo.CreationTime.QuadPart = CreationTime; + BasicInfo.LastAccessTime.QuadPart = LastAccessTime; + BasicInfo.LastWriteTime.QuadPart = LastWriteTime; + //BasicInfo.ChangeTime = ChangeTime; + + if (!SetFileInformationByHandle(Handle, + FileBasicInfo, &BasicInfo, sizeof BasicInfo)) + return FspNtStatusFromWin32(GetLastError()); + + return GetFileInfoInternal(Handle, FileInfo); +} + +static NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, UINT64 NewSize, BOOLEAN SetAllocationSize, + FSP_FSCTL_FILE_INFO *FileInfo) +{ + HANDLE Handle = HandleFromContext(FileContext); + FILE_ALLOCATION_INFO AllocationInfo; + FILE_END_OF_FILE_INFO EndOfFileInfo; + + if (SetAllocationSize) + { + /* + * This file system does not maintain AllocationSize, although NTFS clearly can. + * However it must always be FileSize <= AllocationSize and NTFS will make sure + * to truncate the FileSize if it sees an AllocationSize < FileSize. + * + * If OTOH a very large AllocationSize is passed, the call below will increase + * the AllocationSize of the underlying file, although our file system does not + * expose this fact. This AllocationSize is only temporary as NTFS will reset + * the AllocationSize of the underlying file when it is closed. + */ + + AllocationInfo.AllocationSize.QuadPart = NewSize; + + if (!SetFileInformationByHandle(Handle, + FileAllocationInfo, &AllocationInfo, sizeof AllocationInfo)) + return FspNtStatusFromWin32(GetLastError()); + } + else + { + EndOfFileInfo.EndOfFile.QuadPart = NewSize; + + if (!SetFileInformationByHandle(Handle, + FileEndOfFileInfo, &EndOfFileInfo, sizeof EndOfFileInfo)) + return FspNtStatusFromWin32(GetLastError()); + } + + return GetFileInfoInternal(Handle, FileInfo); +} + +static NTSTATUS Rename(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + PWSTR FileName, PWSTR NewFileName, BOOLEAN ReplaceIfExists) +{ + PTFS *Ptfs = (PTFS *)FileSystem->UserContext; + WCHAR FullPath[FULLPATH_SIZE], NewFullPath[FULLPATH_SIZE]; + + if (!ConcatPath(Ptfs, FileName, FullPath)) + return STATUS_OBJECT_NAME_INVALID; + + if (!ConcatPath(Ptfs, NewFileName, NewFullPath)) + return STATUS_OBJECT_NAME_INVALID; + + if (!MoveFileExW(FullPath, NewFullPath, ReplaceIfExists ? MOVEFILE_REPLACE_EXISTING : 0)) + return FspNtStatusFromWin32(GetLastError()); + + return STATUS_SUCCESS; +} + +static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) +{ + HANDLE Handle = HandleFromContext(FileContext); + DWORD SecurityDescriptorSizeNeeded; + + if (!GetKernelObjectSecurity(Handle, + OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, + SecurityDescriptor, (DWORD)*PSecurityDescriptorSize, &SecurityDescriptorSizeNeeded)) + { + *PSecurityDescriptorSize = SecurityDescriptorSizeNeeded; + return FspNtStatusFromWin32(GetLastError()); + } + + *PSecurityDescriptorSize = SecurityDescriptorSizeNeeded; + + return STATUS_SUCCESS; +} + +static NTSTATUS SetSecurity(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, + SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor) +{ + HANDLE Handle = HandleFromContext(FileContext); + + if (!SetKernelObjectSecurity(Handle, SecurityInformation, ModificationDescriptor)) + return FspNtStatusFromWin32(GetLastError()); + + return STATUS_SUCCESS; +} + +static NTSTATUS ReadDirectory(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext0, PWSTR Pattern, PWSTR Marker, + PVOID Buffer, ULONG BufferLength, PULONG PBytesTransferred) +{ + PTFS *Ptfs = (PTFS *)FileSystem->UserContext; + PTFS_FILE_CONTEXT *FileContext = FileContext0; + HANDLE Handle = HandleFromContext(FileContext); + WCHAR FullPath[FULLPATH_SIZE]; + ULONG Length, PatternLength; + HANDLE FindHandle; + WIN32_FIND_DATAW FindData; + union + { + UINT8 B[FIELD_OFFSET(FSP_FSCTL_DIR_INFO, FileNameBuf) + MAX_PATH * sizeof(WCHAR)]; + FSP_FSCTL_DIR_INFO D; + } DirInfoBuf; + FSP_FSCTL_DIR_INFO *DirInfo = &DirInfoBuf.D; + NTSTATUS DirBufferResult; + + DirBufferResult = STATUS_SUCCESS; + if (FspFileSystemAcquireDirectoryBuffer(&FileContext->DirBuffer, 0 == Marker, &DirBufferResult)) + { + if (0 == Pattern) + Pattern = L"*"; + PatternLength = (ULONG)wcslen(Pattern); + + Length = GetFinalPathNameByHandleW(Handle, FullPath, FULLPATH_SIZE - 1, 0); + if (0 == Length) + DirBufferResult = FspNtStatusFromWin32(GetLastError()); + else if (Length + 1 + PatternLength >= FULLPATH_SIZE) + DirBufferResult = STATUS_OBJECT_NAME_INVALID; + if (!NT_SUCCESS(DirBufferResult)) + { + FspFileSystemReleaseDirectoryBuffer(&FileContext->DirBuffer); + return DirBufferResult; + } + + if (L'\\' != FullPath[Length - 1]) + FullPath[Length++] = L'\\'; + memcpy(FullPath + Length, Pattern, PatternLength * sizeof(WCHAR)); + FullPath[Length + PatternLength] = L'\0'; + + FindHandle = FindFirstFileW(FullPath, &FindData); + if (INVALID_HANDLE_VALUE != FindHandle) + { + do + { + memset(DirInfo, 0, sizeof *DirInfo); + Length = (ULONG)wcslen(FindData.cFileName); + DirInfo->Size = (UINT16)(FIELD_OFFSET(FSP_FSCTL_DIR_INFO, FileNameBuf) + Length * sizeof(WCHAR)); + DirInfo->FileInfo.FileAttributes = FindData.dwFileAttributes; + DirInfo->FileInfo.ReparseTag = 0; + DirInfo->FileInfo.FileSize = + ((UINT64)FindData.nFileSizeHigh << 32) | (UINT64)FindData.nFileSizeLow; + DirInfo->FileInfo.AllocationSize = (DirInfo->FileInfo.FileSize + ALLOCATION_UNIT - 1) + / ALLOCATION_UNIT * ALLOCATION_UNIT; + DirInfo->FileInfo.CreationTime = ((PLARGE_INTEGER)&FindData.ftCreationTime)->QuadPart; + DirInfo->FileInfo.LastAccessTime = ((PLARGE_INTEGER)&FindData.ftLastAccessTime)->QuadPart; + DirInfo->FileInfo.LastWriteTime = ((PLARGE_INTEGER)&FindData.ftLastWriteTime)->QuadPart; + DirInfo->FileInfo.ChangeTime = DirInfo->FileInfo.LastWriteTime; + DirInfo->FileInfo.IndexNumber = 0; + DirInfo->FileInfo.HardLinks = 0; + memcpy(DirInfo->FileNameBuf, FindData.cFileName, Length * sizeof(WCHAR)); + + if (!FspFileSystemFillDirectoryBuffer(&FileContext->DirBuffer, DirInfo, &DirBufferResult)) + break; + } while (FindNextFileW(FindHandle, &FindData)); + + FindClose(FindHandle); + } + + FspFileSystemReleaseDirectoryBuffer(&FileContext->DirBuffer); + } + + if (!NT_SUCCESS(DirBufferResult)) + return DirBufferResult; + + FspFileSystemReadDirectoryBuffer(&FileContext->DirBuffer, + Marker, Buffer, BufferLength, PBytesTransferred); + + return STATUS_SUCCESS; +} + +static NTSTATUS SetDelete(FSP_FILE_SYSTEM *FileSystem, + PVOID FileContext, PWSTR FileName, BOOLEAN DeleteFile) +{ + HANDLE Handle = HandleFromContext(FileContext); + FILE_DISPOSITION_INFO DispositionInfo; + + DispositionInfo.DeleteFile = DeleteFile; + + if (!SetFileInformationByHandle(Handle, + FileDispositionInfo, &DispositionInfo, sizeof DispositionInfo)) + return FspNtStatusFromWin32(GetLastError()); + + return STATUS_SUCCESS; +} + +static FSP_FILE_SYSTEM_INTERFACE PtfsInterface = +{ + .GetVolumeInfo = GetVolumeInfo, + .SetVolumeLabel = SetVolumeLabel_, + .GetSecurityByName = GetSecurityByName, + .Create = Create, + .Open = Open, + .Overwrite = Overwrite, + .Cleanup = Cleanup, + .Close = Close, + .Read = Read, + .Write = Write, + .Flush = Flush, + .GetFileInfo = GetFileInfo, + .SetBasicInfo = SetBasicInfo, + .SetFileSize = SetFileSize, + .Rename = Rename, + .GetSecurity = GetSecurity, + .SetSecurity = SetSecurity, + .ReadDirectory = ReadDirectory, + .SetDelete = SetDelete, +}; + +static VOID PtfsDelete(PTFS *Ptfs); + +static NTSTATUS PtfsCreate(PWSTR Path, PWSTR VolumePrefix, PWSTR MountPoint, UINT32 DebugFlags, + PTFS **PPtfs) +{ + WCHAR FullPath[MAX_PATH]; + ULONG Length; + HANDLE Handle; + FILETIME CreationTime; + DWORD LastError; + FSP_FSCTL_VOLUME_PARAMS VolumeParams; + PTFS *Ptfs = 0; + NTSTATUS Result; + + *PPtfs = 0; + + Handle = CreateFileW( + Path, FILE_READ_ATTRIBUTES, 0, 0, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + if (INVALID_HANDLE_VALUE == Handle) + return FspNtStatusFromWin32(GetLastError()); + + Length = GetFinalPathNameByHandleW(Handle, FullPath, FULLPATH_SIZE - 1, 0); + if (0 == Length) + { + LastError = GetLastError(); + CloseHandle(Handle); + return FspNtStatusFromWin32(LastError); + } + if (L'\\' == FullPath[Length - 1]) + FullPath[--Length] = L'\0'; + + if (!GetFileTime(Handle, &CreationTime, 0, 0)) + { + LastError = GetLastError(); + CloseHandle(Handle); + return FspNtStatusFromWin32(LastError); + } + + CloseHandle(Handle); + + /* from now on we must goto exit on failure */ + + Ptfs = malloc(sizeof *Ptfs); + if (0 == Ptfs) + { + Result = STATUS_INSUFFICIENT_RESOURCES; + goto exit; + } + memset(Ptfs, 0, sizeof *Ptfs); + + Length = (Length + 1) * sizeof(WCHAR); + Ptfs->Path = malloc(Length); + if (0 == Ptfs->Path) + { + Result = STATUS_INSUFFICIENT_RESOURCES; + goto exit; + } + memcpy(Ptfs->Path, FullPath, Length); + + memset(&VolumeParams, 0, sizeof VolumeParams); + VolumeParams.SectorSize = ALLOCATION_UNIT; + VolumeParams.SectorsPerAllocationUnit = 1; + VolumeParams.VolumeCreationTime = ((PLARGE_INTEGER)&CreationTime)->QuadPart; + VolumeParams.VolumeSerialNumber = 0; + VolumeParams.FileInfoTimeout = 1000; + VolumeParams.CaseSensitiveSearch = 0; + VolumeParams.CasePreservedNames = 1; + VolumeParams.UnicodeOnDisk = 1; + VolumeParams.PersistentAcls = 1; + VolumeParams.PostCleanupWhenModifiedOnly = 1; + VolumeParams.PassQueryDirectoryPattern = 1; + VolumeParams.FlushAndPurgeOnCleanup = 1; + VolumeParams.UmFileContextIsUserContext2 = 1; + if (0 != VolumePrefix) + wcscpy_s(VolumeParams.Prefix, sizeof VolumeParams.Prefix / sizeof(WCHAR), VolumePrefix); + wcscpy_s(VolumeParams.FileSystemName, sizeof VolumeParams.FileSystemName / sizeof(WCHAR), + L"" PROGNAME); + + Result = FspFileSystemCreate( + VolumeParams.Prefix[0] ? L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME, + &VolumeParams, + &PtfsInterface, + &Ptfs->FileSystem); + if (!NT_SUCCESS(Result)) + goto exit; + Ptfs->FileSystem->UserContext = Ptfs; + + Result = FspFileSystemSetMountPoint(Ptfs->FileSystem, MountPoint); + if (!NT_SUCCESS(Result)) + goto exit; + + FspFileSystemSetDebugLog(Ptfs->FileSystem, DebugFlags); + + Result = STATUS_SUCCESS; + +exit: + if (NT_SUCCESS(Result)) + *PPtfs = Ptfs; + else if (0 != Ptfs) + PtfsDelete(Ptfs); + + return Result; +} + +static VOID PtfsDelete(PTFS *Ptfs) +{ + if (0 != Ptfs->FileSystem) + FspFileSystemDelete(Ptfs->FileSystem); + + if (0 != Ptfs->Path) + free(Ptfs->Path); + + free(Ptfs); +} + +static NTSTATUS EnableBackupRestorePrivileges(VOID) +{ + union + { + TOKEN_PRIVILEGES P; + UINT8 B[sizeof(TOKEN_PRIVILEGES) + sizeof(LUID_AND_ATTRIBUTES)]; + } Privileges; + HANDLE Token; + + Privileges.P.PrivilegeCount = 2; + Privileges.P.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + Privileges.P.Privileges[1].Attributes = SE_PRIVILEGE_ENABLED; + + if (!LookupPrivilegeValueW(0, SE_BACKUP_NAME, &Privileges.P.Privileges[0].Luid) || + !LookupPrivilegeValueW(0, SE_RESTORE_NAME, &Privileges.P.Privileges[1].Luid)) + return FspNtStatusFromWin32(GetLastError()); + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &Token)) + return FspNtStatusFromWin32(GetLastError()); + + if (!AdjustTokenPrivileges(Token, FALSE, &Privileges.P, 0, 0, 0)) + { + CloseHandle(Token); + + return FspNtStatusFromWin32(GetLastError()); + } + + CloseHandle(Token); + + return STATUS_SUCCESS; +} + +static ULONG wcstol_deflt(wchar_t *w, ULONG deflt) +{ + wchar_t *endp; + ULONG ul = wcstol(w, &endp, 0); + return L'\0' != w[0] && L'\0' == *endp ? ul : deflt; +} + +static NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) +{ +#define argtos(v) if (arge > ++argp) v = *argp; else goto usage +#define argtol(v) if (arge > ++argp) v = wcstol_deflt(*argp, v); else goto usage + + wchar_t **argp, **arge; + PWSTR DebugLogFile = 0; + ULONG DebugFlags = 0; + PWSTR VolumePrefix = 0; + PWSTR PassThrough = 0; + PWSTR MountPoint = 0; + HANDLE DebugLogHandle = INVALID_HANDLE_VALUE; + WCHAR PassThroughBuf[MAX_PATH]; + PTFS *Ptfs = 0; + NTSTATUS Result; + + for (argp = argv + 1, arge = argv + argc; arge > argp; argp++) + { + if (L'-' != argp[0][0]) + break; + switch (argp[0][1]) + { + case L'?': + goto usage; + case L'd': + argtol(DebugFlags); + break; + case L'D': + argtos(DebugLogFile); + break; + case L'm': + argtos(MountPoint); + break; + case L'p': + argtos(PassThrough); + break; + case L'u': + argtos(VolumePrefix); + break; + default: + goto usage; + } + } + + if (arge > argp) + goto usage; + + if (0 == PassThrough && 0 != VolumePrefix) + { + PWSTR P; + + P = wcschr(VolumePrefix, L'\\'); + if (0 != P && L'\\' != P[1]) + { + P = wcschr(P + 1, L'\\'); + if (0 != P && + ( + (L'A' <= P[1] && P[1] <= L'Z') || + (L'a' <= P[1] && P[1] <= L'z') + ) && + L'$' == P[2]) + { + StringCbPrintf(PassThroughBuf, sizeof PassThroughBuf, L"%c:%s", P[1], P + 3); + PassThrough = PassThroughBuf; + } + } + } + + if (0 == PassThrough || 0 == MountPoint) + goto usage; + + EnableBackupRestorePrivileges(); + + if (0 != DebugLogFile) + { + if (0 == wcscmp(L"-", DebugLogFile)) + DebugLogHandle = GetStdHandle(STD_ERROR_HANDLE); + else + DebugLogHandle = CreateFileW( + DebugLogFile, + FILE_APPEND_DATA, + FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, + OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + 0); + if (INVALID_HANDLE_VALUE == DebugLogHandle) + { + fail(L"cannot open debug log file"); + goto usage; + } + + FspDebugLogSetHandle(DebugLogHandle); + } + + Result = PtfsCreate(PassThrough, VolumePrefix, MountPoint, DebugFlags, &Ptfs); + if (!NT_SUCCESS(Result)) + { + fail(L"cannot create file system"); + goto exit; + } + + Result = FspFileSystemStartDispatcher(Ptfs->FileSystem, 0); + if (!NT_SUCCESS(Result)) + { + fail(L"cannot start file system"); + goto exit; + } + + MountPoint = FspFileSystemMountPoint(Ptfs->FileSystem); + + info(L"%s%s%s -p %s -m %s", + L"" PROGNAME, + 0 != VolumePrefix && L'\0' != VolumePrefix[0] ? L" -u " : L"", + 0 != VolumePrefix && L'\0' != VolumePrefix[0] ? VolumePrefix : L"", + PassThrough, + MountPoint); + + Service->UserContext = Ptfs; + Result = STATUS_SUCCESS; + +exit: + if (!NT_SUCCESS(Result) && 0 != Ptfs) + PtfsDelete(Ptfs); + + return Result; + +usage: + static wchar_t usage[] = L"" + "usage: %s OPTIONS\n" + "\n" + "options:\n" + " -d DebugFlags [-1: enable all debug logs]\n" + " -D DebugLogFile [file path; use - for stderr]\n" + " -u \\Server\\Share [UNC prefix (single backslash)]\n" + " -p Directory [directory to expose as pass through file system]\n" + " -m MountPoint [X:|*|directory]\n"; + + fail(usage, L"" PROGNAME); + + return STATUS_UNSUCCESSFUL; + +#undef argtos +#undef argtol +} + +static NTSTATUS SvcStop(FSP_SERVICE *Service) +{ + PTFS *Ptfs = Service->UserContext; + + FspFileSystemStopDispatcher(Ptfs->FileSystem); + PtfsDelete(Ptfs); + + return STATUS_SUCCESS; +} + +int wmain(int argc, wchar_t **argv) +{ + if (!NT_SUCCESS(FspLoad(0))) + return ERROR_DELAY_LOAD_FAILED; + + return FspServiceRun(L"" PROGNAME, SvcStart, SvcStop, 0); +} diff --git a/3rd_party/winfsp-1.10/samples/passthrough/passthrough.sln b/3rd_party/winfsp-1.10/samples/passthrough/passthrough.sln new file mode 100644 index 00000000..fbea6c04 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough/passthrough.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "passthrough", "passthrough.vcxproj", "{9E0E5997-7316-4818-A130-00B3AF1AD354}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9E0E5997-7316-4818-A130-00B3AF1AD354}.Debug|x64.ActiveCfg = Debug|x64 + {9E0E5997-7316-4818-A130-00B3AF1AD354}.Debug|x64.Build.0 = Debug|x64 + {9E0E5997-7316-4818-A130-00B3AF1AD354}.Debug|x86.ActiveCfg = Debug|Win32 + {9E0E5997-7316-4818-A130-00B3AF1AD354}.Debug|x86.Build.0 = Debug|Win32 + {9E0E5997-7316-4818-A130-00B3AF1AD354}.Release|x64.ActiveCfg = Release|x64 + {9E0E5997-7316-4818-A130-00B3AF1AD354}.Release|x64.Build.0 = Release|x64 + {9E0E5997-7316-4818-A130-00B3AF1AD354}.Release|x86.ActiveCfg = Release|Win32 + {9E0E5997-7316-4818-A130-00B3AF1AD354}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3rd_party/winfsp-1.10/samples/passthrough/passthrough.vcxproj b/3rd_party/winfsp-1.10/samples/passthrough/passthrough.vcxproj new file mode 100644 index 00000000..bb497572 --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough/passthrough.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + {9E0E5997-7316-4818-A130-00B3AF1AD354} + Win32Proj + passthrough + $(LatestTargetPlatformVersion) + + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + Application + true + $(DefaultPlatformToolset) + Unicode + + + Application + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + true + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + false + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + $(ProjectName)-$(PlatformTarget) + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + + + Console + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(MSBuildProgramFiles32)\WinFsp\inc + MultiThreaded + + + Console + true + true + true + $(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies) + winfsp-$(PlatformTarget).dll + + + + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/samples/passthrough/passthrough.vcxproj.filters b/3rd_party/winfsp-1.10/samples/passthrough/passthrough.vcxproj.filters new file mode 100644 index 00000000..f9e6e47e --- /dev/null +++ b/3rd_party/winfsp-1.10/samples/passthrough/passthrough.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source + + + \ No newline at end of file diff --git a/3rd_party/winfsp-1.10/sym/fsptool-x64.pdb b/3rd_party/winfsp-1.10/sym/fsptool-x64.pdb new file mode 100644 index 0000000000000000000000000000000000000000..16631b7aa3a12f725521466b4ced85c16c5e201f GIT binary patch literal 77824 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 literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/sym/launchctl-x64.pdb b/3rd_party/winfsp-1.10/sym/launchctl-x64.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ee073f1ee3849fb1f2696f27e8860524c99fccc5 GIT binary patch literal 77824 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 W0U;m+gn$qb0zyCt2!a2<1bzo#LE#Yq literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/sym/launchctl-x86.pdb b/3rd_party/winfsp-1.10/sym/launchctl-x86.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e2dd46d695b4aa878ab1f5a1d0312a8d9d8e7fa2 GIT binary patch literal 86016 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 literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/sym/launcher-x64.pdb b/3rd_party/winfsp-1.10/sym/launcher-x64.pdb new file mode 100644 index 0000000000000000000000000000000000000000..8aa1c0c193edb44264481402d206096dce4d583b GIT binary patch literal 94208 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 literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/sym/launcher-x86.pdb b/3rd_party/winfsp-1.10/sym/launcher-x86.pdb new file mode 100644 index 0000000000000000000000000000000000000000..0f02455b447ab5ec24a52f01e6f21d11b992c3ec GIT binary patch literal 102400 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 TVZbn87%&VN1`GqAat8hnt6p%y literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/sym/memfs-x64.pdb b/3rd_party/winfsp-1.10/sym/memfs-x64.pdb new file mode 100644 index 0000000000000000000000000000000000000000..bb7b7c343c19d69d238ab1057d8e9fae18d74270 GIT binary patch literal 479232 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 Z87MMPWT41Ek%1xuMFxrt{2$D~{{mIiABO+{ literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/sym/memfs-x86.pdb b/3rd_party/winfsp-1.10/sym/memfs-x86.pdb new file mode 100644 index 0000000000000000000000000000000000000000..dd1865ecd694f88c69aeda3ebd526b0bb4b21ac0 GIT binary patch literal 536576 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 literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/sym/winfsp-x86.sys.pdb b/3rd_party/winfsp-1.10/sym/winfsp-x86.sys.pdb new file mode 100644 index 0000000000000000000000000000000000000000..6b849569bc748486b4b3ab1db7fe758c8ed24b8d GIT binary patch literal 372736 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

    F9uRjs)Tfoscnh$pvxbGNTDkoj`iEv zJng*+ggXITTL_N6YY>Lp8G$P}+iQnlc{c!89#Y=M2;2`Ma1J)jZw|?GGjL-exY^ij z9){Z)fh)uQt}8F&6To#KBsmM> z=o=H8LU0qnQG7~=6(Grkliu z(Xe!%L`K>U!93}HtJ09V3#SVdIB?h^k~baQ z`$xXxeC3s*5!QsH8wZYko4Msp09O%`ZaNb6hLo29E{wi0;KJzJ1Kf&`@(MqJHN+6y z7;s3MmoIyOYYxE`ppvT$E?3Snz|kI@d~GxaTqq5|-58RNzJ(RmMlp2qo{)57z>yBf zSC>6NnE81gSvm$>w@H^vUjmz~ibHVSz&#m)qi@b!7J@4UZhr{w4d5;b!G-N-H+ljC z+t(x=y0`lf?hXvH^$1DkgSfv0Zb1m{7;v}SI-d5nW9|dVR4P3r+Jw!WwtM@CCCse-s5RSf|bS^@oFNk{_ICSg0xIMsqJ_I-E zrc34I`B4bcO(E&3f$Iywg`HC*8h(y+Dlae*+=p;yfV&wX(HF$gJ-s6#xWmBFJ;BtE zg6WQ5?l|8w>2h&l=ZH-`F>usLc`()7hj5ppvn#KIxW&M&M;xLdh?@XT^;r;i9Jn%* zE|rsxzC9if$&dnz|q~!t;n0&9nIxFrk=ok#NhnvBZLcEXCU0CFgS$OlfKIt zhPxsHH$MUw2QHt_nd%beV<+6-!v7vt7y5p++O$v$?nCKLN2L3G1TJiyj`9rie-SRs zw@J7JI_511sr|@y(1&pJ9gr~GByeXV4yA+2cOObecMGQw5{`7NK7?Be1*z$RxMtw` z5hs{V`#0&8cxmax7c@hJgrncXa5EGaE1g)3|Mj7CvjCdzaz!8{Tww%mb_5P)WN4mb zmxh%Wi@+5t4m8kQNFS;v$(H76>kz_0wT9x*HA8V|hEUw12psV@tS<2gTp|Kj8-c5j zz>)lg)ulNCw=x3P5`k-rz;#C8x+8GC5x7hQZYTmr_E#8RHb&q^BXFA|a9bj9TO)8| z5x8v;xa|?R9TB+k2;9yH+^z`R?g-qT2;ANX+`b6h{s`Pe1nxit?qCG&Pz3I91nx)# z?q~$=SOo5P1nxux?qme+jR@Ri1nyJ>?sNq1Oa#us;8_4XjekKsPxGcQ9DR>23`h5F zgy9M!aI+(DMG?3;5x7_ct~dfWF9KH*fx|Y)P}*sKWEfxQ+-n$aaRe?NflEZ-u)Q&~ zJhJn{>XM4U(SG-^bSoopbO&Epy0!>hX9TW00@oXX%S7OYB5)%SxQ!9G(Fok;2;7zk z+|~%(SOjic1a5l-Zbt-eJOZ~f0=Fvyw>tv2Cjz%O0=F*$w?6_m5rI1pfjbz1I~0LC z9DzF$fjb(3I~IXE9)UX%fjb$2dm{oj8G$<$fjb?6I}?GUNm-cgp)-kLIQn*I7>>S| z7>1*7aE9S#N8spN^?ftweBD~Z6BM&QaKaEl^viz9IH2wWlpR~vz= zkHDoOaLp08l@Yj>2wYnPt}_DH9f9kOz-1zELlL-<2;9a9+-L-Da|CWn1a4~tZY%<~ zEdsYa0=FXqHy(l88G+jsf!iH{+Y^D?8-d#wf!iN}n~1<2h`=3;z#WRf9ge^qiNGC= zz#WUg9go1Bh`^nUz`YTHn~cDniol(Yz@3S}kt029>?nx9&4|Fwiog{{;AThQiXw3I z?aDA3ViCCF2;95~TuB6uzPTAzm$C@lq6i#)8#64=cmysHfvb(c)komy9;UFmG)Lf8 zM&Mc^aBUH|&Inw01gQv` zcm!@|1a4OZZg&K3PXumn1a4mhZhr)BA_8|H0(a2D-2nfaK2X)pAqyAu$sLZs9Z?+C zbFf_NK9uKC#g&%EOI-}FNgY#MEEjhixW|w|95~ubpbzCaibcvogzz24?KM8a(Ra4P zaO1$mC>`>gi%=g*H=*f(!&WBuA>3i$<{+eW_}6_1_Xd8T->5FMH%cGEor=JniNFFpg93jy@dj|Fm5e_^Hw%;5e zib8N@z!4wwrK3yM$UaAOvZ_Os|i zdG4`r*iz;`ggYF8o3wC5i$0XD@J~GYXdjF|ge#4}r7Rq_+PM#<%S7PDB5->maEBvs zlM%SWSss1CdX`4uQW3aJ1a2$>x5vWe=z<8`q=h5-*2lEpIUapMTxkR@6@kk{;Km|w zdn_Ebthx`?^RR`ZePQ|#ZW6e82&umZaYg5P^qsGX5K_8D7Vf+NZl#68zwSfnMl2jy z>pq0r9)a6u;UIGEL+Or2;7(gObVc`}bVb;lrTT?*tUiQW6oFeAfg6dyZI8h1i@+U? zz@3i36=Bc}r7r@vG6FXef!iK|+ZTa58i6|}1I>OPozY-9S z#mPK!AHt0Rz;2T#wnw=S;l=@_09xC<3ZXuPI}9kIF}yTB@mWP6Bpmtf+Ysi%)q*IU z|53g4p>*{TxHiF!qAo$&J0o!2!0kldqo6&QZWanX%iu~Ui0ArHU5fB$3qnd~?*}8? zIR2aw98{_M7#xT@D!7?0hWRpr!ie@!v{A4fHYyJE%@3p-jlgXN4(xVDOAB+-ZL!h? z+ix7Wj7irvVcT^?LkyJ*!;xKXXh1!K>9$4S#(^s|<)w1c5i`QdD}`+uR$g3e+R;)! z4HTaqqM7!aUS{6-58>$dAwY0%A>qaW9R`=1t`Lmoz00|{QsC-C(v1SQ8jQ_Xmq`@* z+mLjVXrt1QbTJ6m*O70&JjrhT%McuWC*f8D_jiUbxwujoxjP|;RNh>~)rZm@!4E$`I}u-kxJRHg z@tL{2xIHD_-SxqAlfYe$yz`Y8gW@2al@GTIxDJEMtxMt6`2LfrOD+wEKj%2#56N?^ z)RUKBJ@3PQ;lBx?FNMLXCnV1a;PTybO8ksn=Qy~6%J9sds}U}PLnz;tJcGDG3^dwr zgSZml{)0&uYYXDS?wh6ZHeQczeO_MAx)HyJ;7WiCt7k267l?f3w8Kr_nS&s%6S$v? z{tV)7tnkj%2XUK$3#-dGa5TruCxZup3**@&aQW_+Cb=$6;QY~amZgjFt`Fh%RC{M8 zgSdhk^iSbS5I0(@=ZO60(J9Yy;06#94Z(DUNym9mbZZdz-DQx^kn#>d$!p&XrW zIXF{ZZe0pj;Jg|tMY=VZE_IvZ+$-tkAk>FwI1Jp!gl9oq*xl`vF1`wS$3%U%7p*Uf5R8x?m--CqhPuW2AtI)xZ}V<)bggAcc*s_ zGnnT%aH)`VlfXS5f*ZR_&;RAt^Ehx2wY+tS_c~5P2<{=^78;!Y8xX{o1HfrNqJFOr z;mZ0@7isq(ZWIF!kEywN79qngAw9`pFx|EYTp}(NX?=NO_lk**o7DtY;^1H-zN*UErXW^YZK@aI-?n zJ2i?ms}S78eR`%hw~Z!&gSlw>O0b^AUqSy1$@2%By)*8?beG?+XGwGAdK|d_5JF$- ztC;5)J)fKI=UZ?-9Gxwne9n0gG8mHXx^FlRRAJt9e*xT6A-LMHaNKWzYY$16g3=9> z!CM}291N>@>#_^D$q?N3Z|YqGxqLYQ+>8*~!@lW5I_vPapwmow{_p(|ZX62h#SmQE z_V9GYkHPOI@=}EK`cR&6DDoQ-Qu_sQ_W}o1pBHx$xZ6T-72kpWJS%^?iE+o7X>?sK zeSi1wATJ^HJh9VpUJ5DiuOKYwE_v%&3Z>f=f*S=6T{mw!=l_DAAq4lA5xC}EkU?qp zAV0s445x+Ax9{IO&Yy+g63^<~KDUh?`72NN1k3v_I`nu*o;N<{IKK|TmHgkHo)6}E zH*k-J@TG9C*EfUdz7O1J2w&p=(Q*EV$un0bO7~$NVCtEROTFMwGok%*ai@WMTgKF2 zUH%1~2wfs?yN~_Av+IKCCjL`6ZgRrIeFAywLw)T0A7QK#UI%e|{1HF;hj1+~JI=7wGl=`?PrbWLg1FiL z;N77S#H|4?j=V`n260aV_qh<<&w%@Q2=1SO`*sNKz9Zh<4Z-rh58Oydx~pID?yw1_ zTL#=MA?d=tBTD>qeg<30q)Yj}F-o{Sz|A$h&c%g&la|uWJF31s|MzN5p1^%f+OH6C z^&#B8S9$G)+98N5`gu4m?7P5}=OLtfM9TY9Ees*y?l|V%%MrxQ`i0lWg1GDc(fgKD z5Eu4sW-71tzj^mMoExaiF5sS)dIoWguc;34fA87w3^%C&RxUpY4&Od~t%lu039m!3X`De9Ja&cq--IKFf0ltKNihzvz4f>tuZMusd1DYadd3?Ag1EiF{lD$qaY$X)9S87x6Wf~9rM7dK?OghjT5D5l zt+lO9UHX#R%sRK(%%!eKCqYC?{*aIrS0uP1#TCh1$RAQdah(L|!U&zsBxG9%VThAV zIvH7z5}X7F(n^pb!I^!3@4fpX$NT;6?{(+m@#_1$bM866bMATX-Fx4A9b|h&|Gxd% zpl-f{u)mOe<*PyPYhs_keoCz2*6q2+-QHPPJIPlRgxTW^ZoW5QtRF7HULj>}#gpr| zhz-ELLF_c_C&YGa2vgTA#O+7BVXXh^H->?|uOcqr4!jV3mTd1e*guKw#slLYh^@eW zPi!MA1yZb9N!!Uc-oL^gKHgkhrwToRU;_V#PYrp22ZBu z!S&lqZV3atEJ@9~?)GlLJ|<#nix>SZ zB;O+J&dlSqyS*>Ag+V#VSNvcYENqOgOFj;=|Cr?KgyB$aY#U}^KhGG7&MsE3_Tn&m zKF+lPSo*n5W28tZ@2;`$l(O~>V+Y%l$@i#J=5<&fG4`E7 zR_3Y7Xx~h<+VR?GF>8J*3@{a@>bWxltj%7l!dy;l^y%AktDA31*aEB&Wm{a_d^yjA zneWS9Z(qRvLGn#Ki@wd+V^~Lvwc+*ZFnAwp+n#GHuvucCJ{Jc4sd2VG-y7K3e?juy zghh{=?)F-7;mAdjZ^sK^_B@xHkA0__weMUq%pL>;~+2#7@1)>oNnYCix0#xi!ElNxq}7dSc_Sy~H-Z6lR}C zZpVG1#bR9wv$e(AwK7;^#)_g$Slj)(VHSVO=h`r=gxG|zMOZ({*S#+c?#h_$htXnn z=@r&5?1ZqBuqZC>_J&~gy4Kq6+HYaoGUgsHn1oej%zaK2;Je16GTrA4TVT;^3#(JK z*xv_Xy;xgaTw~u~X7|gl3xi}PpF7X9@7l9`?Z{`Zhi!ZAJa`xuwcWJ=*jAG76zo1? zV2NunPZX4M5^;ul@*WVs5Yv;kJFJIk&<9Uf78REXt z5{-el?_M{v_X%Id+S<2vA2XZ49RD%gY*SPq)@D8UWn<5tYuFqVEoOGTY4ke4wQ*Pt z?i05?d+${gYj=BgO=(FcpKAwT6~x|wSsmiq@JCoQzqn;yhedOwYlXQyUs6~HYzL{! zyD(PIi?AqWZe3Pk<)q9q+}XxgT-y)8qPf5=vkf=cxK84l=SQ%P7VF!tHTFaVSex~) zF{^L1m<_Elx6DzPjc>bV{rM;p)|PKf*!jp%Pj`D4B14%aPMMd4jSHI;HYIFY*pGhSckAf!a9W=5!NNFTUd{*orVa0LbQ-9AUY_@`U9Jv+sRmbtx29BrGAUSXimBGGP_Ms)SVws}YtIRx7Md zSc9-eVNJrCg|!H471k!KL)alk`&2tVdX{us&h^!Ulw$5H=|6q_81j!@@>{ zofdXR*r>2EVdsTi5Ozt}xUflKQ^KZ&T@f}T?3%DSVe`Tkge?kN61FUCMVP%goIU2` z2+I|gCoErBfv`ehMZyxoiiMR5D-%{B%)XzQ#kyKpjj*J!T48m<8iX|pYZBHh%)XnN z#idnPo3IXHhlF(sJ0h%0Soa#+6`fqc+Rm@^tTFfeL$9#D$Z$Sq-T5(?ox4s}B-Wji z`Vf{NHUUeWkBiCoDa_7m$CbG#^5x*V|6(Ti`wUwIU(}R!r1mU+><_MYO!|9%onx|#_CcDvuhUO%B+Lg zb#ifb5N7A!PvZupt=hzfoc1qReYB*6&{k%e$BNQ3=ehFNhlxb+960Z7>$=w_$evJg&?U7>mn! z7>o5ZjE%F;U@R^KkxSler0Y>uph zvH4}cuof78V*9-lz}hzeV{!Qi#`)pHQWws%(8G>nbGSs2?NmW17TKc7E~gjK>&Y;4=>VQe3JUF3Tc#`@?T7~79V zM7}W?c8S<}UKTb7V{KT5u`yAAPG|j40%I}T4J#$}Y=_||whcW1R+p17w!KkdlQ8_m zZtpsP^+PV+z{uKA0b}!gldvvWg4AUY#_Dno#@a9qW8-WN#-0~^24l}BZo=4j*@6yY zbtx6L7sl$jU)Vtyeq#IYD1g;v5XPRjUV^bXYZk`(ee*YY|Luga_U#f@FYGlK+uu83 ztpB=Utp5gt4U6ra6ZtL+n}xBs+<>w9B?leEY%7e-1?9r_!Pt0d750`W^SH=&8pitX zB8<%ivm)OzjLj1dJji2K24ijC2V?bY5q21c>csAw12EQqAHdj{_z1?H7hHg`He7|V zG5?t;a|OoQejhpr(?M+e%3-VxyJ2kKtQTdr!`OV?Da!1Iu~;7y+xrm4+HekrpV+ov z1+actg0X(c-OjBD#`>XBV`Xhcfwaj^PQ6{b;ds zFGVocN2M?p>)pbdUxXoSX-<&b2uAg^oo3Kh)bdIQIO+LJBF10k{cQO$q)BmM^o3$d@_m;Z0DcBU? zBQ&st!7VKI*TpJ)ref;04cXhOuruK!IHqTg>gTJUTUTVd?RE^(p|tSi zAy~QS+Ra$scK?@;fRBKWfRBKWfRBKWfRBKWfRBKWz<-Ir-4joS)pj3y5o`%dIbK-g zV14TrUbOkeN5DtGN5DtGN5DtGN5DtGN5DtGN5DtGN5Dtme?9_Fq6Gyw2iu3W9S8W+ z-_q--VLdnykib8ddVUiG|N1u0Gvnms5u^d!wv2TR@(<$gVI+Kndyuf(kWS$LoXolp zC&umkbpuj24lA6*`UFmP_re!5_n$*K#YjuACETaZ?t?T5x4$i~eYWS^<3TY0EBv!& zvGeXIF0~CicJUn~yZ?8QzK8UEq(-DykoF_}0I3P-he!vIUPZE_9Vk9^9l_mL<84!^ z>rC)=nAG`vyp^axTZ(xXWBo`J`Z%8=01)MwG!^&AyQ)?bxKPa#zyJ&p7X z(z8g`f6pP=^$2#|!3#*=LbCJec0EB7X%Es~q!*EDkzPXDhlFlT#rS2c{o*6wBj6+8 zBj6+8Bj6+8Bj6+8Bj6+8Bk<*mz>mIsP4X@B5%3Z45%3Z45%3Z45%3Z45%3Z45%3Z4 K5%3XkBJdyh`G1c9 literal 0 HcmV?d00001 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..f2088128 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,20 @@ +# Changelog +## 2.0.0-rc +* \#5 S3 mounts should support encryption +* \#136: Simultaneous Skynet uploads not being tracked in portals +* \#131: Label 'centos7' amd64 build as generic 'linux' amd64 +* \#132: Switch to `XChaCha20-Poly1305` for Skynet encryption +* Added replay protection to remote mounts +* Support TUS uploads on Skynet (large upload support) +* Removed 1.1.x and 1.2.x releases +* Refactored build scripts +* Support remote FUSE base64 writes +* Switched to `XChaCha20-Poly1305` for remote mounts +* Updated `cURL` to v7.77.0 +* Updated `OpenSSL` to v1.1.1k +* Updated `libmicrohttpd` to v0.9.73 +* Fixed encrypted Skynet import +* Implemented chunked read and write +* Removed `repertory-ui` support +* Case refactoring +* Writes for non-cached files are performed in chunks of 8Mib diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..033bc5ae --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,508 @@ +cmake_minimum_required(VERSION 3.22) +project(repertory) + +include(CheckIncludeFiles) +include(CheckIncludeFileCXX) +include(ExternalProject) + +set(AWSCPP_VERSION 1.9.206) +set(BOOST_MAJOR_VERSION 1) +set(BOOST_MINOR_VERSION 78) +set(BOOST_MSVC_TOOLSET msvc-14.2) +set(BOOST_MSVC_TOOLSET_DLL 142) +set(BOOST_REVISION 0) +set(BOOST_VERSION ${BOOST_MAJOR_VERSION}.${BOOST_MINOR_VERSION}.${BOOST_REVISION}) +set(BOOST_VERSION_DL ${BOOST_MAJOR_VERSION}_${BOOST_MINOR_VERSION}_${BOOST_REVISION}) +set(BOOST_VERSION_DLL ${BOOST_MAJOR_VERSION}_${BOOST_MINOR_VERSION}) +set(CRYPTOPP_VERSION 8_2_0) +set(CURL_VERSION 7_81_0) +set(GTEST_VERSION 1.11.0) +set(LIBHTTPSERVER_VERSION 0.18.2) +set(LIBMICROHTTPD_VERSION 0.9.73) +set(LIBUUID_VERSION 1.6.2) +set(OPENSSL_VERSION 1_1_1m) +set(ROCKSDB_VERSION 6.27.3) +set(WINFSP_VERSION 1.10) +set(ZLIB_VERSION v1.2.11) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +option(REPERTORY_ENABLE_TESTING "Enable testing" ON) + +option(REPERTORY_ENABLE_S3 "Enable S3 mount support" OFF) +if (REPERTORY_ENABLE_S3) + add_definitions(-DREPERTORY_ENABLE_S3) + option(REPERTORY_ENABLE_S3_TESTING "Enable S3 unit tests" OFF) + if (REPERTORY_ENABLE_S3_TESTING) + add_definitions(-DREPERTORY_ENABLE_S3_TESTING) + endif () +endif () + +option(REPERTORY_ENABLE_SKYNET "Enable Skynet mount support" ON) +if (REPERTORY_ENABLE_SKYNET) + add_definitions(-DREPERTORY_ENABLE_SKYNET) + option(REPERTORY_ENABLE_SKYNET_PREMIUM_TESTS "Enable Skynet premium portal unit tests" OFF) + if (REPERTORY_ENABLE_SKYNET_PREMIUM_TESTS) + add_definitions(-DREPERTORY_ENABLE_SKYNET_PREMIUM_TESTS) + endif() +endif () + +set(REPERTORY_MAJOR 2) +set(REPERTORY_MINOR 0) +set(REPERTORY_REV 0) +set(REPERTORY_RELEASE_NUM 2000000) +set(REPERTORY_RELEASE_ITER rc) +set(REPERTORY_VERSION ${REPERTORY_MAJOR}.${REPERTORY_MINOR}.${REPERTORY_REV}-${REPERTORY_RELEASE_ITER}) + +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + set(IS_CLANG_COMPILER TRUE) +endif() + +if(UNIX AND NOT APPLE) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + set(FREEBSD TRUE) + else() + set(LINUX TRUE) + endif() +elseif(UNIX AND APPLE) + set(MACOS TRUE) + set(CMAKE_OSX_ARCHITECTURES x86_64) +endif() + +if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + message(FATAL_ERROR "32-bit compilation is not supported") +else() + if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)") + set(REPERTORY_UNIX_ARCH armv8-a) + set(IS_ARM64 TRUE) + add_definitions("-DIS_ARM64") + else() + set(REPERTORY_UNIX_ARCH x86-64) + endif() + + set(WINFSP_LIBRARY_BASENAME winfsp-x64) + set(REPERTORY_LIB_DIR lib64) +endif() + +if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/cacert.pem") + file(REMOVE ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/cacert.pem) +endif() +file(DOWNLOAD https://curl.haxx.se/ca/cacert.pem ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/cacert.pem) + +execute_process( + COMMAND git rev-parse --short HEAD + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + OUTPUT_VARIABLE REPERTORY_GIT_REV + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +if (NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) +endif() + +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(THREADS_PREFER_PTHREAD_FLAG ON) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif () +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(DEBUG_EXTRA d) + set(DEBUG_EXTRA2 -d) + set(DEBUG_EXTRA3 _d) + set(BOOST_DEBUG_EXTRA gd-) + set(CMAKE_BUILD_TYPE_LOWER debug) +else() + set(CMAKE_BUILD_TYPE_LOWER release) +endif() +string(TOLOWER "${CMAKE_GENERATOR}" CMAKE_GENERATOR_LOWER) + +set(EXTERNAL_BUILD_ROOT ${CMAKE_BINARY_DIR}/external) +set(EXTERNAL_BUILD_TYPE ${CMAKE_BUILD_TYPE}) + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/common.cpp.in ${CMAKE_CURRENT_SOURCE_DIR}/src/common.cpp @ONLY) + +link_directories( + ${EXTERNAL_BUILD_ROOT}/lib +) + +if (UNIX) + set(STATIC_LIB_EXT a) + + set(REPERTORY_C_FLAGS_LIST + ${REPERTORY_C_FLAGS_LIST} + -march=${REPERTORY_UNIX_ARCH} + -mtune=generic + -D_FILE_OFFSET_BITS=64 + ) + + set(REPERTORY_CXX_FLAGS_LIST + ${REPERTORY_CXX_FLAGS_LIST} + -march=${REPERTORY_UNIX_ARCH} + -mtune=generic + -D_FILE_OFFSET_BITS=64 + -std=c++${CMAKE_CXX_STANDARD} + ) + + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(REPERTORY_C_FLAGS_LIST + ${REPERTORY_C_FLAGS_LIST} + -g + -gdwarf-4 + -DDEBUG + -O0 + -fno-omit-frame-pointer + -D_DEBUG + -Wall + -Wextra + -Wpedantic + ) + + set(REPERTORY_CXX_FLAGS_LIST + ${REPERTORY_CXX_FLAGS_LIST} + -g + -gdwarf-4 + -DDEBUG + -O0 + -fno-omit-frame-pointer + -D_DEBUG + -Wall + -Wextra + -Wpedantic + ) + else () + set(REPERTORY_C_FLAGS_LIST + ${REPERTORY_C_FLAGS_LIST} + -O3 + -DNDEBUG + ) + + set(REPERTORY_CXX_FLAGS_LIST + ${REPERTORY_CXX_FLAGS_LIST} + -O3 + -DNDEBUG + ) + + if (NOT IS_CLANG_COMPILER) + set(REPERTORY_C_FLAGS_LIST + ${REPERTORY_C_FLAGS_LIST} + -s + ) + + set(REPERTORY_CXX_FLAGS_LIST + ${REPERTORY_CXX_FLAGS_LIST} + -s + ) + endif () + endif() +endif() + +if (LINUX) + execute_process(COMMAND /bin/bash ${CMAKE_CURRENT_SOURCE_DIR}/detect_linux_build.sh OUTPUT_VARIABLE LINUX_DISTRO) + string(REGEX REPLACE "\n$" "" LINUX_DISTRO "${LINUX_DISTRO}") + if (LINUX_DISTRO STREQUAL "debian9") + set(IS_DEBIAN9_DISTRO TRUE) + add_definitions("-DIS_DEBIAN9_DISTRO") + endif() + + set(ENV{PKG_CONFIG_PATH} "${EXTERNAL_BUILD_ROOT}/lib/pkgconfig:${EXTERNAL_BUILD_ROOT}/${REPERTORY_LIB_DIR}/pkgconfig:$ENV{PKG_CONFIG_PATH}") + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBFUSE REQUIRED fuse>=2.9.0) + + set(Boost_USE_STATIC_LIBS ON) + + include_directories(/usr/local/include) + + if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.5) + message(FATAL_ERROR "Require at least gcc-5.5") + endif() + + link_directories( + ${EXTERNAL_BUILD_ROOT}/${REPERTORY_LIB_DIR} + /usr/local/lib + /usr/local/${REPERTORY_LIB_DIR} + ) + set(REPERTORY_LINK_LIBRARIES + dl + pthread + ) +elseif (FREEBSD) + message(FATAL_ERROR "FreeBSD is no longer supported") +elseif (MACOS) + add_definitions("-DBOOST_ASIO_HAS_STD_STRING_VIEW") + include_directories(/usr/local/include) + find_library(OSXFUSE NAMES OSXFUSE) + if (OSXFUSE-NOTFOUND) + message(FATAL_ERROR "FUSE for macOS not found (https://osxfuse.github.io/)") + endif () + set(LIBFUSE_LIBRARIES fuse) + set(REPERTORY_LINK_LIBRARIES + z + pthread + dl + "-L/usr/local/lib" + "-framework Foundation" + "-framework AppKit" + "-framework SystemConfiguration" + ) +elseif (MSVC) + set(STATIC_LIB_EXT lib) + + set(REPERTORY_C_FLAGS_LIST + ${REPERTORY_C_FLAGS_LIST} + /D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING + /DNOMINMAX + /bigobj + /Zi + ) + + set(REPERTORY_CXX_FLAGS_LIST + ${REPERTORY_CXX_FLAGS_LIST} + /D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING + /DNOMINMAX + /bigobj + /Zi + ) + + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(REPERTORY_C_FLAGS_LIST + ${REPERTORY_C_FLAGS_LIST} + /DEBUG + ) + + set(REPERTORY_CXX_FLAGS_LIST + ${REPERTORY_CXX_FLAGS_LIST} + /DEBUG + ) + + set(REPERTORY_SHARED_LINKER_FLAGS_LIST + ${REPERTORY_SHARED_LINKER_FLAGS_LIST} + /DEBUG + /OPT:REF + /OPT:ICF + ) + endif() + + set(REPERTORY_VER_FILEVERSION ${REPERTORY_MAJOR},${REPERTORY_MINOR},${REPERTORY_REV},${REPERTORY_RELEASE_NUM}) + set(REPERTORY_VER_FILEVERSION_STR ${REPERTORY_MAJOR}.${REPERTORY_MINOR}.${REPERTORY_REV}.${REPERTORY_RELEASE_NUM}) + set(REPERTORY_VER_PRODUCTVERSION ${REPERTORY_MAJOR},${REPERTORY_MINOR},${REPERTORY_REV},${REPERTORY_RELEASE_NUM}) + set(REPERTORY_VER_PRODUCTVERSION_STR ${REPERTORY_MAJOR}.${REPERTORY_MINOR}.${REPERTORY_REV}.${REPERTORY_RELEASE_NUM}) + set(REPERTORY_VER_PRERELEASE VS_FF_PRERELEASE) + set(REPERTORY_VER_COMPANYNAME_STR "https://git.fifthgrid.com/blockstorage") + set(REPERTORY_VER_LEGALCOPYRIGHT_STR "Copyright 2018 ") + set(REPERTORY_VER_FILEDESCRIPTION_STR "Mount utility for Sia, Skynet and S3") + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.rc.in ${CMAKE_CURRENT_SOURCE_DIR}/src/version.rc @ONLY) + set(WINDOWS_VERSION_RC ${CMAKE_CURRENT_SOURCE_DIR}/src/version.rc) + + set(OPENSSL_USE_STATIC_LIBS TRUE) + if (NOT OPENSSL_ROOT_DIR) + set (OPENSSL_ROOT_DIR "C:\\Program Files\\OpenSSL-Win64") + endif() + find_package(OpenSSL 1.1.1 REQUIRED) + set(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) + + include_directories(SYSTEM ${CMAKE_SOURCE_DIR}/3rd_party/winfsp-${WINFSP_VERSION}/inc) + add_definitions(-DTTMATH_NOASM -D_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING) + link_directories(${CMAKE_SOURCE_DIR}/3rd_party/winfsp-${WINFSP_VERSION}/lib) + set(REPERTORY_LINK_LIBRARIES + Ncrypt.lib + Rpcrt4.lib + Secur32.lib + Shlwapi.lib + Userenv.lib + Version.lib + Winhttp.lib + Wininet.lib + Ws2_32.lib + advapi32.lib + bcrypt.lib + comdlg32.lib + crypt32.lib + gdi32.lib + httpapi.lib + kernel32.lib + ole32.lib + oleaut32.lib + shell32.lib + user32.lib + uuid.lib + winspool.lib + ${WINFSP_LIBRARY_BASENAME}.lib + ) + + if (CMAKE_GENERATOR MATCHES "NMake Makefiles") + set(REPERTORY_DLL_OUTPUT_DIR ${CMAKE_BINARY_DIR}) + else() + set(REPERTORY_DLL_OUTPUT_DIR ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}) + endif() + + function(CopySupportFiles target) + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_SOURCE_DIR}/3rd_party/winfsp-${WINFSP_VERSION}/bin/${WINFSP_LIBRARY_BASENAME}.dll + ${REPERTORY_DLL_OUTPUT_DIR}/${WINFSP_LIBRARY_BASENAME}.dll) + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_SOURCE_DIR}/3rd_party/cacert.pem + ${REPERTORY_DLL_OUTPUT_DIR}/cacert.pem) + endfunction() +endif() + +list(JOIN REPERTORY_CXX_FLAGS_LIST " " REPERTORY_CXX_FLAGS_LIST) +list(JOIN REPERTORY_C_FLAGS_LIST " " REPERTORY_C_FLAGS_LIST) +list(JOIN REPERTORY_SHARED_LINKER_FLAGS_LIST " " REPERTORY_SHARED_LINKER_FLAGS_LIST) + +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${REPERTORY_C_FLAGS_LIST}") +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${REPERTORY_CXX_FLAGS_LIST}") +set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${REPERTORY_SHARED_LINKER_FLAGS_LIST}") + +include(cmake/zlib.cmake) +include(cmake/openssl.cmake) +include(cmake/curl.cmake) +include(cmake/boost.cmake) +include(cmake/libuuid.cmake) +include(cmake/rocksdb.cmake) +include(cmake/cryptopp.cmake) +include(cmake/awscpp.cmake) +include(cmake/libmicrohttpd.cmake) +include(cmake/libhttpserver.cmake) + +include_directories(include) +include_directories(SYSTEM + ${Boost_INCLUDE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/json + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/jsonrpcpp-1.1.1/lib + ${LIBUUID_INCLUDE_DIR} + ${EXTERNAL_BUILD_ROOT}/include + ${EXTERNAL_BUILD_ROOT}/include/cryptopp + ${OPENSSL_INCLUDE_DIR} + ${CURL_INCLUDE_DIRS} + ${LIBFUSE_INCLUDE_DIRS} + ${CMAKE_SOURCE_DIR}/3rd_party/ttmath-0.9.3/ttmath + ${ROCKSDB_INCLUDE_DIRS} +) + +if (NOT IS_DEBIAN9_DISTRO) + check_include_file_cxx(optional HAS_STD_OPTIONAL) + if (HAS_STD_OPTIONAL) + add_definitions(-DHAS_STD_OPTIONAL) + endif() +endif() + +if (UNIX) + macro(install_symlink filepath sympath) + install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${filepath} ${sympath})") + install(CODE "message(\"-- Created symlink: ${sympath} -> ${filepath}\")") + endmacro(install_symlink) + check_include_files(sys/xattr.h HAS_SETXATTR) + if (HAS_SETXATTR) + add_definitions(-DHAS_SETXATTR) + endif() +endif() + +set(REPERTORY_LINK_LIBRARIES + ${ROCKSDB_LIBRARIES} + ${LIBFUSE_LIBRARIES} + ${LIBUUID_LIBRARIES} + ${AWSCPP_LIBRARIES} + ${LIBHTTPSERVER_LIBRARIES} + ${LIBMICROHTTPD_LIBRARIES} + ${Boost_LIBRARIES} + ${CURL_LIBRARIES} + ${OPENSSL_LIBRARIES} + ${ZLIB_LIBRARIES} + ${REPERTORY_LINK_LIBRARIES} +) + +file(GLOB_RECURSE REPERTORY_HEADERS + ${REPERTORY_HEADERS} + ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hh + ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/include/**/*.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/**/*.hh + ${CMAKE_CURRENT_SOURCE_DIR}/include/**/*.hpp +) + +file(GLOB_RECURSE REPERTORY_SOURCES + ${REPERTORY_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/**/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.cpp +) +list(REMOVE_ITEM REPERTORY_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp) + +add_library(librepertory STATIC ${REPERTORY_SOURCES} ${REPERTORY_HEADERS}) +set_target_properties(librepertory PROPERTIES PREFIX "") +target_link_libraries(librepertory LINK_INTERFACE_LIBRARIES ${REPERTORY_LINK_LIBRARIES}) + +add_dependencies(librepertory + rocksdb_project + cryptopp_project + libhttpserver_project +) +if (REPERTORY_ENABLE_S3) + add_dependencies(librepertory awscpp_project) +endif () + +if (LINUX) + add_dependencies(librepertory + libuuid_project + boost_project + curl_project + openssl_project + ) +elseif (MACOS) + add_dependencies(librepertory + openssl_project + boost_project + curl_project + ) +elseif (MSVC) + add_dependencies(librepertory + curl_project + zlib_project + boost_project + ) +endif() + +add_executable(repertory + src/main.cpp + ${WINDOWS_VERSION_RC} + ${REPERTORY_HEADERS} +) + +add_custom_command( + TARGET repertory + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/cacert.pem + ${CMAKE_BINARY_DIR}/cacert.pem +) + +add_dependencies(repertory librepertory) + +target_link_libraries(repertory PRIVATE librepertory) + +if (MACOS) + set_target_properties(repertory PROPERTIES COMPILE_FLAGS -fvisibility=hidden) +elseif (MSVC) + CopySupportFiles(repertory) +endif() + +include(cmake/testing.cmake) + +if (UNIX) + install(TARGETS repertory RUNTIME DESTINATION bin) + if (LINUX) + install_symlink(${CMAKE_INSTALL_PREFIX}/bin/repertory /sbin/mount.repertory) + endif() +endif() + +message(STATUS "Repertory Version: ${REPERTORY_VERSION}") +message(STATUS "Git Revision: ${REPERTORY_GIT_REV}") diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 00000000..f6ac548d --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,8 @@ +# Repertory +* Lars Floe +* Oleg Nypadymka +* Scott E. Graves + +# Deprecated SiaDrive +* Christoph Schaefer +* Michael Lynch diff --git a/CPPLINT.cfg b/CPPLINT.cfg new file mode 100644 index 00000000..31ba6dad --- /dev/null +++ b/CPPLINT.cfg @@ -0,0 +1,2 @@ +filter=-build/include_what_you_use,-readability/alt_tokens,-whitespace/comments,+build/c++14,-build/c++11,-build/namespaces,-runtime/references,-whitespace/indent +linelength=100 diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..dd84d160 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,923 @@ +# Repertory MIT License +### Copyright <2018-2022> + +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. + +# WinFSP GPLv3 License +### The WinFsp project is Copyright (C) Bill Zissimopoulos. It is licensed under the terms of the GPLv3. + +As a special exception to GPLv3, Bill Zissimopoulos grants additional +permissions to Free/Libre and Open Source Software ("FLOSS") without requiring +that such software is covered by the GPLv3. + + 1. Permission to link with a platform specific version of the WinFsp DLL + (one of: winfsp-x64.dll, winfsp-x86.dll, winfsp-msil.dll). + + 2. Permission to distribute unmodified binary releases of the WinFsp + installer (as released by the WinFsp project). + + These permissions (and no other) are granted provided that the software: + + 1. Is distributed under a license that satisfies the Free Software + Definition Version 1.141 (https://www.gnu.org/philosophy/free-sw.en.html) + or the Open Source Definition Version 1.9 (https://opensource.org/osd). + + 2. Includes the copyright notice "WinFsp - Windows File System Proxy, + Copyright (C) Bill Zissimopoulos" and a link to the WinFsp repository in + its user-interface and any user-facing documentation. + + 3. Is not linked or distributed with proprietary (non-FLOSS) software. + [You cannot mix FLOSS and proprietary software while using WinFsp under + this special exception.] + +Commercial licensing options are also available: Please contact +Bill Zissimopoulos . + +The full text of the GPLv3 license follows below. + +----------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + +# RocksDB License +### RocksDB: A Persistent Key-Value Store for Flash and RAM Storage + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 00000000..c03615c8 --- /dev/null +++ b/README.md @@ -0,0 +1,498 @@ +# Repertory +Repertory allows you to mount AWS S3, Sia, and Skynet \[EXPERIMENTAL\] via FUSE on Linux/OS X or via WinFSP on Windows. + +# IMPORTANT +Skynet support is considered EXPERIMENTAL. Files added to Skynet should not be considered permanent. For a better understanding of how Skynet currently functions, please visit [siasky.net](https://siasky.net/). + +# Details and Features +* Optimized for [Plex Media Server](https://www.plex.tv/) +* Single application to mount Sia, and/or Skynet +* Only 1 Sia, and 1 Skynet mount per user is supported. +* Remote mounting of Repertory instances (Sia, and Skynet) on Linux, OS X and Windows + * Securely share your mounts over TCP/IP (`XChaCha20-Poly1305` stream cipher) +* Cross-platform support (Linux 64-bit, Linux arm64/aarch64, OS X, Windows 64-bit) + +# Minimum Requirements +* Sia 1.4.1+ +* NOTE: Windows standalone version requires the following dependencies to be installed: + * [WinFSP 2020.2](https://github.com/billziss-gh/winfsp/releases/download/v1.8/winfsp-1.8.20304.msi) + * [Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019](https://aka.ms/vs/16/release/vc_redist.x64.exe) +* NOTE: OS X standalone version requires the following dependency to be installed: + * [FUSE for macOS v4.1.2](https://github.com/osxfuse/osxfuse/releases/download/macfuse-4.1.2/macfuse-4.1.2.dmg) + +# Current Version +* Linux `arm64/aarch64` distribution support: + * Debian 9 + * Debian 10 +* Linux 64-bit distribution support: + * Antergos (uses `CentOS 7`) + * Arch Linux (uses `CentOS 7`) + * Bodhi 5.0.0 (uses `CentOS 7`) + * CentOS 7 + * CentOS 8 (uses `CentOS 7`) + * Debian 9 (uses `CentOS 7`) + * Debian 10 (uses `CentOS 7`) + * Elementary OS 5.0, 5.1 (uses `CentOS 7`) + * Fedora 28 (uses `CentOS 7`) + * Fedora 29, 30, 31, 32, 33, 34 (uses `CentOS 7`) + * Linux Mint 19, 19.1, 19.2, 19.3, 20, 20.1 (uses `CentOS 7`) + * Manjaro (uses `CentOS 7`) + * OpenSUSE Leap 15.0, 15.1, 15.2 (uses `CentOS 7`) + * OpenSUSE Tumbleweed (uses `CentOS 7`) + * Solus + * Ubuntu 18.04 (uses `CentOS 7`) + * Ubuntu 18.10, 19.04, 19.10, 20.04, 20.10, 21.04 (uses `CentOS 7`) + +# Upcoming Features +* S3-compatible mount support + +# Planned Features +* Random-write/partial upload support +* NTFS ADS support +* NTFS permissions +* Windows mount-at-boot support + +# Skynet Limitations +* Aside from directory paths included in `skylink`'s, directories are local-only. A local RocksDB is used to manage directories. +* Modifications to files result in a full file re-upload and a new `skylink` will be created. There is no way to modify a file once it has been uploaded to Skynet. +* Renaming files and directories is supported under the following scenarios: + * File has never been uploaded to Skynet + * Parent directory path is renamed, excluding any directory paths included in the `skylink`. Some `skylink`'s include multiple files in a nested directory structure. + * PLANNED ~~File has been previously uploaded and `EnableUploadOnRename` is set to `true` (by default this is `false`).~~ + * ~~NOTE: This may cause noticeable performance issues for files that do not reside in local cache. Repertory will need to fully download the file before it can be renamed. It will then be re-uploaded to Skynet, similar to a file modification.~~ + +# Usage + +## Mac OS X + +### Sia Mount +```repertory -o big_writes ~/sia``` + +### Skynet Mount +```repertory -o big_writes,sk ~/skynet``` + +### Remote Mount +```repertory -o big_writes -rm : ~/remote``` + +* Sia remote mounts use port 20000 by default +* Skynet remote mounts use port 20003 by default + +## Windows + +### Sia Mount +```repertory.exe T:``` + +### Skynet Mount +```repertory.exe -sk T:``` + +### Remote Mount +```repertory -rm : R:``` + +* Sia remote mounts use port 20000 by default +* Skynet remote mounts use port 20000 by default + +# Sharing Mounts +All supported OS's have the ability to share local mounts with other systems. To enable sharing, make sure your drive is not mounted and execute the following commands: + +## Sia Sharing +* `repertory -set RemoteMount.EnableRemoteMount true` + * By default, port 20000 is used. To configure a different port, execute the following: + * `repertory -set RemoteMount.RemotePort ` +* `repertory.exe -set RemoteMount.RemoteToken ` + * `RemoteToken` must be set to the same value on client systems. + +## Skynet Sharing +* `repertory -sk -set RemoteMount.EnableRemoteMount true` + * By default, port 20003 is used. To configure a different port, execute the following: + * `repertory -sk -set RemoteMount.RemotePort ` +* `repertory.exe -sk -set RemoteMount.RemoteToken ` + * `RemoteToken` must be set to the same value on client systems. + +# Mounting a Shared Remote Instance + +## Configuring Connection +Before mounting the first time, you must set the client's `RemoteToken`. + +* `repertory -rm : -set RemoteMount.RemoteToken ` + * `RemoteToken` must be set to the same value as the host system. + +## Remote Mounting + +### Windows +* ```repertory -rm : R:``` + +# Plex Media Server on Linux +Most Linux distributions will create a service user account `plex`. Repertory will need to be mounted as the `plex` user for media discovery and playback. The following is an example of how to configure and mount Repertory for use in Plex: + +```bash +sudo mkdir /home/plex +sudo chown plex.plex /home/plex +sudo -u plex repertory -o uid=,gid=,big_writes /mnt/location +``` + +Alternatively, you can mount as root and allow default permissions. This will create a FUSE mount that mimics a normal disk. Once mounted, you will need to set filesystem permissions according to your requirements. The following is an example of how to setup a Repertory mount in `/etc/fstab`: + +```bash +sudo ln -s /sbin/mount.repertory +``` +Example `/etc/fstab` entries for Sia: +``` +none /mnt/sia repertory defaults,_netdev,default_permissions,allow_other 0 0 +``` +``` +repertory /mnt/sia fuse defaults,_netdev,default_permissions,allow_other 0 0 +``` +Please note that the Sia daemon must also be launched at boot time for `fstab` mounts to work. + +# Data Locations +You will find all relevant configuration and logging files in the root data directory of repertory. Consult the list below to determine this location for your operating system. + +* Mac OS X + * Sia + * `~/Library/Application Support/repertory2/sia` + * Skynet + * `~/Library/Application Support/repertory2/skynet` + * Remote Mounts + * `~/Library/Application Support/repertory2/remote` +* Windows + * Sia + * `%LOCALAPPDATA%\repertory\sia` + * Skynet + * `%LOCALAPPDATA%\repertory\skynet` + * Remote Mounts + * `%LOCALAPPDATA%\repertory\remote` + +# Configuration Details +If you have enabled an API password in Sia, it is recommended to pre-create repertory configuration prior to mounting. + +## Mac OS X + +### Generate Sia Configuration +* ```repertory -gc``` + +### Setting API Password +* For Sia edit: + * ```~/Library/Application Support/repertory2/sia/config.json``` + +## Windows + +### Generate Sia Configuration +* ```repertory.exe -gc``` + +### Setting API Password +* For Sia edit: + * ```%LOCALAPPDATA%\repertory\sia\config.json``` + +## Sample Sia Configuration +```json +{ + "ApiAuth": "", + "ApiPort": 11101, + "ApiUser": "repertory", + "ChunkDownloaderTimeoutSeconds": 30, + "ChunkSize": 4096, + "EnableChunkDownloaderTimeout": true, + "EnableCommDurationEvents": false, + "EnableDriveEvents": false, + "EnableMaxCacheSize": true, + "EventLevel": "Normal", + "EvictionDelayMinutes": 30, + "HighFreqIntervalSeconds": 30, + "HostConfig": { + "AgentString": "Sia-Agent", + "ApiPassword": "", + "ApiPort": 9980, + "HostNameOrIp": "localhost", + "TimeoutMs": 60000 + }, + "LowFreqIntervalSeconds": 900, + "MaxCacheSizeBytes": 21474836480, + "MinimumRedundancy": 2.5, + "OnlineCheckRetrySeconds": 60, + "OrphanedFileRetentionDays": 15, + "PreferredDownloadType": "Fallback", + "ReadAheadCount": 4, + "RemoteMount": { + "EnableRemoteMount": false, + "IsRemoteMount": false, + "RemoteClientPoolSize": 10, + "RemoteHostNameOrIp": "", + "RemoteMaxConnections": 20, + "RemotePort": 20000, + "RemoteReceiveTimeoutSeconds": 120, + "RemoteSendTimeoutSeconds": 30, + "RemoteToken": "" + }, + "RingBufferFileSize": 512, + "StorageByteMonth": "0", + "Version": 5 +} +``` + +## Sample Skynet Configuration +```json +{ + "ApiAuth": "", + "ApiPort": 11104, + "ApiUser": "repertory", + "ChunkDownloaderTimeoutSeconds": 30, + "ChunkSize": 4096, + "EnableChunkDownloaderTimeout": true, + "EnableCommDurationEvents": false, + "EnableDriveEvents": false, + "EnableMaxCacheSize": true, + "EventLevel": "Normal", + "EvictionDelayMinutes": 30, + "HighFreqIntervalSeconds": 30, + "LowFreqIntervalSeconds": 3600, + "MaxCacheSizeBytes": 21474836480, + "OnlineCheckRetrySeconds": 60, + "OrphanedFileRetentionDays": 15, + "PreferredDownloadType": "Fallback", + "ReadAheadCount": 4, + "RemoteMount": { + "EnableRemoteMount": false, + "IsRemoteMount": false, + "RemoteClientPoolSize": 10, + "RemoteHostNameOrIp": "", + "RemoteMaxConnections": 20, + "RemotePort": 20003, + "RemoteReceiveTimeoutSeconds": 120, + "RemoteSendTimeoutSeconds": 30, + "RemoteToken": "" + }, + "RingBufferFileSize": 512, + "SkynetConfig": { + "EncryptionToken": "", + "PortalList": [ + "https://siasky.net", + "https://sialoop.net", + "https://skydrain.net", + "https://skynet.luxor.tech", + "https://skynet.tutemwesi.com", + "https://siacdn.com", + "https://vault.lightspeedhosting.com" + ] + }, + "StorageByteMonth": "0", + "Version": 5 +} +``` + +## Configuration Settings +Configuration settings that are not documented below should be ignored for now as they are used internally. + +`StorageByteMonth` should never be altered. On start-up, this value is used to calculate estimated storage space. + +You can change or retrieve these values using the `repertory` executable: + + +`repertory -get EnableDriveEvents` + +`repertory -set EnableDriveEvents false` + +### ApiAuth +Password used to connect to Repertory API. Auto-generated by default. + +### ApiPort +Repertory API port to use for JSON-RPC requests. + +* Sia default: `11101` +* Skynet default: `11104` + +### ApiUser +Username used to connect to Repertory API. Default is 'repertory'. + +### ChunkDownloaderTimeoutSeconds +Files that are not cached locally will download data in `ChunkSize` chunks when a read or write operation occurs. This timeout value specifies the amount of time chunks should continue downloading after the last file handle has been closed. + +### ChunkSize +This is the minimum data size (converted to KiB - value of 8 means 8KiB) used for downloads. This value cannot be less than 8 and should also be a multiple of 8. Default is 2048. + +### EnableDriveEvents +When set to `true`, additional logging for FUSE on UNIX or WinFSP on Windows will occur. It's best to leave this value set to 'false' unless troubleshooting an issue as enabling it may have an adverse affect on performance. + +### EnableMaxCacheSize +If set to `true`, files will begin to be removed from the local cache as soon as `MaxCacheSizeBytes` and `MinimumRedundancy` have been met. This does not mean further attempts to write will fail when `MaxCacheSizeBytes` is reached. Writes will continue as long as there is enough local drive space to accommodate the operation. + +If set to `false`, files will begin to be removed from the local cache as soon as `MinimumRedundancy` has been met. + +In both cases, files that do not have any open handles will be chosen by oldest modification date for removal. + +### EventLevel +Internally, events are fired during certain operations. This setting determines which events should be logged to `repertory.log`. Valid values are `Error`, `Warn`, `Normal`, `Debug`, and `Verbose`. + +### EvictionDelayMinutes +Number of minutes to wait after all file handles are closed before allowing file to be evicted from cache. + +### HostConfig.AgentString +'User-Agent' used when communicating with Sia's API. + +### HostConfig.ApiPassword +Password used when communicating with Sia's API. + +### HostConfig.ApiPort +API port used to connect to Sia daemon. + +This is not the same as your wallet's password, so please do not enter it here. Sia typically auto-generate this value. It is exclusively used for API authentication purposes. + +### HostConfig.HostNameOrIp +IP address or host name of Sia daemon. + +### HostConfig.TimeoutMs +Number of milliseconds to wait for Sia API responses before timing out. + +### MaxCacheSizeBytes +This value specifies the maximum amount of local space to consume before files are removed from cache. `EnableMaxCacheSize` must also be set to `true` for this value to take affect. + +### MinimumRedundancy +Files are elected for removal once this value has been reached. Be aware that this value cannot be set to less than 1.5x. + +### OnlineCheckRetrySeconds +Number of seconds to wait for Sia daemon to become available/connectable. + +### OrphanedFileRetentionDays +Repertory attempts to keep modifications between Sia-UI and the mounted location in sync as much as possible. In the event a file is removed from Sia-UI, it will be marked as orphaned in Repertory and moved into an 'orphaned' directory within Repertory's data directory. This setting specifies the number of days this file is retained before final deletion. + +### PreferredDownloadType +Repertory supports 3 download modes for reading files that are not cached locally: full file allocation, ring buffer mode and direct mode. + +Full file allocation mode pre-allocates the entire file prior to downloading. This mode is required for writes but also ensures the best performance when reading data. + +Ring buffer mode utilizes a fixed size file buffer to enable a reasonable amount of seeking. This alleviates the need to fully allocate a file. By default, it is 512MiB. When the buffer is full, it attempts to maintain the ability to seek 50% ahead or behind the current read location without the need to re-download data from the provider. + +Direct mode utilizes no disk space. All data is read directly from the provider. + +Preferred download type modes are: + +* _Fallback_ - If there isn't enough local space to allocate the full file, ring buffer mode is used. If there isn't enough local space to create the ring buffer's file, then direct mode is used. +* _RingBuffer_ - Full file allocation is always bypassed; however, if there isn't enough space to create the ring buffer's file, then direct mode will be chosen. +* _Direct_ - All files will be read directly from the provider. + +### ReadAheadCount +This value specifies the number of read-ahead chunks to use when downloading a file. This is a per-open file setting and will result in the creation of an equal number of threads. + +### RemoteMount.EnableRemoteMount +Allow mounting this location over TCP. + +### RemoteMount.IsRemoteMount +Used internally. Should not be modified manually and cannot be `true` if `EnableRemoteMount` is also `true`. + +This value is used on client systems to indicate the mount is not local. + +### RemoteMount.RemoteClientPoolSize +Number of threads to use for each unique client. Only available when `EnableRemoteMount` is `true`. + +### RemoteMount.RemoteHostNameOrIp +Host name or IP of host to connect to for remote mounting. + +Only available when `IsRemoteMount` is `true`. + +### RemoteMount.RemoteMaxConnections +Maximum number of TCP connections to use when communicating with remote instances. + +### RemoteMount.RemotePort +TCP port used for remote mounting. + +### RemoteMount.RemoteToken +Encryption token used for remote mounts. This value must be the same on local and remote systems. + +### RingBufferFileSize +The size of the ring buffer file in MiB. Default is 512. Valid values are: 64, 128, 256, 512, 1024. + +### Version +Configuration file version. This is used internally and should not be modified. + +# Compiling + +## Linux 64-bit +* Requires [CMake](https://cmake.org) 3.1 or above +* Requires ```fuse``` 2.9.x binary/kernel module +* Requires ```libfuse``` 2.9.x binary and development package +* Requires ```openssl``` binary and development package +* Requires ```zlib``` binary and development package +* Execute the following from the ```repertory``` source directory: + * ```mkdir build && cd build``` + * Debug build: + * ```cmake -DCMAKE_BUILD_TYPE=Debug ..``` + * Release build: + * ```cmake -DCMAKE_BUILD_TYPE=Release ..``` + * ```make``` + * Optionally: + * ```sudo make install``` + +## Mac OS X +* Requires XCode from Apple Store +* Requires [CMake](https://cmake.org) 3.1 or above +* Requires [FUSE for macOS v4.1.2](https://github.com/osxfuse/osxfuse/releases/download/macfuse-4.1.2/macfuse-4.1.2.dmg) +* Execute the following from the ```repertory``` source directory: + * ```mkdir build && cd build``` + * Debug build: + * ```cmake -DCMAKE_BUILD_TYPE=Debug ..``` + * Release build: + * ```cmake -DCMAKE_BUILD_TYPE=Release ..``` + * ```make``` + +## Windows 7 or above 64-bit +* Install [cmake-3.15.2](https://github.com/Kitware/CMake/releases/download/v3.15.2/cmake-3.15.2-win64-x64.msi) +* Install [Win32 OpenSSL](https://slproweb.com/products/Win32OpenSSL.html) 64-bit version +* Install [Visual Studio 2019](https://visualstudio.microsoft.com/downloads/) + * During installation, make sure to install: + * C++ development support + * Windows 10 SDK +* Install [WinFSP 2020.2](https://github.com/billziss-gh/winfsp/releases/download/v1.8/winfsp-1.8.20304.msi) +* Execute Windows build script + * Debug build (64-bit) + * `scripts\64_bit\build_win64_debug.cmd` + * Release build (64-bit) + * `scripts\64_bit\build_win64_release.cmd` + * NOTE: `cmake.exe` must be in Windows search path. If not, modify the following line in `build_win64.cmd`: + * `set CMAKE=""` + +# Credits +* [AWS SDK for C++](https://aws.amazon.com/sdk-for-cpp/) +* [boost c++ libraries](https://www.boost.org/) +* [curl](https://curl.haxx.se/) +* [FUSE for macOS](https://osxfuse.github.io/) +* [Google Test](https://github.com/google/googletest) +* [JSON for Modern C++](https://github.com/nlohmann/json) +* [jsonrpcpp - C++ JSON-RPC 2.0 library](https://github.com/badaix/jsonrpcpp) +* [libfuse](https://github.com/libfuse/libfuse) +* [libhttpserver](https://github.com/etr/libhttpserver) +* [libmicrohttpd](https://www.gnu.org/software/libmicrohttpd/) +* [OpenSSL](https://www.openssl.org/) +* [OSSP uuid](http://www.ossp.org/pkg/lib/uuid/) +* [RocksDB](https://rocksdb.org/) +* [Sia Decentralized Cloud Storage](https://sia.tech/) +* [ttmath - Bignum C++ library](https://www.ttmath.org/) +* [WinFSP - FUSE for Windows](https://github.com/billziss-gh/winfsp) +* [zlib](https://zlib.net/) + +# Developer Public Key +``` +-----BEGIN PUBLIC KEY----- +MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEKfZmq5mMAtD4kSt2Gc/5J +H+HHTYtUZE6YYvsvz8TNG/bNL67ZtNRyaoMyhLTfIN4rPBNLUfD+owNS+u5Yk+lS +ZLYyOuhoCZIFefayYqKLr42G8EeuRbx0IMzXmJtN0a4rqxlWhkYufJubpdQ+V4DF +oeupcPdIATaadCKVeZC7A0G0uaSwoiAVMG5dZqjQW7F2LoQm3PhNkPvAybIJ6vBy +LqdBegS1JrDn43x/pvQHzLO+l+FIG23D1F7iF+yZm3DkzBdcmi/mOMYs/rXZpBym +2/kTuSGh5buuJCeyOwR8N3WdvXw6+KHMU/wWU8qTCTT87mYbzH4YR8HgkjkLHxAO +5waHK6vMu0TxugCdJmVV6BSbiarJsh66VRosn7+6hlq6AdgksxqCeNELZBS+LBki +tb5hKyL+jNZnaHiR0U7USWtmnqZG6FVVRzlCnxP7tZo5O5Ex9AAFGz5JzOzsFNbv +xwQ0zqaTQOze+MJbkda7JfRoC6TncD0+3hoXsiaF4mCn8PqUCn0DwhglcRucZlST +ZvDNDo1WAtxPJebb3aS6uymNhBIquQbVAWxVO4eTrOYEgutxwkHE3yO3is+ogp8d +xot7f/+vzlbsbIDyuZBDe0fFkbTIMTU48QuUUVZpRKmKZTHQloz4EHqminbfX1sh +M7wvDkpJEtqbc0VnG/BukUzP6e7Skvgc7eF1sI3+8jH8du2rivZeZAl7Q2f+L9JA +BY9pjaxttxsud7V5jeFi4tKuDHi21/XhSjlJK2c2C4AiUEK5/WhtGbQ5JjmcOjRq +yXFRqLlerzOcop2kbtU3Ar230wOx3Dj23Wg8++lV3LU4U9vMR/t0qnSbCSGJys7m +ax2JpFlTwj/0wYuTlVFoNQHZJ1cdfyRiRBY4Ou7XO0W5hcBBKiYsC+neEeMMHdCe +iTDIW/ojcVTdFovl+sq3n1u4SBknE90JC/3H+TPE1s2iB+fwORVg0KPosQSNDS0A +7iK6AZCDC3YooFo+OzHkYMt9uLkXiXMSLx70az+qlIwOzVHKxCo7W/QpeKCXUCRZ +MMdlYEUs1PC8x2qIRUEVHuJ0XMTKNyOHmzVLuLK93wUWbToh+rdDxnbhX+emuESn +XH6aKiUwX4olEVKSylRUQw8nVckZGVWXzLDlgpzDrLHC8J8qHzFt7eCqOdiqsxhZ +x1U5LtugxwSWncTZ7vlKl0DuC/AWB7SuDi7bGRMSVp2n+MnD1VLKlsCclHXjIciE +W29n3G3lJ/sOta2sxqLd0j1XBQddrFXl5b609sIY81ocHqu8P2hRu5CpqJ/sGZC5 +mMH3segHBkRj0xJcfOxceRLj1a+ULIIR3xL/3f8s5Id25TDo/nqBoCvu5PeCpo6L +9wIDAQAB +-----END PUBLIC KEY----- +``` diff --git a/arm64/debian10 b/arm64/debian10 new file mode 100755 index 00000000..f373eea1 --- /dev/null +++ b/arm64/debian10 @@ -0,0 +1,39 @@ +#!/bin/bash + +mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc +echo -1 > /proc/sys/fs/binfmt_misc/qemu-aarch64 || true +echo ':qemu-aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-aarch64-static:OCF' > /proc/sys/fs/binfmt_misc/register + +CHROOT_DIR=./arm64_debian10 +DEBIAN_REL=buster + +if [ ! -d "${CHROOT_DIR}" ]; then + qemu-debootstrap --arch arm64 ${DEBIAN_REL} "${CHROOT_DIR}" + cat << EOF > "${CHROOT_DIR}/update.sh" +#!/bin/bash +apt-get update && apt-get -y install \ + apt-utils \ + build-essential \ + curl \ + autoconf \ + automake \ + libtool \ + pkg-config \ + cmake \ + jq \ + make \ + gcc \ + g++ \ + libfuse-dev \ + libstdc++-8-dev \ + diffutils \ + git \ + tar \ + wget \ + zlib1g-dev \ + zip +EOF + + chmod +x "${CHROOT_DIR}/update.sh" + systemd-nspawn -D "${CHROOT_DIR}" "./update.sh" +fi diff --git a/arm64/debian11 b/arm64/debian11 new file mode 100755 index 00000000..c90dda96 --- /dev/null +++ b/arm64/debian11 @@ -0,0 +1,39 @@ +#!/bin/bash + +mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc +echo -1 > /proc/sys/fs/binfmt_misc/qemu-aarch64 || true +echo ':qemu-aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-aarch64-static:OCF' > /proc/sys/fs/binfmt_misc/register + +CHROOT_DIR=./arm64_debian11 +DEBIAN_REL=bullseye + +if [ ! -d "${CHROOT_DIR}" ]; then + qemu-debootstrap --arch arm64 ${DEBIAN_REL} "${CHROOT_DIR}" + cat << EOF > "${CHROOT_DIR}/update.sh" +#!/bin/bash +apt-get update && apt-get -y install \ + apt-utils \ + build-essential \ + curl \ + autoconf \ + automake \ + libtool \ + pkg-config \ + cmake \ + jq \ + make \ + gcc \ + g++ \ + libfuse-dev \ + libstdc++-10-dev \ + diffutils \ + git \ + tar \ + wget \ + zlib1g-dev \ + zip +EOF + + chmod +x "${CHROOT_DIR}/update.sh" + systemd-nspawn -D "${CHROOT_DIR}" "./update.sh" +fi diff --git a/arm64/debian9 b/arm64/debian9 new file mode 100755 index 00000000..c59da5db --- /dev/null +++ b/arm64/debian9 @@ -0,0 +1,39 @@ +#!/bin/bash + +mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc +echo -1 > /proc/sys/fs/binfmt_misc/qemu-aarch64 || true +echo ':qemu-aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-aarch64-static:OCF' > /proc/sys/fs/binfmt_misc/register + +CHROOT_DIR=./arm64_debian9 +DEBIAN_REL=stretch + +if [ ! -d "${CHROOT_DIR}" ]; then + qemu-debootstrap --arch arm64 ${DEBIAN_REL} "${CHROOT_DIR}" + cat << EOF > "${CHROOT_DIR}/update.sh" +#!/bin/bash +apt-get update && apt-get -y install \ + apt-utils \ + build-essential \ + curl \ + autoconf \ + automake \ + libtool \ + pkg-config \ + cmake \ + jq \ + make \ + gcc \ + g++ \ + libfuse-dev \ + libstdc++-6-dev \ + diffutils \ + git \ + tar \ + wget \ + zlib1g-dev \ + zip +EOF + + chmod +x "${CHROOT_DIR}/update.sh" + systemd-nspawn -D "${CHROOT_DIR}" "./update.sh" +fi diff --git a/bin/7za.dll b/bin/7za.dll new file mode 100644 index 0000000000000000000000000000000000000000..bc2b47a33c4bdd1ea29a795f8eebdcc2062ecbde GIT binary patch literal 381952 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≺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%0D#=B=+rKG_j^UGN4VQh?~|^a=7PJPy>sy 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ʟ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î@aoSizph$6H)2TRK;1dz*V*dp$sw6P z72lvvX#Iltw4O^h+&oZ)(<*`iDTKGyJrTTJzU$Zpo$e;++Lrt9I-7<2g}J2k=*6Fa zyYn$+7e7p^{FNjRjBb2KoAY1CrJ{w2Fs5F)|B+}h=Fy@(Y)l|f# z^3jlJY-N7{U0B?}pnLvL!{b=5AhZ|Ur>xy098%Y?G%Y)v3OS~zF0 zE-vxGd8!b@mMgz0>jc4;DZX&}viwNJI*hY%^-=V!ZqVc9!}5|-d@@Uf(#hT(amDCk zj?%M8uv^sU4#PkUYCJW*_!wl=q>e~%W8O$qp zCChK8H0MCoCg(z5@X6*gW6mhK5vi$;7nuTsn;YNF97}Q0bkU}Y?bxQHz;0dOac+Tt zM-Cxbw)_eaOEmX}At5_Nw}H;STh*1)vq58U&eWCspXoeW&o~D6@dh=w5Z$i|fuW|x zWgHl5c8N;t0K4@- z9%F;KTK}yrfZ5WwU*YQWhb7{zHA^C~$%*Uy4@bTIo8tT@8ZdGcEyObd&xMw=8A@~$ zr1ueopMN+%))Di%U-8WwwLMcf&vMQ`-2cd0v@haZgnHr=(dmnyo!obLye7Hth+B%2 z`^Mga?TGUD=;XeN_({oq=f;l$h0xOdtMdyzp3ISy{Lbpa0zQjYd-8D#R~Py`9xH`l z^IAkkblX81mAq$-GyODb=?=rkzHy!gqH|nB`rRa00FMnacY6T;E^A--bQit;rG1k zx(}_o4;MryPfpy}dZX`RYgQz&p!LS0dEbebCa%VEZ`#6qN5R6&=UK@ci}MpR;k%rF z0za30>4UYy6A>T+HPLhqHXy}4E1W*RI8wFCN>3H*Q43G1ZJjvss&B-UA%{@*|4miM;RljosnR;u2sFQPIp$X=9{M=;}% zH4pnNiRBOTYf%22fiIocT2psv;=-^KooG=dYrbi+l}^dTvxA!#POv`c9-cT8q&up0 zLVbi&1pCTVZ);zSKE!7w`{IcB^%cY;@>7%Sn;1W>b^lduMwLM?v#+x@xxis5<-z(1ZE_{^gN?P}ilInc8v@7u|CRye$ve}q2 zFJ#TiGL*|8-FI`(nagw7%VrZx<)_Z~xo^_ql=i%!I*DV?4Os-5#Dbf%1A{9NQC^)$i^B-&=&r{O1f1P;LLQl)O(wdoNXC^c&yj=YQ zGEI_bG~}%97{}AT8@wa)xF4wGDy2ZwspmQ4hUropAI@CiUW*q_;+dgND9x_6P4P&} z{?a&GAG<@O6XEYJ`j{9&#CVA~#hL)p(P=Zg`_~dYR)XD-y>20iKcy~)j+MP*)b+9v z%W>8=oFf43{td;6zmPs^oak89Vrn}TD($pFR!0cHVvIVK*J)Y!%0vJviZ$&{YZBg* z@Rr~WbXv7|PwuqNt=h!LsaA)53bwaPd0g4*w9f08G}@|;o|ia`-*XeAqBYUdc%cY7 z=5eF?UW3??2S3&%9_ry*z!GHEsMKLc<&d77wM1B4A&p= zu}*P!&CKpVqkrK@XJ)sT@8V_=iO1HT?b*??xQx_fdJ^YI$;3ze)NpXzla0QG#|JNe z(%WD7f2nE68(j@=!EttKMx$Nl;OE8`R%qDhh84H2+wO zb&%R5D=^7;D%&KRWRl7B8sL^>aTv2kSSrsVB^Ey;$fExc<7kjKF}PfV1S-0|>b_$P zeL9C2pnXIs+FAPAUv7$DjrK{%a{Fq}sRu=$k z?It*E<7CPV;1+WS{&{U$4I61_n~L2wZ6@Xm+T>9;o2=P3L73<^{q1P!6KzWA0=}S4 zfJkiw6(R=Ato1Ih6!+7L`+VkRL zK466=cNg?;)LLNNUx-H4xXvl(PN+RM0k8N%TFvv!Z^38zaA)6m7JQ_-T+6!o+n$m& z8Z8b^EtWD4dN%NdvE;|a(o?&bMscP>kJchOTx?rlGdxr96xr&h6sJ?|k|OFr8iT3u zxTzLqQ~eLAI;Ygqw1hugeQmA3{pW;8OV1WBY&c z)+Mecu9Se%!MM_F+_ZsCe~3yYtxVL!*j4HrZ<({fa%}G!smuySz5du*ak3d9V34`X z_s8Djm%x8Po7YaiBs0ab6!))xGizg^xJlZ-7oWA@>`X+EW(n8VIaYHgD^Y$rgc zyqQD;)QXR{~;+MW*0m94&{NZ)fn z;>ht~fChKY9|vs%0UAzw*=a1K-w-ylyWb$^D#XW?OJw;^dwwURn6nbH>C+R?iuoDAZDE9ak1?m?Adv#BK!dN95vO z&Y7kS*#<;}pYyUeW*XjdV?iDgRVi!S1~io7r*r7~aJyAw@wf_Ysg&y*I6(R4^qHQD zK2kXZ{RmNlF6E3VRf)Lz0PXdx6CIa13n^}}X{iU{P7NMNAUiqn$viO|vqkM@pP~>p zfi3ECdc*e^XBw!oHW0LZjcZK@pwqO`EC?KZG2?Pb!6`#IkO0KWeCjr_t zVB5>73&AifSDWE^3UG348B=_DUHhgevNa-Q&;81?@!>Aw!<4+g?FS4}%S|Kl{B1H{ zoE}&S!P-Eh2kN2fZK(1Eq3UaW@ndL)4c|x3{R?OrO4D-sC)!ahH;v4LLY!74d?Dv) zj-%6F`hA!39XGvRiEx;KDi2_}hZE-a&6Qo!}*9JaN+-``#d#53K_;*x%l-`{{2#9DtcAnIqB#{NC2{ z6A7pFs2r{W5OQB97@JXmWZl0ZRGPOTRKm&7R%!u^q!n1I?;_sXkPl;L8B7P9J9py1 zeJ_{XEqu$LvrMio0O6v}WxyI?bHD&vml+7rjG-4i8(mL>c(%Kq*N=Yq13|AL>1hKW=hsSn`c3PdhTQnjwtS)t!)w$N{u*$69Pr8U~IzH+oS7);n z;}PHtWQqDR!|UKIm`o>;X?Hf$&fH9DNTz_!gm|9RbTXM_kabP_ax=*d)L=~|I#Y?s zbPAbDB@=s5Qs@ZNBRu7JoT9tvkd=y-W`;*n=a-s1<>U!T9^^xj8#Q?no(M-|uB+7$489P&iO8`LM2{NI(w_s;%kiMnmIFF7xNk_$BC$xFXK&anjU~|A;?u9;1@A^V|vz_wy*9NM( zU^N!VRAAr9@*?bHpRZ5kMwms}bE7@?5+4R&n=i7RuQ?yt$#()z?m-z-_`to&gQ!rl zryq?UqPqXVR(z1dx1ayX0gS)69F<{O5& zq+B?fv$dRK%Mo;QYHc~k#y)k9^{5NU%m!ma7Ka8-p?lT+qx4BRq^=}hqEk(wRBa55 zUawZsWv6yguy*lhN-H#_EuypqIi+20N?V`~)1@t3v`lq@f}Rcy!lk&9(9E& zTvAZD;J%#J{%)l7-H}k$pbOXOQh$_?lrGRtJ1Zr+22k+bCEur+@7?l!y!jS1q{fSZC5jdaT5|IaKNQbw{FKnrw>tqxYIyd!3@wu* zgo#|ij1(~?ZDtL+k$Gy=77#tj!Ez}CRWQ3o{!&1LC_;JOqqYEP=WMBNuT*!jD@nwT zbnB&39SgItUVpLP(uF6PPnKQbflDNQatWW?%x5X4<0_?S+-lbiiAz(_mq1@yXdIf# z3hqU(VnxjPk{oMfIA!;TRAAGV4BT_pL4IhghTeRMSZ0gE;UIZ0hr<;ai0a89yW(+S zg6?X4Rd1qhu>l}pU=h&Qw4p&{V7BW|@7Wmc?Yt;UKWCHV?CIQ_Uo#MI_7cSUgcKgv z?G(Ve=Ys>t zwcKxWqCVKO%~!GMhilF+VM}X1%685NE3Wm`6vV?3 zkG$_xgtBQ#;~ve86eFpn+ES{9s8b+<9hDs49QcxmcT@^GgMaN)sc#7Vml z7jZ^fJGkMhn}fN^5B z3^_+8tpIHZB%%U#njBrAPSmZK)}W3yANA@m^P$Px0cay?nu{-J_M0=^E@qFOxvrzRJNmO;E3`d~x8s4Q+#&tE8mDWV_lLtZYj z$enNX%(wcX^KCRV5qYv!3y01((sF(udHw(l^;(hnG03{?e2!C>?LNnb8xRzUTcX`` z;p|t;GLn+UKX;Iex}If1%>8};f-|H#6{1@(~mXJB{zskz`Ck{=;#frI+(jDcc49WU)r&gaMPllW_M z;y(|UJ*AmmhfY05>iSfWG;c^yntkDJEYz+5z#H{uE4#V+p)NH&twbGh zOCh$Nkb+ku+%L4dVGZ>ixVex={BrvjQqR0T(DBdCRTtNtPHltJb4dOy{H~ooP|T;} zHT#+RrE2jca4DTB6`l*2L3#oCD?eV|ZJ zBNRHo*fV?5;Qh_uYIENjGFJrdqI2)polAYpY?!&`Ntu;1SSG3AsVj>Jy`t)Elq?@D zWkA(3iGZMD2VNwL=v1Bx%Cntu(9}-}jp^`2X3V*acbDe`K)R{vB~I z&)nEQg^?8#XHO*VGq=>$18lJ&h%xV66f-1#kvc&dq~rCuPFOq1w-)8fXR*v> zD3K)JZJgJPgJ?2E_k@(ZsnQeLD@a0v(^}2Dqo4tMr`q|I1N~aD9vxQnV8t@c;}SHQ zv;_Ur1U)E0!%fgfCg>i5*e=i!(&xW=^?d@I>wU>vxQe!upAMJFPkvUn) z0cUSiAI_99xm*kvT^4}3HXkhnoa?wMWmqtN!N~Qh*C$93+tjbVsHg}2t)l)@7uBoA zpbw;_>}$m)&}_88+riE+NCUgy@MxQ@@38&A{jyO_#mWy?B59zBgbXPB(U< zM@}X*c7{)VvfIGz$1xiFLE;&?`<8iaO3g`@w*`@z-|_&9afbZH6OG z7P0ZSZypw|c$;^Y;E}lxu^k{EsWj@6a^A#m={Y;}l|1$wO&b_Ft-<}on1WCaI{(;r z)T1$_BsFE6!_$Qd`YL_-cUbAK(#9=ndX&j5<8?zx>V|Pz@KvlBY*fG8&#vD&xwKl)a%eAbQp{TTxibL%E4XVKNMSDhr z923?3yRvBpZ4!QtW`FBjirFU2{+-M!xhjyC))7!cCu%<9B$uW7ObaU@xWV>^yKV6B z3f7fe4Bw>(^6s(*QbP4-uar4%Uib)9rZ%cTvXwfSj@F;)vFo$ZNRnf2eng#f+k9qs z#)B+&EV#M(BCC4V8HpLvXx?n=vYk81X6rh(sY`?hw6kglwtBv5J4R^(@j#*Vk-?BY{Y+4@OC5r2 zhk3#rvIAONgXO<)nuV+*O!&?5naMs+d`4?ue*rH;PZ6ocNq9cV^Ta14_m{-a%9NUW z@_2=NGk&7E2^WD)eKUT9;YMg?15)PQO@YkqRXb?r3aU;|&CdX>Op#8MF@kFhhQI9> zK-x0zaHF2})5-4RKM%QjI_3eOO9|G*QkxFueV9m%wqV|z zT8WJr%qGVe$q?m7Y8rjbr|5@du;^Trm#pcJ7drW=;-$Jdo+qOS##_M)e2p)0KDniTa$sEkgbBzM|ZQpuZv;yiBBh z;=Q9xOSt0tSXMXzy}IrwD=}WtN0yZ(i3LHHEtf@lukL0Yq)+`6UW}*;ld+tXBF4)r zBQ#0U18phX3O?0*0y+W_ga_=_>ipsF4#Os{FY=&Vpo@PyXGH6Mp%wh$ z&6F%fnq`z2O%2kS0L5g^ao5ymq)iaXHp}c$O3ecyf)6EEW|W&<@80PQsEChQl1l{P(HVq#U>vF%BY z_Yaet*dM(58LNuoE<4}g!ptOnN^mh*ET4;2T?g9(ZZy~v^-tpN$9O4Ju%-XuuJDAH z{gJf-m(Rt928R>y4JZY&4jcHXTKb9PV5 z;-DBtprw0#+^pwC=RS^U7oPiyPsFU}<9Qk%hY^BE?g3;xq4|6q`#PN8)0XsVlxo-R z7IibOPE1~T_i3xTmXH%YqV1;5 z^1ztEr0{wLm554?&9kPmH8&%RJgXehq)xOK!kwGhb*!2Te9f0eox?>-H@y&IYh<|k z#)+&NCt4cwJR6y?4VsaifU@Ti=^cuWT3c(2y(6sbf3IHqqu2ih;W&^|6?pnarv(TTxzp}ogI`;+s4 zw&*?oQ$B?3&6p2E8bq=DJIE@{0(x5((3Z2I@3!+G_idV_+Q}&ps0IQ|c9teY-0IWi zhzVPut*lZYGpf${P}DfZBd=y`2P4&?pFEQN9YZ{FLt?E0z`Xq3t8O@r%p_J6FYaE~ z-G?i33qoUstCv*y+g_Itmb;`>;jaqyx)0Mz!F~R=&2E%rQk$-2g^*54QjfVFo$2>@ zpjBhRy@PEDtk4tt10F#AJW#*rg8HFz4X7W`?iO_~t_$jS45Qy?og;KCPYJ}Nj~(s%Y6LX zP#J^fkC-uI84G$8GKNptwZs+lY2-!1?4JRApy$Jkb2v`T#l?vu3HoeI=6tbpFQ~;1 zJ|~9p+$%k3jf1vllw z=2OlIhCHgN_xYEeO^_zQL@ao?Rb4;P-zMT&e4XcS?=xTL`rBXPD_T=u>Ti3RFZ#Ee zF5|q0LoXCgwV_bsCy7?HM02Ak1I?G({FIz&cgxDy?Qh>e5z-22PiIKf;U<0oJaI zgO5TRS`^E3cHjRDGOqvb?)$6q|7G`;D^K=cb?-y$xjXuMqRAe14FjFvB5Xds&e2LX zDm|zSiWz6KP4#`Od$C+cs?(%l>TXneiu`fTt@IyI#61G`)f@?GC|_ym%1 zKL0xTba!7GG~oxQ^)dbQmNxta@&qJUf;Uu0+pCQEqovfMdTRt^`($D+AW+;a20tpC zS|m5%PLJGr4CkaBP)+cbGN{aI#4H)2!G5WfZ9-l=6Qx$c)KvEAh~;Ig%K0D$Z7?BLcjSqBIA zxo_nR?pD{M2e%8)|J&eht~NMrt#-GlHMm0u_dY^2PP<1w1gHJTd}MLj7jCMC%~oA) zw!GE!RmgitV)@i$z`m+YJnqsa&vOf0bokhdkCeAGcG15D2xnve*vOZLfdje**&mOU*?N|3QwJW%+ zjs@YGNo>j~fs6=}->Z*ET1iPWoQj5r;bp{&`8_Xj3cu$jj*rz?rHQX+juKu>G0YDS zV(4wg%1d>4V^QK5R7GSpO66(|w!pJ>F%DtRK{3=C4t~$q_%rr7X_eF}X|qSw7$=qV z*zZ0Mb23|sJ^d3d_n>i?jwWH9^Rcr>NS1m%$scmhtPdED5$`gk8!*p+ZO;g0!dRvh zp$^n9;6<$nS1&v#UX^8(2)1d^Sa+N1$Fgv^od?4REn~h++HoYRvg~uXU z1oQN&GycYgO^7BxbV%L;2{BcEwwf*Ku0P651DokK&8ynq4;A3$r4fJo6nJ6MFWFPF z(8!+VR9cssSB|=(9H=P33Vz&toX`@p@kG-zimdd^viwxO zN8a2H1bZ6)DThN7EnSsls_AK9kh-_brlzQ~KE|ieOqAtc`khK?)jknDje7Lq*>HY~ z%Ov{($-WaqDy$BxI$U;GyhxlX>>jSlm*ZuZ2z+G|&Hzadl4l#gBs9!x;p(e>@vn!g z?=AZ=g(Ymkac19LFBeT%7AN~kspoHuAWy+@G{8K zJjuSBU0D6JfM%lW%)Q&=nhXfhN6EQcuY8u4yR2`sf&$qj&3Brr#Wc9V9z- z*zrCoE9yR-skTxU5Z+2M!Z>N+Q`j6e;U~TR_72j^nBOI7d1b0iu147H))3Au>Qqz- zN(CNreraC^IN)!)RU-9#7e&VAmaUFDAJ-VxbMy6j7>qz>^~~W#m=GXQo=1398+F+( zcUx=^Pc4Wz>#2bzts>6Uk~orDOyX=++I(qGAh=w&ym6(RJf%CryEI>Q2?NS{V0~1MBYiaq?ob#WgWn+2JxI-FT{AzDnf_gK}a8l%{IL zke;zX-iinuyB|Ab>)i&+AP5&o6)u#u1_g*G=FGO`Lck1ObZ$}7Lb<)X8P(#2Avlj7 z=S^9Dk~EyYMzjK<6>kJ6#npC2F>bHAe;f*rp10X`tl)KJ<&9h^8=lAKt>0|jykHj+ z1SxQKCTheWz~n9Zjwq`xdGrXGC=ci^WgDT{t5IiGH7z*6b#bMtpnBW$5jh(Fk;NdN z#u%)yzHL4kihIjeQJYM7Sw!N>Y6=p? zaA{i1;~g$bRleDd;KKKK-HrsYC~B6v|JKGYK*w2rY8Hdiaj8Wno)eN4Aq^E!bh)l{ z&D6Z5t7|F8f5ymJ1OnEoq??*^tB)lqf9|SZTWEgX56X$$E}I z7EiV~`XUHL_8ZAr*Zx}kaCtI_jYpq?Oti3zMbs&)O+#*-E7f32PFdq-1*0jI%_|h^ z^0E$TGv+DXqmr~#2e}IsZ5P2G0@9U|68v@_F6G}xs|3&zN@8goB?fr_^;HcHQNHZk z$>*aDq*U80G#=5XKDR)D3^tdbt*h*mje>$*ow7rWM|ceixL}$ncfR!&KeM$~m0C_2 zf^KZ=y^KN+Tv{UotCI|NOq$b0ow_->9h1Ol8tf&lklJO}>$tb^|5QAN1G8ja;G3K-^k_>{f7*suHq_t!J=U~o`zM$C57%5xc zF>8BbtYC!f$m{ZSDYg~~&Y3mUk|WhnFEEtc28K*~8BUEJHE>SCc=B&GKj{mz*ns?C0mK95SBLK$G_ym09>;`Rp!Ti;K^_D;Q^4 z2Pw2^0kxnd8UGYlBq*dvoW`{P^U~#snn<} z+yP_j|KA?G-0Z>0ZoLODA8SU-?8_{%WEXQRj*J&;i(Sm6S@2X!BXxW5l*_a%MWaa2 zR=sYdCLuKux3UjKKhwx_h${8B`JkJmEa@>i2I1-`sPUiDnJkxp6@LKFvI_P76mZB~E$ zq69oZTVz~xK+iZS+uhS@+R6gdqL=+`7a!$jU3Lup zk!o6U%FqWj(%QU6?Mxk4VgG-;y$gI)#o0feut^9I*`PtAqHb}kQBcFBx?!X4Np{Iu zvcVuIQL#p`h+-AUE}$R;Hj!+Ot7z4?wKuH2*w((a)hgJk36~^*Tm-9lsiL)Y*0qY4 zYD8uK-|x&hyJtg!`u^J=AF^lemuH@tdFGktd8Y7_7X!z?sjYl7AIfXa*2WW1AL`-w zI9o3}vCpogre_E0vRzSyW&>pzM7vrFD*|3kZ#o^9><)R*gsB`KuFZ>sxl=vq>myAk zA!FTLsw#uIlQGlG&Hap1a3}-dvF)aD%_ZTE#<3$L;Efr(^29k%M8+G#*1m4hCCFCJ zzRoUbGwF&9nes9spve>Ld=q3!-n|yB05VLGD~iIT6$UA!Fk!bAzZ7Jlq*?-=8F@v{ z7QUtFcWm>U^mw46*m>Le2-6G@&;hitvd8b4S?O#&os9s}f1l`ZNym(@hoi&*3vYssUA$5u3K6AzXtdv}mpWH{ zP9?u3g`mlZ2sjo;CUNZKf;8_<3g@Hfwa6yoCv(Ze5YGm^sB^N;w7=)`gJ=PlG=F=;I6nqsjjGvs>n~)B!Ruolg_?o(&p2z? zU<*6dlM&Fa(u^V~0ta#e?K^3f6Awv&qi9~2ECo{n!jVu{#SV$j1vu3BfGahC@uob` z$fdzC??#@mW~2q%zDEp;8uquVX5uJDII-2GXe1GVU$A$60to z4uEI->%4D-j{}j3^VcA8)M!FevhEp&lmLnvf(?ssLfOfYV_8(rQ0ufY2)akn4X{ku znO8UF?~(V+9LWL|4|9VQhT)Q1htoEkTn;oGz;As3(1r@~gxvu-t#>n$du0Ho$Km9% z3NkZ#G`>^f6YmHbFZlsM=R_k4Vp;BOf@0kEF;7s;pzc|Rqk z1o;Bq+pGZ|aHz1bujbS9fEeWuxG2FeC9n)a67U;UTod;pA!o6olyF#)-L@#D2b&ok zuL2p;;BnNe!5J|L9KNPv zttU^z;s~L&n>g9}7B+tjy-%yC@jF{z1nl(LxD-VLz%R9SR?Rz2Z#qXQ**+>O<(df@ zTguLHe|79p0&~;!g^A2?X0}v-%rFb%F2FJ@s<*jY+%KR`cgO$i;{05w*1Xp7uZ)7ODZWQIB!@J-@==?P9AeexV zU4l^4sC7s{?&b6N;zO={u0prua9nT8;JamTf4pP`8AbPqnjhO4$|KPzK%c#UsYm6| zqY4A_*qjc;a80zvg^@&Wh*55GuA&`X?wA~I%!GZ2u#hVl54yzL_u!b93;J0`fXYR> z5L(XBCUp(LsBxS^9q_|+(n7b6XLEoR(vRAes1Gft@V)3w&emfAb!%=Gqv2eEkdEbh zaoAKunse2SQ2gn;lkvn2o$&l$;PUdZ3NCx(cbnLTZ#G=kBSgaGVLAwxUn$2| zhD$9lCJmQKQk&Dlmsuz(4VMe(vEXv{9>7ITu2;wcJOp7TciRE8D_{f6M$;n!^B6pR z0Q2Q?jGIdpRGyUIZQ@V(nou$27#~20gvxz%5Gr>nhXs|xiZEh+aVtrT!~T|rjO#@^ z##EuWG-SR-j|G`gyAO*oXLQ*C^SIvznBSNl378+l(+4mUzKST^ua8l%xnF*_i67vb zjWMecB4M+f4#Fm)92RW8bS52((?2`^FsF-0X1374npYy<@m}_`cSgY z6vvRv!z* z>|4RyC8jlEGZepIX1O@o?k6&kB`3%}7!s}vWQ7(QPvCaQ^41c?FG5@zjdgk~xSq8G z=_p{`-x^r8!4B7Fz?NY?xoJLadL&%`2u~lle)$^Md6dH7_42z-`~lzWHSnhhkr;e0 z9RzAzIV_-NL*e^a@oYRYCB}W$Q2;BCD%LGe28sjV=V`JI3yw){6KOaefw(jrbLg?) z_|`Lr!OsI7b~v`2Z-e7v(<9+{9Xx&D_?4E-MMo-7-XOo*#2kFH@pA@3Bq(d?ASkPp z!vf`(E}8$7WEijx$Gr>;C5~nfgG9zRN3a?Th`;2Hk_KWA;?h9;Gd&g%f41!~$oQwH z?La*LJR1|~fcCg*}tQ~B3A}$TK7J4kO&D)A}haqK_;@p;59`nz&L9Vw_ zc_ieL@O*8^9dNQ)!^8*j3;QSdWvS)|qT3b|8SEB|GPOZR*# zJyy@Z1smaq>G|Zp*n7TflC9?(O^@vPWAOCX^WQ8md;a1PX3uviM^?|NH7bY6)^mp8 zW+xFoLiKyC>bJAyWNc+=xd|{DP1JxLT5@#WXkW7=7UrmEe&dzjga*guI_E=yW z#EmeGFmA-9!FCKi7T6AUA>BY5=7>Mrf%d}+8_;eyJrZau;pq=(k@+UjeqLk(?T5sE!QgZ5Kxr&E5pii4 zjG)JYLGLD}8(`5Gw%!hdd(N@Jpw0A17%YXSKN#G2g9(G53^ieJk8*tFsZ)X1&~O7D z1mOdDJaf}F?^6d{M#^O+79>94rjmw43F6X_7)*}^iFY?5-M|ZI>Tx?PVrSc6vCQ;H zSlkFtf3TSST@w~}4KZO6Q;sZHq{SF)%Lv1`jGO^kudfG)Q)LYnAQIdm(tsF-xHKRR z7TN&uj}30nz*|8z7oYj|9XVc=`jxrPrH)h@n!n2l`*ikp+nK3TFd^wVvYL zk*^7e6J-q+Aog*?NCRRJ`;O&Ra-9A>*anDKIu8qofBnf0h{Y3afVj@|NI+Z;Pk(@z zHqQh^Gb)vUSgagbfEWlP)CzGdE(*!$JlD!88J%ZIpVi&>yY1aQ3UTS~7SLl&fPZx$ zU2uSnR{xdbD~&k&FR!B1Rh8h0B38(7d!%m@vsIL-u~G^jW=^ds`Y4iV>IYy@MXB z_iz8@u)Y5bS8W-ZsP!yc@0XY!+536$^w;|<=Gc258)WvrSvkH^?=cC!3C0o+iP$-& z?8kLhucViMEQxE${y9W>sXD9O+t0MMyTkOzc0U47f9?L&chGL$cs!qLHhH^ps3!L% zNx5a&_%}v(Vxc7F%^SIY{DPNNHfjIAAU%!)+IlSJkUGKjI@LexU0)Ag|kL=lt@buTS?N^&U`#i_&*@w#URePrT+CSIrng6vn?qYl6g7(H$4$!!At8rIY zjl1}3G!9p2D>u4S26K2}%U;PEg_dcb5%-YGdVZ>Rp!~EeAb$1vfc=x$5&fRs3}Y62 zI#|BrcLVlMw(ox+&oDs$_p|+{4phI{{uKuYZ2vmKe>NUj9H9IjmY-TPVEuBhcx~YL z`OI&u8vwp|*O~D9JvPVz>X!%b6$6*w!S;10^`z-Z^)FZY;n^F<)^f2 z6dArAvLKLU_>}_!LJ-)jxT4s3PX`*Ij6y?;GJ2p8&r~iPWxy;_0`JahdC?8M+Js!# zS}ydXgLqB%?dXBLg%Dw5SYGrENA$p;MMvO8-Q3Q7#YhrNbw&^5%8((QuOm|@LRxp@ z4I$@aL*RqyWo0Lv_U=}`;{lAJ-iAl2U3deJa%S-v(7B4@jd)`_9w8D>e*nvm9nRJt zVKO)$_q*M(!Tg*OE5P*5%^6c&S}}NW7!NG@dBoqYJEj*4L*|KG@2Pf&$HGu59=|<4 zdj6n=b$mOb*;5_yL(`x(a$a{eWmj_?&Xu1QHRt3kJ|nu!?aB$Cfh>^gcEHvSB*9a7 zAW)Bo+^*;b7y;TPa90N@vkl?F>(F!v^BIG4t0^D9aufTKeuKk&b2iZ0fd`N^W3PPU z`~C1Y@cI?rpBkf$@2&j=n>FM$#p(uaH;S;FT89X-YF!>K{U`M}mZJL7O(_?mNcQdP3%{+FNXe~%5{Y=9rs*1 zZYy1|S01Y=ZL2x1t>$>s&aQlRUC#Bs^Swdb+n!!X%oO%{OPka#aUEr(FaUVS2mkEx z4dUW-eyjh+GCX_);5TvzTVXe78theQrT$nD!hl+1mPLtLA9biqmU_D%iaoKVzV7Nu zjux)*Gr&tt5 z4l;)l_V=U= zWT4I_-ohy5!&g`|(85~T!mSbqX>dGid}woa`G?jh#_)KoB`XWx=8Au= zw&P-7d~B5X`UGs9^^dP}#V^zO)AmiZ85+&BXJ+45x0!wYN0`f&&Fm&+GrJ5JAf_|I zW;6TzJ~p#|2(lk<0^k8Q+RQGAO)bF#XLx=@S#>G4c!Axy`cYs$9W6hg(qHiA=jzr%c9=<&K_Mq^wsjZMf1^sDEgL;_W zCVtcoiP9Aa;6i8Y!SCFsxqm^fx3uY4V=Gi;Fu#g=9G4U_h2sSnKAoF<9d^?&9X#T4 zX7?dG9uWabF=!Ek&Oi{JJVutQY0L=);`2E^vWi)mD!!|#2pLeSH8vuBBMrGVO$``( zgU0x(_Ry;Z(bt_u_nv+JVf*|LT)vvmW#&ge9TagH8}R|5V)RrwAM?LDxT57Y*3>jO zrW}4pw;u#pWAY){>{-dU+^>ZjM}sxShp22u^kA_w`fK*r`M^h}ePHhC;(B?hqs%?| z@ir{#I>@@9$kD<|q6hPuE+CI%4Ln5T`A8HW8Ck`Rrv!%YX5dXa%;iZNBS%LMvc(4n zMNa9;h4RL<+WlQGZAm;c4s%tY6Q!)Iy z0Xj%Qx~xr}ui4x?-|tN&NO(xdR@_wTZ2b*;FvJhS4G zhA@mMPs75>MxJyl0*^%>xE*m+(0(}r9#M+)c<)lBd!&UhlUYjPln=SdC)w32fy!dP z`EchU>r5PP3!S;y+HcHg+d31kbBR+{4ZIF9zTnV!bPewf$~W)c28nq+&@hP;UYZ_} z>lK!&?-T0SGUuvw>UF#^$aQL#8*Aw-_h=GKWqd^5nC7Z7CgQ6Vhm4~AlZ_d>VenHc zo?=w)(xSov!-BvI<$92=6jZF^Drk_i<@$6a(Fe(fhA+~hz4;LB#>%Ilo3|eids3rl zicz%7&_cqf;)C{-B-|p`z(4zaCFb)vv8H@(yHQ`+~j6J7!1LjG? z@`9Wx=Hk$3E)Jzg=YailT075P9#V14A{?a_eL$cwh-=ipu36EP(^Fi7}p!Y4UA+i%b05-+mwZX|O)K6AA5 zi4UL|L+D(`;D-@x%!D=Me>Gg1C_THD|t9hIEKv-3#D^X%3a7ex*6ZT;fm7*;9-dtj#jtvG0HW?C3n){PKvd<%gMH zaoK?fvXf-!fH>X`yEQwKbV8r`cfld^4|6l~QW1#fsHRRy=9^9N{L7bFr$U#|{s*VR z?rImhipkRFg)GqNwgUkVk7p;%!{dN&Hu=PT!h(tIO@zLUq9P}l>>v9p7L+?%w*zaT zDO~BtGKhDii=hrS+Hc@cJgwL$!Xsfg!RGbA6z~S9kU%dG>T3bM=>A;Dm{%I`ey6bM zvO41u9FfNvH{v0K=c2jZG`s799UR-H1D;=ku!~&63wfXMDXZnSJ>tEH0cp1 z_kjRZ-zMgU9e6SdhPCnEdr{%S$7L(EG0(-Omq!NUsDoxgo3LpjW@zpr9q@7my*t8% zMs-<5P06Cu#fSGepp4YyGA<|)FTkzGs_Bl^mIb|Cc_Lev z&DpwzWmhznJ6mw_$T6l@;z$7v`a-m8sI&FA2%|dJd{pX#LbqeO$8T)s(PuuDx5>%x zip(H>&qtFY-)1tNt?;07xr%H^RafG~mD^t3fOq6}f3o}Jzj8!Fc(6>)3+A)VezF~{ zONd(EvdXmLjP7I;N`}mUyfjPB=_kR3>E;uxgJ8wmI7nFgocDBNk^REn2|V#$UC%zS z2gimgn(8Binbzr-$=C@z{a%h8rrh?Fu$+$Bb7k~DGk7Q8Kx@8<=gSu(ORx)+Ca*K9 zD?>1i?5OsbcqK8cFKQL_L~km|iTDYd$}dP_$w?t!)liSeo2S^;R0JeZt&gWbK*NJm z;0S=2qXr$;irUJBw<}%*&Vhj0zd3hJTHbsj#K-MXKHgYoydQwcG|AhV@G*v&?@0q0 zW8(s?Z#r96V6rqXy(Guk@&Is0Gd}lM%%0_}S~?47w=(E6`tfz+Ih05p9&OI^w=Hcj zTOF?SLkW@V7-GV1G?eOG^y5^kUfYKKUXaCZ=u|Q|IoM3klAD)K%)z^r(WPK_9mfJj zB9~D+7ECV}pX8qRKj1|z9V_WkH27mS_-v*-!q^#dBto%=lv%bhZ&8brMC@rxXF*ps zw{~s-t;OSm-HAugq3F_C(0?P%md4HK8}iAD-@nIarJb$Z?xRb~0RU-P1VeK_4wbUy zV~Nv%yHe|ne1kpbJwK+-bj;2d!cIJVI#vvMjTd?7>DW-kQdeZO-?MaLcof|A;iDz% zh~w>()rG&2fUWOC+H$hlmR!W)N$?gDKIj1L0Fx2Y`mwY11-KJaK<`K-sIBC~>?dfB zkJNxF_(0G`&#j(|_gmH>H4)ON_Bg<07ESWIdKQlSG`8-op4&87&Alb`EIM~g z^<2DS!duF!9>@Fk+SF)t;tlZ3Xh`KUjs~pYqb0g``dnx0-4fNei69i+fXOGBP$j1) zvBZq~1sZY=3)`i?b2al5ed~t8AJ=!0*BPC0GQ*d8pcJ z;jU#Q#l|%qn_L!V*sG$gi1Fh~B4os3sPNoMN65en*sn*y zxV*cwE##g`T!N+XB8^N-C^7O520Fv))g5UUW2f^Tzq=0VvLUihv_G>TsvPeHSnGiO zm_^(y0tOD9cttf3pXVSeH@Y41EE;dtbR-AkM}q+ll8t^GtzeSDn9&2`*YCza7xj{O zonnmI)m{xUDNk$J99dw-<@Fl#(*!Lx%~9IQ1Cpj40tczuNPfV00k3ba#B~6CdH(pt zAbGIb7)9%}c-~OWyD?lCbUaHS&Gj35(MdMl59SBB-ysK7hn4DMz_FRooDT_7LZKbd zp-FcV;)&DIX{!us^L8N6(hn<@fFT_Aq1>l+{E)%4^$k#KrdlXXmxFWLBffYR3%7wM zkb}l2e6OVexWHU*mack+r*p;akJgc zzI31){FWj`o$(f(g>drA)stUbHz4XgI?K!`Inm*F$tY=+y%(w1OV-r7*Vzx4mQoShX1t;}p` zD?)XM1=V6jjug;V5|DHWw~A)8i(eY{keEx>@mxJN*+Wg#eF%lSoa0cwlPt4da8z#~ z0kA|IkB+S2y+pcc#cQ}JK$ObT5#?$Gi^hSRps}605wvv#ziC4VQYLun4!P4BhRB_1 zEq9Acp`+p_jpK)rK;q-V@2bjwvhTlJIhN~JkHjXt%sn+HJTzdy@?yxXCt>pdy25D3 zWTPa;cX4%Su2bK*7-6(Vu@>Jt;|dp_BIp710-#Kxn2l+j*TH$fqmyP)sU&h4xE6t? zBJdX0Gr!%(1)v3{h)07Gn6SkYa@RTU>0}eq%y1ei=|F8k1Mg^Ukvws_37j_)D`%TqkwvZGZAO)K4@a@|A>VLmoLu9*5uz-nAu%toC z!8IF9aTyTYhXdpB{|}mbX)(d4nk#3fv!xN6ve|A<)kHn~7KZT=CmVJZ^j*gz*`9ZNM8p<_cD_ z+pv;hHEhO*{AgJ0IM8%54oqOqED?`E14V}V9WW977nv9Y5SG=w?UL2AM0^iP)MMoV z$EQ{r?nG-*n4y=D8G!epXz_vppi^K(hWmmuT7qA-Tn_=Ygh&Q zkzA#NIL!Nvl4rsHgCBEYHs^;`sgX!hP z^oqEQq@%D9t+1;-EFmMHq?7=;26{ ztjB1D+t)2(V*#;_nfw^T6vd1UGEP zB!>lX;TU_!Bm^H)gdhkW0LdhH3K>nJ5bZ&uumm_CoAE3*V|64K-$@P1F?s+5;$}m_ zFPrgkWbXPUklPe@yucyb&-&J(K4q=wy@=2xV#Fm-WzqS*Zlln}o7uiju*Fgfegd*pR#OQ;w>7t&Lc+2u9RU7Kd_q78X;? znG4f2bmu=q$sUEnt<>97lEcgov+vyA4yA&I?D8B<@3T zIPpXxLa{B}jWo%VOyZ+BUZ1ju4>l8YL1-=~F#ctK+bnm8KeM2nMT2>5$PHp;Zm^=J z(Ru4j`Kk$AI{aQ=>B1v8o#Dwz%!W<}u1mN`^JbYwqS$!0fDNuQ28GavwQvSnw>Vq( z!J!#d6FbEq+)Pj+t*RO~{vCKgE>`0T8ttmLF!5iqE9kh;h34RNO7rGey#~aoFZTS` z$EZHxMNfG;m)$cLy<2zaIrhtAo zUQ!Q$pIrFJ4R09=x#|Id`S9-l6fpZgYGQ)=6Yru0Q5e5w+coFi8zlmwU!+jdz%)VS zY+WdMWFhz5pyPtM2xSjBP4@At%sEOYR%Jbgw{&rWe)s85xeg7CGh3ehPjz#^b*Mfu z7~N!d*w1x2&G2}87G);SDcCF#5jq_@&SGSuTAqg{>5-M6M6of#WfvpzF(!6dL0&^l$jjdP@$y8`aR*@-k_l};>eE#E`AlCq?ga=r%2Kn{Gr+u)R)|0(o4%q(j|D}X`1tXah+%36gIrQ}Eh zKPcPFu{{Z_uES27yLSAi+I^U5vrD$d+I{YTkJJ;}=Y1jFzNP)b^@HvI{q`j%3_x3q z!+V5%Xp0jOq?r0EH#K57`r+%R@!c{!g$z^xyuvCE~~{aJJ2Kj`w!y{!@nYiR{dW z#NT(g__!|npPeLAzJc<0Z_5I1R{2K!`|RKEvy-InU9fmkCg)7-$WkW9XUYgqSMsGe zKS7i>xJ2B@{E$`^bCjb&T&^6tm_f(vd8MuY(v2_h`fcZ1n7!4-d|)=Z8JQ*y)RVs&2Hl8B;s!K(hS`djrZ<&embd|^DihRfDO`WJz@=gD?S*@O*%>(l~Bl z4oqd~1Iz)&|Ayp_jF&PV=)Qei-`8hfQm7kAu=A_+&VM+f8)o8+lQ1 zvenEiDD4z=l9t*jw)6n6UXFBjPcFoW5#AXw7?Z((;w@aImH893YxaNbJN%e$} z(K@+#8{ih~9OZzro@fS?+|FA-d<*K^u3lCcKY`V+Sj4hL8W?uFb!Xy0g8*l{tx1R=;6U_(>w7eNU$*8K-op{Q{*9~s^5oGfUvjwlEl}U) zzqseJ=13v?5MwQEH#SCBl;%XhcTfjhD0J~~!aX)tb9L*-k?+9AkAhL9AMo&fBwz?u?=^?5 z>)qaTUDtg5x+Wrv1|{)ARK_7c<*;?FLS2bha8wGk|HI#Qz1xK`##?e16vH(7r2wn~ z5+*1wxZ{d~q+<4dtmub_SXrhQ_iy~#5W4|c0I_Nu{_LPGFnRizdU9@KXs}cQ>l)D2 z$WkoEr-$M;hdTOV$V4_xW+QawR7-CD2(VCOS`iR%r70 zp|x}{&%(JX&nPR8fxFS|q6!4Rf{Q<1or@`t*B%R0Mi!|Vb>W_l zsIWMzBAqRRr58d>Sf4%v3Q7Tj=k++QOvNRnUWx zczqAOngjjAxrLEpa<%8PAs+FHWB|%Gy?+s}xUE*=>1;T;t)ka!o=(l)XnfUf!vJPf_@^eiR z-s~jy{2p=fG>fjX2t-@FlDD3aouqHPB=4VIX_5E#v!BX83>edY`&IlM5U4#|{Ec4{ zf5Df;pEY27oh~k}&#F8desy!jiQhXMe4Bx4VkfRg4%hzQe@Xlued58uvg?a%1BITg zF9H(X1yQ&9Zmj|J1H~^XoB%1OIDX-e(uOQ(HcH_T;Un)fTax zQV6ts%(KwyMj}04QYh}fAs_PRkQT0n$P3z3UBml@&=`uEsB@Ciq};NwbWl*JC+YhZL}gnaW^7xhYh6?8F`a@ zq0-oCeCBvrkLB&~{%z4Z^5Yu8YK9l6R;E<9a5OY^B;+|2r{*9PI^T$Xmb<7yhdRS& z&%Os{Mlar=gF++@_&9C2#JM;VM!Qpyf9UaLul9ly1H*+pV&nCsbXv*tCDR7%6P0T) zbA6V(cqgj2pG(PSkmqFAgpW}*SVXW<2zIl#x^N-3HF;INO+1O~dtAvkCWp7<{0p9q z1DErS59gBf`T>B`0#5R;38ac9AM_BsOMT&~6aK|h^?1rB?p}vo+S}yQ3Fj`|SySyJ zPT^oO-2?6F5X38?V9nQ7j=nZO2iW2f+mMAd>alsaGFghO)gHVAHK?tqKu>k)D^oc> z96ncJHBUDeDu8Blhg;1(N6z=Aqt$$$i3Fwga}@T0Q|AI`$L?kc!y7g5;X80R-G$*VI8>x`23 zjY-C(5b~`mt~17d3Q^-J##m^b1>oHuGTeLH>qcw1Zy4Q?$b-;d^Xs|pTuKZNr+DXZ zEnbsK48i<>FYH7(lu9^T692{z%M4(SK+A3Kp^{z@Iex(|>QxWE!o{wD5rBwT-XHz( zqCsqg{uT2g&l75SLPjlKe-NvH-@C;b!jiN_bNag}FFo6+E7rUrck%HZ(R~LsM~C!S zu>qqFx;Pd-?Je=5}eO!{Rb!;T%?!GV-}z ztXP1P+M?Xpg3{Q6ve*J({kz7y&Re$vV?qWJI0D9I#36b`8>>4X|0Y`kdR8Sc`ig5)cKcmT9_tqWpQq8?0V^1@03IDHiQyx&wnEdL2IcO}E^15%yWcGQNmM+{Gn^!s^Rk5^m(RZej5-z5ioRULvK}K}4VBlTw)n)MNgRV~%Z(Srh%*kRyiJ~4_RDHF z%WChD8%6*4t=1KZ18CVLg??k3^VZeq9?+eS(1naae&aQ*VoB+uYwC=89N7mQI-GvT z%R!_KcpFNawB##5;NFTQh0c~LE-=#Nfy*yvL}{IoqqX}AKojga=xjZSN!opb=}kFX zdA`DPldReA4HhnJHm)r-KEZ?Q-uE;ZJjC_>YtCC=kpL^ z+O5G(N#0arR0rkiG|(z?7FnvgmbxuY9BFmis#J|pvRZRMRjc&=aHxdO6(*%Q&TL*f~6^Ji~d4+Ci>yTK|+D-u(GEw;hrH@D5rNrZPE>>pp zi>*S$bq_*_U@!88^AltjYwOrUJ$}Nu)!;qQFo4Otyz?q>{8{|jNR=)I4JZ@mfdisV z>TK+Q3YYj}P~(Z`zq1cCPs{<$(PAokyc+brO2r4jA9wno;MDV# zLFf~Zfgbc8WGpyLd{2h`>Z{g)6AK&U7U}0 zPy`e+5a77p?a2lM?~>ZD$j_;ZFUCwgiqbnd=mVDgeL>zHZG*~YsnH9*n&$0*0=HpZ zmM4w}XA~qeQ%5^oq1bX59J&FuPlo&KpraeNbcO!5$>sjo`QvEzTi``MUy30$`z%96KOXehXQ;A(-v(jbQd+r*NmT>uFj)P-zB%+)URPj>as z<#2J4zX*j{J!JtPCvkuS&1sDl`}&h_qp#Sy(8yWt`6w)e!gyJW5e?zESBhgd202oW zg-YjLn*&k{K{?2m;3SGcj*LomBOe%1OfPT@ChqJqdJ{v?jSzI3uw;N^S2Q??`%ss{ zhV{Rb*Z?pF0Y)GMb`r=tzG@;wwM2-$bznLX26bK$K7tHYsX$XGnVKB_9wG$UM+gbU z<{@M+&6%4B#AGH8fwhPC8pm{7DB|r|d~7II4IHTkj#Pv0Pol^`jRxJ0y28J=!!}b=572tq6 zVeDA3qmmn zy{e0ibu$8kvXjf9==?2K$QbrLU<~vOzX()Z?;g7-Y^^b7H*ZAq$j!yV|08*8!;ZS= zKq{{Yn8{wXwYY~X=c#Zy;e^2A3^#a#JH!|7;^v0b7@NT>Al~~-iRHbhrTp$fMNy4i zc$;S2EidW7OV`ItE)I_A(jB-*cNFL_U^l~B4xw`%1j?J@j+p$?dhF(`ng0z|Z(@)( zMqT|W1eyoznpeg~y}9sHz!TQm+^}Ov$d$!vMmZl3xliwW zUHZok>%pV0j5!ll+D6M8^c~`D;Fbj2A=W-Xeq<gglzsiSQDmk)i zaxGNK)yykiBTdC5(^Ih+_Wvm(^xm(rymiAGAa}VeqJc+8`On6etScAGE3=q#NMVbQ za}yIM|0;{Mmx(vx9Cxu4b#lvvNQjO(f$M48oxQjP$C~6Yz^VZnzDQ2~OWHPNTD}Bx z?`;TLlo^GwIv6p@e}-L_tQsX~VzoVs=Vt_bUA`$W1CswhpX9O~hsZhbmU{sC0ql7b z%Xn!tmp8#D>&ESJXULKt*ddPi8(9K7MC?H&KLBcoy^-Q55rmnow8Ic`9pX6ez%Vwz zJALdGE8fQM3zmz~C=$D{OB|~l#iCd`DDD9(iN~PR953AQOG3-|0Hh4)tRQ)u#PyNq zMo3TWP`EFuFXb&w_*g{b9aCV<2z2Lk84($($4*LB7fR;)AYV>1YcXw<$aZCHe<)Rt znZIK5_R2j^DGg{!X<#zMg-M3RYKuW7#K6mo)w*D+B33&VuJTx|CstbtmoHX}Us$iH ztrxGZ2j4#l?1mf>kDh5WAQGlFoP+Jsp{!UToP`%Q855smwEq!Qn@VHaD>RLj00$!H zKvbz-Z2Bdee}PZ@SvktZAC=5rDl8>@{V3uX_-#OwzU{hi2KS zT!*V!+NpG{`zm%S2W915X67CH74ph4sW&$8aq+!TF?J5-Mmc}Rb5_9=*Kg27nlz$i zgQz$zJSWu?4n}*2Ia|q3Gh(AK8;wo`7N0A=0O#RIAjVmf3UZQAk{CIf4rx8dC2sgJ z!NHvaD{HwprV^HPuJzo>qgnV$sZFLL9%Dqk=gtv`hzwS8qW|z4E4ih>xKbEA%$~?| z;OV%MJ3M!C?FeIOyp!}?(rE_Z9B^kZnx{%!gA%2SFMg*gOpo{uTyi+-!N|?v|4L?r zz0)B1UAu#^m2wUnFOoSdsWRjFAPD+vyy!PVVB#$@q$|p9hme;-^} zT^XK4o63a1CbPzGMCD;&Wp9GRAc2k@ZKt@n2U`#n*`*z{GO-aig}xT(Jrg2jq9hE{ z*BBKf-7Zd@WZoE;iFY25vqQJ!gRDg}}V|0}RLecog?N1tB`$s+O(0nLXnzV3{}-`vb0)X=LL~ zBnO?kC>Wo$9f=V;Ct9&25-^WrEDg5I2C)c_IEO`0Vq`6YEqiG{#>S3C2YEdr7hP?A z88#-6APE9^4iuN<{nf&u#(J8GwQ7YI%F;5IK4X28Ye56eH=aFsl&$W;wR~N>=9+or=~55zCAvC z5!BMA;O~5xPYzFL*OowT;+V?v@KKfH!_LZYg^#WDhet}G{p4A49*ci2H~^rAlk3PF zPae09gm?0&bvcdr6s^l~;gi2EXDy(DMG|)p(oPOnbDkB6@lv`BT>Gp8CV2H}v#?~v zPw421k_ioSx^k&CZMMo81B)sPhc+*rk>hOTy#QU|dEj`>)eXbN;lNy|*Yi_!0*lL# z2D^}?cc<(6H+j~V##Omr)uTN)BB-mP8?6Ei&1X((9;oW|3e6Y!R;s$bt9nLGvKf4R zJru8Ppu}4PPk&K}*Rn7D$pOS=1Hfa+fR38KZAB z;cBf9n7`Q@_mhfJ9l7GW1vuPoCc)8mq1?L10*6m4PKPd3p+_V1LuWd4mJIE0HU$5xz!YnB~t$x%1ltOWJCdv}0jDi~9F1pZ4u!768_eO#t}oN1*f?>)_Mk%m9{0!s55 zw85Ma@XX8~(q_xY4LrY;Os-E{nw2IiKhV2gOgd~l=)ZKljlPSqk>Y%I!>DZ(XDdg& zI72yn!Yv(?cP6a|4;BDDdXq0FoDZcG%r@X!N?Q6=G@yCy=u0o*^7avyzh9s5@f=XL zFp?d1pH3RLT(4N*gDoZ8Q-DQ7qi4xU-f8ts($HR+7(5=&M@oHF0h|>}!1p$K!Ek_h z8JBZ04hwL1;u*vR=9W5WCSJ5PFEAF-&?Qo>Fg|EWjxzW$^oUIFx z7KE2e_wI1ETul#V?tHNcTbPd=t!Y+}s&Cyy*!MeE=9yWnuiPLf_{ujppH+f+Oh94= zoAmg|FdY(>k$hvOo&=)I1TDix*DwvY>-L%@s3bfRi`@t;c1K{b%d7N9M*1GhO%|)W zP3*kA*B?mv+V}g~rC?W?ST+IKVZJ^``-7C)!knf4jVQ(1pSU04dVFR*G;^dhEF)47 z*GUj9qsimKH%61khilRQQ=*@_BM~%nT;#@z#d`QUWb@gx^&nevhU~{wCJ6RT@GB;O z3dT-x2Cg8CnPn^ANI6rfVY^f}C!(E64CBm3d#MYN$+Y}gCf1jmW(mv0iEv74KW%vF za?>hd2FJMvRV~Om01^+euG(cUo&YM^k84u@$&ZB=>jzS*oYPXAslYFSen=fmw~VZfN<3B+dC zBWbwE?|nl@wkw2o7BKd{+>oyNCilpmt7Qnu19AfK_@F+ zucK4qTlaC1q8z9ii(3_^nKRgeF>tLR*@5S`;7wxQo#H9!Xf@iZ#!FhmS`q|X!+;cdpY+%|EBy!9dBrK0{tpOWNV&qOR55J&)S;c|pAynDMT?ab9!3KE zB{dQ>O!Ork&O<@Cm25~3(~O-8T_^UiPl^J?Erhhy=s{OP#;4LG&pw(~31bFbx1s*TTi`InQiQ^ICZ$Homu71Vc z5?Lds=`e%sfvrF$!DNZ#C;p8KE$wj#i!O8fv?ob9N_4i3G=L&48~tY>@(}8itp(Xga(Gm{Fs>j3>gx!adlGj_VV7v}ZkUK9g z?;E+);)~2LL~3N)><=&=Vwx<=a#$ZrW%*!qC4LHcD>PqHSFyY_vM>NN4;p;BV4En5 z%hd{EC(f3eBpHGOq*q&} zUMFGGS515ZZ~A{6c*!dUE)pPSgUt0HIb1rDgH695*M6{4E6q99hoFwMkKHqVF7@3L zxWr4V(5^*9hNVvt#`M1oy+$3nx9 z<6#^AgWIzTC%u^F&&DB3y!+62i=Hf3dZt4xda_)x|0OAD*JXpy0}R=M*B7GZ;)}4R z(G9Ewj$peO1sRYsBM4EDT3p=JpvV&Jm{Uqa-Yp9UV{g73DT8CSP`Xr!m6DFYMmFDH z@f&vD*>W6G_>KGM2~60n8QY#sgukg9e{4noZZ1I;dW*W6AkXn)65=|~R>zBudN!d! z&HraM+~2yt!3>(_WmIj_uUx1bfFG)n~Oj(IK} zSNL*%7$RAPW)U_``B1w_9;L;ra=okA@20`%Ca(83 zW$ij<7QA3F(}1w^cDM8&X3Q>ZV7Pa`AP#h(JOMjXu> zLFkw9jRHf*K;=Cfa@3b5^FoekrFE^lZz@<91x>aQLtPh}UK)1P#YV^no-+21!PSxs zR@2(C@Ead+M>90n6l3Ck&>xl4ovnNkVtqY&B_6n)g!Eo{vIw6LTS5x=j+4#nilyb` zLB*EhH$+iWIH>8^Qcylii@T~_c!q4#{!naoS;+gA-Bb`3qjEj7wIKzh z5}H7G{F1zJW$`T1uc$dqF9p; zA}%5Bl4Y=%%(d6=y;Tm^SrC=eJKxCD9rv=uMy*ba;+18pTGt&n7s^bK?dA}=l0CuL z<=|E)YbwV_P69Nz>m3t{Yx|9h^*UoaF4KMD6ByP<61UolP%zQ1&gcnodoXZ6b=`AeL&{6O0pl{U%!^^cmPSwJF7-s^`0-UW_!e2FjWvTekvzc?1%g)zJ4sqnb*Gh zNBC`v^0$5UkENTxIB`Lca}VfcpnN&*$`VU&vfTozO*WzQaoy~6pw=FwJ9Ej`Jn(gTy_8jF2bXcRH!s29!3;S-CMBS+jI9oxkmd|7vQO(6g!xx(g!gshv) zD(zy$2iVVe@BswAW$KUn{Ij>s#K^-fhPuzYl8Juxbz^d8uam2+!%eR)ktKp+vwGMdv z`1Y9JXYf@wO7RxA2W9ic2Vi0NA7IGrmo0l8p?=RpGS=C$m%g?~cq@jh&T?|QeBxr< zEc!jaJqm%5+1jKp!ryMc+x-fPCLIBIK7_lT_Fiq$=5PQJf0Gerqc6+EorXgjXdKyk ze^m2VR_l&R$#f@I1!lMT^=v~8>;=)7cw?f`>Iagl-Ptg0X@MVyD z^+ZkpPZ&^8X;>S~?m~DFqmqw<#V6IC6h4u&C|M7|ihZa;WsrqYI!Xm07qkIoz7fd4 zzH}h1D2oxNm9;-{yy=m>9Bz7=nJia&2(M4tkU5&BvGd;4vgR5CD3;YN!3!{pFQ4ugf9w|lPhQZ&MK^CdMVxGs@I$gSc%R35K zv2Xh=QB#9P&V!WZceK@dD$F) z#p&T%99=aBZss}%!GBuhLp+tU@N86D)r&5y8dZ=ZTJN9)>*k0{HD-9<;?Go+d(v#| zyT=XO*t>vH<|GG+*#aLdDgrtkaEVK9wIN5y^vJP1-}E#y*?8&USeC(MbR~W15{@y` zt!28Qrbm|WMXM@Xmat!XSi(QyGN8<|X+LsUJF`?|$m~aPY#Pf;2fqJ6JfMgBkE}FV z`PKc$!0}?}TZbt>PJ9v@@s>{iXA!&;)ddB9Yrm9oE}4Cu6t>NDMF`#HUc6J>2hlHF z%$8RcKp|^)$`M(%|JRz6<~|(EEltT0WK16pm4x`;kgly=;%yJGB7*X$6$GxEZ*9$4;~T{DCHAuW=5LVm^p9C-?Bz4QUfeZc zJlo$OzKsoTp!ToqB(%ganI`Jdgex(j=zzSJl(>hpm>u&V$rY182QGtCPF!AttM z0#UP)LvO63+pF9U(tVb4ljs&FOLuL9I1UcvRI?&el9~=_KS?XfjU^uV$ZiISpvr58oEbM&>B?EI*Tg!T9))9HrH!c02-8B?1Y%AXU@5WIegp+v?(`3+!Njfpu_YFhXOAXsK7NB9KcP95}Vi3 z@=BI~(wRR8NrSf?rA*RJu@QIH7&aExumUkfb5P%4B^twn6PqFKI|{eS6!>dUl67*p zY~#hZ1~<&Gk45%)@_zD(5ouUUJf!T2-D(ug8ySOQ=3BQ=M#5njs~@!L@Wo5FrSgT_ zQEeJDd{1c8PH3+>u}wQsK5rZCbcq+*9$*XofOoubcbPAHlsTn0+;MRt2-RRcsKF|k`fv%v*`{4ON>F_ zefd50CqzyS;1@5;KoxPLp=@(%-W-2?%0bN;dKONoOYSx{Y-F+s**ZBn8x1{AIyA42 zH)3?A?4%n>H&ABJ(hV-BM6NpV9bPy2Zo{DX)Ck=oaH{S-STHK6A7TD+wDAg91A)6Rt*@mO9*)%>hIp$-0b^ ztjlnxA38^`JhDi=Xa^{?KhvkH8RNT_o9f}*c>qP@}eQ{PJj<7c($KHq!m!!Ks3ynb6?*mUkb{#tp1cR^#&PN?N z$ysyGg&37Nz@=Hm|1Sz5Fl8U_H$8w*j<`Eh{1-P^ee{rPfnoKCi;l)7g|5z5UEP3} zonc|TELR?eIlEYhwhrml_zE4QexKPj&R)6OUimSZ%9~L+`t}sK4-jQoo)f+h%_V&e zG7FcX$~Il|vJt7X!k&uT+@!f9qtZ*u(W`JSROzj>MrT)E@mVSSj>s|1pR?ui0$Q#M zgoU>5*mTQphrC3emM>mx1KV|`rx`iKpA@81G3>SniFFIL=lrzSW z;?rY#s@n5LOxmcm4GIs_pqWnVKrbzP+t^@iYnzql!Ybr)QEdS^V8JET+3azJKgK<2 zJe24192?2k+B=h@c`TSOJ^{~_B5T0r`AnAQfvjf6;Dk=O=#}qyutI?Ngb0e&4p1nn z9Yb0=w6G$qtJ6N_WX!LaX^ISRNG8{I*_+lYs=qOnDVH*hG0MT$9?@*0S zJV{lA7DSHI@bopV#k^Y=?l;xSAEx*@K!aOE(5pQ-=m1Tdb!QLc;2>As*?a!SyWF|S zmnez|IuQQkeoB6pqh#?r428daFM9~SghOlJnEV6Ib0Fz+ojvEWpvXuTEQ=eYcZ%~r z*#$+^q!XE;LCa=|Yf%Q8kddQ@q6K=>G*rqyB$`nQ7%^9~P8|}d7~3Zb5hlhVAB6NT zeHt_@$X3v!&U-r$05MW&$F8)eYP#OBX6b%e!!SZ(InA5brA~UFap@E>?-^YTo)H(9@vj8Ww@x?-55x;t}fK zQh4kck(i5vARgAqm4>Kc-vx@_SZVxidC=VMN#=8uHuyb*A|FF79CoaLaA;RUxS+cL zpfTBC8G9vwIGXb!aK0R|IpPUfT^i>(f2{MCd^FeC1iYJzl1L@g10*;EKwAeLfF+$b z1F>)T+h9HC^QSltdTf4UDDG<{3>!r`8m{4m)Ycz?-qqsQyD=VEi;*tq-2^T)RJ$+1 zBdVMpjea296^`w?W3zY1!VhvE;o;iX{skpLnSmE7{K|r<&iULmvh48h66dqo?OfiQe=#HHU$($#yMm1c38^uo{%pF}?cy)LferNNw&`o$Yd9%9O z^tVHnP_;nf6N!dR1m26#bkHVk3LkIvELL6iG(bf8TwoZYq}1&XLG2QY%`$+>U@_k2 zeuhQdYZd`v7*#{8dTb_l9B#4FIaL3S`b~T%c0QiL&2M6Jw9)~rLuju z`%26>YI#jRF&{WmT`wzRMYJ9vwxNj#ZA^#882TrK`aM5){~8|WJsoY;H?bSl{q&P5 z#K+j-nZP#06W6P*cG|j1`jw^r!7BCUfl6fxvG&kXJ^hq=m02nudvUhhC;N{TU%XDL zmn($pi66?q+uTedUPQ6}3Q!y2Yj8>hGx#=$$+qX^dh$+-Tm-Xsdi2x$WukfMl2CZE z_V8JpP8fL}zWxrNuaQb3k{qS$fYwAhFd(M04mXTECPbY z=X(56_ZxtUQQ+)>7*Gq30;2Tr1TD1*MvY3f z=;wLPRSSSPST&R5@xuH2G{U zy92C}|9h3W0#j~FuTZI+t=rHaYl(fx-CzQDD1qy2r80*e4}<$Ier=}PFUrpNCTQ^ zE`iX;?o(fS*99B$2kpcrX{a<`GY*>pQw|&N6Q`%+ZL%KPOl+_cH?hIGxWR%>khXUq zu$6$dxU29> zy#RHE;aQG|EbG8!Wp!HK33a_ZF4KIcKc}oI8kPB;}oJJ*dd@HXB7gjEDw$fBP z?uNT^a1#bYN4MXA>tPtjJ6@f5{znGy6gT4Z$+~X)8IrRdSfIezhbqB#@g5FbW=m=j zD;q$0!^CQItuhojN}Keav-NKn2H&4>6^DzoNM_;+3IL8NkT>T1s5-OluWm{%v+VV2uWLw_05?P@8Af2dX zGX_P+>Q^RyeT}*LdBjiXOgy9VM~cyWyZ}DwEs|a67TU=4H)Yb_KqpM?Bz}M_D)zEW zY`qn`6tNtXb5;zgEWc$IjSkLKsn5uy9&M$rOPA%$#OBeN7@v;%XimD(2|C$`62zj( zVW>n&t1COj&zc}5(f0I@&~|oXB)RyE^oTYU!`;^(JI@c|vfSB1y*47CE-qS#GO0i! z7eH8vg384wDwQ-a;y3;oa$rlcgj=vNi7#+bPlfLvx%Z*ep!XGL%R_K9dtJ`f2jBqk z%E#>Rb~;zz1D`hLmDEP>MyHg&j2BJN9e^#+@r5t)bHpHQJ;cSKj(>Zh!MAWt@;lLu z`D2p)c-{m*1oqH{xol{e$bre2HR<#IAK7d|cCOg-9dsS5I&^ei3!lm`$mK5^mKus> z2Ap(1u664JZIv(_$HM}s&qc_~9+%5y3q6*3gn@Eok!7OUa(YCBPQrXGx}t{is!Z%m zD|S^n)}M*3Fk_R~sEns&qE57;LMm!_Cdy$&jZ;w{UTwC^BLtmEs2UI;FK5Dc(TPSf zqCsqc569q@o473Xw=8C@dkx~kPY$;(dc^p{#+QjB4;%mg5%(qVQC3&`Sz%; zMon!L)JRY#jLQs}kauJP!8IyMDoU|#G0XspOK=j%%tQaNr6^ggS7B>A`#CoZn0}&R?x&&O%7sO;v!{@zzR`_Mqxd` zS>5|I8%UZiEL~q^KCiADlAFP^i*qimzXi-}$enR-7#P+nseIA;Om9n$qp?*O1lb$? z*)N5^zPvtejxByBBcm|G{h~8G4_Tij$B*NbYd*wATH4xT*`A}?fru>su#Hv2+Cv|k zV}~>OB}mSc6z|z%$`Yn5wNi5Tx`&jaR}-Bl&yuJz%(jqFFMQ5{3=nXh3G*BC#f@T6u8OE@eTQZw-`k@dQu>1ypde%{pMg89$l?&L0Z3g?r{!()IUJgF=zG%*!;o>L|%pa z-TIY6V48l(RKe+^%6#6rILn{CF}suG^(EUW`ov3dO3&CG0YVEXqbl?o zEGhsF32g$(FD@XIp+Rne%X!;X*zm~~lmk3P9!;(!;~xs2&axT7TUYhhWi zr|6c-8=K2-R2y-;*3%eG0#W{A_Q%C&8uYPAmasC!J^1jYi8*W-4E5l>aC4LTGe!_a zvNI=Xbm2IvR^r7EEJQ4Uau6~H>&XyB>C+GU31p5Qoq_@=c#a}w*hRFf1{48|_w893 z{wAybZInh-_nKn?WhWbj%Wl#Sx8Wi~7YpC$xO`e(_(tRMY5mldXk1L&oa8b5g=b_( zkw4@=0Gwc`?kl_b8pTu;fu?}5)sA!AHaw^@2vZby@nZwg$)0$B%NGck@6yyAjI3W? zU+#-eg;wCzJah6~j$QK(oJV<~6e__GD+**@19R4pqtmjobWn( z+QU1uZn`7hFMgrf9X}6$6D%Vxg<`YmxygV57cj+_)2u3PKVWa1aJ$g)2%dU*{r(aR zB@2YtszRX-3!19{&3szYvMx#Po=9r3?pJRY4|Hl&qvfhqH(IVjRRvwRKdvDqp{GjlWlupYK{%2aAUH5>qb*90 z-@TD4m0C{|OFozvDMmY~o`<0mgiyc*)iQ!WezCvo0&dW-B3ugSdbIVM0?INzEeRrz0)-y~(*EbNE0abgyxs%HLE-7s%O9P^4mvz41{VBZ_ zKmz3Ff&B3>%b6nAcpVhbEg-#R7$-|H11tZqV~`2U?>}m4gL<8ww6RTN}JcZvVl8X+PYrIQO zVP)pIMKCb&qVjFR#3vmv1p5Gl*1FdPi>$Vc;QUxaSU6S7nT9FiIs9cML-9BjcAaPe zalK2+1r5!N!IbB~^Y53S4nEmX?S2&pUu0`QB)?1)YXqG3_^-AhgwCv~!hAP7gvErE z(#}H60FJ@fgEh(F;jQwWB% zuvZq!yMxdofjs`HWL*_X3f++gI+Q>X8O*6Z{7R3+`3%I|%sS#23fcwG$T8t80ybE$ zhO!JwIH@qN!guW@9qV0s5sJ3apzhwtjv`l%H$Ari2fnh0#Kv=QwAEcFu~{rQ(PO9J zBov4|RMdcy_>~qAb$<6+OW|HF&8rEwfK+lmcRiQW)UWjhmq&TX+!7jjSx`?so~HGd zEj1HX7K6Yjd1|PI*BJ6Tv^?1?nQAbyDduMcvd_U%AV+&GBVv@D<8d~UnaTd7Qk}E$ z1Ej7R27RVX|Mu5Wm@is^scSvebfmNf2b)3wO==ffy^{p?PD*Y_%7OdY<%;q;3o=Yy zaiX*bB#i}4CPBj(@u)}1lafMC>4)mFpDbzskfcp2d121;=-4jA5_I4Lpzk2+rO#uZ z!s*3AMKVeZ+Toq0tG%uOC!)THcfX92Da2h^G{5Ye_?0k8HL5LG0D~2SVXz_(1}hve zg_eU0?EM#I#s_NYLJZv3ioV8N;)|L64UM^JZYf z{1xX_Bl}nOxOhM#MGrFI-Ael%@oHX^7YFMEyPVWShAEkoX>SIvz-RuQ1qZUP0l{8Z z0E;t)@Mg4E7E1@XsF!dAkndfF`3Tx%Fh3lfuv5x_xe8~~`zQmOgx%9B#6(E0Fdo39 zKO2C0%C7Q&?M+wa)uc7P$4kms2&rw|+NOaZ)a?J*8yAv6jr#m-;Q(3ae-}PBZyi8V z8!b;OJ*zFxB6^+{50|>f;R3~Qb?>oPP$R6DO}u;XP!T0sy>2Wp&fETpQ5pL^fJn2n zLjiZo2+aK6rfmSB;0eokVtd0umm(XFCNjXXhk+;Bh7Ka$*t8*l4TW1xb65?KrhPL( zw^N$-spXNTy)7O#?KQXnQJN);|6Ne8CoTlktE4U))JrUY1k`HFBcPUB9s%_f@etJE zaLqT|-zB#^X;^jtixH4%0?jajSjBXoj@4cP9;UFcszs_+g0`5KQ%73f8udtZDyHv) zFF`~LERTTSXn6$u8R8-M*TD7TV!E%uZmk$Q#|yO9qLPY*8ugBjvuNfO_!2GYusqU| z<(5ZU@^|sDC4Ybmo6T=`-x1(u@6r)m*HS?!=^cQx$y&Q3K;96u-BT|d!^#u%USL5e zMAYB%2<$t@=~fBspNogEe+bu)+Y7T(7N4|6*Qj4e<@NxWXhA5jkGDJm`)JD}u%9d* z!afYH9~bsj*4n%q>VLE<74Hwgm!O$DEswxH$MOj5H;9L@UkBG-VDB|CA5y8F}yTLtxJxA)b!JY|U0^3(v9s&DO%OhY<5D&qw zgzHDc_6Lb0N-qMdQC(-H5=k3;39z5EJOcKgEsucxJMj?g`EdPcV4t{WunVMK8{7RX z;DkuN^XoPU*jp`+fc>s`2=->U_5yYENj|eK?z3sq-0I9l0wLu0yIb}QnUxFI`WO)SE-&!7lb)I+# z>uqrT$gt9QoQ5@DDzow0*Mdm!`gLUr34CIC1lBF$A*>tW`jKJ14tswM>y=WO4eP}g zL;~wL%OiO8S{{LQq<9GHad4qqu#*74D{b@lKc!S!Tk8ZPLxZ_uOltQ(316c7|7>{# z%->la0W&Hdf*FSE#{=`o1ek~FdaP~SKnobbW`^YvFu$zO4G=It5D&q86RzEZ`9EHb zZo8)dznOs}WD3Lc6__^W`7wB@ zbrw2^GW^6yZW?$=uv^)M-f~^AyPdKkZCPx+(TR>W`i z7+;0+`>T7CpQwZ61ML5#rAfjUtzvw&x^~a;>Wqi%dm8~h9sa5sH6krB+M-L($sQ`Awa^7L_eS! zZm>ZLk*OH>ou)qzVdU8wJ+%c|KNx@%8)4D51@ljdFv^b5VYoKW%uru^oCVfPD@?#| z#TXCuT}m6)@w1-7HCa#mP+S63W0a3H%-=9NfP2?9>WB|>sE9-cjSj^it@bWuaUA>A z1<27J@4I~iu1_w>AYfv#3a}N#egiHnamE`uA_(_zVySRK3GQdTOK~be8EYWXsCKyI z#uBDu#-oXvZ7pJX`?Fgls6jx2nBJ=lf-$_aAv%z-P;b|Pq+g^x=wrVN@biHQTmN-m ze= zNz@j9$%srU)Yi05WjUY|lyYE)2PZ(#NHjOHl9znhx~z$;BxSw9HDk1LIBqCu^`%g9 z;3azOtx^4W5J{T@jrLLWbrr0Rfn?3CC_O8V+f<20mx9Z_LDO;$E+sL(W)*!Yt`>gx90|sfc#6wL%&XCx$Su^ zg?3>XQcI};_`HDmG8*N;Sj*@RMEVEZozwPPD#8Z{4U~;_Ov?#Crw4jbGfTI%I6R|X z3JvtS9w$#eBr&jN>1m!;&|W^IA6^qY$chUdjDW#jSAAWu4_u}3{XC;K26NiW56W~d zZgVbP?P=KwikK299~}Hy&+1@JIF=n87mj5Go#EI7xbOl{z_aAccqLxAE?y31YX*FV ziJ^zPxq=-%?)IAw#(XMwt%EzKKuDs0$T6j?KF{O)RXYKS5A-ZKA@1-j$&Y7ymJIf| zW(}E^<7u8XL{p^w29Lho$Hb9tA0?Xm#BrnsucLG|9?JrCta(+a11_(;)L8C7|C6WA zhqLg9i+NKPimX?&@U%rVx8FuPL!OmEOQr1P{VYzj>KI7+pu-`9p!MUnt)OL~r(Z#7 zc(g^#1a(P)UPmxj-Q^}J+uBo@2XK#+u0J*VW8PL!T7jL$uJyKTuA&qLq!sYA>U-qW zbCIfOzM{bIeg)5qi-!CcU>ob<;*dHNm8SB2ky;19`R)`p4k8JWE96G}W8US>NBMsD z$GkwR0I<9QpU*3)67Q%tLzwXsA`Wl;m5rf@15`yyLI*Qb^4>g8GnDFuZLNjmDR1~63J*HUKMC)sy+QSvOr4xc10WWU`AZh%3=rBMLEbzJh zL^K4Q&c&TR*OWR~z0m2JtFYt5Wt-Q%Zu&t4xF0j+qEgyVTj#^HgSUDwFPi9UzP!j) z(ejnweAB){^tM-k`g!@r>%ZH;1&-%RVUPu>Xbu%fe1-di;FS~yI6e>w0rHRyxunGO zps#}DjGXwotv)6z0MmxA%z9vtvECZ|r-vlGT(Am7k#MCPnRT1H{5npq-354|6uy`9CS z$u~U95T9#$9ZW02#cE3pQ;G_dE$T*)v*`i+E^`4W^$%AH1R}6;9R&99n1Ur@@vK79 zfcYm4N$LZ*e4vu0rBv>RLyGbTW(XT=L`&5ob5gj=cf-jsmO4oCw z^o8r-H|VN#*v;F5Y(Kntw=>(G8Y0m9T*0D1u%B}Yg#Q3-9J-AVBnq8P@u7*l>D738 zNtN(6S2ukK+J*~v7s!AY&buSVgOQ{c{bI4PqN&Ar8P z=lQWGDQ4PuHj1rkdN19S@a?TECb`83ME=B(m;-nR43k3VYZwMETZCZs+{qTjC-yJ@ zd4&6yZh0W2*Ara5%Qhm?$k-z&31wdvI>&0?vg*T7_T*j4{_X8QwCwmfD0o0{D1P^I zE^N&i+$u^OAspCX=;DAsM?Y2jN+GJ>a|dy506qh-#+Odb981Ndy) zRCQ=;;OG^G`7)(pzlO~fUES3dd$T&F7XbdC&`3XuEyNL_SS@-nn*uUWwVbmWWl8iA zE#l_gG1oqCGlZYw2iV@YTq-ky(0h<6qv6?Reu6^{Q>HmG5Ad*vy*^Q#FFvG-ftayn zPKGiygiH|LqOmy2S2SdLE^8XXQfpaUI!fkxV-u_5Qb752SX zYqZ30XxD_-`+!vh1i|5e916yfb!&e+`IHy|Q`PDYPEHW2OhHw$eohR2!-8&00!e z6p#?CEykF;Y@|I=mWZp812I=SIg!3zD$^$=1RvAR!a(HbCHRBX+|NZq@LP-#*2b&R zl)f=*! zvJRf;aoti!h~_9D#xx3|1EP6w#dDWoHzTI?SNO{+AYO4lii!90mz@Xqop8&N164`c z{`lON7u7g#%b*1kPS&yMgb3oAP+c0!=^uQB`4YpW8)HZ0En>62SE}>ASE>`gSE~KK zSE_fhn(P~Tz6rDMRKNLNsjmNCsm6YoUP79q2dd!;azt?9@H$70FCt1lS7f8o49IFqGgWFBh8_ann#=C@;altXO71_-W-;u-e<)G6rAHz~3V$NnfQr}8oKUH0p zX_s%m+ZxRsy$b6f%x2=fH!=pEc#+E@jb`HAhn8X8J=<1h@_Do_bu&ELKCbmPc0!XO zjgc(eTd4JAvAo?{;50`Mjd+KeqYES6LfGB}>$j~~9d!CmTnt5ThUqIltrtBX>r|J@ z#5E2=&o`jGo2O32afm*MN{=s8zX#WCe#@At%@tD(utSr4)!p@NtyJ>PKkW81O_Fx_ zHv6_WzS|3JOhx`YHR>6gDWAgs`W)78=acj%9!CU?o2kyBBRbBdMge?d@+~Dz2!AU$ z98a1;oNWvm9CyINrC|=wHkv*OV)cAcIhhpSgOInWC$tF#A)V$-$FdMeUJNxycHu3V zk*%zK`9^Nf#prJ8JcFQCME44kJx0p34VE@4gGt>Y%|;azrs4;0u_IzU>baD7X^+Kc=jKU_1!(TSy8k;`SGp8W+)S!#8FPJe<@I2+MJi`nFTu`j zL}BKm4fu7dAhrT8s(%y%>rC+&LnDtdh49JGpGjs!#^#)i`7Lv}>u#RQUmOM4ZASDC z>AlxS@<4ar0|*L4?&n9J7@FsD0@H+_d|S3R{b1~+(bg{Upr4uQ>*Y!MK|dB!{|&0X z&_{eD5V?DiRDCzm2wy8czUI4m!hmm`{%q2pt@tFlbSMc3NZhv+=zS51hxaY}#U239 zA%$Ldf7kHMSBYDNoY%?559Jz>BjOk12(e{hA}R(X;>7ztLYF5)H%Ms8HN<_tO5|9g z<9@(31kJo0*3Mao^HH4B6X&C7ZmV|Y@qUX2qg=Be1Rg@?!0|^q&hnLs)%B1UA%ABG z=8y?Be)qbYpwR4{inlIrItEcZIfM>_V;&sb*w1c&Bc5#xTj6)NhO!rBt{l-S`q7r2 z;tmk+OzZ{J+5ds9$GI^$aeRNn*L=T%vt#a7{E}ygfUn?epZg#D;)TEax8aM=cKzwr zABwMc%>5R>_>TjPnAhsa;-O5QJX#z6djI-9!Zck8#qMZ+brv2%UEG+L(KZlvp1|;) zmp8v)AP4}wgeeh+zXLh#yd7DNgggATBdr{VRZhY8CwtJK@pv$|H+b_z9!ue*xxYSC7#;GU2@%an zP#zH2=a~BQ=ZTgs+9+cRnmR|s?qng+{J;D%5&KJt4ZefW1CyaQ={)*&?`*^!l#HuQ z#^uHF)w1@BMB73(-+6|L=cD~Q{*=SK`vy~& zjmPbe+TjJUcN5_Sv9}W8g|Rh>@WNP!6)t$!cM`=bxD&DNB))7*jQdXQ%)|A>j-$B5 zTGtckZ&&O?gb)TZ ziW(U0!<;uTd_~Pp+#6J@k^i)3@jcbMqr+RkIx%Tw%Pk;hvdwIsp2;57PTc)@i(Thx&tkM8H!vV)MQ45ZpE)V zbOWF(WR}xVDL^GB7Hi7S(FCsaC2Td-S+k9B_kPp*E@h|0{YF?}Zb7uPZ96Q-!;Sav zst$$4#8rW#JISZg%kf60LxU|v8F=J+9rVkyB^ptq@APGD^gB`!#f6b;X4qSR`{jaA zU-e+2Wu6}^CU7D&8TKaZ_+v%&m#~Cf^?Wb~J+emC**P#3U@Z!mulvfpj_DWT76pxk za&u;Q)Ip)sjqr_mV8)#7s2|~VF3G|HDjVO?aD?6Tm1ohLLl+ECE*ag2u0G(E!XQH) z-f*K{tst?=q~Y*3+>qsk{$j%o*%iT`q8@C+p})JLeqGsxLqq$i zU$$jrj9Qs$uM^D#%w?GXExuK71n~%yrW6|p0J^jogB!*YwqgXs#&%@p7W}F`HTXq+XEzRt#T;pln6*?61;;6eEwloOj*ts27=G!bQ`a5mC<6fWc>|2?dM7Nw1{Wt{-P+4v87q6=Cr5UbTc zU=v_IH8r&*VUN1{G->TRUBaK9u-fiXR~=?Kt5q$Wu_-93OazpijTcF=`3s-55&63k zCXU`IOkwG$?o!M)m?BDa!Buv_CF%f{MoSank1CywH2XmU8Et*p=i!g~I2->82O}CJ zz!5wp{B^FgX$z8hTsQp8*~kaCF#VLMm;M8*#-lo%P0u65M#Tcu7kfeyFMAp#NY5>T zBYvojx~7FJ!CY_`LhWv(nQ0M+6nt)CA=m0c*!|8%ns7817Ij8*uA{nAh!?_n)?7CLv}QIz9h!tAk3^bBCgi zRmg|qbrIS}Q`1^e8)LT!sLoi<9}V+HR87YInuKU5jW0cTzA25+f+op$mO#lT~P* z6e$mwimJOKxGWc^A-*&1t@t&U-eRbNpmbqL=0?`?@f#}a&qgGZqD?ads zyAO2E?EzVct8s(46z1b=60Wo8>gjYg4zwLK?js>xwqv~QcnMYTLD<7l9wzf&Ixr0$ z)bNf>O@_)`1fshIVYoQTxW#YgI_%DIT{_ zG;&QHugVrf0-+otQ|>jP{hB8hd1Hs60-1EwA2CsmS{XdZ&O?GK>B+zGKRFrhm7zhX ziuL336+Wqn@FoyJ-OyJ+9i0GGWYh@FW6ub*<-MS_WJg-oG0jRzvn#}N0acu!j*iu% zg7kWS4HA!Ctn2k8>jmm@PqS8?s_PxSOTA2>5f#`&wRv{6p4d0kPOgnhtt0Fo4s+elNg$Zt(zjJ*Kb#pH;JSYy0-TM% z(RpyHXZd$B4<9SxetZbTK3in1G1RAjN5oZ(VBe@e9E%Yih*lPxb9j8_2C!ugkJGpV zrFj9pn4pZ0FyH7bn?As9*Ir``6?-HxAwD_;Wjn1({|M2AQ7f_a!1b?r0Ul8xSnF8( zCkXL|)evXn5}U&3&=FR-&c>ajY;n=RBwQF9Tw>tL(d!mmeS_8b?SpIZaQC4w9xYWA z>ME{b6};jm!b#c0z(inxz|=FP6)XUq$<(lMVzuoN?AGU7D2Czh{HaUq#o%nLwN|Ug zyHq23%ymD10_G-f384wh-5gu;kS1L$9tEeegKfa z{2#iQIyDcYVSd@fqM5;;;@2fhRz{+d_7gc>TSg8_)Dn2-^F{&szxj4;q2sJ(9A#6= z!J1M+T>jKz8{iv}S*l2G#te1+-x7WL`d}c)jXfgGQzU1PBhUhn<4``%K_n-pjWZB| z7gAcIHCcF2P;mSPN{e-KM`m6CJ~QdyD+axfAm`!>#8!%-{>h;AOjUM&14?u@uA&FY z>(qD05T57-GYwRC7b4Z9&uM4qcA?n-X!drYS%?$Bq&p;*iRn6ad?~;IZme7b(HI>i zP@M4B1meCt5VfC+3P~jae0|Qvl@sJGhUJ4%p%ESUGz5Xw5{|3kh<7fTkp=4!V5@T& z1&=^U+xo)P#|NO*@XpE3rbi`L{*C{%G3^0unHw;XG$6)H%RaEEht%c^@}LlG09nV1 zBlWQYqP-qR!%Uni@)~AlSA_ccT55BgOX_mt{d-nKwBd*N5|Dwb3}?a+-fu7S9(^oy#w|Klez(rbICTgB9;w6w)OQm8)E=&3V`Hu z750?HiSQS&j7i)qM!2~KE8XSc9sQ>r2ia6UoE^;__ZZrly^bPH%<9ep3kruOz}f~r z!sYRoX=BR00T%J4?ou4~;^RSy*DkX0Q;4A6t$Ao@@79b;w8pt)p#>!yb1iaD2|r!5 z4V7n3hl&3D?kDV$+tE952oU9GCMtV^K^zI~iBu0DsCWHEyVPHpsGqiuI2VU^I;R~R zi2mf;PqyQ*w(u*@b6_N*e;614Np#Hb-79Z8G2ERy?KtBuBzsjSdwyw3G9pH-Y~fvS z0tUmBN+r?$j}sewsmC6^zixPc5`3D`6>M2 zP9}`|!#f=zU+-pBVdt7oBuTWQ3EyrZY|>9A$}+z}ch|bV0TVBpKPOR59iv{;$+p7H z8A;9^hC1obiTUGqc`!w!lNsuUKgu}f4Dj!V$R7Z2!P;3aLW7c5nq&s1?k^4X_4}wn z_$a&EKbEL39^BjhuTHJsTf97*pdL$4l3IU>`ek}#ul+5?-CpDC)Y-en+xyQF(T2$V z0=r7tf7ln)}puV3>gGWy?Kpco;n|hP(V+Kp+*q2f62d4{N#S(UOdoz6z`i zngO^kx#tsJvhS-Bc20Y-sX-vQZvuvd{zCsYVNz3n;ptha`U_vQ3ilR#VdyX1S&Qi> zU4ahuaYhLUL%RM{BYGWnv8kT$TZC@wc^BBGx9;o$f?t=M* zIXdv~uR$6t|1tbxh00w5B@Hc0+9WO!k-A7b^Ah*IO#?YxdNUT&Xo_6XG0=h2G@rN^ z)&~-xA}I{7-+MPY01ltV#b%rz$^>P=_AF#Az_IFrt=Vk#&Hz*!$%cVhgx*B`h0m51 zAemat2*{gb`!|!EQi#_MC<>Uv2YF#fFyb&eJW?vYc`UZd4CPfdZ3`aFy-ZXJt%TJ< zJcE87_>!GUJ)MIKHW*^dD(x|;nE>N8r*-y#KOAm%7(FkBA{M=+*s`=owf-i@o(bKw zA@}cjY@1ax)hPr)=7t2GfT5&<7g?=%DbXo-5CUG$NU(gj;ml%= zOJixGY5(qzi{m#!IMF##yxdgAUO-q9)>Jra)wTE8aLS!X{G%i<|E+}E5&JCR&WpX9 za2Ld0OSr+;x7-%bxLCu#1FT;2OWt~a0FHHEBmAj@Eis4p;iWh3RjM57SOCbo+aopb zn>6rp^$;6K;CDyU#L(^tNLW3$3QvkJc81`B{i13TfrzhRz8{bGTAziyX=M$D{ccD) zWgaI@pK)O-ubh}n#Uc6WCF+=a6L{Rs_~U&>blFmXATQ#8uPu_L3Hc-wfEM+W1qe@$ z9->`cY86bsVkcEtxnR950$TAKpW;sHDCSockB zU+;L_2PDRH@3z;dqX43&0XWstkv7Nv1IF`v~9uz=~{Wa*=P}R^Nr1VwfFS(}*ch z>+m`kKJRP3974o>P%)-9t$GvfOCblvx8nv!X7W;fayBK_EAV$SG;adtX93`19iR%h zKMVFx81sa_8f?iYFP~r(IL~l**_TiL$R&9wp#VBRMP5sTh6L}@dJIFP+AXX$UsrpY zOAE^Tkx1(OkjgKeQtyYXHwVT?@hmCo#TAbSePx(4^B@R3A|r@fm7adnN+~^`ObF3D z94ga>NCNmgumxi;z@n%T{;VI5Nzk`xCwtqRSL8y`s^4rZKbx?Y*o6+3+C^P_&xOKF zX^4fw(mv{aBUDaMg{(4g1cj;Z_kzwuL-OooskW5TAuN`{tlK?`o9Cs_zaQILp!lYu zg3=y-3cby+dTW3`AT`poH6VG5mP8*W7A>p^p^n3m-Qxo8oQ;#P@Y)2pd-6LyjrZv2E~d#(Nejo6c2dTU1w;kmSpqsbq>wKyX* zc9{o_P#@)B+J^l*j-|v!=)GXzTNk1J2y8{CU4;76FG7)^*l$k4;4rd+@iJkZ~fLstdXPE~cH7Q$z3os9f z%w%<|65!lzfn(KrM0$DXl7jR~3s5P7c2_AUifZh;Y&8x~9oh`5Z+VnL$CGv#3HG9C z*$>uZByaxr>=+0NuRV|*tP2XcxyjRJ<-TVLT7_^f3IVNpAU(vXgL)LW?5&DcdT?Us zcfGA>QC($Lda7_UE_a-~8?6I2L3!v*KbKQDrFMb3+hu+rH?8n8)a9qEhAaQptLG3 z1Gq3FW6z24i+TZ>GHUk%MM|o4C?e9`dcO6BZ>`Rlj)64Z@Iee~CJ|MJ7gJ$C9~&Eo z*L`bseLS8kar8KwpzMUlu}SJveVFrV@kW@lsS&t~jyKe{p6x(*H#petwqRw%D8^8G zFq0#nihgzClEYbrc5)~lqMg)V`7DD;X)1p_RENhygmygiSGY}f@8FsZf`a%v4iHe= zNm)_^m{>megB5tX@QP){4H)xRX;3)x9-Gu_`|ds)m<{3*U>?>^IXO{GeqS~HP59>B zeL`m~Gq5753|5sg6++Lq6K_${NJIDcDeq!k-k?yGH)~yf9^`G=NKCG-q43c6!sPzC z$N{0gqK+3o*E_qLQW(=czQ_np+Iw3J_c&~81_4m$MO(UloZhG6QG=6z4^|v!_HhY< zOw4%y)w+x6{Szv8)80R9JJ_TCf3l9>i}IG?2!S^#zm@LicsLT{rxpwb8AcH!Ii7$W zOxO-?v;7#(cyK~ZjDaEAooFD~%be29F27lc_yL`Uc>`ntx$a?kFi;V?O7z(cEG0+$ z0yIK>cIG!YVz0skg9*46Q;@xO2=*lMe~i7yz<<$InS==S*)nCj0q*Q8djoehfa9b) z^~Zs3{~rR~;56v4v2wo<#O%CKju0(bxG2Q&DzgGA>CtnGMhY%V*Sl8)$LsbZHM*5u z#jLOImF{=HP=FX~``hT$#c@&M77vf&a>2zy#`8=|ChkPNjZl_1$|mH6`ZS+gREiY? z2e?u=N8<0MW_@ph&wLPwukj>jV}C3o{;~^Pw%YyEJCcK+Ag@4i82e4n;iSBtQ_2c| zq_TwJxJRigWXKnW`wQAsKp(>v4mA6)iovq3v|NMgkIaDGn;BS3o-E=FM@%4t-ZLQs zlnJ{fI3_uRDan;OW71YuWTHD+~%UX0!cDRq$m%qUTRT*}w#(RSpA3$Ry{MoiFr@!y z&_70q*W75M+Sy3u2+oCdur*>S)yiRn);h4x>8&KXAob0ZU3(-|9XDkc?RRgZ(65Y7 zCgIHpCdWWzF~_HV?gTv{q0$-oGGj!rZk@=}!v(Vx+dZJWg|R%eT^sFY>_AVq=- zELr0kQYR|JrVrQk@>UUE-0Y$uFKeh_yDE}a&8!#yh&!H}D1pE*V7~S;eKOQf4+!Ri z%!NkOWjGtB%6tJKsKfya6~d^QW-xNhvYcMsAzhS)<^S{k!MUe8261RKS)cy!7&FxP z=K@&p>0o)`46`k~#kri@sA21j?3WFQ5g5}C@HIbK)POL%W$|A~#I%dK_T7{SJ=bt! z^E1uKe!)BTKatq@;pjhRb}q(Zhj_2Ea-$_)z=V2zx88U-AW;_9^aS$ly$wldP{_-n zF3WMoI^{j89nv7{!|!|-UXhcW13Wcgz7`@KS7GPk*0KpTUS~x+PA&|Po=Dj1uad=uD$b@9lykDq42#E9cuECUU|WVYbiQ>|E?CI?3nW?5t=5 zA)kaNOhyI|z%aWBMCTi|Lx>JOKX&B>FiMX(p{EM#Kw$-0!JOw$;>w8**Ndu=r+(6$ z1&R$6orI@_k-f{;@_93SOhcmR$iU$r7M3tvgJl(?wg*T0A})Gw3OYLQ2r?LgNBLY& z7d61e5Q=`q^B6+P$J4+W4t)LYG`jNd{k-Vk{dv*v-k!2FbS0ODXZ6zX8OBozp+mfv zS3F4}j7#t~Us66cx(INociZhNX}O|Gjps6<`o6Ho_;rjw@MG}7l42Yw`Kw%NTRbfi zHKfExJDGn&dXm)mhZ+CGp5o2uU5xMlDK_`JtKW)`L+WO?@swdcKfUmD_-I3Q{kN%^ z)8lphV;k)2x!(AL4D|`=k?Hvnf7{wL@~htZHw)>d<*`udxo!0E#6E1Xp~d8x-*$X-*BdhQt)ay+y+_1x8%`Ayz82B zBE>te*fA#Ua=?!Zku*Ql$6pxOep4HI9I_C&v)oB}gd04-7PauV2anhC2<0vjNDwXj6oG`h zJ_1QWAYnefP{V(XcvN8t1OlNsMy;|~Jp!mFme7CQjN9s&>SCswJZoxtMYX%F=tL>= zMfFpBt%_>ZA-VuhdI7tK^iyz{2G4XN*U{`f2_G-qEw9}To>@+^krKF zDEqh2CzUoeO{LL_x~Oe0^MufvOSOEkH(IMvU#zmr&}|jdy-A@XdHD2m>fb?on%Z{} zZs67vp{SOO2Lt zfAbiBOZi#NW6o+RAKN@;tf8%}+Uh6vFiKe?Y<sl(VZys}fOGSP2 znEIBAY0YD%869J0qIlOx-0>XDsxM~1X3WzfzxB55uJfQ-h2d$3IpbvD)V`~!Kuy8-2K_us@v#`rBSJ|?k;paX2 zwb!)S5p9WB`Z*{Xpuxttz*f4xbhSF;x4Z}g^=nlfp@sDH(cJscy=n54iMeI+4aJGM z%aWxkFYGm?9<8A2zGdlp?OGqtv%H8ZND-h( zst^UtH=)|O$U56TfG=_HHM=1^1HM4yiFNSfvq^up=#SE$t@_igKeUX1ln(vL(;uoY zfw{Q`)qI_7V64+T8Ws6I8WjR5&9Qsef)`l`D9TZ&M|(o51ws@EFpQvn_$p12|*1Y zfK12&Fm3|o2P8)fpilXostwgS-{Y_%I|lj0LTSYYOl(l_25VKGqkWhdPi3t*cu|XY zc{wTvtncn&yWHEI;s1~^61fWI>L$Aw_uk9AR4HwBcL$F)+?#m#w7F#o3@zo8jUBPi zk(E$X!=hhVW072WIe+y$n3op?abx*u92{imNdOX`Is6}9^F@uY(>igl!LrC*QPm(e zb1r9l9)l6mGMAb?&5cD=nQVBvs2QJ(V6JCzX58y-c~s3wW?Bc+qOz@4-aPRGndp%UbFByuc+FR( zXNt}4iqcQK?p49ji6Y0Lcjg-=xHJBgN8|kZmAPGTHIKGTJ7TMF;_;69kF$wXh>E;q zYNP8*Xpl6u^sT_{_b>efUHZ>adIBP_rZg|?YO?M6EC*u+HKHz8@46a)P+cn^I)j#c zLq?5_-qEQgI2*4NCJt+lT?(hK`D)lEc0D3}=xj29XsF~}2$mKe03n_))3Hqlvrp_wsxSe2N39Cw2g=Z-&>&ygBSLJ>#x?su<{yBb?~ly4`BY>_ z>=0>$)xD|6tTOvxC|{^KJ2~L&0IS~Jp!N74RO?l`)`zlFS{w(e6L32l4`7^hYOF7u z=>+p!YTBfT)E>z3yDz1Ur=-^Q$!x)|v+@0Xp!3`xRMjtaRckQ%_C%Y!GTI$s#(|SW z`}f(VV|7KaxSyn%zoeGnY+Ofr(imI?r%gej6EsQvG(l_Er{@#lDV;Bhe0v+Xr>5rI zC(I!z7J=3tC0rN?wVX#ioG!Ntq_Z3NL72;&Jrhp2uq~Mg<_zX->`g$OvAZ8)YW*D*X*!2ZnK|Xgd&psqTc(r6yA|^ ziHY2LE2{TviFnHR*T0E{d=GossDA(EwauwVmXy6Nc{9t?Bh&W6QT;y5Q-1*>lT{@4 zi`82H=BL;z$$qig(*NG=84p4x7r&tOZ{RG^&OEB(V5!aRZoo~x$QC{;E|D#~Q#)}M z8e13{TO1iXocl<%lq!ry)Ff4_izkb8`Wp56lhVP-qn+T2KdF0r5BBzj>c+GN^^Px5 z&#p^FczV2Leya!dS~y8Ld+*-%)G+87iS@Ua)X1o4?O}DSuot?!$Rf*bgvErQcOa>h!=a)wr({c9Tlck;E7Ee#)(I>C0WuftzunCK0Q5 z-v(_>eo8ir=5{dFPb5!+76qYWVVL0ukjU1v$m5aVac01G`DQs9yb8?%rcr-|U%J=Z z#g3dj4M&ZgxI@P|9zt4)2?=RG9mjK4)CR!nV;;;n+g-iq<%(VTmbY zrB?d>7Th%Ij@w1f->C)y1Kh$MhOBZ%p>-|c=>Vt%ZdO|Eb7%6Sbv5Q061g#{*R+vB=h3QSl?8>{)OM0ZM?0FMHvuaeO@$Z7M$(r! z-Lg>eOb8XtTfi1o1}1 z9ho*jt1Wq&hiAg96`tqf11rg+o~1*x3r_^kb!>)2OlHgI%w{isvzonGEu*uWz1c0J zbDF(5V2pq-VvZgV@eTlUM0g{EBi_N_l;F?^EsgLB^gBlO1MiYA(owGQ+)?h*_?`g< zuE+IeR`njB!rs42X=`kXBVxEFgk#YmyYJ4%x$*e*KN-8~3 z=cZ6Ser1AZLOgoU1x*whlW&0Z#yg3_^2wUfm)+~E3{7RcfVOBOd!(vR{aG9@s{8Q; z8?DRdo;;wVoQq_}^ka$UIfwvj!05o<3uFYp^L7jua>WPJuXHRC)M9rJyTSA?n*#ExNIoB1xSw(W-;A=gT1s*S6S4 z1XSw&5%1(_uV+jcDVY z%eu|2;aeRU!2^9}rNiI01&3BBqIIf2HIX2lY9iA_PK`_&fLf=NeiAU_TK(f7omn4! zF}_AnW6v;$0>2wrz@cwaq?hkhMaSi-32$pQTOoXf>L~>uhT=AJyg(lr+1Uf>)9@;X zAG&$>TUuP2CzEyu#C7_GR{&9R5$&}u)v2sGd$ajk2U^QhV}71SYoN4Z8n=ZQl^G)k zmHa~(u*HbjB0NMIw2gR`IeKfvyVV^1RmA(1Il4RI?N%O4SYp^Vit8hH9h5i4ur2N) zwrv5NV%HW%*p{KiuzWhzFjx7SFPWMg$wF5Nol21$lsT}%1P^PgMFZist*ZR*G%32x zYkpec{?s{#Hl$#Y3_9hU%w7PCYrcW4XtA1s8P`{aOHpUzUt|}aKk!Cu2_$aA>)U(0 zquRBQ)RgcU4rkLmITBn7t)cw4Z(zDLYQh_mDmdK;uf%ehzsd?fUgr+(*FJYM7MjdB z&f)nFS&@0^ky-JdATn%4ehHXRZ>ZlCUsf92=_HFVYHp}?>gy1+N6-i-L5OaD@DkilKa7M(#CjGUf&}PimwE@xCKyZ6v6j6gmolW4 zY>-Pm@-m8W|J&KL9(mivtZ60~Ei5fE_hS?opMes$9b{KoV^xX0&u?fsf{-^rd0r4e zR#3bW=^tFh*?{CV-%4Kq@;NYcfH}r-I)#d7TpgLag{4E!`i`k^$f|%>BGjyVcCfI} z**gCKz}K_NAATMKti8bN{=|9P$*>9>AETG&6ZGe&`ctSs2geTrJMBRHIpYKIyPpou zg3^t^v~(Tha#zOw0XQJ`?~=N!&i2FL1=&cIzljBVT4;D&%dtz z13=3J>hlYB;Ku)cX7q-?$(-I-Otr>;Mo;L%L@@=vvS|g-UID9wxWV$Dr#6C3#M2@J ze6Ev1PK^+Ug%H@C$&a5)bR+E`teNcKzP`v3qD!_$)u~Fz$#s!?kNYmO=PB;L`7brz zrEW>Y@BThWHKAQx#^rLLBisNO`L83~s2v&Y;byvws8&lo9%H{fOlrX{EBpYz__rJ7 z{3IM=1AVW0qaMtqGu8T^*=at-(qDux_kmUB=U#JDz>Jk{^O-xrHqHae zJg)063}T-G^Wtm&Obc+BR>VAHY~-QHjx)IjfBXit`4^9R1SCgQ&!1rug&o+mInxL zB=xouyz8VytD%>{W5Id>offPd+yX210~V}02(aSRqG3Ho3IeQ$iK9#9%U8p?AKYep ztO-iArL_H0!;Lzwz)JSj2SD&rHVN|?vFT|pu^~4occ>Pv1%`U{3wZr(xqGAYSB*sr zkgM!TK>@uSv1mHcge!x)@bN_+D!K<>3cdZRmDda>L(;LpfN=k|OjtSDmgx!g)n+<# z!9M+2rh8-PQ02N-nB*j%WOa>O2hxrW?g{ww3lb!`+B~mJ)fQLnUMMlQmcHSJWt%1x zK$4uQM%Riyl+`Vp)})Zo8hEU3X{FQZ7A`Wqx!8y zQz)!Dafq5a1qRawfD#`7R51#FPdWWStb?2`G?4dBN(Hi1in3_u7{JRRffE=_IB6sgi`%!Tk+jTuL$)tH7|F|LDB8*`Wx1dI~R2p4=5U9h3@OgA@edW{9IpT_;}+ z++?^lrr*pbX+hzTIIdQ6{>2)FOz*yAFX*PE*&fmTGvox=7J+Z?Oli?a@K`N+i%zRW z!ChOVgHl`cs1$@2{ZSlU>R$Qk7A=4q=pKmXBniCv9+~!I_Y2zlr=k7niK#%IEk#*0 zQ2~zy!SN#b6LZ87P=j73UU>^Pd8! zJ(76w-f;fO#i`8+OQlwGro&@3=PEj_<`nMQ937O}oKaE`nsbsky411q)y+8!Zs7d4 zP_msuRjva=gQQ6d8)cP^L$9sr6V%eI{kn-h0Lmq69b2=M=WkW*1$G5Y2c-h$m4X16OB`LQM7|oZBDewA1K0;)4aq=x z_~hVIc8`b#ga*RF4u;)G{Mwg~+_o^ZC;yHI#boEriAiGp^C>;O3LXpY<#bwbm+T6+ z4oZbPA_W2N261$$nex?eUk$e&fA8mMupScdtUK&0e+J%)OoQbMabjrEBhv@+osDFe zBx~Fow5pWe)P!%U-gzQU*@*PPT4Ay^IZ~(93)@#FTJtfTR%@zvZH*2}ZOv22Ams75 zIJ(qd<*QqBAKbb%2cb2-mX(<92q<6)9uK2^6SdL4YLyA53ZdsTRBf)9(vjmmF{5V% zT#=y@aHCY?b=^xNu)+Pj<}+Wx5zl=NzZva~MGg35BKkA<`R?<*Tj7AkW(3dfiG9Z& zeg$p=d(S*xb>jXEHWDYnIEoR)D}?Ov2ePpFy!IVI!a4>lLI(BEE(x%rH>|+X$*ScX z*F92J=u9bPp`>TN`7CGw_VeCwSEdhUGx7in+f`QW2o2#PR&AJ$p8T_gxPtu|^%UC? z&!H38X@JK|i*|>3VZqKWf@i=Mc8J+F#XI{n zPeVq1PRq*pK$sq!Cvow27G=VCA*MZjnP!8`1@)gFKt2h4>Df=q_Lj%~`Xr&e(UwB? zFTrDx{YpA5La9OR?75VEl@3ZJlwV3gAp3|oy3}m>YC;LYtqJ8**|zRs3pJG3Nr+2e zCQjY7M$b!KUyhd2?fDNL3-11OT5x-Ig%FL5k$OF=;E2yt|&g`-X`-KVs%=?N?NIOlK3#)O;wA| zNyXk6M6g5|r)4@1N%;giE$kTtpG29&o(@XI-gnPho%@wIy41(=)!5qtx5nOuqJ66c zkj#4oc*A{<9K3^GX&M@%4}pJU0lf}^l)fU@TU{oR+Hw>R-aNU-!Gg9zkjyFKkq{B? zRDZZuY+YEGIR{yjn5ht-VCL6nliiN7i}u=w%SN&eA^yb<<<`yFM04_cJPks)EOl5> zO)Pm9JO$$mIjrl2X zV_3bjpS5kvPd)ejaY8CUZpmhm!U^zL03A)I1yJ3t0O_DqfWCOzB88YZy42h9)d0N; zw)f=|Kq2a)kG3^otn^VI?u zP}#&0KcOYK{5a}ozSNUfWgadPO1ut%bRytYXJKnL-yi*zV8RZ(=0iwiw#ah_*i%#k zSomm%8omhx9j$G^7s5}q2!bY%aIB`{3vgyK1&Fy$f=dXs9M|11IUA3Wwf9NOAhoD6 zlJP+_a9O70<5m*h-x!FDjO@vu{X32U8@e~KM!=GXu}-P~A2M1XDMY&;eY=i-He zLaJc>%<4U^~uN*dte~OQb$&5N8y){Z4@K|{HZdnp96K%XCCrllbI$^Fw2HEbd z6i1hOO1>H|kHM`+NipR?0SGRfUS{{nbp8+*0&TFK-Oez^wc@LqHw#R%YLI-?srtxb zMW2U~0kTz4C44RESoDnA=xpSR5U_wuGMwz3L;KS``DfmhNLkOrgTs$rXG}nFv0y+99?RGd^M(;;MSPhnUhNI3m_5iHSblZ0GBAybs#Kn z**}RXaAx4~n@x8~??o&uj6x3n|+;&B?RMU_$ztBB6Zb-$&{5JSy&8EdfeB+6jI z_$IrI-0;dt@m$O2jODK~w zP!yX0)8=Wwj@u`&4@i;Lpt}}CN7{>Q+m(_=bS&K(n?p$zQ8_G3b)Wd z7#<7k{phs79=ZU8+OA8tkXww(fsWR_QhwNA7>$T;MgExTU3* zfv;oxrbFKdzw3zSmTq${exn8N0?aFdDWwc$z?KxZeK3Gx2c3){Z%f66e%!!`@qob5 ztKlx7yk`k_;9CeZcHqTWn?HpcDh!1IEV~7uQl4pH19csaom&&*>JO1rT8go9*#IfR!UEDMq;t zsMwOMiBY`S`^#oq-fB1b z5nsQL__OyBKVon3(FaHrKTU5!I(%Qu-3xrt2hd6CLth#SQu0ShlB#3R@vV&i^B&{b z{=L+1Mq3I0pZ@`BN_J6N{TRc_iML<&5Kr1xU(VT6|3tYhRAYagre>U4zHWc{9@{VN z>*y5^29vyl4-#0qY!BwNBIDX8hR{UtAyOFq>tvF(kp?;BSNU`Yn<#h zJ8%0Nn$%EM9hyG7ta@xoNzlP>UkAjh!Ygx(@JBhb-PL3J^a)*p94_Z=dM8ninATT} z(`h4M#%Y`#s9O~sU84RpIVU4LD=#B-OnBDdj1a`-W);Xwe6tE+l>|PRJ%t(PStZyW z)R+8H%Gy;_jao%sTE%MO z%a}7eC$t1P4|m@7FLVIJ2BKqg8p^P|;F-Ukws7|$^`GO%+4vk{v5Osh2>ymvL?;~X zjpp=2BXH24I}JOHKy>swRqnPbXJuPyE6iC2k8QZA;P4En7U5k&cWeFU@dCKwgCx}1 zWbDet&5O`q}61bk5xjpSyGV>oIDevG+6L8!-5%%!dW5 zmdt7Uqlu?ghrVbi8yorr?;`fB#GW0B%+4j=tSRo%S;1^Pq=;4@0P&*zLwxF&ydUq< z9xPkIK~qlelQClue7B<5KHjA}@P*Ci6?j`{N@?a4=khK6r;YZN;W0?lTU=pop1yyB zt6^FRYk|_3`@)j?&wS=Zh#g(*HD9i9Z=UXC0w<(MdRo2i4fUUUoy)iOcP`lvrLOlL z-RV7go%;o7w&A@^%C#1YrYiIrUnU2_07hXQOFGJW7bi3v@{xH)S$Uqb>0zP?l6dez zIE(fQ&GMn{%Ar9AZEdyCUs+OCUV=At%nMNR*kYCUGkM^^)9_RT(NNE7DW3p#Vk>G{ zye^m<{iG=pViUf7(RY z_k)eUHm}pS#@n!CBEBm}bq3cotq=8YDX%{5;QE}?il=vtXpO&UykE#v_zSFWA-^5o5@4XG-Fpg?7Bi^bI}(2(e=X!z@tb|fl^%_ za5dujyrrsf1P|AN%NYoXVXV5vY675wn9=V*pX4Oh>MAwwP>Ps`)Kiw9fH{lFw}JQG z)OrItioU_fjG5pPWRBKAz!19!BRUxBy%gH&Pq5ukVV&m0l{H8Wv0%ZY5gnC7i7o&I ziRPg!%B5ES&DtImt7qXvseJ_`#KD;Ol;gc%eIA_Q{Pl|F3m}bk{Q9>kyY;Ht_&5&^ zu&)IDF78r_RS~$8?Ue^*wpSJaA{KpZvgpaW=tt12kYM^fUi{Wc?$E`QwO0_H;%nA(#au zh(7S4fS!oJ15ZE=ED))KHGeO+Y(j2E!>tF?oVx-Nb!3gOwn0shY6c+~LQI9`CaB9n zFqc+jA%KKd8tQNxc9%NPb`~oKoaV~-x#3%ljL?DYm4^_K9)e@2`I^nh%x{ASHD4or zqwOqKYv9DQH4xHehdq;wcw8bdhG$wL%d&k+S(_nGHtw{vg&8SQ<7?EAThlfMz2aSJ z&|dT7Z8x`FJ|{l+f==MNiXvRAgI84Gy$08Uzau0NnE=Jy2?fDouY3JXN4poaB5>Mp zzd3s;9Oes#nbR34%L_t`8Y;wIPrNYv_0AB~IcGaS7k>AOP=8rZ;y}OHHt={OQdN8y z0ty4}))_#Lzra7N6}ES0^f!ieLfk$GueAUi(nGdPNU&C^H3zCwe2uIVKx#1n{22U?~V1S@?I zt2E3ZJ{&me02^h7>M&g~0n8F%cBnHl#}q=U68iiF!5o%UL7C4bC`|-6?}a1oX8xI0 z{+T{=6*TBM=>>{rdNT(Up(L`tP!Rr#1KF`*F|YfjP(4ZtUGH-(W={pD0=N;u%gj0K zNfdq41wF0qIj!(at1>$ca}Ik9Qr~d)r{yvis>8x6_Rnd1&)tq{LPzyTe!yQyi<6Nt z9xr5=o1VpL4^r++_`RYUP?#zTiMd|%8<6LQ0-5DE8^dnMgVAf}oGz)hJdY+^Ve_OX z=mY=(6IY6ZGgbG6n5;U=_4*T;g}mqBZ>%Q(O$w|A9^^&O?e815!pO!$S2!Ed_8UgB z$H>GB>Y3*h;8p8-tacZ>?i4Is?mA~gaFQ7&5}I0Po(CL+Tj8EImN*D&98j0qNpmZ> zX|Qkr44|aq9?1xZ3Xuoc>Z^4l0NAiuXwG)$+>6Q&i%y8f6 zfRd5fk1!8V)Beac7dvh=k&CZ`uHcbm%?xK$WR?Ru5x_K_K!&nF2UU;G0oWWe2^|Sh z*}yzj;#~^18k)Mf-8&*v4MRE~PO&hteDO#Pk^z3!>FnRx9~TM-?rRvtcq)TVf^z1ZMLv%mF@>FvDGbKGSQ%#0`t)DYp z=ZrD4U2>Q@W%f2jP>&}sHW!t^7rYfa zd%t`2^uJ&NH8RI>7V_i3BHh!p8WTkx7F2Ugv42=Qk7AyT`k?`HIy7%#Wf9#by@#&D zVU3g##Fz*KFX5-n=*6aTmyUgr#x`5iD< zn6fUZPhqEk2tr*<3n2a9}RP`~U|= z8RQq>KoeDd}Q;x*E*YSqa!-8C?2~`mlWR* z3d+vLU(naHrs1?hszaa7#xG9z&Ze;p4SzGZeQq9HluI}yCo-3tRyzAc=90loC+Kc& zq2=xecQM?i?+}pW+!F1C#_n8~m16Le$lL?ymLVF5mVXRMlRVHzUuRQ0>ZvdTd3oj? ztf$JnI?v(7LD}6I9Kd}qay323G-ZLj9A}skS6(`ku}>g~`eqpGg|6DE*hbD|K9h#E0!G*%;EO&FJXWRkpriG-yX>q1)E7^_uG zW*~@Ya1xoxb1J`TTWwui`>WReep+h<#A?ElfUIr^;(}}6IH0((x#a)-p8MX+8zAWK z^DiGV@7;IzbI(2ZoO91TH{jhF9;q$3DQ~qPR$VV^^@RBFV&FsQ7%Kx)KV_x%sB#6P+qn7?((O?y2GBDi zsFO($&2RD}1?p@F;QqW<0wp^ED(-kocryY=Ghq1hwy1I7>lP)3FF1?^Mp7igjutr(t`fNMZ~;O`!(;7$jACBY7YdBPm15A}6j zHQ^z>6?xqi!?VjL=FR_=;!3RLM@As|F=jr_H3I^6`#~Yn=N4rdPN-}BKD(DoA$AhT zvZ5Oo8o4-EX)zagDw<-<0Uw9U{IEQkoy>s?B-N=>H#%w_R|9q~*32s@u(IKB;d&r} zbr)WYKHHrC(((+?3f|AsfH7A<7i0T%!--N5X?kP(1d1$N#Yad+cDi}g+PaDlmSRUZ z9p|B4(@+wQlD=%W-I!R*6j;vaVg+5PB`V;|3~4w2q1rTGWa)u;a2QvF@e&=Zags4M z543rn4}YM@^J;MphukDoSMa5z<@us>hvP3Fe@El*82lCB@7S0&GB&p`Hn%9I6+`4H zjm<4K41Wr<$Q9vLf=a*Qa}s7P0x9@94AZwdZ7quQ3Jwl%8h zQ7sVFCPcM~Q7stNYNFc3QEgIGtBq=tquP|HHZ`hEi)ufLYSZCP&iod3uOJu%@nwm8 zVua{s6;5;QP&`Ty2xBZ*jgEm$36=z~0^y|P)}Sj;81TLt6Yq1u*wqk;t{xqX1?utF z=;005S;6u%JncN#MZ9gPj922OU#$1$rSL)l-z$j2I)cR!S5>u70rLt9HtTsZBo|QC zYwU_uj1A>@d%|NRzvQ)9)3xSsyO3+sg$%U{K}HnOe?aIcJO&I14aUQTN_KMHGI)A^ zVxC?yvB0|rY(n5jp+L{=FMB4LQ`hw+i-OZKg8zj4{(d~isQ#2r0KF{4; zXueU^4>ICLc)x(psuJ_fN(8;Dz-5O92ElFz%S-IVZ7nEDcSR|r)SYyqF)M*Z63u`$ zi9so1KfJYSp5OFTj{C;b#?woy&EHXiuB+=btIvVF0*NDFFxlKrgR>n0gJsBSKE%0mMSN@pUp+ zkK@K*vW;I-uE%O$QS4bL(IpjF5mwK}$m-crQ;eB-b=25?HSsgSX>XwKw~rIdy$T1G zJ&{k*=m6YsfypoVSa*Q{ziJLJ!8`5k=V^Z&k(F(|)&M-f#-04>sp9#;==BA0r+9IT}$LDA}!NH-klOE+%UI0JvGKm#iYU3?tMNbmJOy z35+tTeTfneS!J0xEmABL1PW1kLo(FUF?dK}blU?EIup~7MreLw0^aPkN}Tr;-ghZ(WZ@%Udkrxgm9e-c zc7m0mGAmq!98H&Gq%LLZORdzUHL)w;oBjME^4Q@sB46b+ogP{7wYA2e!=0#%8H$m? zj~+8z85>!IQMjOc;hzx7?ykzi->_`5HXF_NkPr^Kp$~C{MBBzeCPNa8~&{q{D8_aTwqH?u8GlN{`G|iJFi|_I?^O zrCY^SrTM9NjnBO9Iy5ECPdW4ujpWU!e~JCLul&&(IJcZ$_k(ik-avYwI0#5i@%;WUS0(oM;~_eLPgU(i=nECR_EZ07K~q&7p?9O zPQPe8H1Nd@v0T3Uaq=6oZ$B^qm}?s#<>GAuMR|YG#erB(5uQ`Pqr1&B&|h!T-?4Xm z+<)!~(FbUdA6vKxzq5UMTpcY%!DSF6A)wKP3_cQ30WJiAEI9nDP?vIKA>KJP%qB=N zxFONIHWW0vj2FAi{H~Aka92X)-4lCPNA?b$b5?vj7N`^EoN9EPlC?K0>jGE=Wz8u- zXgg%w3+nMRXHevw6J2W}`@FMryKfWh@R!di4dwaAeHG5Z5DvG#E_j{|mVMpdc49;h z8arK7r*$L(;!i>iPDel7sqsj5I2R(!L&y%J*%q)?_|=UmdFFBZm73x`?!;T)(Sj#8Bk#!$7S^$~S5uEbt%YR?}N8^o-#7zP40 zEwB!tKOwOW0F&1Y)^n z10Y_B**r>Yl2CL#mJl~QWuj!#+hQ*Dh34B3{o#TIy8mtxlD*(6Wcg^xoaqO`LY9tF zkd)p^J+aupJJ z7k47683NTpP9a=?+aJs+cjaz$ad}kJ4KZ0>wQ7XV)r|+Z%|j1x*zkmOwpOk=RCZ)e zsmz*qiARyzyZ9B90qY852Ch&0zBxsk6aSrwtl;9Yoi^%^*mCPw_#!^+-ZEla>wDW< zSKP=8AANpctRFf|N%r#n@Ug@%kmadf2_wP5(pOP>lB$J2^m@%DQ=eoD#lO^;fXb94%u96Avnv)h1D zHIm*MW~EXrWU2}(71>$nCo+?$jV8hb9>A<5i;+YjT~oQb?C-kU(L#XgNWBL=MVoqj zZa!%vA@=@v5HrnN=I-gWuoZh77PelCOMVuuD7P-JGNnai;kDPX8KPYoUZ=zM>>(gZqf#Qg`S)B+16YPW)oie&KdJ z50MUw$Inzh{?>8m4kN{Qm7=5X6oo29W1lGwwbEwnp{qMe9?vwncCUsLf8x=i2Qksab5iXNvhXj>r;*2J#CS`w%Q7S+VzW-Xq7?7o~VUNNbzoq}>j zmii5(wMw&OE_(xPint|(7_Pith)%+~%(5r(5E4VqY16Dz)W`h5gn+G$8}13!?mhG$_7wSt5PBn`A|Q2&W2IPy&n{=6 zKlTqY{>h_yWDk{Hx77?VWrx5z4F_h7T_Vv^1UHry09(5wFXKJih%lhUS%e`HXZbu4 z@_WW()WJi}y_KwvVQ}%#yzA$?V-db4Pw=j8>Z8lIg4TLJ@w71`IYaVc!Y2B$0UP;;y;dVbQx666?!*r)0)96Nvqr;$@G!)Xq#vp^I0Ewpy5TQ>jE$au zs3aJp7X=18LzlqWlI971oY82ohsCgP%u?-M4XoPcOs0k4cQ6@ zl*6YkSjL9XWb)=d8sles4FR&>+X=me(lbpkhI9tYPY+MXXq*$G&SnL_t66WM4Z-rq zh*qI_08b~v;ZX~Ev%rz`)v~`LjpqI4riuReB(Q*o9$2glYG!d%SJC0O%p_Qw9AYLV zf1CnMXk2%MGEsI4)ov>Gu5K;@#}-r&z;<%5yf`$ZcX=Sv>Gr-j`{U$*n6U+U4k%mU z1qe}w+bAI=4mzUl`Z*28?@C-#x*L!Xh%Z|MP(xz>u6>QxVL}sYU&~}|wfWk1Vn4Vp zG|;$BaND)XQoDpNYF)-{&8(2eh&+L3c~zmOoi9+sl|kP2C4M;EOr?wvU8%+p@`LjgT?|nr73wyJnuoDWqDuB1}f1P zB`%wR34~nPkaEom7FBs)gsC5NCugv2(4CCJ6FUZ5tQ`XlLc7~LPuwqV6!(j-MwoCH z?SAQgvBGk{2s@|M=4oTG=K)8RZ!%46Ol;l|RC^N+H5#9&ot3*K^WN0X3YfGZF!Ma~ z2n`!TF}Ka+;ECDI9l>y34fj}}Of@f;LaW_1+ynX%`n1|yJSGQbS##vtZ{>MZkDb4| z7v6&--EJLD8Do|YunYqoU|kyLxZiRXOOB}h7Vb4rB^ZIHuFb!q(V8BsC z@={H*?OW7E7qBPUgajPNVy+gj+)@Uj+=&$OVfl z@5L%HSwe{yhF!dG!K{PKxzn3qOeI5Af>QbN{+yM>=sgrEu8GKi+&n!?ZB*k07D0_g^Q5JANvCz){Py)UYh4{i|UA{#o5`(o9v$5l}9<7MZfMqr3Q@^ipjn=&~2X)MfQs(%T zKJ%7;Hz|n((oP zd?^=!!Pa2j+_naUV0SVH!b}}6We&z8wCKUcRWLpT+yu*9E2Cqs0@VYXPGeWU%`SPt z7S-$CPw5)@fXonG9GRoY+}_E&=vYNPx>={pVarl3kQM!~?{YeDky9&NaOO|3r0=N2 z{a0sE6Q@O1_6A_sAiF#8sLS;~kL!QIf6>P}{JhTF11;kF;my{zPSCi%SedV%K^*C8 zf{l5J(~FRP4bWI{3pPf%GyVqz6vAXd+<{{tu0ntiY^zFORmCGN@oCv#>$s7LM7H&L z!GZ7)z2uTQ`(tXt+y}7^MUX+v#uErF`vF`q9?1@siGj2|xe}X61-C=RbCjyT3~mZE zV`YNFja!SP9h&E^l}X!v4ssy1Mm}s;HXSpDS5Tb<+4)~va-{<&nLqgfxFLuDtd`T) z_1*zBY{r3q*034P@^?I}5~}uWFwcP&y|V57kSe(lCC{`r$r}OYF4NwC94z+#v+)g z2Yu0=MdGaF>yew?+2PY#;g_hN`-M>Q;%i~8malDpJCD-jm~{U;x| zCUVVGdz&`qLs!3GM;@hRsE#+G4)Sb0RoiOMm2*=Ng_%)}9enAEYa0162C?8uC9-<5j-ygEtUq0@jTH((G^J51!UX(HArp7!(6b+yl434ZS(lmOcp z*jP*}YGIydUgT1HIkt5oU!B>Eje%8(t$>#z1tSvbcUx`>Ip3HwE z@{5MHRFA{m9V#;)KO=|kZFV3<_#C|K;!ClPw=ej10^i7{;`TPYakrj3J5P!C)sR&6 z2RNz2Zp16H9<4JkdWSs^BTb5n0G z3T7}o3@;D!Me4d2Zz|{6R-sq3Pz!D_=7DsyDlv?uij9I;_=IoKmf#Djn8r)G)|vBB zegizH*M?8xV@h}gAJf9a_?R9Zg5SFE0Q_FA>RNFm+XdDvfbp*5csz*WWGtQI_|ZDm z-@7FFI&%Z6NnA!80*Ffq;?=N6B4VvXfF0&XHfYhi%Fl6rD&=(e3}9Dulx0`Q-BjQo zcm*oh8@a0oCIjpKIuoaQps4^Ic?1oEFK&qc>&%N$|Dxo?RGIxyrcD3DXMi|dF2}DE zj;Iz*)QoRB+63XFZG!*g-L|7J)~9pFzmBQAFh8OO2+pzO20iK3U*RYKw;0`rLN#N$ z8y<6k4c{b)^#Y?BFQ7JGzHvxvN)Qa9tx@#eZ*1^xo;@)@Yx;YOYVl=!e8`{|6G3D6 z+Dh+_3!8I{7n6m2n?1lE4`e5Y*LcU*h4T3;aXI|z_rB27lk5-1B8*!Dze$dT@RaKI zCAd$TPNXGf1c7-wS^+mcAXi{B>H=s=E54*MypF^Cy1`vdtYnKA1CgeYWNH?WpcDY{ zC))5iJv|?k?0t^TJEBLzu$<0eS&Zra9mOYcZVHxH6Tuh$}B1>>@p2`{=HML#NNIa3f=>_ghcfZ$XK0KM9CokXOdQWW*0Om#8~F z0aFh;X^hOJOD*BL)<)UhwdR;+?1|y>#?9oSi8H+6sTK9uRm7Uzlub!JH6ZyP5yj`9 ztS4u&5LwdaJpL5$2aX37y$t`5Z{!)m{S%THQ-2GBq5g^A;32rgOU%}pt!p^baPPTc zCg%q*QR_p4I6)g_f*v$6C#&SRCecj7R3KDT%tFpyk5wG){cn^F(T<;5Fi-5=8&dCNM>QGDVn1 z8s^k$>$gyB5giOl;dJ?$o2X^{+OYem?6ilP}WOb0N-)6SJ7Il_;bPn5EYB4@4; zityU8Hbv1XC2_D)UAl`d2JHTAgm`qQ{#~-&>R(%-Eb|sZ+1YAQ#-hN?Za;RL+s+z- zSsOpUN3*Ut3L2*cy&sa{U1y$#gnZsHi#WPFye*N1)T!#-EC=6V4h$))70sLwANi>& zh&}Ss+aHj9qxn`lksbbD?1D7o?Zi`q9c4X>6dYIBg7w(*l6Noqco+}N0LD2`0tzS7 zly#nDlN{Puv2L198an8XYDyB;Pbz{XJEin!@&*r z1(4+jL`kA1bDfG@ES9bGEN+wU4M4T0tnf#8GW;~2Xvq#d5L%)_yHw~|Jh=3bC&DX9e09SLAuCJBf-OhD_SI_#T-j(|^CnWzel?6}L* zahJ1TqEw~l>Ge8T_Cs|zcMkT_LX79_O#sqWcH7POTS;^r3RcxoyD8+zJg0Dz0Zn+WsBZ| z{KLqgO9}~qB%$;>5@-nqLF5=T(Gvg%)_AiU4N7niRaQwI8Fjs6weU5G=kVE&6UJ@7 z#tR#%dE2a7euXb8F%A=#D0rZjTY`=nPE$2t)msiW$HSgIifq!Tz z6*_zL4qNoU_zt9m+d90U3^px{6%uG3h!4rt%YiK6G1NWb4r#&HQ%P)y*8H-G$#GR2 z5Az^M%nwxplHZ?J+<&v86$7qL6S{DYh0Z?koqjIm=LrJ}u~`Xu#%8=ch|2IF;|HMt zZ-fN<^cVTE8OxqOXo=b^hM`%e4$@;Ef-1( zcBdxJg`3MLh>+@r>p%$FDR;w~OXSFKxEogYfK-uqI6Pn@oPI5P2sv9Rx zFoth~7Pqi`d|`NOjZs|}EQf@06i1wMAXI3KuY>2EF#MIRsdTOPgQ~Hr8rPdaXd?7v zp7lY80$%5;O);hk<8E96S!y;qa$+TPY+8Is-iry{$XV<6>PjvGDbYnP(z4;z$MDq! z%Bvw8@z<7(G{{EFn^q{<=y*+uMR%iF=H1)B7WVg#2qe1jgV}A2Twzp{YToKnPdnM- zfbD`Nj(eKP6#kcdgrZM;*+f)GeA$HOS_cgDB_eKxt_Dm-mRF1n*W-|0HEw^Ys13v~ zsfS;qdb1JoZe_=eSul>ArFB$eEAR$9upQWhM>BQ>nPm$14N=H6>>VN}OhG5Mm<_f2 zk@JBVYW7F}z(>+;PemELO4qCY7zWW&j;sLZ3oS{d7q>*r}HIG4hAY~Yc@OGjdvl|04#xOzG&$%mPF)|hnY5=BB=K_f} zaCLL4@6=q>hKJ%?DD@4504jIz{`Oq=couho_=P4n@W^PW)&?BtS!uFLMb1uT=U2V_ zSs@dl;s*N-8L>Tg=qB%Cn z!Hzgcj!kiflH#PAVX;;z&K+!o;&uqar+0me4F}VPwZ|vNW6H4W*wbEsp~inm8vTF6Z9yi6PTw|EJ}CVoNNc6P z=}_rYcd*9etw?HqbwK@&cxm6nzT*XtFWQ~DDlv%Fw%{OLYh;IybVqD~Ym9w0#&+mh zxv7tt@E}^C&%D76yWcUr-aVo7x#s}kOKmx1*BC#;jlAA}hal#zGymM8B(R|~iL)xR zcTac|@tT+rqiMxj^T*&1;VRiaBCm`@u~k9yQ*V!_{U2Nz;>{rF1A@i|iSCDJ?qDJI zH?nRF!2U^LFxHHNC(ZDwf-{vd93g@m5MOj&sjp*C(Ayg-38D>A)EmT6%)xBsfI#{A zMWN$-Pm5LAty>`Jqr?i7XeaFu3m)INp3vpx%eEkIcv|_gPCRD^q0!_q__gK$EC9?m zm@N@IY%C_ljCsGCG4S>iq4GDoJMuR^5-(u5X~Nsqg_p!Dz&}JKvIJ*VX>g@>~pNMn)FuK4>EAlf-B0TM3e8-_*ru`9` z6EtQvqDcd-CMAdZ%H({NrwwQA!EG#yqxO*3H*Qb(hs^WK*Hq`uQnCNT*yE9m9SRLE zUq*P&AEH_o6JrgvzvdgaF?5uQ4nr3|uRfF`S9lZCqXGw}n5r^b20|B#d4*&1Z=f8N z!e|{QY6&?n6##H^Wb8xviMvspFDe~K=2|aShr(AymXVw34FQxBb(W;e2?anFb{wi$ zPdlCbs58AxoAUB422W@Vl!Ua$0;ZJ_+wA(_QcRBVnzyasHjlNY5Qe8?Ukfv>FbQuW zq}{D(R&uyfyK*xr{nfAV%@1_A2)lwU!0K7*q?rYxDja7l)Jx#n#>I1>tJ7GrTK7(N zH=o)aA#a|YJRYq@LL6vx;mm4mBAB;{EuP=uprY{Zj@i*&aZWZW1a~y^ADzgHsf~$! zUdF_hF-cACW8~J?G$c6JPoIJP{XOCJF_|48-Gv}~z60oLragpFS;q4mg&>sgV@Jnn zs9_OcmEJl>{Sm>`{vcXd-r^2JG131S=7P;(dn-P6xBeNw*|GU7@2_@w#WQTWE3_P3 zK;Dls%41eN)&dZu&m#4CE*nj}(^T=cE?%)9Ijj_*O^+c=j5xwD92uWMhguxx@Bx#N$)@%I+b{ z5<0R&n~V!u2Aw}RG~j%f@p8ETGn^}8Nj37UeZ7dweIh&YM||^lEEHx3pZa%P0>6K7 zZCgIW4VQxDGxEZxmd_{+orKE+xw+VSQ+Ds=;bG%m4y|b2KOpp6>;A!^rLFsq2tCEy zU?2upPxn0iLS)~7Th0wlfq})vk$u^r;gNm)LgOO)T;X#YPRZKUa6y(YdE_b7o?Sp= z%Fu}yWVxZvxeE@-B8l8kUL=td%8w-ag$DG(sZj5l(Ey8bY6MQL%gl*v&ra?X7#4Q? z7h67NTiZ)$x`w8Y?u2_f_xY~SiRTXv=i;-=xOAGi4daLJuE^RvtkEd!vK5Fj5w+mG ztX60bp24l4TVdZQV=1T5EHDmhojchT9_m>fnC@L08w3aO$zib(W(NvHhX=s1h%YNk z8c45)KnhJA5YT#j=o;v9`5-?IuGbiw!T~L^udt~iXlQP28FuTj$aUsay4EJo04u8Z z!%r4MvUBHMqj{>=G~l|}Fm@aYnvaC=?dtTGtU(bub2h4qcu_NkxV6|I z4URidqu=wVEzQH^`_V`U_Yje;92D?14&33KovZ1s z(VdsAFtTAY$vNRSUa&#X^-e!jUx!6*1pJ8P7+82F=QUx=7yvMaWIvIu#oQ~E<;Y4j{%V+->b{dP}D2mGsU7 zSi;;D;B)hw2rO!`2aUzujbRN9(|Wt$-_>1-ouM5H1y-2ffZ0!eA!8u8WL)Z|o!ve! z{nx=dWA+F*4GS29)VPF30EmGI6$aay5-?_Fp{v8AjZI11A+pgNL%LHW6W6gUKnr8p}Dzr*!n#We$cA z`v@?#DBJhXY)?DA&1$>1@`&Do?OC5w71uxJJIkWapbAgsXEFH$Lsr%s5 zyf*wQ?*7PTq{YsOh$r5{czoR31BQ8a302J;Am9%7H*c2QH~}K`(Oy#wm^6O+ zJZTwL1;FDe%#<#OMZFutA2X%$HD~+Slf)qAR^o+7tXrvf+NnvORQk%cPFN^*OvynN zAOxTjPL5$#LB9XzvGhrd_5npp2a8Pwc};;Yy=uuu7pmKs2RXM#tqAe z>yMCe2{ae9Uu0twC*zBn*Lv&R`YdDoNKOo%It5Qv6gpP!YR79aULe^+a9L7-hT-by z@p=4=uXvnkSrpL3*XT4SV8WpS-S+2&%&)`s2u(xw!9}f(0 z4i+GFIB}9VuC=&9JvIa4-$pzN%r`HfkEuyzmY1waKAw65%ZdusqC->xRYiu$I?d-@ zlYK!W4*~@^I(Q|7TQhO|xAaM6o5bzqQnSmgT>FWyN{ffN6h-Vmuw4h(y<4?9ZSjg} zQ~nXmXUd!0vuA+eqh%VnIBY=n$2QH07?t^;iySe0Md*4_iOk@>8bUwGh?|NKBz!1< zpqwHr_%VsI95wTX-Axa({zTkww7Aa+Bp~N6AMcwDrgsX=#4h%cw1G+oOV(mnEe{$# zcTPCz>sSSEdB?r4McyA?>DrFWXM?bIZ8V>d&+(&fj6 zayesOO1g~cIP|*FEJsua@aam3*Ei?E>WzA;SulMY1h)!UY8ldu*91HuZ#=$Cg6=m472$89t1@D2Rm4Pk5A|HFlPf< zjB354x|UEqg}OLIl)NW;@zwK8`-oB3JRWz+YiG{ z-PM$*yFP^jDcw5#4l_Xz+{MzwwPpqKCQpS}r1R@90YMGk5R^BR%LLb9;@Pa5QxSuT zg=h+o0Dn>r{|CkY5=<2qNH70|Tl3tx3eP+|yYZ~Ub0s{X`J+FBirs@AhX=t%5RP0% zE-yPr9JKZboeS`OP_dBqurjpo--$5nP<84;|x5fK)a48to5HC_z^Z)6Cv z<;za>g=1-cg3PJme-eT8@INf&zM*w=YrD5KU^?J>qxaprw`d)!8jf4j5P8Sl;CH>V zdkX>}O?KE{esLqG*YtW=VK!RRD**drnO?zxm|hwd_8hIFXZMzl+sL0Z9Jj6ETMI=Jd3ZKBDu}w2&Mb`6hg-IX^1kn;s-?nW4-F0=!6UIt>M4w7+lrKdXj)X!# zQ79iqP*ryg-mH03k5}issg*oC>G)u}z@KOT=mL))WQaQO0kfUqIyU7-gj=5@m|zpg z9hxTx@pCRdtJ=Q7aknQ6`R#MOsc(tYn+NGs`(90bTgw~;%mGi;Ru0^^(`)=zaaQQR zgziFZOvUuZZ|}B3xVR0Wd#%vp5_-@I;RHG2xC_I4a4W*;T+jEva2#o+)r!c5N-U7* z?evyPxOZXn`>>rkaNa6;=YV+>G_KZhvenpyNhD_=w$2{OH45B2DERQv=B=2Bz1XVj zc6+aPH+={XN8D5B?R}0eSm0-}rsRX5*Yw=k74&ZR+}T+^#~sDC7Uo}1+ZtH<&Ju6; z1L+{D?eAzRCf)!L+O=jkTKLSF_`<*k2s{aAN^8wq@J5)gHN&ZI*QCDvB=xp1^)?@G zSpS&i{`Bjec(s&oQF(>0hP5WsvIV&e_z_T5jl-Kxq+DxW#uOs{BQQ!O?=KC`PbJ^> zrJeD`)LT#L?O%99ca4vM>est{9a8Kg_}I|3ldZ%T^B$E3Ddr#r=*(L4Hc9cZO0n6T zgCI`6%*uM6z{d9WzmW)cfttTk5iNupK7WEUjpmK`MsxFAtgJV?ldgs_y}k|{Sy^kA zBF3|ruMJ%vxy_RhY@qw*0Nh=B7K6sEHJ5(D&eN$}aaw6~#bt?m&IOh4)!dLl$*bA4 z{?ny}GHCnFHXIDaNq?RSJg&z_Ru(IH|D$))eIUIKk{9H$|83vFCc&$>4%{sZx~hDt zA;Nv0I|lV9_8fn}TC)$5TrF6Z-u!z{M@?}YPwA;HmCAdn3+0J}b=K0M_nvYcQjw2N z=_~f><(C$QkAPz;UzWLL56^B?7eaqi2#p1SAj%0kfrP}lI&>s|20&xzYFz zT$7980eS9#C6TP$))jCgsmCT4hg^Z!kz*jCqb}Gcx+z0APZw=9e}tak^vOh@Ii|(M zTmB{%^yc4POnsL?zx1-iAn9y+-@||pp#6$pcDP%~hzB$Z%-=t@PZmo{XO@zckRS0r zvk3&75TRd2#lJ>w%)=bu87wMkC%EZ2V5s@l1dOP4fO2UrV2MB;L2BNuV)Eo8q$tRv z?jBb*PO)|5M&YU^yIbq0MKwHJl^xanqFPQzbxu_4-%;H^strhi)q)M%;5-Yq6$-{! zxz1gQ*j##H#Ma2%Li`ouuM~e}_+wXeGj|ki*OoP6isErK9_B(96&wRJa z&Tq@MShmPuxy^~QU0JQT{l?QyyAVCTOlQZ9iei6QpV zcHJGqv>3oZaVxHxpwCep#&Jz5p!5x;uxnB={-E!M=`w{>Y8RlVri;KuD3o2y?=0el zh*)m9acOBk(l~@0(#+QjZ2YK!vv6bin3odA0nY5FXixb~7O(_8aTD&!nMFOdT6G{M zSQhu;2v`u-2RNJFQ=!0U!1p7Z`o;5q3up&0D0$pBj1t0dZqr}<0kXj;L}ftBF*705 z)BL@b=I=Ut;{${M9!OQG+@3ZndXX7hHwjvfaeoz8B`PiWGp)q9~d_2$RlMR3$WgPJ9&3_J7nn(x3 z_^HEt`l(oYQaSoP>NC+=loeEE(M@D6zt!T~wDdRK(FuF+2_sW);S~vpV{GCCmU(i8 zJv_iW%z{Er-bhzjZ~p&`A{tLDFk33w0?eN4%zz6RGwG>GAJ@UT6+oX{=A6TdU&=GDg!++F@zDHKfq7vn-sY#glYJJJ#U__FW8nx8PoTiehB7NT z4o&Q>Ee6amits+|ou|(kf^oLScOC|Sg8(8FAJR|v?rYA4lVPN+RjVgB(nIri5t6B|5EF+@mWtlEcIE>3>CE5XEu%83$CE$Xy|NVB2SMo z4UxI-Vd4J9rFqt^w~?>1=U7J=$3KHTN+8ZgbDYYT&mD5We)#H!$c>V1LS7O>wb2Y9 z!I(9Xz5PA+b#W^73?Ow@n~g$QEtpythwU@Xs-87TQjChhbG;VrJs_OwTn;|fkL0ER$*Ui zZwb?tSEk|UPIMY{!y9_Eelu~~Al!`yVimjaw>J=!6R$%w z#aztrg#ac}y!0n3=>p+1fXwNo-_zD1%<1G>+*m{+7%HYl8-9$ja|$a{Z%^|vx>xfx zA7Q=-Jsp?}%Uh8q1dJX~&g3bQi(>sLf(j*@%t_J$Py1HD zN>X96!{IX0zF^J6%~|k{ zbi%uC_E7A;m8`QfqKIs=L>1VwkzF}7&e&sS?L_my^}1s7(adJH2S-vXN`?5BDq`i- zAvpG{^_iEt!D+WcqxiXU=)=hz`50HnfX=5K`ed1xo=^5@y*U|AI77zN^rVpF0(|R3 zzQ+1-*}rA|FsGhEN!x(sO(y+sJRq!_JH2#YhiPR#(5QGLP9YG`MF<`|chve&YK~fK z(@&;J&n*=X8Sk+1y7|Km_WtFe@;91ql^w49S>|)8c*SEzG>MiGgpL~{qbuc-2gR`mBt5wt`A+jrGbt`FhT(}LIGp!04=f# zb{N>Pi0pJPxR9bhR0j}xFpDmBn|~U|QG@+~JUxCGdRLaL3dDyG(Ov5UUE5vei$IzICn-}7`25v>sP zgfldA=4Xs4ajruA$XP~$6G)x!1q5kGF2H~ZwLY`~QO?auj+o6xA4uTdYN>s-n?~;DeUI3y$f38JQZOI`M zMl1|IjiI(CE>PD>w0F?vW5KUya6%~a8oNwO?zj0LWEGqduWCwH1^+!@Jj9BIiirn- zio_T&Q;;nu^`ny(D(WCeD%ZWOH{%-Wwtq1h_K8UB#CevlttT`{RFYdo>dn0L{ar7PdDJD%xuAn zSX#*G?(5#hwnoQsYB&Dvkf)=9m&vWcE@-5ST=^QPh>80J*L-nRAym^ zp55?tR34b=UqaMf^Yd_k#{H>ClJ z5f^`(E0Xhd+z!V)S+*p14I9FRLC;oGnvvwf3rVBjdXr|}>eLFDI&R4q+9jL+dJ$62 zmOwTx6Ckf%XfY$K3d~AI^;GGIK$KPjTGKMkYsBLZqH6OW*fmw?CMg{8HHGGHQ;`SZ zqQ?yHA|Y67CPp8~Cjj?&Yl_-jk7a}Y#QNn4Cr7JKHvcFYd(azolT+et7&W0+wv6go4E`Hi7N0i6vOSB(!_K4&F5b1*@s7)1 zmh=4$unpVwn6@2H6Hn6^zbmHgGRA)q)4njq?~Q4D&Gi&*;!`0>!F}Gf|3fUiO!r5x z)H~oJ5$^NgB@y29Dkj2t9^K7gDm(SagiQu7E3}qGHj|eXT6+RIKq7YAIZj$Dy-PIV zo3%ztnS^%2%!AqkE6bJ81Wd2j<2Ci*9In9W+$x;Es+?j}O^a1xL%pgF9=7Vt$N$F0 zUx|ZTSIp|Dx&c{QqLnvvR5c+Z-kLh9nxmD?X6Fd-LmlGm&mX-nic#pejn;h8cK+(3 zZBE~vC3<=%#U!h>^a-Ri?<^%v-ol-PdI-j$3bET*Z7#$?xuEik7gT=n;HptLDw{Mc ze2_I+ywyU^AH`nD?jRlcrF`aHb-Z&4%HXZ*%?sH8p{?RK&pJet@>=BF+Fr1ufQLdb z|LZ~Il-heM$mdd>Jy~-$3PLw#VGV|h2{;p6ZGMAQ9AaP+xc#jjd$x!>D)dAEH9oL= zBX%hk!BmCUuH221=Cjzbqt~-mRt9MnG=`^|%=%o4E4(_SD7!K{lv8#>_!jWyBw4eheJF3_YC2A|%b~5A-w;=Zewcn_ zp|lQhW*EhxekuAcsgMf@BqHQrYn}t5$@aa+Fiw`q?wj3&Gg07}&awfXw#Sft%(k*C z`-RRTQE2D)P^}FprhEW!5fh~K=G$;oXoN`IU>r05`_kpT`?=vKVE^(7%Ted%s*gTZKDcTO7_IO8Te9TT%m9P2iAOmBP-47 z4>-EiVe6pl*`iMN(g>oVIAno|Y;BjQ(GFduJ|t%dHHbnilo3Z?(RZx$s7d;7oi0{tG3d@vBP2J-|oqPyA$K7;rJY)v&kj?FUjw@?P@k?P_TI9@V!zwkM+ z^FxG?v!%BaHMQswWfzHwd~Z<;T7*-h_JDeBeIAB&iL+6kKJ#+;IWdyp|G`@0Y#{mn zoyY_wW6&sqChdLYo+XOXIpn*}kW~q+HQV$qLNY%DF<;3-dlIWT73?NX&S+wVgjAIj zITSZ$ z40VL+dv_mwza6RB_b*OI-yzkhzJG{Ny6;;7VAtve7(_x!DI zQR}ixvT|D!Jd@b>5L9L~>h;D5Hr435VM&m$Tf)@2|Rnq z_QOgf-GChu`o0Z#4yie0r)D&uAfo|;R0F<9H=sMQ4={2vT^|ioOjqcV?@dH2P&En3 zW2ZR#ejh^VzTfc``kq+8%CMF!B0<4&i@k((W@s}ge1-d(&a-ediR%Mczn`HMSU;>L zd^a8G9H)9;oY9048BG|%CTNDU_i!~z);LpJmzEppSAKJm&1c)%pmcmZPR7{uj_OP9 zjLQOYC+yY~tA3DNT5CQDhQ<*|882nC7LN-i_EJqHtp0)d)txVI_ZbiW+V`K7(YVa= z(Z8Dy8{cSNnTogfcX=h(R`XZr6a*cv*bsF1&<(lH2<)I9lQYQH7B!aLJ31LJ5qz^F zIu@=*C@M$EI~J~ycm6_T+QdgJA`jz^EeuI^zS-H4Y&#=j5qTI3O%;-dv2d3P$wM>< z)>%uXvpdl4j-8_M1NYp=yCE;5**Ne8uk6AU1#vHe;=C05 zQl(3=<@g-A4*YR-u03T zs+tFgZ163@N5?`jSrfyxj)lAoJ{sY#vG7{_#v=SR77}}6V&(==(IgO{l7~{LsH3M2 ze4}09l)v|lFNlYt!EK(EktU6=Dn8FV;;`|>=AaXubsU(#%>0PrXA0pDjQ5!@q~gDi z?CVCqA^Sc7Mhf5tqr4B2E`-l|@{o5kmKTFjj)#36L=Omdz1Wfc5V9{0B|%oj$)xyn z$jI=|0vP(^RoNO$yFIrRBE%E3K!YIz%8rG9fbz)&I9JiJotCk43xcj23Tj+t;&C9N zoS*}XEY+ckwCoAy!kk=|DSLt@rDac{m5?ok3%R|h5k;6w9-z>R1GsY_R4@iYMSNm* zTUTfpK0JdDP$0e(dDo4T;gBX?hNO_iazJ}qS&nP9?s`#o?dQ_N?B*@!g2wbL2Yh;I zoC6(oP;;3yb=P3)?z#17MA-0xV{$O@R>mr11d>}agry-~lFjA!tx{FvB6b?81puYR zt%=e$;Og~{`w$+uDb$1Wq=R@W8lC`1$Jy0m^f1-Zf!X^lK)~GaM>&{aV1C^wgPVa3v(HU`7%qwh zsZ;-OZ?ES1gfOu4CYo?*j%ppXCEtdA*!tBG;d7ojf~1D_9Q$$Rw0r)sI5Ly^Ht;LB zcu{qWzc@BRGtMkp;zK5{IXlNNleyTu!p8L{c)&Y?=jmNF2-DAHmgcG2qrnZvv`RRF zHr~>_8$7qsq%i=+OsW@Sb1hSq4Q9_i?rU|=&%-@XsgI|kSv;tWeTRDm2u&;G{v>VO z+u`ArWzUMFtGsn<9{-Ny0QHWmy*+K@?pnVZ;%VoJ4XebBX1!F?bJM}5EkCv`Vl?mD zHyy2c-f`QpA1KL8_gf1<}oiBtM+_um~vXT^{W|hN)`JV_+kq1Of&io>asO& z&-_UTRP{H+1fh90Rt6$p^@avZrGY)4qtazr#0ZGZ6wR)@L7PTAJ0PT zS!8`Lw!)>>b1a^0zK*B)*aX-p1P$D^s}zm=c9nat6ugK~2F0h^m8WT0$%A-f=11@} zuR~^j+$0~tj`9gVdAsoB_q}+sMZ^d`>C=-inMH84@aLu)tPF_RZlyG>=MFq;ux=o# z)yf>Tp10#^e2M0Ey*p6!eYZ=!=9-;w3uSD_r1i9&iZpQC`_mC%o$>rJpL!gcHgg%Q z5oPe$Mzj4rE5w$YxjQUQdlN(NREhP5>S}NP_&ruol0KERk`jo$`KKU~=t5ANJC5Z5 z-!9`}zHJ3KNJNm7uw*HKu}`BUldm+mV;)U!&ChZ1aKR12Ct#hF)+0CI{TPNg5KB(P z;cGq@qFm&#CH)oz6;6_J{{kw&G=`cVAAq4$SMlnD+s+^beT$Ts_+JUXL|BbEvdZx_ zq2GzsjzhQFdalEh-#0M~?_gWxi2<~p?^sXlyCD9lB5HJ%e*Dn_>c^q~5=eCOrUxuI zh^C@^%Lj0o0Mzf6>pX84%rPJDk4|Cu{(zjC>rD+_2(W@S06Nr|Z)ZEbAJ6`!YOHhl zS~LJa_yFFYK^T`3f6Oxvs2tjP>=3Lr%U~gvu9pZhj+GL_rI6L|a33i7GW?KTBbbGx z=eCK|jluW{`fbGrQYB}Mh3!35wTkh3-}AH+ zr^Q6hG>#$CfcnAiFLY51mo3KozYU$H9&?dc5$V7ggO7&QY784qv8ni98=Hztx2D$N zKzg*I9&e5Ko0SAB@VXwudEq$r|I3dIA7Or3DXkgvl6QHyfE%ay%=WyS9As{_z*0niYLHX2WdJJisS{9_ z*+~_k)*&)QSnnL}0Mu<(fPexhc;)8dXzTX@)QZy;ph{4*15hIoOatl&0Syqe6BV1c zC;9-?8K(%KwhvQ)+QO&8sB$dZQrs>~AJb)nO#s#YffGMf1gdwM7l%%8WqzX`f zLSzb1zd&sa6tIa`Sb_f_M*Y560jeL0b^z-0qnv>Hz;t5NObHnfZycAS5~H$5TtQ={@gbkr%I*Y~CaAS!RpjD++c77RZGVfaP!u5K^KNt$d|wm~@2j53lfY>2 zYER^^c#^y4>W15EYK)=*nrk&|bZ|pUx7*IBwerU0wto#qB8;nuaaniB#86*nTIU?Z`&CD$6=ACAZuoU%6g#5)IUyj_T$e8Nk2F!1pLAMxn&TbfF-__P(zo<|J4|w0ecDRMFf#C1Lu)e)NXk??k!9#IyBB#NODs0Xu8AVrq|EHdSm z$VO~_Hx_dJa1=ZS_bqZuPp;m$1^w0HmAF9?>kSsU{Ci+aD$QW)GsuYzyg$L{Stg*2 z>u(UUxq^e>!uwPlNNJ7t3~bN?%PYM&$?_8%iXb|Ut9K(Y{$s0{^(;&#hTe9*vUe6=A|3-C4&ud;OInOAnhg)cR2fklv6kc z7z<{?#wQ0)KE?C5!`4e3`Qry<#RXoF=~6Bii6KM^f3)!=y97qVZj&4;3s;3sEH%H_ zLy9)B(3p&Y59FCoK@z9q^+pX_l2G|kPlp~f;$e$VHz)4_%+7c>Kj{@T3~F9_%FCKN@GL>A-OUIt@uA;MkNkG z+cO4QFjwo`LU`tcUmFVK*J8?mX-Utz#L-rAi?9WavEUNHGjS!a#AQ9WZ|z~c3rWfY z4Kqveam-86yNZ?|q?Jw24h_`Gj`p-KL?X?$=TKDAp;MFc{%2bT0eTSSrgUnogp4;6 zk}OcChRJ09dBtA-2?+L?LiC*90X~e;7XDx2JO21 z9TgX$GS1mn6iUBioiCEqYh|}Zkv%k6E31Mz~DRMau7!a1;ZlOGakTu_HE*NTTvl88pwt*B=T^{XIuzzf|ASx zQUa0E({_tMpL52BWg>)6{_=;Vo1QqGWcXt$B&rVr3@VYr8ry^f&Fz?q8}z`|AgB4y z^(h;YTQG#Q9eE9TaOv+TyYDhOa20}_Y}g%}2(U8o84Cl93V=)ON$li+v1LoriGs|r znd2#@2LiHn=A-{4dL)%O0={W<6e#i)biEi^wT@Jjmero_X@8J#fkIi49Q7o{eDGg{ z?aWdFMB-phkoNXP^G`X*VX0YpVI0B-CXurpjwFplJ5_z4bO}c^s+}$dx?%XcmtkRD zA_1+V^u!@a;_}Y-;qP7$`c*W?L_V%JC;i*S+fkTB1gkvc<~~8;DZ+oNC+cTJ?w)ISi|zD(PECJ_`@Y0w-=GJSAw$p@bp7~ zZNC{*KVFB+F8?M>Q>C%WU$O#6D*EAc#RKBQ@L5Pvu8;jOmB5dZ*>IK0Wm7k}?|l=) zj~fzDa3CIBm1SOtjM+~~;xXHBX9nBjY3FS(7{qHexBw@uh9M75)oH-183+-skKkFR zjqo_O zU72M@HdskHs%8x^LDqfJWpm?emfW+6p+`qsV%j4J_2v(P1}vTQCOav|yElKQm?v9$ z!>6EmBFGC6W&Xtq}T| zO^E(j_~}(4HsHzE(~@mUL8JDgE>!;3KIB&on~ zpbb%hp|RNs!=Im%0mE)+6(yr2Ewhs<7(R+ff~}aXo`u>{Fq~-x{xdNA^RWtsLs6;& zhTpoJFx<7(3B&6o1eAr)djJdvtgKjO~HH0+9Ab%OcZvopXv14`U<(idN`k}5EdM`Q}j15sNF%wP9Y z0fITB1BbxVH~YX-OI4*6C>TGAA{~l_-yu?ZmM72`BP>CNiL|RQ;hPbef^a2jV?fAlnHBgCKzM$>g762ukS5bR zG@B7jLwNP8P6$^?Na1h_!b`+v^4&ZO#{1u3#|{VM98{c!@$TUkjIWT2Z5U5d%^-}Q z=yAgMM(7wMx4`)8O->kZF3EuLdD0Y29!dJBom9bi1R_%~e&^fWX&Ap^1^xptJ{FxL z7B4`N4j4Bfn1=DsUU9ZI~0T_cKJ??Jt$taNYBbR86?nbvxn8 z`|{FoeR!i2t~Z~N0oS)*cjE43JE?-}azv)!8bfU<+`Y*P{0Hc7*HH?tr=v&*{T-n? zX9n8wZ3FFJ9vNAHXNP3pHg5hNDn)8ivCeA`IuTXu_~b)j=4(yut~?`&L>Z zf#HekoiN;YS_TY%j2&I6Lz1prXC+lIya16Y80Mh16b$$5R{;gX@39?oXnxh=1Ilq` zjr025*Uv3;a7CPs@A*+ zU(z5wXQLCOk8em%Z9z+Qgf($7)%=+M0>EFPXemJEbt^*z;J^1;0DOxty3Ff~x|{$U zXoFJ#XuRMA;LlIV0ATm4P5_qKNfiJeMPv#mXQ8$fPR_IfhXbITuYm2vcL-3A3{?o3 zhaw%5I$L$lB8;CyYo=gH!gzy(4xH3tPd^m<04V_0py)IJFJg!Q{O>)4o4vf;Eg^y8 zzUQ4#T+wNT1d5ewoKQTmCkS0%cs1-J2V018fnaqnOYj5Am;C-QVv11Iug?0!hn zU7V~7Y{i6^}>PNE_Qxssj~gBbbI@<60*KKYZbUiA)Y&tDVd<%66se2O8W;&CjR zFg!}tK^Qhe!J3BQ1vW$lhR=69vGAUgGGMs>MJEiewUes3{3aq(Fnst62Mm8_1^zQI z+&WOfP(!H>7>-6T4Z|XV8t_Z_oIkGV6NVR3oo?gd%_v&R5PCR^A;R#r&snrRo!3Z6 zrt=xkIsy5G9TGs!UgZR2Ej9$CWTja8`z9wKPqvdPK;DJO6d*4{Z48K{bFmfp&j50f zTLE(KXBmJ@AeaW^w$)B#yi`Jt>1>OWu%SzX@jMiq2IJ`r5sZsiFi~-#s)49zLW?L# zcX7%-xy%X)1jnv)Lhy(aGaz{VMkfT{S&=cFryw!~!DCTd3W7td03rC@CVhwIb1Z3m za;^g3(oYG#lr`U95ln;c-X16TMo373FC{CI&shRvCti~z7a0;8xd?4~Gi?-kGTRFn z23a~`SfQ#R3?E+VgyD5ILeg@s2TG6lm|cR66V+6w#! zU^sMuf?*g%I$+pb&X-A)*8UX`B9888e1M7GVa9>=*Vwq7_Zt>C8JEacE#n?#-c*q^u$c)$o;{DzDG0srzR7T{mti!Rf@WQh~-U)mu7{G2W) z;3tpF0Q{4%#FYL?(jq&l0{m|fnF9RfsEq-c{*$c0e*o}z!5J_YqOU*B0Q^n_(|~__ zr4#U1Na$eX<@qrv=rhlc$ssN4Cw+DW{wvI*V5plu*TN)@__(N;hJlbek~rgqoWH!H zud`%vQ8J!}mL57k&h}Jg7JfkewA?nYhk@{+^T%akj(Mcd_Q`+_{$roJrvKlg{KXT#qyL94zm@oL2Ml`q=)c0xWqro0{@?dK z`u`p6`=sSC{r?{2FAjW1{|{6C;(Ncl{g-@4`DY)d{7b$^`Fr%kw}0cDzTvay58vJX z-+f2<*B`okH|f*$AM`o?A{aDhl4$4r6}8ILzT*Xd&ifwif35oP@OgapA>q@)_CNl9 zpY50W7ytgd;djY*)PMG&>lgT){T=n6_dV)=t?E1a|Np3a8}O*AYj1oeGa&;6Pf(Dk zsAG+7>`)tx)!{41fngdt!Qm~!e~X?Lhx(e-*2BYlbHn6_IjV^|MD<7`|Ptn)?Rz>wbx#I zt+jC-)RE}t?|%Hr?OXB*Y&bmd&9R{rBBjJ z?K5%5`QtROZc%8gLNoZ@iW<-n++aYBU>QtJeCiSy1K|pevPkd)rL_%ZYc==%3Xk}* z=+tl5-@I6>xmW6_#i7S@12mPwLpxgPAp2>I`V8-nUnPsARs}?8(%m6^fIMaIfMLxD zp}6!3_Ok>ufj&0RO61v84-l-;uXCHUo5o9%9pk0Hu9C(}QF8&bkr$NX=a+^|!;F}u zYb)qLrhf=^CLm+VF!(6oSY42(OkP4dFbQ# z*d~#jLx-(mojXHfU%&wMnu>ac8u+J~U6VwErO!4V0rWyQ*sk(yR>^Pqh}E%Aoozi% zx#)=6qo`f>WiK*0eW|py%hE5a*QZ|Ap!^5>H!8ke6A|7Ddv^>4P4*=`(($4wyGF;Y zgKVT-V^~UJ^OZ8o(B7A1**7%kfg9>kT2#P6n)Lno@XhGz{ZfGX%uul-8}e65ZAUc3 zV6kqv;giMp=&9Qz7kY5Fe!?#O)Sc8Sn@vnh1v*$3S82)Xp*x3Y-HC=S?ele_hgSF! zVZVe(6b|5zh|qcf=g19QpdaQ_2 z662W~-o2FnZ>U|oQ>Kww<)-j3<(__+a=#(VP3b8+7iYvusC57c4pI>gJo^@rX z)9*5z&zHVxy|5B@zR@+n`^C%tstf6ll@9OVceDUxeGWYoo;dM|15g^>7BMk1j*kX^ zTK3L3SA2X_eBFnaa=zfc_H;2kPrQ_Y!~QW5)0a`pt8vqNoj49j{6Ap&I=EcNOC?|O z)5rSkRIdC~zTv6j$8gSl6*r5+4Yn&+{P<{aP3U&J_={2e8l5ls#oHOZ$XGU%abr=) zmAIlyGu3(ajdgY}iOrg+wM27K;p$zuv0NpE@W#}It3{D9Sk_dD`|!#Pt2B19F<2Bk zUTVH{!DV;NG4a2JMZHgLc^?@POa828Hb;z(a(HI-;yU=oPR+c$Ay+nQY}c@8x;CVzZfw|ysRc#qHzVdvdl#-=2>5S??}9p)k#Q^2aa{v0ybGQm`+~J4No)CU zxx^05{Jhn(0)wNi1O8QEW_A|FxOu)TNR^JZ;b(S>Pc=R)ZhRO%u2D@p8DKs2NTsAK zCAtX}^jaM*XDB$rqlyn+>|z?_b_{1cV(Jm&w_`$lq{KRatEY?(Jml3UtFf^4Ma@$* z)2|yHs2RqvnQid_979Fvo6%avaV%=*Bce{g<-*@p@g_>OiJZK+&Dw+{bS`QS>X=v9n42#6=8L;R@Fx6{Teq)6jPn70pK%{*{CM5Sc$+5Jd5uAL zY&iz3(z+DH%g!cRMTaa$30r8b(rTbABacfQ{FM?Z?1Lr6>D|qvajQ?0GEKw z*FCmRCAh(c4W&O4=+?i=8=e}c;!Z$T7)`;ZgmQCSXky4A=&=W+rxWsTQgpajEs?jm z#gC7Q7!pG)-jI|7sj3z2LBV#9h%7sE5fguT2rra~A0(adZf-E-ky zJQh9R z^ewEXuB==*G@qM*Dn$(*fLEOZq;I9c>X_g96NYuv{IYw_*Xy$kN>dZ>b#4UlFy;w_pk<8ZkfYsXO zcGbbwh2)dZN<2C4DmenH1de*_)x4&w{U{e)Sx!MOvRgEVdxM zj+ueATUql=&)TgV77?>d@&URr;2VG~qs)x_crP1(C^7dA-m**=&tMCtV=tw{r>?wT zQ8()cb+ci=ZZ5KPvw3gSoWC0uuAt?MdZT7@N1fP<%Z#u&!}^A$?5$$Cuq9B0S800{ zZ&Uz{$eL(zy<82d=kf6I*T-f2Q$kHBqCc0oZ z_$j~^BXOYZC#gs!96BtTPW#b_m=V&^pX-QPJW0?ZyaW>@XuisuRy-g_trZD79^4sB zVGtj6;<+jyJ&av&&WZThPQ2_D-k6E_X2j2R;yL)>tBmk~=)e_E473P;K$lUW_5Q7H z7mS%-Kq}ax?ZyLn7oq-F81rbwqj;RPHMvT#g(`92{d9`P0WM8|?4$ zt#swk%j(vxO6wGi8y#n4mFNJa^(4F%R_N41psE~nRbg=jSrxls_}PF?mkTs5okB}E z9a5#0dTuUNp{tTl zS^=%1#?vZY2my=4D;I7eHvM@F#n>q=@4LZTDsAVoEC(%F<2u4yi3Y`La1{Fn^5_9L zm*dm3)>--h6KcRVjFrQ=3XjQMiq;FjWsL0Au!-p}uB82(ECq{Ipf?iO9tk|Jd+hdb zoYa6>B(W)0T077Vq+X9Va63)kuwSk(F@vzJf`;Se1OZ6VZD5t9`R^95Zn4}0x_^)deE*?Y1@io9&$TF zExVva0$tJI{@BD>DQ`8W1v`hsY~a7Jx&l*5+foEDz$2nRiV?gH-}z*^Fa#%H*Ey0G%(^u(S(tu(iky`!f@-F z(prRM>_jZ@o$MH$97GxTpo1Uq1O0b#Iui!qTaP%SkURwh2wQVd45Hw?c{A{g%x=$_ ztT!23!RaqZnHx5aF(+h2eT+^mgC!hHAY~r~K9t%GNKR4_1`RC!B}LC(QWqg!DnjBY(p> zv=8PTe?NgXFqkgq4oj|o;797YNYRUqfQORop8>D!mf@#txR{zQZqRs`x%T7Q9jMU3L)5Q1L@{u&O%4JHrL; z66stfsX4bisHiJsE`75HvjVb0INminu@DXxFZ&a+j{3foA0qV1GKO#=5z4cJtovp= z$hzm)LDpSq2U+(&Zj#xmu$8k1Z1E&$4@=ZVQ{!&* zvzsp?r6r5We+|z#JHOWY5w+&zGhlKdpK)sZXXG=oaV}2Oep!$l7jDL13d-b%Lo1fB0iMAeBi!<@BV?Fg75x;6$Rfb2ktBQUODjX zg6~xWD+<0>4a~^@&g(lnxTA5nGR$-=6T9WbLb1^i>}N%<^j5O!;6`>B_ACz7hw}hC z$`;Q#yGWoF!#yjd11SLq$>o^kN)OGDQ5?#abTpPj2=j3=@;;;ZZ%EizP*4s(AWbN5 zwvNpjc3#);Xyp0|T$TJ5*26mSntjP~%o8?G4`W#=!46O-qXWhU-0eR?H4p7XCA^T! z+>L;Wi(&&}FY66bZtn7;NP!EwYN2+A^C<@gfX<32cc? z^z0`??p4jRD|AQ?+y=`PMh!ko3C<-#W#8sT$o?VY_KR$D6}45D6|19l@rp>est}Z z#Tp5YdsTnJiPb%afXHK|q^2y}8h7jtiWYysCR{%hS&Ybdx!7U6W=mzF#v*0;PgoGR z69{Ew*$~QrEJG**X$)K8;M-ci#Fkq;fa$Uk@vebem{a0Uw8|!?7vVyPqnu_#MzIbF z676iZD|Tk0on7nV4YLyS`c#8m94|N8bru)@rJWHRH{kTee+th8>639Cg%?Z&1RVqp zGLCgfDyyfU1ClNfd2Y19#9;_=4+}4-7y61)##dT`sV1psY&) zN{_k-7{FEGT;nT-zbp&%4F#a@UpuOy1DQ`Ld}TU0}V`1=!m<-~>5V!O=W!PnXA~g2ltH z6u$}h;e2Fl1l$)#Khk6;K@J=TWJNCdxDQ(w@)+5(9cNGvPZ8 zC2{MNEviR_eV}vJA@L{ghtzmgyx8nCNIK;2&CDscn_*uH>A)b{<3|bBm|Xp*qJC7& z8dKwDeIG+NHSrZWnRF0|LKuefZ`&;K5&Lpa$VZTn_daCm2}uBT6HOZT(K0t8D5k^A zL}4TGGF0BbqdXfQ1@K&l?f^W|PlV^Zk?>3!4$ny_?9;-tuk*0*2wXe@c%Ez|vH3Xs z{1W-uyLtFoflLMXIUj|6T6n&GczABI;hFM@@Eku9o`W|IgXfHY0-kLhhsDoLH%a{5 zg`z(mKP!=c7=FGz0v;6h@%T}(pf`DN^rsqoKMIT9sApS&d{fylM%ggkjYXs=65N@b z{!wyfCcY0$ltU1Z-;0CUY!M%XMPJmjYe;^qDjQS}{*1>j0^fmdMii;Zi#=*Gf~V?^ zU;|he+!lXP7OKyIk^&BVEABb~4}K6m`|=KakIp~vg?IN(ocMMayLlLaBUzmI`mX4T zilS)HDC6c}Toe~-;H4ZdF`rDSiC!G1@_cv`6^~oIhy%f%#+bNy({w2POHU1@|K1VP8%uqzTSgm8%Up5KdUw}Z zSv=?9lk`d#$0gdy`?zAb;8$|9*2C!{>|w+pCHYezQZW;TjaZoqK(q1LbYIR5Rp_ z<8W?z{4(P`H$z{K*BS2>G1L&RHQw{YeJOPZ_^&1Bpg0T<zo! z+KzP)4C52F6RMeb6D$eSf$Dcj-YmP`B&JS^pORSWZj7IhSXva0PfRTJ)WnsF3Dwmk&#CEDenTj+(wBIgo{`4}+`|0q>_nRu)mj z5wI5m!loxzx&FY$WkNt?b7)NC&(xlTg&6)rv57Yj26BM}#v&&9Cp^dYcD{zVq!YLL z&y3sI`8wiOJ8_A>Fm7`;V`3xgIWrzp6B}PeNR597p}h!Q9-oiUYY2Tl{xyVNM`%tw ziqIeB*XaoDM+g_}Mly*(gz#|Ph$6ZZjCZR-cF@iawb};K=`i#qg~OyCcI}gtHaWCx z2pW~PBpYc%5su%C5TU4%FcON{5=KI?TEbWe1qPot3j$6EeF(p6gX7{bf|LmrY*YFW!p^Tu-_ccRr|3Bv3lW zgeu&Sb%RFvG*5>r)DOa@`T>FwXaW4OZ5OUzzdiBpIj-1w(UjSOK&_atMitw_pm-Sl zkxZv*dc|~{UmVY5q66UgoOqjKU*cG0MB;Meew9!1YCWrlE?)GVZ?1>crJJ_dFY# zXa|r~Y3&DI+72kK+im=a=YWFW8@TGPbHJyHDXUa56Z_2OFM`T`P8F9_sK(zw^B-Sz z>FgKBVT#Z6r)IiaUZWlYUMkegOh1;84`Nfb;H#of72Cr~xSP<1lgH`RJ0ar-3LRiM zBQm`bWL3N$i(;#oNM8UogRtm|ovDde(O)Cl8>#Le(cYseIe3vR_n|3mH5equM{ah3 zKOP}C@mkrgEh^5nj@YjKpU^Hi8HFeuy~FKfnTiusyi}^@zkAu^HL5usY;Pm@PV7A+ zAk!vpe_}^xho*dT{gC@gx!dHe?t2RQ7hB;wflEDTtivO|BvjL$WZ-*K+gI_qP#0^O znLvnjjo^xxVV?`pytzi^GS@H{1Q`jL1Sg3&xllK{pjXC|1H3@-!!%eDHp^=}k_HPW zKkc#abHZ)Hh)9><{#quY%7=>W{%VBfo#VjsiAMXgcy-6lb6`_iX8_^dh5>l&Noj9+ zx&4((r%L&&+*@a3hF%L-V|zdF{}z6}osSq5y*R{>@`uC^Zw z@X*ao4fbP^{b=T6>ZW>BA3q+4;YBWM{Z(L%N%^E^iPCy2V9=+wbB&3gxXJ%(&1HR< zOTt*(ENc%?AeIF|zCT|+vV)h{Hrv@mvz?}_X8VKk?|S?VCEMo%hU$*)+Nj&SNy9r) zVzyt8zr%1n^ePYXCI0PctV1=yc(a*$yo9^~M76X6$_Rr|@lw>(A+OQz#BUvb_v5!7 zzm52H;0HYgy-zds-C^8EC23#XfF z!w+J0GrdnjEVbkUEuj6TUTDAhU=uufxB@%$PHU`v4T;*nSMC3k^7y+8JO2#ea6MS> z!m$U#ZExwRC+i+WVmMwF&nb_0FZ|mBP-e_@slgW-SCOtZIFPS}OyL?{Ct_oOhj?r` z&nYPYVzPG4(;I!%%gsU!piMq?1VKzp#n6;rNT6u(THde!{cOij3f z3U||&qPSBn8jOICz7r|X{PAdWmXGc=J&}|OHkzkbqvv?VEU)P7v`#iW8MAhN$~)Su z_4d?GgCNLd+%(M-zt#wrH+?kj6CRsGM-}KZ(*p(_<)dU) zfXt20q6))fp_bRmJ1w6%%WKxo6SXx{Yv(D(>*xejhrg`O8((4s%bL!Y)fLwF9Fnjp zpHyF&Q{R5vJB1p{uv&0d%<^_x5P!^SKxKd&<8Xn7U%6QuvKqeSVdce2+XML0a+Ag! zijl(0YB5WD!j%9AJmBr$*ES~<`wjreqInk3JPT+((}C^d&|C`~;4&{yN9VxFKymDI zVph4bVU7k|fxicr*!h|#(rJ0j+H$@B^_ipRb~R*bwJb2pW1ywl)CJ{A>w0tz8Zipc z0q9Y22OtmoJqyq}r1|82H#{GrAoyH?biC6#(X5@F@;-+*7vO_BDu$M_9Cx5#jEz!O zOl9DvX(jQSjiAyr&F&${bF&NsS-g8z*OKp(U#aYiBq9%BDqB z6O$5e%*&cCeAA%I`veAtD^=Qtzfi8|1+co>KL7!NYP_cOzn+bi)UllyVxm^llB>!|pV6s!3)aq6mWR-%zyc`_N(!;*Xx(U~jfc<9eh+=F#V@g2 zS)AX+)QJ3~R?hMgLi{koI$ta9v`#QQ@5}k8!Sz8oTJq*#C+RN5NK|B!)ZnEQuM8?FA^O2dfrp9bVj@ z88>X_f7s$=t8&u`bW00#U}4bAT20E!#VlRfP^%?dk9*|?VqKy^wsv_r@Q%(zQ*}MH zhM)CoJJw@D>8VxaPtE{qhzkxgtsOBv!>*GZgOQ;uzX3vQUCgS2v-^$Q8(C*u<>6d} z`z-e0<`n6jns94zm{iDYbUh>}cPXA3^;E#VPQ#)DIPUavp9s`!Mr8)3ri*Rz=gUh$1 z33IuO9a|UN8Cz&~LUV4}s6&sM!T#5ypz7M#m+FF@vFS)tCW*h6y37}VYWy+%uj5-J z(}B-S7(1Cs)YSBBG27UeA!leHDOl-Ft2B5)g|eIqg*GS?mRzQbn*a*Q*^byulrcV> znw>49w+=K@*5$yW8t+Y5QV|XId}4KBvHb~lmfAT`s=<^YcwuE@DULolaDt^jYWlk- zjtK|*(9<09f#{Du$nqkX=2-kSPxMFiYX2X@fxZi{XS|Rs1R%k!pWqiX#9Tm*01JfJ ziYmMy3ebmK{y9#O{yzpfO^;FQ&tS+GH3h`13P`uy{d+afemu?E3M`3gU<(~`8|Pr4 z$uToP?TB#O0pO!5b}rTnXhLq$+-Ki`p<2ToyDGY&U={ZKH7x#)@m7%>pS;+eytoJg zOsTmN>}`BgH99j|5X+5m7jYcCuBPd~!lDy2t3<_$qhjTmDX#BA(OaWfA$74u@3*jR z#&&lLOd7Q0T3OZfjQ0*OiL+AEI%B72bxb2-JcSPw0zh;S8M_(hE)i25jCAg+LFdI^ zeS(XrEb?`x08@xW`l*}sgRsMTQAgM;8MpukKsW=fmQc3AhDS~_RlKMr?;X!(YE!S9 zhvtP;WevQGUssPwhhousyftB>T{lHDF?Hn88(1$Kdtwqf`o2(BB?Fc>)ABehFuzbr zZ@C|ZL7+i4Yks7qgOi)$hKB05%xfD$$!o6{ML0aF64Ox!7}g01+M(1?AOTr`Pn~+L z4`EFe-qqBd0{j`CH7Of9@TiEDAyOl}{3ul@F~=9-g<8irYg<;)oW&=|3xKZ;;f~WX zC_f$w)m(Rjo;uqdgO*tBB0W&stOo}%X2GnBL1&A>v-T+Tn8a_bZ~PVI1-f-N(z!w2 zf<28>rd~Hcj_-IAb3!P;-n#GZgJkx&;_2pfI#SLSweztT#)T0m%bK*0=A;0Q$X<^204S(tbG~zm7iF&>Uv-U$7#4yQ(GpVvDAT&Xxl z`@E6*Ur-~162p*8PU=HU%0J(SJwl=WSNXuf0(~t1F#WH}f!`H;uPW64`hQm5_t1Xc zVf4Q(?>nsiYQ0qdBGHp3+aW9>)d%GM1++&_(Y1X=Qpf*iTrE@Wq)|*>SyQ64nTRu& zlqP4md8g4mcj7e~xQA3I>bWN&Kb9wF6q!qWkS`ljU^nQFV5*7wt(;C)<+sOtT9 zlsa`rd0Y{K;w$qaZ}*HMcY3=pK^A+Xs6836`O3dGYyV?Y+g}$*reKam5&(hsW!5A+NY)Z__N?GJ#i_y&)SbZG&y+d|R>qV0PpGUPTX}l&i zv#ya+;j9jBPQTd?MZli0pCDk3S_WK5HRn84Yf1K{d=fHAEQ%p^I2P$cxb2m98x=vG zCKVrVTMcv+=so^i#+W}(@~_%6DN=OJtEMZkD(Y`ikjK9AiV_leqR1O15A%t!bUkNffHHtP8~{T%G4Yaz+m zZ6%;EW!6qhv|qswvD1uprgK3~ZAj6mD|U3ZA-{o1oCZbAoADVZ;zHi>4hFYY3uBje z63>Z`lOjL!HKpiq9ZkpkWO~U%G!(?(c*etO0wTGO$?AkI?!}BzxLs7W% z5B1})IW`^)D!bk`S>R=oJw`A7;y%}g~mewxPge(kKD+}WpBod{|c?=}HE6v(^GM%+xmYe3|x2&g@MvEEn?XjbJ zYN4(};ZZYr(4N|B_@%p6!?vr3+Mp@0hLce>PUHg5MTHf}wo-MMR^UtpY@%_~e3x?D z49o-LrUuZ6uOfsJ++x->2X{^tv(XVsYo&|~yB#K7Ze(B+z`AXI5wizVh=T=uxlT4c zL=DFpFp>>JOPM`Cvi1TP!x%&1Mb7y==F|g#e#D%@#m1@Pr{{WI=EXJSD$R>S$&0_2 zyckS$aT3uG@{_;(h8-k-`9(WO{xUO1Ch#Npf*mA(`3pN()zh*HEg;Tx^L8?Z=Iy=m z@3Zo6AO7OQUi-mL#T#im9;DUg?UGd9F6rd$B&+7_%Yd)s?Je@}a`~5(FL^uZC9=s0 zXx?s5_S^5YBk$)!bS7`#gR+yilhe(^8R?0&1V$JRF&LWvHm|4~Q(f`V)??dA(csv` zW`mvBpWCs}7?Dgc)S!Na*24J7D&7WmSQ3XJQegLw)c0_7DKW?6iZ%N0+`etM9)pUE zgd(f!!3>f<^3b8>O&$l3iqv4Z0HyWNMdJ;hiw0p2xgSRm7VIJS!X9!r>>>MX)$Q&U zE{rgmG9Qv_$U|HoLdl1?h*&rN(Y~Y53;8Z@kmfo;w=p9MHr^ z8jSgnrV>Ars@eGI>60C~+t7Y&t;|ikJ3qcr-}qY~2CzB=K>#ttwo-$kW1xeEPi|LJ zsUFy-w;W=)ahfhlX#7}Zn^4m=bh#KL^?MByP-c{-9}Gdm+p&qnIRQr(PLGcc(Y|Xp z(&BVOX~QZ6Dub8_Y&8R85pa$#m9~%ANZ{QB9&ovrCfd2GgQnbxR8TVKAcVztf)4;* z8G6jkU1VPSl(rMm6?TDR`gncg}U2*8`Z@2tp zM4LDz8SDnvgmk9r6$Ym< zXaumg5h0vqK8!~U2gr{+iU4wS@BxmhQrYmpLkNrZC-E1q0os0y!qW?F^c5*>zrt%F z|MWCwh7HH#_~t+$sRAI7bb$~^(g0lwX|I~sJ3K(*z!+#|yYUs6If`zP1Y@mTznAua zvCm;-#7}f4w)J3lw&~wSmA3vB@Kk{EY{9TiMaeo&;lPD#w_bxR!G<=9tTnaQV^Kr^ zlMi)kQ=1x;wiug{KZ3GF4ZHyRy%8#4zuuDDhKrtodB{8>$*Q3w^nqM+xHJtzX;93> z!zBq9BzYJ38Bx>c3X<$NT$0Q)Ie6`boTtho3feQ23gFy&xFj3$lcX1pDB?#2-!B;P zeeuwDU?qK8ckOrGBNAOalxQPxf{wXM8lCc>kz;x2;PFX$@JQ>y1md~=Hgo-5L_ZA; zFd8IfcGi?3{q7X>yHDDU@quN)w$+pL+_4wTv4RloaNvR!1Os>tjXVc++VX(=dn0OI z)vP72x&cp!k6LBzR8hnUJf@Vos9U|kjql&pl6P}W#Dj|>9$Xcp=G|Nm@vs@zySX0X zTM}*6%)3{~$5jwUZ6cv_#gBzR8He&GOo#Bsxg;1>;d;+@P8V1Fbo)g9I{Q202+C-r zCEt}bdEdZzk%H$3bNbSoGvbcU4F$#pyXr(nMVW(PNV6fjk`JOMB{8SoByLcu%a z33>hwi~-0K3f>`4D0qiFA^*M8HxO8MaHxFPR|(bcNC|1;5>&y3UF+wbqQ>4xD9i65 zwm_)-x_HidcHTiLuKXJ!l?{x<=(9K4n!R0q8VJX|sh7IK*S;b3Iy29TSGC|@lv`h9 zK^U>~BdNHX>$?a;St;ym{2Gftg~fkY79YE1B}!H{L@Q1?Z(D2zT)s4p3nkw6!b&F7 z9ZKGuNgkEylJ($y<<2DJsOj33WiWL~N{GU)fo}n~DA;{mAgG2Npwc+YfI^ELxzIsKI&q1<*ho+i3j@$}@h%2cg8UCx6fpk|mokgcQC zz-~w1kNlqPPq1Q~!e+gX+8(uy5yEo_(Efl}Rs3J>@XQhEJ%!Hs0IzvQ)}gTAI52 zgLJ7hj85MY+@oBy$M`4{KQ6du*%)w<6(#7&bY=AcQ>7zFC z;3v3WnXw<;U15BfiNiBS@v>21h5YGL;F)0A=+yNmWQ-5(Tz;8rbZ|hKF@TYWfd&RJ zVy@s6CdQ#5N17>di!BV?+HjgRA5Ju$oojqzuh}%Nr-eKeD}aj9#t`A^Q)a-+hT5ua2xa?FmY|{eU)Lrv^Q0SZu{l=|0xEa%jL#4oO z_4L`^aB{XUeyl2d5fLiWk`vr&hN`JvAF8CD`9n}-BP)LYC@upLOdKiz*o`+CI-*6Z*$#aGonVHCTkn^S&VCob?0tN$~_2aeU`4FK|l7hS>4 zLkExp%S}tI^|;!Alj|wu0AY$92fv59c+pmP!ogN|t9KFmH4cX?FOu(H1V2k!&4Zsed(`sch_qYt&UV9TR;IJ%J&uJ&D7a$5MrG8M>c#VE@VuaMI4>BoS0Dl~ z9!~gQ8V@x3%j}5%I3j-kG=Ty=>>|8c&Gp{dv8$ch@0!dO*&uwz1JVH?sinSG6a^lV zz(bw58GCkg4E8_l82aONPpTtpe}yho-&R{bCm+sFo_-LXx)er5?)3&sz=Cf*B+&7E&U z875kB4KvhW@aT1^|FiZS;4ksie#&)XXGg@>{IJ>C#FB6<9v1JJMR+&%mIQjC2s6r@ z>5X9ag_R2iP2H;{>wW33w!Ghq)J;D1X@ZyjQp@}G2=E>1P_FceE$^?#VC6d=uJpK; z_veoW={*5T06n8Po5JE%braJ%a)-}&I>`ykDim48XTE+!7W81gVYZ3Csp3_r(G+0} z%uGF5^?CFVM-jB}x}jWp5TEw} zn?PXRXyPTM?Ir-CrLOZj_^p0fbY*D>z$Gb}nOaqKHpq-M|EnI%3Bb|#a`l1gj2w^f zZz<`6JtG#bRyLG=86-T@({d;Sls1k9!9awk7g2C#X@YoABlW$rnnndN{u_5l?uiD( zEDrMSE;_m8+Tb9ode?=ic~y>wHujH8y2SLtCZn`m^K4avyBhat!RMMv)a2v}RSeh= zK92e5t)Pb|NxkfrRByd7)hgQ}YeR+b#|e`Pf|T(l)Zn(pw+R(lMW{1TKf5{;N&P2V zpM`HODC$;Fedpb%!MRP32q0IfYqt`WxdE{D%xg|^xh_m; zRh8V-EXHAZrUxGNm`Dv~8t;r`o^vLk($)a#Q@zy&8G_AdX$a&7?ydd?Vp$Q=0IZJ9 zV)_`zt`9UAqMNzXLfP?xVGR352xTtGB&WOM`&IOKW=m*gcR2W` zP!jy7vV0$jH{4I87FMGD%7)1m5-FP?28Cq*<bD}|@5+YrF*vmV%ZN}us{OC9jjw|Mb8NKec12} z41OB!{gL3jinEpF5jHftirvV?QiEm8HNu_p%2hF-deuN@5XlWrO?)qp*XuC2r}3KcozD`E1Q?99FOX$S(M5KEFvi&C#$ zKH+s+KJTqqhbKjXSIN$zf<p_@S ziua{tqfR^vlf_jZj-nQ{7sF|M{7iU7tVE{GHg%Tk>vnFC2Fj`YSlz3Nc_~-*Zd@!J z|1*k82ek8ck+JVckG4%*w3WNWb`-!YdUY>rLk?uF-ks@zDPi!##@i{asXW+k4+#z! z$sZzVV7rY9=xg>{%7(!lK1R}$Vcq#D=?Qiqs`0+JaizTl$ITAbEASph=|&Z$8#uJZ zgd~CBwh-hY1c73n@)6`4qz{lF(dj9a1UQpLiv|9ggML1~O;MrO08G~-T;&ibInC9; zbns1waAFIJgO8QKI1CQOJMe&+#9VQ8gJ&YYQNfoa_>SL@1}L|l3hJ)54DxJTS$-^E z#Nf`iMURa?Z2gKdHKj$dQRhX=K8lyA!9hj(R0BJLZrLl}_o5&*bvYPDC{aGIfnoUy zXsYH&sBr;+XKqC^qWLkJ$4y* z$h`SI2lNV>$D1K9>67x3&FZcNl$Xo`x$337q?huNKK1lDkeAHz#gA46oQ~8&UQ!Bq ziAOcB^Wr!^{+N#a3J85=7EY-1iY*Sd+)y^2?p+BiC5c3UuVY;hZhgUVscH7AuoU9N z=dD%HLy!ew1=x*!)N@3t7MSTx*oOqJ*fm@lD!4RMYJnX9Q4MU=^^sD(SHmCB9qfXC_I*dPC-L#==C6O(#B<(Gs3Uk1c#pswVW`j4W`_fx%shjO3 zz6KuR;enwEuHJ6)!xj7>vce6##ciIl;T=`%hl~qn6iVxVqxtX?zh4s;T*sG@pPEwf zw7uHM`7RChpn^LmFsO;=#15$#-l>fdJkILhi*vX62+$ZhfF;WvPL{&99y=YiRKu}i zyx3Z}5Z0?iCXQb_TJhbaiA>RZ11STKcveHI+PCVbg4})&Z<~#r+zQCXakW#o#Ef@iS z5dyg7TLAFDNC5B6Cjr^HfBGZ&Apa%gYbVHuOKJB96auJ~LGM&8E?8LM;j?hy={kCf%Qi_EbBDj zeqvx3BJ%BXQ^kv_q5eVRP>eZPG8>(KbLk*pMW+^@&2Oe^AvoF&?za-PbloUTHce@J ziI--!-jp`ZJ@W7eorcc73(*Xj?dzBzB{tgW*5hFf{t_UY?fVfn+GWc47&{AMoG1#V zWhp~ZV-`D66l~jO*2Z8ab}VfGOYO>;IIS3iqnY$hyg~TDs_sY7yb1QaXem6{PG2~y275W|K7M)xHCXD;!VMGLAUegeRgo`n#KMNX=&A72BME{8>2CmYEB<}LOtI&VeaDQTzIASCMfk;W54k@j>@z&kK z6MT$qFw0QPX3uh=t0DjDw<_){f|Im2w5j(I+qi^b@ikobLfA}!tk|*vK5^&H8_X$w z&MN57f7MAGvsTmp!5|UQlgh2BpXVefJqZQlEr7SES#c6}J}upq|AC`~U$chB4WybO zUEIcUNHJ^v>ZPI{sb1m6;rI=K$A)r z57^K>M(C8*+nla%5bXpr(-Zs+F|KGI=~ExWk+Umyfu2guN0hbl%7YmxdV`&rAHWAv zq?Q!__`v~sqN&MLK4s}q;1f7YGQUn!f^s-?x6vZGlG}-jIvW*mtzRZlvEyEj37*-b zf92vh8+uRZcbtMdUSYHPn$n*x74tx`xQ1frBG;bPP94CtBt_$7iLy5^hDoF{6EC0Z z!ASTip;Qy?9OO96h}a}7GqD<9p;}2bM0|ZqevPW#21B&6ki_@%hbi{GIUIC$Rl+3k zvu=awCbCG{{WpXMz6p52_xXV(`Vk@s)=N-0qE3N)6Y5+&pjPP~6@I2M=x|>O&rz5%(1(07)kQ^wp2nmgZ{Kfwof_y5ntRA=r zxE`Ld1R2>J7g$P6xAmBSWERu7y#uo;4d;M-z?6iKvBom+x=QQUhYBJiX0{BX35N&v zX+V)!hVpsXRM?5DE*XLCQ}SSLLwI06wSQ3ee0xmEAylXzAi`C`XVz6<6{OT*g!ZMQ z-#28V60XUnr?Byp()WZb9DV6SX!K!HKl|)J06^NTg#0V%5$I6PRkYMUspt5fPs$55 z0BDzTRd+}-^&iJsm!iGYK#LQX(1GN`{t|S)Tp^=ujpEqRaOjEmskM`(y6?a78#?f9 zPzUh{zu>HyZYK;<2(xLjc>db0l4!v+&T44_Rh1MH0`N0TC<8X*IIH+`Bz%bWgB1T6 z4i+`hEvYfxZJu))U249O9!0sQ_`q4Qp?jEBIr$9+E$;JyIvgs*Cg@)LmGbI{_)xz# zBkT4^;C1uooHmJeg64`rt>HE~B_FvPieb31EgnLQoN;$&W6nT~q%XH+V~w;f1fn)D{Se;1zu|jQomi7Ze=h zBvl|=>?*7@*e$ZFvXsm2csk&hzM z<_9^pqEnZhTb^t^mxopH37cHMzY%x3!u1y|0Zr}P^4N9JsngDdR@3^+FK}6>WxsgO zja{M_uWKKN#%SmI^y2ADPLRPeG7LQ&D8UEpPE&z8JvGb!gw&gQ;5;hT;9?P7Af9X7sxit3Q~x&(V_h*1(=^n#~F0K~jxxq`G); zd9l9mpGB^xrUSEb$*wlss{w_?X(w=`HZvF94TrFj>Sl0n5VuzqIS9Ad;ViLe0Jr-H+=CUR6b(Em#e%XTRH7{$T48Q`L8$rAD8`;jmO6E zPE;z9@2yfc?EegaSoF^Vq1DKVq_jQ{WMDOutYAy0oFTvasa$Qzv0wmkJ+z)dRBm1# zT>K@@NzTV?PO(an({KvX;rz}S`I2@wzKn4zxu0L#nul^UpSacCPx*ru|0%;K=P?odaNq{{8FizvQ26KXgXdVaj58 z2mO$;cj#QpnGkr+5xwuX7km88k;Z=+zOVhW@MX5(5;kS|)tID03Ji^mPci--ID-=K z;v7I<8(J+@NB|GJTxv%U0dBsy5NBB#<$o2fm+G#+XpX?oUiq!dk0 z8-B-3Zog7x+lz&`{{YKfoKtLe7(-_dF+9DVO@GHQM)I)fQ^k_g#opnWEWb&6sH!33 zNU_K9#vgCuRvgTB@#vE&N~FVsS5J~cMeYV3wS#5WPv7FrxHgkyow3&TBCrwTF*9+s z24D2qwdxq>(|oRe`!2*C$mHFuvM;j(wp%su*$&Aa;DVF$ynp%pGdkgJMKKJExQzcsx49+)bBDu4A4 zGwbm3n{{Jpm5W;u*vV3Z7~2Zi$>IoNAS&LAPqFP57L1p?eZ&k`#gCI)reQkAD7U$b zo0IuGSzjlo4UXuz&zVirj{9W{Z`DLi4UwL32ocyW9I*XoYTySFh=@VQeN-e64n=|; zO%pXSDvWUUqwR?qSA0gqrB%F&l{s+pC&g3tOWRgqDXrf}H2IYCt6v6x5!j9!ygipz zQL|bTo$@Xaa3jnFRrrYe(vasRY&>Vd1p9oanBbnq?zA`Jt_!uj6|cfACQ9oin1H-m zur3AIQkOzfic7}HxU|-AYL3HJampKR-C0Hf?JOy9 z&0bZ5K_Dk0#uu&uEU@=}57of#WXRroR#kzq_e~&W6g2nLk}p8XID3&(n?m~h^AVYi z7cR;hZECBSS|-dhz?9>gvRk%IL@FUV@iQHAagSRc5r<@dv9r*9urxubQYth%R%9xK zq#j7j9r~g?DO${zzfcw_$0Z81%`hSqX6}oM*EZ>>%evueObf{HFkd6pFPrt1z~BiI zgCz(JEFdmtkSac92Z`)8c96(!u!HEgE35FU!7r39=EdFbvkky|hPS0cj)sBiTg?!_ zsiYXdPwhLYUoJo53Oumj3|>-ZpJ)RwQj{vE6~ULw)sReLh`yyDkN7&|yM^im@(Vjiq}*%=iIh2Z5J*`9 zq$~kamJlhByyMEtBOqlSkm5{gE>0tngAT$8L=HjeliQ_y&Y86O)Qduj_J_O#j`YyM zAaIFso5i4Q*pQwN+A4_!qR=x809KCw%_&BiF1c&8m? z?04-T5HfMP9RxyjAVa5Msqm@|Nd~h1{O3;l=luEGH@KJagv-7FK%Q`AF947paSAQ~ zi0!Z)|I3pqB$JN+*EX%K!=FQ`9H*OY^wh$ z=9h9Mhth7cQF2jKF+P4;N9=hJx?P59eLc0*+=MV{R{6tjt0}^Ri4(o$UMx)~AldN< z(SaXM1)Zy3qBWuP%=kkMIg6<3nPY`5-4h60i_9Ddh0 zz<&{o&4Yh7ZZ^d=H2%*?5CfJPDJu)4p9SRa`Ht;<|B$3`vgz9y>??T@pZfL*a9m zvjr*v{4YC*)5U>=6*&zPL(E#lg<#0F)T|oI6+V~=9q4g$UT(K8`34cymGuyB5ztRG=Gy^Ra}8=VzuSz{tE;O?k^f!l^F}Z@@HifeL7HdM5sM z`qHyHayx_&frjHQ&Pzni^}H8 z;$D-!k2NxRNDZBk@nEjLVZ1k5Ok10p;a&)a?)$Bf_n6+bxbbpHZD83Cq1N+5$KCNZ znD~s6O4R*-fpbIU@!ev_LbdacUOGF5m&P_o$eyfg1q89t0!o&Tcfr{)I)uLOTL#(m z##O*LsC|ROe#sSpZRg4fr^bKG@?8Hieo^`VDt>9*|Nlq)8iW4E+dd_7fn?jB&)!7W z`>5JTqfQuf@?icwn0elb-#Yy6$8Y@;$Dq~l-JLi7lnqcg>d0uVxTS4de7}b45V9UL zKqf+(=*RUFy69I^H{OC#tBH9NDmIl6dAOoQbkUz>pBDVBvSKUZG*g>U!9Ukf#mJmH zK?{4Z<)?+jp_0X2_<|h*{>)c4Ou~S@5My$!-!4rKN7y#PTPTj=*Up!Ixc?}kYp0n= z1KCDDbhvcS7PaGb$T)koF}rBMR7wR-Wy3CO?O57!Kz-kM|Cq+RAu*U2*bj#b#jY3> z-MSwhw3?8BXtjMRYZuK1~3amfD%RbS&+>*13RW`N$^>65jU<4<(iKbY*8Obfgjf1yQ?$29*f=@2BN9cT6T_BGzx8Vv!&#@HXuA zv5ccGNS2;ME#K||y2-((V-#bm9V&}Yg2R^90N!96dd)eRaO&E3ak85}W_rq-dJ^nj z_^dayRD(xLO>?pJ%5tuL(bQM2e;%VsuGT~c$CqrUJ{%v{PyUziQFR1-P=4AVks>7S zH1~I#aqU3C=<@WK@|&89mUv+6wd5kem+846S#b`HVh%O_4W0VnbI@lGzNajwF3@_o zo`<>!3x|aEdP-=ou~{k52I)8gc4C~698vWof;;T>#e!VSo`rN9kaZcb$kJ0^nZ*j8 z@&j97ARDha()^2_FdRPx^G_AekDPr~ho60SiQCxsnHkNZbLRjQHB9-Ab2kMy!mQ}S zI1#sTc{dJul@)TG7u^u#2WB+WJM%sKatj7{gWaEprx$k}{~5x&g76wMnu|nVr&VOU z?lJ9{_llO33ke}C4wj4q5<2&K0v9z0dz(tm>KNDytYi5x@2y}c{PD_?5BsbsUTk0>L+Hb+x^WRBM_ZE+ znRvRN6-U}joPYX8pYtyYJNFQ#9-lg%Iz*9_GwU0Roqzl?+xbEPH&Zk?&qdC&8PAO{ zG6c69?lxCEi`oX3BJPP|#Ib=p(ZKABmfGmXH>uC}gck|0t^r9hmvui9I^bf?d*fxs z(=6?z#Y8&15Kt8dBilWe`^pC^27wAyydsIfY8B?w8_sAt<_V8e>lG+0sZH_Ya#yJT zC$E{}CmYgDHl*JkhBSa;85oXB{uBPYvqQ1*c4*mhD8s@6>-fcam^=j%_nhfeIbJ*b{mqJskPH2Bq)@5tg-k8=sSo6Kp(OmebJwAR$UspAUV7e|Bo$T0X0N+}1T@Qy9ChqLh#=qu(GOtF+GVD}Ns}~w z3(OaYCM3T>n{mIEl#8gn^KTX{yV*(LHNe(kHwUF_G9r+?L(HaP*9?sbP09kKve?g{ zo-IZ2)o&StA4&1Nmim_8zKJeW^NSZySUi9L=Zm~+1n{_BO1MvMSFb!LU*+Zk6b8>| zgf;dRr$u&)-$%2cud_Sb%r8s?!7>*#o7XKfC36)@%52JpHLMX*pBn4eI6gr%DWv%T z8`W+64u9QK<;%_UF~q}=rPgNzKMGuiAYMTrn!2J!^aXZiw!wbet9s^4hzOX=&+%#8 zC-VY+cL-(v%hessP zhfsnMaNA<6Lr%(KUWbYsXXDz!`rGhYP=5>&Hl6_n3AjsXt;QSz@G)HcmWhvp9*ZQ% zZ4o3jWEd)bP`?8|iv&vRas-W=n*Fh5;K9jyf8Oc!Auj&SW1RJ>kc%J5Z{rq>5FEjS zW1dwLPEHIX$@6 z=wO-e7>5*P#nCXQb;_~Jm>yVb&`IG&sU_5@Z0POZH{G+=@S&&2s677-;h)t+fHavKG-|xq{5P0$7qD5s)1g&-RtgkI8-*v8OB@{~7m}kiF_|!p5zDtJYGnVvi|5hJy#g z;;&(4#@mEbSH&Lmo!fSPieXlE$8nRW2(TKr942pL#i5@(5 zJqAPL63I?+KV>9<)@*<0@HbhJ`1{r8K4bj3uWJ^P0T9orPh#|9VY~^8_*-iK8*1iR z?bN;fmdzl9J@-Cb1xP8KhFn|?{5|u0IJmd5JaJ1EC^$4$U1G)rEw~rsA7MzyXHY^8 zuOy4l$A>^SL-4#&l9Q3wro5F>MxH<3hvem39C`T#S?3{g-sj85;UD9O(s9=rAlzFr zactP^>*d0M55s|f#J?I&E%d{#`I=J>Nb=dX9ZY0srF|tGc&17pVf~+z zAx$3l8P9i4oG*P7)qmW?k%T&L;*d@sapDwE=@XpsoSQ!#z=@ncOBRoqI7gz*oH!)S zwu7)ZZs7y#<8+eKCj%as5%d`B2F}VH*qe+kl}pF~>r!geOogTp=s7rDx#KT`_^2G>BQRnOgAgI@hoH!U4hyvk z%!_B^ymfbXXsG0e2rnG|3Z8bkWJd#sqJegs-D_XR z2v2(gkLtqlp#oQB7;)FYnCz?rv?ue2Y985(T4;3zo_5j~al8{S_9I4z`(Hi+y^-Lv zOTM6q*TBqIBKaUf;S;v1Ew8y;e)^p1R>ccs z@!rP9g*FqhW7oUEYmb%{E<}Z*d*Di-*JzjhptNlP;Lb~YX`-F=xnhgJOE?>K4=#mk zwub>W4O8ISvFVZ{vT~=4`B+vCC3V`;Q!RPd$%jx?riX>5e<8u^IUTuiNiIx>pmXy@ z8>)|JV@Ir0&QPiauCqsq)ig$~eFHzhr-7CD1En6NHHnTN>MuJZq};%=%@s@TJQC=^ zrMn5_;jy!1CoNGq)E9`vEyAO6?y%t)R%!$Rol5KHQ9~X|j{(fE7Ey4x0PCn?`M}vi zmXvW%m}Etm3Ua_;??}4EalJ@N$|%;FpBuw+Bj^0d*FTtT{Q<7Bku2YzZPuQ|Z|e_2 z5^LK#E#jKzDoo7zk)Iy+OPpjl%sqm26w>qP7#63wGgoLf+*mHB4J2`}$cKAP=-z-M z$IDza0!n>&=gi01nlu}`7G`6*I2LKe?#v}fCNn~WXP*IA0mhtq&anG$dAWqqIUg5H zSS2Oc25;?|QSS%D=0)?&+lWHF?PcYM9o;K7U>M=tM+$~oAw=tt6Gayu-IgRN8}4`% zQF`j4a_ib_oWNb5M|V?v-?L&PKHB6$%HO2OTW+p%hQ&^QM7h7F@(B;sC7H=7&B)z# z1Gm=mxogJ$T6$iDToOu3xN}wts`u3Kgk0r~iGafBEVGW4Q0&(Ok8s-}HGjfqb!asP zVS@i(c<^R?pgW4y`*=D^uQ9j@jE_d(S4>l^u6L(L!{vIMgmYQcY^s6U5NQB!ZrBHp z7~F!Urwon9?9Hy|1RC?%D=vqp#3{wA$XaFv0h$I8tG}&7Q^I?xr*w?`a5awm19F=c z=r&8TnqDesFVMM&WEq|Bm`Opejd(yD4@PV%Jv71##v`2BO8YxMM&w1GYW(`0@mq8F z)N=e*%ACFkIv@OhmlX+QB&kt4bhIc855WY>}iH{&vt4@&hiUm+}XwBFH&l zeer5Jd}^$3RDi_;@x@IPVn@#kl2T^~*~DDxBw+a(I&4AvD+j&~fm>et9eoB6pyIw7 zDpw!}w4gAGu;d*wZ>++37QU^O-=t>7wG8qI%v4w7%hmtz;Hc*%yxobnDR#Pb2)gay z{knPMM)O9r`o=!|_TsnSieniLB_F4(HTiRHdDw9^h+$jt;6j53k)fN9vpsm@vLFwM zx>sOjVQv-PfwLrm~LD_M?dw`aRTQP(@RaY6t0X+wMJYqW$
    B#uNs+JU!j;HN#v>tPz`aR&!UhurZiY0> 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

    h8P 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

    ':_files \ + - --proxy-negotiate'[HTTP Negotiate (SPNEGO) authentication on the proxy]':'Use' \ + --proxy-pinnedpubkey'[FILE/HASHES public key to verify proxy with]':'' \ + --crlfile'[Get a CRL list in PEM format from the given file]':'':_files \ + - --proxy-insecure'[HTTPS proxy connections without verifying the proxy]':'Do' \ + - --proxy-ssl-allow-beast'[security flaw for interop for HTTPS proxy]':'Allow' \ + + --proxy-negotiate'[Use HTTP Negotiate (SPNEGO) authentication on the proxy]' \ + --abstract-unix-socket'[Connect via abstract Unix domain socket]':'' \ + --pinnedpubkey'[FILE/HASHES Public key to verify peer against]':'' \ + + --proxy-insecure'[Do HTTPS proxy connections without verifying the proxy]' \ + --proxy-pass'[Pass phrase for the private key for HTTPS proxy]':'' \ + + --proxy-ssl-allow-beast'[Allow security flaw for interop for HTTPS proxy]' \ + {-p,--proxytunnel}'[Operate through an HTTP proxy tunnel (using CONNECT)]' \ + --socks5-hostname'[SOCKS5 proxy, pass host name to proxy]':'' \ + --proto-default'[Use PROTOCOL for any URL missing a scheme]':'' \ + - --proxy-tls13-ciphers'[list> TLS 1.3 proxy cipher suites]':'' \ + --socks5-gssapi-service'[SOCKS5 proxy service name for GSS-API]':'' \ + --ftp-alternative-to-user'[String to replace USER \[name\]]':'' \ + - --ftp-ssl-control'[SSL/TLS for FTP login, clear for transfer]':'Require' \ + {-T,--upload-file}'[Transfer local FILE to destination]':'':_files \ + --local-port'[Force use of RANGE for local port numbers]':'' \ + --proxy-tlsauthtype'[TLS authentication type for HTTPS proxy]':'' \ + {-R,--remote-time}'[Set the remote file'\''s time on the local output]' \ + - --retry-connrefused'[on connection refused (use with --retry)]':'Retry' \ + - --suppress-connect-headers'[proxy CONNECT response headers]':'Suppress' \ + - {-j,--junk-session-cookies}'[session cookies read from file]':'Ignore' \ + - --location-trusted'[--location, and send auth to other hosts]':'Like' \ + + --ftp-ssl-control'[Require SSL/TLS for FTP login, clear for transfer]' \ + --proxy-cert-type'[Client certificate type for HTTPS proxy]':'' \ + {-O,--remote-name}'[Write output to a file named as the remote file]' \ + + --retry-connrefused'[Retry on connection refused (use with --retry)]' \ + + --suppress-connect-headers'[Suppress proxy CONNECT response headers]' \ + --trace-ascii'[Like --trace, but without hex output]':'':_files \ + --connect-timeout'[Maximum time allowed for connection]':'' \ + --expect100-timeout'[How long to wait for 100-continue]':'' \ + {-g,--globoff}'[Disable URL sequences and ranges using {} and \[\]]' \ + + {-j,--junk-session-cookies}'[Ignore session cookies read from file]' \ + {-m,--max-time}'[Maximum time allowed for the transfer]':'' \ + --dns-ipv4-addr'[IPv4 address to use for DNS requests]':'
    ' \ + --dns-ipv6-addr'[IPv6 address to use for DNS requests]':'
    ' \ + - --ignore-content-length'[the size of the remote resource]':'Ignore' \ + {-k,--insecure}'[Allow insecure server connections when using SSL]' \ + + --location-trusted'[Like --location, and send auth to other hosts]' \ + --mail-auth'[Originator address of the original email]':'
    ' \ + --noproxy'[List of hosts which do not use proxy]':'' \ + --proto-redir'[Enable/disable PROTOCOLS on redirect]':'' \ + @@ -62,18 +62,19 @@ + --socks5-basic'[Enable username/password auth for SOCKS5 proxies]' \ + --cacert'[CA certificate to verify peer against]':'':_files \ + {-H,--header}'[Pass custom header(s) to server]':'
    ' \ + + --ignore-content-length'[Ignore the size of the remote resource]' \ + {-i,--include}'[Include protocol response headers in the output]' \ + --proxy-header'[Pass custom header(s) to proxy]':'
    ' \ + --unix-socket'[Connect through this Unix domain socket]':'' \ + {-w,--write-out}'[Use output FORMAT after completion]':'' \ + - --http2-prior-knowledge'[HTTP 2 without HTTP/1.1 Upgrade]':'Use' \ + {-o,--output}'[Write to file instead of stdout]':'':_files \ + - {-J,--remote-header-name}'[the header-provided filename]':'Use' \ + + --preproxy'[\[protocol://\]host\[:port\] Use this proxy first]' \ + --socks4a'[SOCKS4a proxy on given host + port]':'' \ + {-Y,--speed-limit}'[Stop transfers slower than this]':'' \ + {-z,--time-cond}'[Transfer based on a time condition]':'':_files \ + {-f,--fail}'[Fail silently (no output at all) on HTTP errors]' \ + + --http2-prior-knowledge'[Use HTTP 2 without HTTP/1.1 Upgrade]' \ + --proxy-tlspassword'[TLS password for HTTPS proxy]':'' \ + {-U,--proxy-user}'[Proxy user and password]':'' \ + --proxy1.0'[Use HTTP/1.0 proxy on given port]':'' \ + @@ -81,52 +82,49 @@ + {-A,--user-agent}'[Send User-Agent to server]':'' \ + --egd-file'[EGD socket path for random data]':'':_files \ + --fail-early'[Fail on first transfer error, do not continue]' \ + - --haproxy-protocol'[HAProxy PROXY protocol v1 header]':'Send' \ + - --preproxy'[Use this proxy first]':'[protocol://]host[:port]' \ + + {-J,--remote-header-name}'[Use the header-provided filename]' \ + --retry-max-time'[Retry only within this period]':'' \ + --socks4'[SOCKS4 proxy on given host + port]':'' \ + --socks5'[SOCKS5 proxy on given host + port]':'' \ + - --socks5-gssapi-nec'[with NEC SOCKS5 server]':'Compatibility' \ + - --ssl-allow-beast'[security flaw to improve interop]':'Allow' \ + --cert-status'[Verify the status of the server certificate]' \ + - --ftp-create-dirs'[the remote dirs if not present]':'Create' \ + {-:,--next}'[Make next URL use its separate set of options]' \ + --proxy-key-type'[Private key file type for proxy]':'' \ + - --remote-name-all'[the remote file name for all URLs]':'Use' \ + {-X,--request}'[Specify request command to use]':'' \ + --retry'[Retry request if transient problems occur]':'' \ + - --ssl-no-revoke'[cert revocation checks (WinSSL)]':'Disable' \ + --cert-type'[Certificate file type (DER/PEM/ENG)]':'' \ + --connect-to'[Connect to host]':'' \ + --create-dirs'[Create necessary local directory hierarchy]' \ + + --haproxy-protocol'[Send HAProxy PROXY protocol v1 header]' \ + --max-redirs'[Maximum number of redirects allowed]':'' \ + {-n,--netrc}'[Must read .netrc for user name and password]' \ + + {-x,--proxy}'[\[protocol://\]host\[:port\] Use this proxy]' \ + --proxy-crlfile'[Set a CRL list for proxy]':'':_files \ + --sasl-ir'[Enable initial response in SASL authentication]' \ + - --socks5-gssapi'[GSS-API auth for SOCKS5 proxies]':'Enable' \ + + --socks5-gssapi-nec'[Compatibility with NEC SOCKS5 server]' \ + + --ssl-allow-beast'[Allow security flaw to improve interop]' \ + + --ftp-create-dirs'[Create the remote dirs if not present]' \ + --interface'[Use network INTERFACE (or address)]':'' \ + --key-type'[Private key file type (DER/PEM/ENG)]':'' \ + --netrc-file'[Specify FILE for netrc]':'':_files \ + {-N,--no-buffer}'[Disable buffering of the output stream]' \ + --proxy-service-name'[SPNEGO proxy service name]':'' \ + - --styled-output'[styled output for HTTP headers]':'Enable' \ + + --remote-name-all'[Use the remote file name for all URLs]' \ + + --ssl-no-revoke'[Disable cert revocation checks (WinSSL)]' \ + --max-filesize'[Maximum file size to download]':'' \ + --negotiate'[Use HTTP Negotiate (SPNEGO) authentication]' \ + --no-keepalive'[Disable TCP keepalive on the connection]' \ + {-#,--progress-bar}'[Display transfer progress as a bar]' \ + - {-x,--proxy}'[Use this proxy]':'[protocol://]host[:port]' \ + - --proxy-anyauth'[any proxy authentication method]':'Pick' \ + {-Q,--quote}'[Send command(s) to server before transfer]' \ + - --request-target'[the target for this request]':'Specify' \ + + --socks5-gssapi'[Enable GSS-API auth for SOCKS5 proxies]' \ + {-u,--user}'[Server user and password]':'' \ + {-K,--config}'[Read config from a file]':'':_files \ + {-C,--continue-at}'[Resumed transfer offset]':'' \ + --data-raw'[HTTP POST data, '\''@'\'' allowed]':'' \ + - --disallow-username-in-url'[username in url]':'Disallow' \ + --krb'[Enable Kerberos with security ]':'' \ + --proxy-ciphers'[SSL ciphers to use for proxy]':'' \ + --proxy-digest'[Use Digest authentication on the proxy]' \ + --proxy-tlsuser'[TLS username for HTTPS proxy]':'' \ + + --styled-output'[Enable styled output for HTTP headers]' \ + {-b,--cookie}'[Send cookies from string/file]':'' \ + --data-urlencode'[HTTP POST data url encoded]':'' \ + --delegation'[GSS-API delegation permission]':'' \ + @@ -134,7 +132,10 @@ + --post301'[Do not switch to GET after following a 301]' \ + --post302'[Do not switch to GET after following a 302]' \ + --post303'[Do not switch to GET after following a 303]' \ + + --proxy-anyauth'[Pick any proxy authentication method]' \ + + --request-target'[Specify the target for this request]' \ + --trace-time'[Add time stamps to trace/verbose output]' \ + + --disallow-username-in-url'[Disallow username in url]' \ + --dns-servers'[DNS server addrs to use]':'' \ + {-G,--get}'[Put the post data in the URL and use GET]' \ + --limit-rate'[Limit transfer speed to RATE]':'' \ + @@ -148,21 +149,21 @@ + --metalink'[Process given URLs as metalink XML file]' \ + --tr-encoding'[Request compressed transfer encoding]' \ + --xattr'[Store metadata in extended file attributes]' \ + - --ftp-skip-pasv-ip'[the IP address for PASV]':'Skip' \ + --pass'[Pass phrase for the private key]':'' \ + --proxy-ntlm'[Use NTLM authentication on the proxy]' \ + {-S,--show-error}'[Show error even when -s is used]' \ + - --ciphers'[of ciphers> SSL ciphers to use]':'' \ + --form-string'[Specify multipart MIME data]':'' \ + --login-options'[Server login options]':'' \ + --tftp-blksize'[Set TFTP BLKSIZE option]':'' \ + - --tftp-no-options'[not send any TFTP options]':'Do' \ + {-v,--verbose}'[Make the operation more talkative]' \ + + --ftp-skip-pasv-ip'[Skip the IP address for PASV]' \ + --proxy-key'[Private key for HTTPS proxy]':'' \ + {-F,--form}'[Specify multipart MIME data]':'' \ + --mail-from'[Mail from this address]':'
    ' \ + --oauth2-bearer'[OAuth 2 Bearer Token]':'' \ + --proto'[Enable/disable PROTOCOLS]':'' \ + + --tftp-no-options'[Do not send any TFTP options]' \ + --tlsauthtype'[TLS authentication type]':'' \ + --doh-url'[Resolve host names over DOH]':'' \ + --no-sessionid'[Disable SSL session-ID reusing]' \ + @@ -173,14 +174,13 @@ + --ftp-ssl-ccc'[Send CCC after authenticating]' \ + {-4,--ipv4}'[Resolve names to IPv4 addresses]' \ + {-6,--ipv6}'[Resolve names to IPv6 addresses]' \ + - --netrc-optional'[either .netrc or URL]':'Use' \ + --service-name'[SPNEGO service name]':'' \ + {-V,--version}'[Show version number and quit]' \ + --data-ascii'[HTTP POST ASCII data]':'' \ + --ftp-account'[Account data string]':'' \ + - --compressed-ssh'[SSH compression]':'Enable' \ + --disable-eprt'[Inhibit using EPRT or LPRT]' \ + --ftp-method'[Control CWD usage]':'' \ + + --netrc-optional'[Use either .netrc or URL]' \ + --pubkey'[SSH Public key file name]':'' \ + --raw'[Do HTTP "raw"; no transfer decoding]' \ + --anyauth'[Pick any authentication method]' \ + @@ -189,6 +189,7 @@ + --no-alpn'[Disable the ALPN TLS extension]' \ + --tcp-nodelay'[Use the TCP_NODELAY option]' \ + {-B,--use-ascii}'[Use ASCII/text transfer]' \ + + --compressed-ssh'[Enable SSH compression]' \ + --digest'[Use HTTP Digest Authentication]' \ + --proxy-tlsv1'[Use TLSv1 for HTTPS proxy]' \ + --engine'[Crypto engine to use]':'' \ + +Marcel Raad (7 Feb 2019) +- tool_operate: fix typecheck warning + + Use long for CURLOPT_HTTP09_ALLOWED to fix the following warning: + tool_operate.c: In function 'operate_do': + ../include/curl/typecheck-gcc.h:47:9: error: call to + '_curl_easy_setopt_err_long' declared with attribute warning: + curl_easy_setopt expects a long argument for this option [-Werror] + + Closes https://github.com/curl/curl/pull/3534 + +Jay Satiro (6 Feb 2019) +- [Chris Araman brought this change] + + url: close TLS before removing conn from cache + + - Fix potential crashes in schannel shutdown. + + Ensure any TLS shutdown messages are sent before removing the + association between the connection and the easy handle. Reverts + @bagder's previous partial fix for #3412. + + Fixes https://github.com/curl/curl/issues/3412 + Fixes https://github.com/curl/curl/issues/3505 + Closes https://github.com/curl/curl/pull/3531 + +Daniel Gustafsson (6 Feb 2019) +- INTERNALS.md: fix subsection depth and link + + The Kerberos subsection was mistakenly a subsubsection under FTP, and + the curlx subsection was missing an anchor for the TOC link. + + Closes #3529 + Reviewed-by: Daniel Stenberg + +Version 7.64.0 (6 Feb 2019) + +Daniel Stenberg (6 Feb 2019) +- RELEASE-NOTES: 7.64.0 + +- RELEASE-PROCEDURE: update the release calendar + +- THANKS: 7.64.0 status + +Daniel Gustafsson (5 Feb 2019) +- ROADMAP: remove already performed item + + Commit 7a09b52c98ac8d840a8a9907b1a1d9a9e684bcf5 introduced support + for the draft-ietf-httpbis-cookie-alone-01 cookie draft, and while + the entry was removed from the TODO it was mistakenly left here. + Fix by removing and rewording the entry slightly. + + Closes #3530 + Reviewed-by: Daniel Stenberg + +- [Etienne Simard brought this change] + + CONTRIBUTE.md: Fix grammatical errors + + Fix grammatical errors making the document read better. Also fixes + a typo. + + Closes #3525 + Reviewed-by: Daniel Gustafsson + +Daniel Stenberg (4 Feb 2019) +- [Julian Z brought this change] + + docs: use $(INSTALL_DATA) to install man page + + Fixes #3518 + Closes #3522 + +Jay Satiro (4 Feb 2019) +- [Ladar Levison brought this change] + + runtests.pl: Fix perl call to include srcdir + + - Use explicit include opt for perl calls. + + Prior to this change some scripts couldn't find their dependencies. + + At the top, perl is called using with the "-Isrcdir" option, and it + works: + + https://github.com/curl/curl/blob/curl-7_63_0/tests/runtests.pl#L183 + + But on line 3868, that option is omitted. This caused problems for me, + as the symbol-scan.pl script in particular couldn't find its + dependencies properly: + + https://github.com/curl/curl/blob/curl-7_63_0/tests/runtests.pl#L3868 + + This patch fixes that oversight by making calls to perl sub-shells + uniform. + + Closes https://github.com/curl/curl/pull/3496 + +Daniel Stenberg (4 Feb 2019) +- [Daniel Gustafsson brought this change] + + smtp: avoid risk of buffer overflow in strtol + + If the incoming len 5, but the buffer does not have a termination + after 5 bytes, the strtol() call may keep reading through the line + buffer until is exceeds its boundary. Fix by ensuring that we are + using a bounded read with a temporary buffer on the stack. + + Bug: https://curl.haxx.se/docs/CVE-2019-3823.html + Reported-by: Brian Carpenter (Geeknik Labs) + CVE-2019-3823 + +- ntlm: fix *_type3_message size check to avoid buffer overflow + + Bug: https://curl.haxx.se/docs/CVE-2019-3822.html + Reported-by: Wenxiang Qian + CVE-2019-3822 + +- NTLM: fix size check condition for type2 received data + + Bug: https://curl.haxx.se/docs/CVE-2018-16890.html + Reported-by: Wenxiang Qian + CVE-2018-16890 + +Marcel Raad (1 Feb 2019) +- [georgeok brought this change] + + spnego_sspi: add support for channel binding + + Attempt to add support for Secure Channel binding when negotiate + authentication is used. The problem to solve is that by default IIS + accepts channel binding and curl doesn't utilise them. The result was a + 401 response. Scope affects only the Schannel(winssl)-SSPI combination. + + Fixes https://github.com/curl/curl/issues/3503 + Closes https://github.com/curl/curl/pull/3509 + +Daniel Stenberg (1 Feb 2019) +- RELEASE-NOTES: synced + +- schannel: stop calling it "winssl" + + Stick to "Schannel" everywhere. The configure option --with-winssl is + kept to allow existing builds to work but --with-schannel is added as an + alias. + + Closes #3504 + +- multi: set the EXPIRE_*TIMEOUT timers at TIMER_STARTSINGLE time + + To make sure Curl_timeleft() also thinks the timeout has been reached + when one of the EXPIRE_*TIMEOUTs expires. + + Bug: https://curl.haxx.se/mail/lib-2019-01/0073.html + Reported-by: Zhao Yisha + Closes #3501 + +- [John Marshall brought this change] + + doc: use meaningless port number in CURLOPT_LOCALPORT example + + Use an ephemeral port number here; previously the example had 8080 + which could be confusing as the common web server port number might + be misinterpreted as suggesting this option affects the remote port. + + URL: https://curl.haxx.se/mail/lib-2019-01/0084.html + Closes #3513 + +GitHub (29 Jan 2019) +- [Gisle Vanem brought this change] + + Escape the '\' + + A backslash should be escaped in Roff / Troff. + +Jay Satiro (29 Jan 2019) +- TODO: WinSSL: 'Add option to disable client cert auto-send' + + By default WinSSL selects and send a client certificate automatically, + but for privacy and consistency we should offer an option to disable the + default auto-send behavior. + + Reported-by: Jeroen Ooms + + Closes https://github.com/curl/curl/issues/2262 + +Daniel Stenberg (28 Jan 2019) +- [Jeremie Rapin brought this change] + + sigpipe: if mbedTLS is used, ignore SIGPIPE + + mbedTLS doesn't have a sigpipe management. If a write/read occurs when + the remote closes the socket, the signal is raised and kills the + application. Use the curl mecanisms fix this behavior. + + Signed-off-by: Jeremie Rapin + + Closes #3502 + +- unit1653: make it survive torture tests + +Jay Satiro (28 Jan 2019) +- [Michael Kujawa brought this change] + + timeval: Disable MSVC Analyzer GetTickCount warning + + Compiling with msvc /analyze and a recent Windows SDK warns against + using GetTickCount (Suggests to use GetTickCount64 instead.) + + Since GetTickCount is only being used when GetTickCount64 isn't + available, I am disabling that warning. + + Fixes https://github.com/curl/curl/issues/3437 + Closes https://github.com/curl/curl/pull/3440 + +Daniel Stenberg (26 Jan 2019) +- configure: rewrite --enable-code-coverage + + The previously used ax_code_coverage.m4 is not license compatible and + must not be used. + + Reported-by: William A. Rowe Jr + Fixes #3497 + Closes #3499 + +- [Felix Hädicke brought this change] + + setopt: enable CURLOPT_SSH_KNOWNHOSTS and CURLOPT_SSH_KEYFUNCTION for libssh + + CURLOPT_SSH_KNOWNHOSTS and CURLOPT_SSH_KEYFUNCTION are supported for + libssh as well. So accepting these options only when compiling with + libssh2 is wrong here. + + Fixes #3493 + Closes #3494 + +- [Felix Hädicke brought this change] + + libssh: do not let libssh create socket + + By default, libssh creates a new socket, instead of using the socket + created by curl for SSH connections. + + Pass the socket created by curl to libssh using ssh_options_set() with + SSH_OPTIONS_FD directly after ssh_new(). So libssh uses our socket + instead of creating a new one. + + This approach is very similar to what is done in the libssh2 code, where + the socket created by curl is passed to libssh2 when + libssh2_session_startup() is called. + + Fixes #3491 + Closes #3495 + +- RELEASE-NOTES: synced + +- [Archangel_SDY brought this change] + + schannel: preserve original certificate path parameter + + Fixes #3480 + Closes #3487 + +- KNOWN_BUGS: tests not compatible with python3 + + Closes #3289 + [skip ci] + +Daniel Gustafsson (20 Jan 2019) +- memcmp: avoid doing single char memcmp + + There is no real gain in performing memcmp() comparisons on single + characters, so change these to array subscript inspections which + saves a call and makes the code clearer. + + Closes #3486 + Reviewed-by: Daniel Stenberg + Reviewed-by: Jay Satiro + +Daniel Stenberg (19 Jan 2019) +- COPYING: it's 2019 + + [skip ci] + +- [hhb brought this change] + + configure: fix recv/send/select detection on Android + + This reverts commit d4f25201fb7da03fc88f90d51101beb3d0026db9. + + The overloadable attribute is removed again starting from + NDK17. Actually they only exist in two NDK versions (15 and 16). With + overloadable, the first condition tried will succeed. Results in wrong + detection result. + + Closes #3484 + +Marcel Raad (19 Jan 2019) +- [georgeok brought this change] + + ntlm_sspi: add support for channel binding + + Windows extended potection (aka ssl channel binding) is required + to login to ntlm IIS endpoint, otherwise the server returns 401 + responses. + + Fixes #3280 + Closes #3321 + +Daniel Stenberg (18 Jan 2019) +- schannel: on connection close there might not be a transfer + + Reported-by: Marcel Raad + Fixes #3412 + Closes #3483 + +- [Joel Depooter brought this change] + + ssh: log the libssh2 error message when ssh session startup fails + + When a ssh session startup fails, it is useful to know why it has + failed. This commit changes the message from: + "Failure establishing ssh session" + to something like this, for example: + "Failure establishing ssh session: -5, Unable to exchange encryption keys" + + Closes #3481 + +Alessandro Ghedini (16 Jan 2019) +- Fix typo in manpage + +Daniel Stenberg (16 Jan 2019) +- RELEASE-NOTES: synced + +Sergei Nikulov (16 Jan 2019) +- cmake: updated check for HAVE_POLL_FINE to match autotools + +Daniel Stenberg (16 Jan 2019) +- curl-compilers.m4: check for __ibmxl__ to detect xlclang + + Follow-up to 2fa0d57e2e3. The __xlc__ symbol is only defined there if a + particular flag is used for legacy macros. + + Fixes #3474 + Closes #3479 + +- openssl: fix the SSL_get_tlsext_status_ocsp_resp call + + .... to not pass in a const in the second argument as that's not how it + is supposed to be used and might cause compiler warnings. + + Reported-by: Pavel Pavlov + Fixes #3477 + Closes #3478 + +- curl-compilers.m4: detect xlclang + + Since it isn't totally clang compatible, we detect this IBM clang + front-end and if detected, avoids some clang specific magic. + + Reported-by: Kees Dekker + Fixes #3474 + Closes #3476 + +- README: add codacy code quality badge + + [skip ci] + +- extract_if_dead: follow-up to 54b201b48c90a + + extract_if_dead() dead is called from two functions, and only one of + them should get conn->data updated and now neither call path clears it. + + scan-build found a case where conn->data would be NULL dereferenced in + ConnectionExists() otherwise. + + Closes #3473 + +- multi: remove "Dead assignment" + + Found by scan-build. Follow-up to 4c35574bb785ce. + + Closes #3471 + +- tests: move objnames-* from lib into tests + + Since they're used purely for testing purposes, I think they should + rather be stored there. + + Closes #3470 + +Sergei Nikulov (15 Jan 2019) +- travis: added cmake build for osx + +Daniel Stenberg (14 Jan 2019) +- [Frank Gevaerts brought this change] + + cookie: fix comment typo (url_path_len -> uri_path_len) + + Closes #3469 + +Marcel Raad (14 Jan 2019) +- winbuild: conditionally use /DZLIB_WINAPI + + zlibwapi.lib (dynamic library) and zlibstat.lib (static library) have + the ZLIB_WINAPI define set by default. Using them requires that define + too. + + Ref: https://zlib.net/DLL_FAQ.txt + + Fixes https://github.com/curl/curl/issues/3133 + Closes https://github.com/curl/curl/pull/3460 + +Daniel Stenberg (14 Jan 2019) +- src/Makefile: make 'tidy' target work for metalink builds + +- extract_if_dead: use a known working transfer when checking connections + + Make sure that this function sets a proper "live" transfer for the + connection before calling the protocol-specific connection check + function, and then clear it again afterward as a non-used connection has + no current transfer. + + Reported-by: Jeroen Ooms + Reviewed-by: Marcel Raad + Reviewed-by: Daniel Gustafsson + Fixes #3463 + Closes #3464 + +- openssl: adapt to 3.0.0, OpenSSL_version_num() is deprecated + + OpenSSL_version() replaces OpenSSL_version_num() + + Closes #3462 + +Sergei Nikulov (11 Jan 2019) +- cmake: added checks for HAVE_VARIADIC_MACROS_C99 and HAVE_VARIADIC_MACROS_GCC + +Daniel Stenberg (11 Jan 2019) +- urldata: rename easy_conn to just conn + + We use "conn" everywhere to be a pointer to the connection. + + Introduces two functions that "attaches" and "detaches" the connection + to and from the transfer. + + Going forward, we should favour using "data->conn" (since a transfer + always only has a single connection or none at all) to "conn->data" + (since a connection can have none, one or many transfers associated with + it and updating conn->data to be correct is error prone and a frequent + reason for internal issues). + + Closes #3442 + +- tool_cb_prg: avoid integer overflow + + When calculating the progress bar width. + + Reported-by: Peng Li + Fixes #3456 + Closes #3458 + +Daniel Gustafsson (11 Jan 2019) +- travis: turn off copyright year checks in checksrc + + Invoking the maintainer intended COPYRIGHTYEAR check for everyone + in the PR pipeline is too invasive, especially at the turn of the + year when many files get affected. Remove and leave it as a tool + for maintainers to verify patches before commits. + + This reverts f7bdf4b2e1d81b2652b81b9b3029927589273b41. + + After discussion with: Daniel Stenberg + +Daniel Stenberg (10 Jan 2019) +- KNOWN_BUGS: cmake makes unusable tool_hugehelp.c with MinGW + + Closes #3125 + +- KNOWN_BUGS: Improve --data-urlencode space encoding + + Closes #3229 + +Patrick Monnerat (10 Jan 2019) +- os400: add a missing closing bracket + + See https://github.com/curl/curl/issues/3453#issuecomment-453054458 + + Reported-by: jonrumsey on github + +- os400: fix extra parameter syntax error. + + Reported-by: jonrumsey on github + Closes #3453 + +Daniel Stenberg (10 Jan 2019) +- test1558: verify CURLINFO_PROTOCOL on file:// transfer + + Attempt to reproduce issue #3444. + + Closes #3447 + +- RELEASE-NOTES: synced + +- xattr: strip credentials from any URL that is stored + + Both user and password are cleared uncondtitionally. + + Added unit test 1621 to verify. + + Fixes #3423 + Closes #3433 + +- cookies: allow secure override when done over HTTPS + + Added test 1562 to verify. + + Reported-by: Jeroen Ooms + Fixes #3445 + Closes #3450 + +- multi: multiplexing improvements + + Fixes #3436 + Closes #3448 + + Problem 1 + + After LOTS of scratching my head, I eventually realized that even when doing + 10 uploads in parallel, sometimes the socket callback to the application that + tells it what to wait for on the socket, looked like it would reflect the + status of just the single transfer that just changed state. + + Digging into the code revealed that this was indeed the truth. When multiple + transfers are using the same connection, the application did not correctly get + the *combined* flags for all transfers which then could make it switch to READ + (only) when in fact most transfers wanted to get told when the socket was + WRITEABLE. + + Problem 1b + + A separate but related regression had also been introduced by me when I + cleared connection/transfer association better a while ago, as now the logic + couldn't find the connection and see if that was marked as used by more + transfers and then it would also prematurely remove the socket from the socket + hash table even in times other transfers were still using it! + + Fix 1 + + Make sure that each socket stored in the socket hash has a "combined" action + field of what to ask the application to wait for, that is potentially the ORed + action of multiple parallel transfers. And remove that socket hash entry only + if there are no transfers left using it. + + Problem 2 + + The socket hash entry stored an association to a single transfer using that + socket - and when curl_multi_socket_action() was called to tell libcurl about + activities on that specific socket only that transfer was "handled". + + This was WRONG, as a single socket/connection can be used by numerous parallel + transfers and not necessarily a single one. + + Fix 2 + + We now store a list of handles in the socket hashtable entry and when libcurl + is told there's traffic for a particular socket, it now iterates over all + known transfers using that single socket. + +- test1561: improve test name + + [skip ci] + +- [Katsuhiko YOSHIDA brought this change] + + cookies: skip custom cookies when redirecting cross-site + + Closes #3417 + +- THANKS: fixups and a dedupe + + [skip ci] + +- timediff: fix math for unsigned time_t + + Bug: https://curl.haxx.se/mail/lib-2018-12/0088.html + + Closes #3449 + +- [Bernhard M. Wiedemann brought this change] + + tests: allow tests to pass by 2037-02-12 + + similar to commit f508d29f3902104018 + + Closes #3443 + +- RELEASE-NOTES: synced + +- [Brad Spencer brought this change] + + curl_multi_remove_handle() don't block terminating c-ares requests + + Added Curl_resolver_kill() for all three resolver modes, which only + blocks when necessary, along with test 1592 to confirm + curl_multi_remove_handle() doesn't block unless it must. + + Closes #3428 + Fixes #3371 + +- Revert "http_negotiate: do not close connection until negotiation is completed" + + This reverts commit 07ebaf837843124ee670e5b8c218b80b92e06e47. + + This also reopens PR #3275 which brought the change now reverted. + + Fixes #3384 + Closes #3439 + +- curl/urlapi.h: include "curl.h" first + + This allows programs to include curl/urlapi.h directly. + + Reviewed-by: Daniel Gustafsson + Reported-by: Ben Kohler + Fixes #3438 + Closes #3441 + +Marcel Raad (6 Jan 2019) +- VS projects: fix build warning + + Starting with Visual Studio 2017 Update 9, Visual Studio doesn't like + the MinimalRebuild option anymore and warns: + + cl : Command line warning D9035: option 'Gm' has been deprecated and + will be removed in a future release + + The option can be safely removed so that the default is used. + + Closes https://github.com/curl/curl/pull/3425 + +- schannel: fix compiler warning + + When building with Unicode on MSVC, the compiler warns about freeing a + pointer to const in Curl_unicodefree. Fix this by declaring it as + non-const and casting the argument to Curl_convert_UTF8_to_tchar to + non-const too, like we do in all other places. + + Closes https://github.com/curl/curl/pull/3435 + +Daniel Stenberg (4 Jan 2019) +- [Rikard Falkeborn brought this change] + + printf: introduce CURL_FORMAT_TIMEDIFF_T + +- [Rikard Falkeborn brought this change] + + printf: fix format specifiers + + Closes #3426 + +- libtest/stub_gssapi: use "real" snprintf + + ... since it doesn't link with libcurl. + + Reverts the commit dcd6f81025 changes from this file. + + Bug: https://curl.haxx.se/mail/lib-2019-01/0000.html + Reported-by: Shlomi Fish + Reviewed-by: Daniel Gustafsson + Reviewed-by: Kamil Dudka + + Closes #3434 + +- INTERNALS: correct some outdated function names + + Closes #3431 + +- docs/version.d: mention MultiSSL + + Reviewed-by: Daniel Gustafsson + Closes #3432 + +Daniel Gustafsson (2 Jan 2019) +- [Rikard Falkeborn brought this change] + + examples: Update .gitignore + + Add a few missing examples to make `make examples` not leave the + workspace in a dirty state. + + Closes #3427 + Reviewed-by: Daniel Gustafsson + +- THANKS: add more missing names + + Add Adrian Burcea who made the artwork for the curl://up 2018 event + which was held in Stockholm, Sweden. + +- docs: mention potential leak in curl_slist_append + + When a non-empty list is appended to, and used as the returnvalue, + the list pointer can leak in case of an allocation failure in the + curl_slist_append() call. This is correctly handled in curl code + usage but we weren't explicitly pointing it out in the API call + documentation. Fix by extending the RETURNVALUE manpage section + and example code. + + Closes #3424 + Reported-by: dnivras on github + Reviewed-by: Daniel Stenberg + +Marcel Raad (1 Jan 2019) +- tvnow: silence conversion warnings + + MinGW-w64 defaults to targeting Windows 7 now, so GetTickCount64 is + used and the milliseconds are represented as unsigned long long, + leading to a compiler warning when implicitly converting them to long. + +Daniel Stenberg (1 Jan 2019) +- THANKS: dedupe more names + + Researched-by: Tae Wong + +Marcel Raad (1 Jan 2019) +- [Markus Moeller brought this change] + + ntlm: update selection of type 3 response + + NTLM2 did not work i.e. no NTLMv2 response was created. Changing the + check seems to work. + + Ref: https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-NLMP/[MS-NLMP].pdf + + Fixes https://github.com/curl/curl/issues/3286 + Closes https://github.com/curl/curl/pull/3287 + Closes https://github.com/curl/curl/pull/3415 + +Daniel Stenberg (31 Dec 2018) +- THANKS: added missing names from year <= 2000 + + Due to a report of a missing name in THANKS I manually went through an + old CHANGES.0 file and added many previously missing names here. + +Daniel Gustafsson (30 Dec 2018) +- urlapi: fix parsing ipv6 with zone index + + The previous fix for parsing IPv6 URLs with a zone index was a paddle + short for URLs without an explicit port. This patch fixes that case + and adds a unit test case. + + This bug was highlighted by issue #3408, and while it's not the full + fix for the problem there it is an isolated bug that should be fixed + regardless. + + Closes #3411 + Reported-by: GitYuanQu on github + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (30 Dec 2018) +- THANKS: dedupe Guenter Knauf + + Reported-by: Tae Wong + +- THANKS: missing name from the 6.3.1 release! + +Daniel Gustafsson (27 Dec 2018) +- RELEASE-NOTES: synced + +- [Claes Jakobsson brought this change] + + hostip: support wildcard hosts + + This adds support for wildcard hosts in CURLOPT_RESOLVE. These are + try-last so any non-wildcard entry is resolved first. If specified, + any host not matched by another CURLOPT_RESOLVE config will use this + as fallback. + + Example send a.com to 10.0.0.1 and everything else to 10.0.0.2: + curl --resolve *:443:10.0.0.2 --resolve a.com:443:10.0.0.1 \ + https://a.com https://b.com + + This is probably quite similar to using: + --connect-to a.com:443:10.0.0.1:443 --connect-to :443:10.0.0.2:443 + + Closes #3406 + Reviewed-by: Daniel Stenberg + +- url: fix incorrect indentation + +Patrick Monnerat (26 Dec 2018) +- os400: upgrade ILE/RPG binding. + + - Trailer function support. + - http 0.9 option. + - curl_easy_upkeep. + +Daniel Gustafsson (25 Dec 2018) +- FAQ: remove mention of sourceforge for github + + The project bug tracker is no longer hosted at sourceforge but is now + hosted on the curl Github page. Update the FAQ to reflect. + + Closes #3410 + Reviewed-by: Daniel Stenberg + +- openvms: fix typos in documentation + +- openvms: fix OpenSSL discovery on VAX + + The DCL code had a typo in one of the commands which would make the + OpenSSL discovery on VAX fail. The correct syntax is F$ENVIRONMENT. + + Closes #3407 + Reviewed-by: Viktor Szakats + +Daniel Stenberg (24 Dec 2018) +- [Ruslan Baratov brought this change] + + cmake: use lowercase for function name like the rest of the code + + Reviewed-by: Sergei Nikulov + + closes #3196 + +- Revert "libssh: no data pointer == nothing to do" + + This reverts commit c98ee5f67f497195c9 since commit f3ce38739fa fixed the + problem in a more generic way. + +- disconnect: set conn->data for protocol disconnect + + Follow-up to fb445a1e18d: Set conn->data explicitly to point out the + current transfer when invoking the protocol-specific disconnect function + so that it can work correctly. + + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12173 + +Jay Satiro (23 Dec 2018) +- [Pavel Pavlov brought this change] + + timeval: Use high resolution timestamps on Windows + + - Use QueryPerformanceCounter on Windows Vista+ + + There is confusing info floating around that QueryPerformanceCounter + can leap etc, which might have been true long time ago, but no longer + the case nowadays (perhaps starting from WinXP?). Also, boost and + std::chrono::steady_clock use QueryPerformanceCounter in a similar way. + + Prior to this change GetTickCount or GetTickCount64 was used, which has + lower resolution. That is still the case for <= XP. + + Fixes https://github.com/curl/curl/issues/3309 + Closes https://github.com/curl/curl/pull/3318 + +Daniel Stenberg (22 Dec 2018) +- libssh: no data pointer == nothing to do + +- conncache_unlock: avoid indirection by changing input argument type + +- disconnect: separate connections and easy handles better + + Do not assume/store assocation between a given easy handle and the + connection if it can be avoided. + + Long-term, the 'conn->data' pointer should probably be removed as it is a + little too error-prone. Still used very widely though. + + Reported-by: masbug on github + Fixes #3391 + Closes #3400 + +- libssh: free sftp_canonicalize_path() data correctly + + Assisted-by: Harry Sintonen + + Fixes #3402 + Closes #3403 + +- RELEASE-NOTES: synced + +- http: added options for allowing HTTP/0.9 responses + + Added CURLOPT_HTTP09_ALLOWED and --http0.9 for this purpose. + + For now, both the tool and library allow HTTP/0.9 by default. + docs/DEPRECATE.md lays out the plan for when to reverse that default: 6 + months after the 7.64.0 release. The options are added already now so + that applications/scripts can start using them already now. + + Fixes #2873 + Closes #3383 + +- if2ip: remove unused function Curl_if_is_interface_name + + Closes #3401 + +- http2: clear pause stream id if it gets closed + + Reported-by: Florian Pritz + + Fixes #3392 + Closes #3399 + +Daniel Gustafsson (20 Dec 2018) +- [David Garske brought this change] + + wolfssl: Perform cleanup + + This adds a cleanup callback for cyassl. Resolves possible memory leak + when using ECC fixed point cache. + + Closes #3395 + Reviewed-by: Daniel Stenberg + Reviewed-by: Daniel Gustafsson + +Daniel Stenberg (20 Dec 2018) +- mbedtls: follow-up VERIFYHOST fix from f097669248 + + Fix-by: Eric Rosenquist + + Fixes #3376 + Closes #3390 + +- curlver: bump to 7.64.0 for next release + +Daniel Gustafsson (19 Dec 2018) +- cookies: extend domain checks to non psl builds + + Ensure to perform the checks we have to enforce a sane domain in + the cookie request. The check for non-PSL enabled builds is quite + basic but it's better than nothing. + + Closes #2964 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (19 Dec 2018) +- [Matus Uzak brought this change] + + smb: fix incorrect path in request if connection reused + + Follow-up to 09e401e01bf9. If connection gets reused, then data member + will be copied, but not the proto member. As a result, in smb_do(), + path has been set from the original proto.share data. + + Closes #3388 + +- curl -J: do not append to the destination file + + Reported-by: Kamil Dudka + Fixes #3380 + Closes #3381 + +- mbedtls: use VERIFYHOST + + Previously, VERIFYPEER would enable/disable all checks. + + Reported-by: Eric Rosenquist + Fixes #3376 + Closes #3380 + +- pingpong: change default response timeout to 120 seconds + + Previously it was 30 minutes + +- pingpong: ignore regular timeout in disconnect phase + + The timeout set with CURLOPT_TIMEOUT is no longer used when + disconnecting from one of the pingpong protocols (FTP, IMAP, SMTP, + POP3). + + Reported-by: jasal82 on github + + Fixes #3264 + Closes #3374 + +- TODO: Windows: set attribute 'archive' for completed downloads + + Closes #3354 + +- RELEASE-NOTES: synced + +- http: minor whitespace cleanup from f464535b + +- [Ayoub Boudhar brought this change] + + http: Implement trailing headers for chunked transfers + + This adds the CURLOPT_TRAILERDATA and CURLOPT_TRAILERFUNCTION + options that allow a callback based approach to sending trailing headers + with chunked transfers. + + The test server (sws) was updated to take into account the detection of the + end of transfer in the case of trailing headers presence. + + Test 1591 checks that trailing headers can be sent using libcurl. + + Closes #3350 + +- darwinssl: accept setting max-tls with default min-tls + + Reported-by: Andrei Neculau + Fixes #3367 + Closes #3373 + +- gopher: fix memory leak from 9026083ddb2a9 + +- [Leonardo Taccari brought this change] + + test1201: Add a trailing `?' to the selector + + This verify that the `?' in the selector is kept as is. + + Verifies the fix in #3370 + +- [Leonardo Taccari brought this change] + + gopher: always include the entire gopher-path in request + + After the migration to URL API all octets in the selector after the + first `?' were interpreted as query and accidentally discarded and not + passed to the server. + + Add a gopherpath to always concatenate possible path and query URL + pieces. + + Fixes #3369 + Closes #3370 + +- [Leonardo Taccari brought this change] + + urlapi: distinguish possibly empty query + + If just a `?' to indicate the query is passed always store a zero length + query instead of having a NULL query. + + This permits to distinguish URL with trailing `?'. + + Fixes #3369 + Closes #3370 + +Daniel Gustafsson (13 Dec 2018) +- OS400: handle memory error in list conversion + + Curl_slist_append_nodup() returns NULL when it fails to create a new + item for the specified list, and since the coding here reassigned the + new list on top of the old list it would result in a dangling pointer + and lost memory. Also, in case we hit an allocation failure at some + point during the conversion, with allocation succeeding again on the + subsequent call(s) we will return a truncated list around the malloc + failure point. Fix by assigning to a temporary list pointer, which can + be checked (which is the common pattern for slist appending), and free + all the resources on allocation failure. + + Closes #3372 + Reviewed-by: Daniel Stenberg + +- cookies: leave secure cookies alone + + Only allow secure origins to be able to write cookies with the + 'secure' flag set. This reduces the risk of non-secure origins + to influence the state of secure origins. This implements IETF + Internet-Draft draft-ietf-httpbis-cookie-alone-01 which updates + RFC6265. + + Closes #2956 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (13 Dec 2018) +- docs: fix the --tls-max description + + Reported-by: Tobias Lindgren + Pointed out in #3367 + + Closes #3368 + +Daniel Gustafsson (12 Dec 2018) +- urlapi: Fix port parsing of eol colon + + A URL with a single colon without a portnumber should use the default + port, discarding the colon. Fix, add a testcase and also do little bit + of comment wordsmithing. + + Closes #3365 + Reviewed-by: Daniel Stenberg + +Version 7.63.0 (12 Dec 2018) + +Daniel Stenberg (12 Dec 2018) +- RELEASE-NOTES: 7.63.0 + +- THANKS: from the curl 7.62.0 cycle + +- test1519: use lib1518 and test CURLINFO_REDIRECT_URL more + +- Curl_follow: extract the Location: header field unvalidated + + ... when not actually following the redirect. Otherwise we return error + for this and an application can't extract the value. + + Test 1518 added to verify. + + Reported-by: Pavel Pavlov + Fixes #3340 + Closes #3364 + +- multi: convert two timeout variables to timediff_t + + The time_t type is unsigned on some systems and these variables are used + to hold return values from functions that return timediff_t + already. timediff_t is always a signed type. + + Closes #3363 + +- delta: use --diff-filter on the git diff-tree invokes + + Suggested-by: Dave Reisner + +Patrick Monnerat (11 Dec 2018) +- documentation: curl_formadd field and file names are now escaped + + Prior to 7.56.0, fieldnames and filenames were set in Content-Disposition + header without special processing: this may lead to invalid RFC 822 + quoted-strings. + 7.56.0 introduces escaping of backslashes and double quotes in these names: + mention it in the documentation. + + Reported-by: daboul on github + Closes #3361 + +Daniel Stenberg (11 Dec 2018) +- scripts/delta: show repo delta info from last release + + ... where "last release" should be the git tag in the repo. + +Daniel Gustafsson (11 Dec 2018) +- tests: add urlapi unittest + + This adds a new unittest intended to cover the internal functions in + the urlapi code, starting with parse_port(). In order to avoid name + collisions in debug builds, parse_port() is renamed Curl_parse_port() + since it will be exported. + + Reviewed-by: Daniel Stenberg + Reviewed-by: Marcel Raad + +- urlapi: fix portnumber parsing for ipv6 zone index + + An IPv6 URL which contains a zone index includes a '%%25' + string before the ending ']' bracket. The parsing logic wasn't set + up to cope with the zone index however, resulting in a malformed url + error being returned. Fix by breaking the parsing into two stages + to correctly handle the zone index. + + Closes #3355 + Closes #3319 + Reported-by: tonystz on Github + Reviewed-by: Daniel Stenberg + Reviewed-by: Marcel Raad + +Daniel Stenberg (11 Dec 2018) +- [Jay Satiro brought this change] + + http: fix HTTP auth to include query in URI + + - Include query in the path passed to generate HTTP auth. + + Recent changes to use the URL API internally (46e1640, 7.62.0) + inadvertently broke authentication URIs by omitting the query. + + Fixes https://github.com/curl/curl/issues/3353 + Closes #3356 + +- [Michael Kaufmann brought this change] + + http: don't set CURLINFO_CONDITION_UNMET for http status code 204 + + The http status code 204 (No Content) should not change the "condition + unmet" flag. Only the http status code 304 (Not Modified) should do + this. + + Closes #359 + +- [Samuel Surtees brought this change] + + ldap: fix LDAP URL parsing regressions + + - Match URL scheme with LDAP and LDAPS + - Retrieve attributes, scope and filter from URL query instead + + Regression brought in 46e164069d1a5230 (7.62.0) + + Closes #3362 + +- RELEASE-NOTES: synced + +- [Stefan Kanthak brought this change] + + (lib)curl.rc: fixup for minor bugs + + All resources defined in lib/libcurl.rc and curl.rc are language + neutral. + + winbuild/MakefileBuild.vc ALWAYS defines the macro DEBUGBUILD, so the + ifdef's in line 33 of lib/libcurl.rc and src/curl.rc are wrong. + + Replace the hard-coded constants in both *.rc files with #define'd + values. + + Thumbs-uped-by: Rod Widdowson, Johannes Schindelin + URL: https://curl.haxx.se/mail/lib-2018-11/0000.html + Closes #3348 + +- test329: verify cookie max-age=0 immediate expiry + +- cookies: expire "Max-Age=0" immediately + + Reported-by: Jeroen Ooms + Fixes #3351 + Closes #3352 + +- [Johannes Schindelin brought this change] + + Upon HTTP_1_1_REQUIRED, retry the request with HTTP/1.1 + + This is a companion patch to cbea2fd2c (NTLM: force the connection to + HTTP/1.1, 2018-12-06): with NTLM, we can switch to HTTP/1.1 + preemptively. However, with other (Negotiate) authentication it is not + clear to this developer whether there is a way to make it work with + HTTP/2, so let's try HTTP/2 first and fall back in case we encounter the + error HTTP_1_1_REQUIRED. + + Note: we will still keep the NTLM workaround, as it avoids an extra + round trip. + + Daniel Stenberg helped a lot with this patch, in particular by + suggesting to introduce the Curl_h2_http_1_1_error() function. + + Closes #3349 + + Signed-off-by: Johannes Schindelin + +- [Ben Greear brought this change] + + openssl: fix unused variable compiler warning with old openssl + + URL: https://curl.haxx.se/mail/lib-2018-11/0055.html + + Closes #3347 + +- [Johannes Schindelin brought this change] + + NTLM: force the connection to HTTP/1.1 + + Since v7.62.0, cURL tries to use HTTP/2 whenever the server announces + the capability. However, NTLM authentication only works with HTTP/1.1, + and will likely remain in that boat (for details, see + https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10/http2-on-iis#when-is-http2-not-supported). + + When we just found out that we want to use NTLM, and when the current + connection runs in HTTP/2 mode, let's force the connection to be closed + and to be re-opened using HTTP/1.1. + + Fixes https://github.com/curl/curl/issues/3341. + Closes #3345 + + Signed-off-by: Johannes Schindelin + +- [Johannes Schindelin brought this change] + + curl_global_sslset(): id == -1 is not necessarily an error + + It is allowed to call that function with id set to -1, specifying the + backend by the name instead. We should imitate what is done further down + in that function to allow for that. + + Signed-off-by: Johannes Schindelin + + Closes #3346 + +Johannes Schindelin (6 Dec 2018) +- .gitattributes: make tabs in indentation a visible error + + Signed-off-by: Johannes Schindelin + +Daniel Stenberg (6 Dec 2018) +- RELEASE-NOTES: synced + +- doh: fix memory leak in OOM situation + + Reviewed-by: Daniel Gustafsson + Closes #3342 + +- doh: make it work for h2-disabled builds too + + Reported-by: dtmsecurity at github + Fixes #3325 + Closes #3336 + +- packages: remove old leftover files and dirs + + This subdir has mostly become an attic of never-used cruft from the + past. + + Closes #3331 + +- [Gergely Nagy brought this change] + + openssl: do not use file BIOs if not requested + + Moves the file handling BIO calls to the branch of the code where they + are actually used. + + Closes #3339 + +- [Paul Howarth brought this change] + + nss: Fix compatibility with nss versions 3.14 to 3.15 + +- [Paul Howarth brought this change] + + nss: Improve info message when falling back SSL protocol + + Use descriptive text strings rather than decimal numbers. + +- [Paul Howarth brought this change] + + nss: Fall back to latest supported SSL version + + NSS may be built without support for the latest SSL/TLS versions, + leading to "SSL version range is not valid" errors when the library + code supports a recent version (e.g. TLS v1.3) but it has explicitly + been disabled. + + This change adjusts the maximum SSL version requested by libcurl to + be the maximum supported version at runtime, as long as that version + is at least as high as the minimum version required by libcurl. + + Fixes #3261 + +Daniel Gustafsson (3 Dec 2018) +- travis: enable COPYRIGHTYEAR extended warning + + The extended warning for checking incorrect COPYRIGHTYEAR is quite + expensive to run, so rather than expecting every developer to do it + we ensure it's turned on locally for Travis. + +- checksrc: add COPYRIGHTYEAR check + + Forgetting to bump the year in the copyright clause when hacking has + been quite common among curl developers, but a traditional checksrc + check isn't a good fit as it would penalize anyone hacking on January + 1st (among other things). This adds a more selective COPYRIGHTYEAR + check which intends to only cover the currently hacked on changeset. + + The check for updated copyright year is currently not enforced on all + files but only on files edited and/or committed locally. This is due to + the amount of files which aren't updated with their correct copyright + year at the time of their respective commit. + + To further avoid running this expensive check for every developer, it + adds a new local override mode for checksrc where a .checksrc file can + be used to turn on extended warnings locally. + + Closes #3303 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (3 Dec 2018) +- CHECKSRC.md: document more warnings + + Closes #3335 + [ci skip] + +- RELEASE-NOTES: synced + +- SECURITY-PROCESS: bountygraph shuts down + + This backpedals back the documents to the state before bountygraph. + + Closes #3311 + +- curl: fix memory leak reading --writeout from file + + If another string had been set first, the writout function for reading + the syntax from file would leak the previously allocated memory. + + Reported-by: Brian Carpenter + Fixes #3322 + Closes #3330 + +- tool_main: rename function to make it unique and better + + ... there's already another function in the curl tool named + free_config_fields! + +Daniel Gustafsson (29 Nov 2018) +- TODO: remove CURLOPT_DNS_USE_GLOBAL_CACHE entry + + Commit 7c5837e79280e6abb3ae143dfc49bca5e74cdd11 deprecated the option + making it a manual code-edit operation to turn it back on. The removal + process has thus started and is now documented in docs/DEPRECATE.md so + remove from the TODO to avoid anyone looking for something to pick up + spend cycles on an already in-progress entry. + + Reviewed-by: Daniel Stenberg + +Jay Satiro (29 Nov 2018) +- [Sevan Janiyan brought this change] + + connect: fix building for recent versions of Minix + + EBADIOCTL doesn't exist on more recent Minix. + There have also been substantial changes to the network stack. + Fixes build on Minix 3.4rc + + Closes https://github.com/curl/curl/pull/3323 + +- [Konstantin Kushnir brought this change] + + CMake: fix MIT/Heimdal Kerberos detection + + - fix syntax error in FindGSS.cmake + - correct krb5 include directory. FindGSS exports + "GSS_INCLUDE_DIR" variable. + + Closes https://github.com/curl/curl/pull/3316 + +Daniel Stenberg (28 Nov 2018) +- test328: verify Content-Encoding: none + + Because of issue #3315 + + Closes #3317 + +- [James Knight brought this change] + + configure: include all libraries in ssl-libs fetch + + When compiling a collection of SSL libraries to link against (SSL_LIBS), + ensure all libraries are included. The call `--libs-only-l` can produce + only a subset of found in a `--libs` call (e.x. pthread may be excluded). + Adding `--libs-only-other` ensures other libraries are also included in + the list. This corrects select build environments compiling against a + static version of OpenSSL. Before the change, the following could be + observed: + + checking for openssl options with pkg-config... found + configure: pkg-config: SSL_LIBS: "-lssl -lz -ldl -lcrypto -lz -ldl " + configure: pkg-config: SSL_LDFLAGS: "-L/home/jdknight//staging/usr/lib -L/home/jdknight//staging/usr/lib " + configure: pkg-config: SSL_CPPFLAGS: "-I/home/jdknight//staging/usr/include " + checking for HMAC_Update in -lcrypto... no + checking for HMAC_Init_ex in -lcrypto... no + checking OpenSSL linking with -ldl... no + checking OpenSSL linking with -ldl and -lpthread... no + configure: WARNING: SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more. + configure: WARNING: Use --with-ssl, --with-gnutls, --with-polarssl, --with-cyassl, --with-nss, --with-axtls, --with-winssl, or --with-darwinssl to address this. + ... + SSL support: no (--with-{ssl,gnutls,nss,polarssl,mbedtls,cyassl,axtls,winssl,darwinssl} ) + ... + + And include the other libraries when compiling SSL_LIBS succeeds with: + + checking for openssl options with pkg-config... found + configure: pkg-config: SSL_LIBS: "-lssl -lz -ldl -pthread -lcrypto -lz -ldl -pthread " + configure: pkg-config: SSL_LDFLAGS: "-L/home/jdknight//staging/usr/lib -L/home/jdknight//staging/usr/lib " + configure: pkg-config: SSL_CPPFLAGS: "-I/home/jdknight//staging/usr/include " + checking for HMAC_Update in -lcrypto... yes + checking for SSL_connect in -lssl... yes + ... + SSL support: enabled (OpenSSL) + ... + + Signed-off-by: James Knight + Closes #3193 + +Daniel Gustafsson (26 Nov 2018) +- doh: fix typo in infof call + + Reviewed-by: Daniel Stenberg + +- cmdline-opts/gen.pl: define the correct varname + + The variable definition had a small typo making it declare another + variable then the intended. + + Closes #3304 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (25 Nov 2018) +- RELEASE-NOTES: synced + +- curl_easy_perform: fix timeout handling + + curl_multi_wait() was erroneously used from within + curl_easy_perform(). It could lead to it believing there was no socket + to wait for and then instead sleep for a while instead of monitoring the + socket and then miss acting on that activity as swiftly as it should + (causing an up to 1000 ms delay). + + Reported-by: Antoni Villalonga + Fixes #3305 + Closes #3306 + Closes #3308 + +- CURLOPT_WRITEFUNCTION.3: spell out that it gets called many times + +- cookies: create the cookiejar even if no cookies to save + + Important for when the file is going to be read again and thus must not + contain old contents! + + Adds test 327 to verify. + + Reported-by: daboul on github + Fixes #3299 + Closes #3300 + +- checksrc: ban snprintf use, add command line flag to override warns + +- snprintf: renamed and we now only use msnprintf() + + The function does not return the same value as snprintf() normally does, + so readers may be mislead into thinking the code works differently than + it actually does. A different function name makes this easier to detect. + + Reported-by: Tomas Hoger + Assisted-by: Daniel Gustafsson + Fixes #3296 + Closes #3297 + +- [Tobias Hintze brought this change] + + test: update test20/1322 for eglibc bug workaround + + The tests 20 and 1322 are using getaddrinfo of libc for resolving. In + eglibc-2.19 there is a memory leakage and invalid free bug which + surfaces in some special circumstances (PF_UNSPEC hint with invalid or + non-existent names). The valgrind runs in testing fail in these + situations. + + As the tests 20/1322 are not specific on either protocol (IPv4/IPv6) + this commit changes the hints to IPv4 protocol by passing `--ipv4` flag + on the tests' command line. This prevents the valgrind failures. + +- [Tobias Hintze brought this change] + + host names: allow trailing dot in name resolve, then strip it + + Delays stripping of trailing dots to after resolving the hostname. + + Fixes #3022 + Closes #3222 + +- [UnknownShadow200 brought this change] + + CURLOPT_HEADERFUNCTION.3: match 'nitems' name in synopsis and description + + Closes #3295 + +Daniel Gustafsson (21 Nov 2018) +- configure: Fix typo in comment + +Michael Kaufmann (21 Nov 2018) +- openssl: support session resume with TLS 1.3 + + Session resumption information is not available immediately after a TLS 1.3 + handshake. The client must wait until the server has sent a session ticket. + + Use OpenSSL's "new session" callback to get the session information and put it + into curl's session cache. For TLS 1.3 sessions, this callback will be invoked + after the server has sent a session ticket. + + The "new session" callback is invoked only if OpenSSL's session cache is + enabled, so enable it and use the "external storage" mode which lets curl manage + the contents of the session cache. + + A pointer to the connection data and the sockindex are now saved as "SSL extra + data" to make them available to the callback. + + This approach also works for old SSL/TLS versions and old OpenSSL versions. + + Reviewed-by: Daniel Stenberg + + Fixes #3202 + Closes #3271 + +- ssl: fix compilation with OpenSSL 0.9.7 + + - ENGINE_cleanup() was used without including "openssl/engine.h" + - enable engine support for OpenSSL 0.9.7 + + Closes #3266 + +Daniel Stenberg (21 Nov 2018) +- openssl: disable TLS renegotiation with BoringSSL + + Since we're close to feature freeze, this change disables this feature + with an #ifdef. Define ALLOW_RENEG at build-time to enable. + + This could be converted to a bit for CURLOPT_SSL_OPTIONS to let + applications opt-in this. + + Concern-raised-by: David Benjamin + Fixes #3283 + Closes #3293 + +- [Romain Fliedel brought this change] + + ares: remove fd from multi fd set when ares is about to close the fd + + When using c-ares for asyn dns, the dns socket fd was silently closed + by c-ares without curl being aware. curl would then 'realize' the fd + has been removed at next call of Curl_resolver_getsock, and only then + notify the CURLMOPT_SOCKETFUNCTION to remove fd from its poll set with + CURL_POLL_REMOVE. At this point the fd is already closed. + + By using ares socket state callback (ARES_OPT_SOCK_STATE_CB), this + patch allows curl to be notified that the fd is not longer needed + for neither for write nor read. At this point by calling + Curl_multi_closed we are able to notify multi with CURL_POLL_REMOVE + before the fd is actually closed by ares. + + In asyn-ares.c Curl_resolver_duphandle we can't use ares_dup anymore + since it does not allow passing a different sock_state_cb_data + + Closes #3238 + +- [Romain Fliedel brought this change] + + examples/ephiperfifo: report error when epoll_ctl fails + +Daniel Gustafsson (20 Nov 2018) +- [pkubaj brought this change] + + ntlm: Remove redundant ifdef USE_OPENSSL + + lib/curl_ntlm.c had code that read as follows: + + #ifdef USE_OPENSSL + # ifdef USE_OPENSSL + # else + # .. + # endif + #endif + + Remove the redundant USE_OPENSSL along with #else (it's not possible to + reach it anyway). The removed construction is a leftover from when the + SSLeay support was removed. + + Closes #3269 + Reviewed-by: Daniel Gustafsson + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (20 Nov 2018) +- [Han Han brought this change] + + ssl: replace all internal uses of CURLE_SSL_CACERT + + Closes #3291 + +Han Han (19 Nov 2018) +- docs: add more description to unified ssl error codes + +- curle: move deprecated error code to ifndef block + +Patrick Monnerat (19 Nov 2018) +- os400: add CURLOPT_CURLU to ILE/RPG binding. + +- os400: Add curl_easy_conn_upkeep() to ILE/RPG binding. + +- os400: fix return type of curl_easy_pause() in ILE/RPG binding. + +Daniel Stenberg (19 Nov 2018) +- RELEASE-NOTES: synced + +- impacket: add LICENSE + + The license for the impacket package was not in our tree. + + Imported now from upstream's + https://github.com/SecureAuthCorp/impacket/blob/master/LICENSE + + Reported-by: infinnovation-dev on github + Fixes #3276 + Closes #3277 + +Daniel Gustafsson (18 Nov 2018) +- tool_doswin: Fix uninitialized field warning + + The partial struct initialization in 397664a065abffb7c3445ca9 caused + a warning on uninitialized MODULEENTRY32 struct members: + + /src/tool_doswin.c:681:3: warning: missing initializer for field + 'th32ModuleID' of 'MODULEENTRY32 {aka struct tagMODULEENTRY32}' + [-Wmissing-field-initializers] + + This is sort of a bogus warning as the remaining members will be set + to zero by the compiler, as all omitted members are. Nevertheless, + remove the warning by omitting all members and setting the dwSize + members explicitly. + + Closes #3254 + Reviewed-by: Marcel Raad + Reviewed-by: Jay Satiro + +- openssl: Remove SSLEAY leftovers + + Commit 709cf76f6bb7dbac deprecated USE_SSLEAY, as curl since long isn't + compatible with the SSLeay library. This removes the few leftovers that + were omitted in the less frequently used platform targets. + + Closes #3270 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (16 Nov 2018) +- [Elia Tufarolo brought this change] + + http_negotiate: do not close connection until negotiation is completed + + Fix HTTP POST using CURLAUTH_NEGOTIATE. + + Closes #3275 + +- pop3: only do APOP with a valid timestamp + + Brought-by: bobmitchell1956 on github + Fixes #3278 + Closes #3279 + +Jay Satiro (16 Nov 2018) +- [Peter Wu brought this change] + + openssl: do not log excess "TLS app data" lines for TLS 1.3 + + The SSL_CTX_set_msg_callback callback is not just called for the + Handshake or Alert protocols, but also for the raw record header + (SSL3_RT_HEADER) and the decrypted inner record type + (SSL3_RT_INNER_CONTENT_TYPE). Be sure to ignore the latter to avoid + excess debug spam when using `curl -v` against a TLSv1.3-enabled server: + + * TLSv1.3 (IN), TLS app data, [no content] (0): + + (Following this message, another callback for the decrypted + handshake/alert messages will be be present anyway.) + + Closes https://github.com/curl/curl/pull/3281 + +Marc Hoersken (15 Nov 2018) +- tests: disable SO_EXCLUSIVEADDRUSE for stunnel on Windows + + SO_EXCLUSIVEADDRUSE is on by default on Vista or newer, + but does not work together with SO_REUSEADDR being on. + + The default changes were made with stunnel 5.34 and 5.35. + +Daniel Stenberg (13 Nov 2018) +- [Kamil Dudka brought this change] + + nss: remove version selecting dead code + + Closes #3262 + +- nss: set default max-tls to 1.3/1.2 + + Fixes #3261 + +Daniel Gustafsson (13 Nov 2018) +- tool_cb_wrt: Silence function cast compiler warning + + Commit 5bfaa86ceb3c2a9ac474a928e748c4a86a703b33 introduced a new + compiler warning on Windows cross compilation with GCC. See below + for an example of the warning from the autobuild logs (whitespace + edited to fit): + + /src/tool_cb_wrt.c:175:9: warning: cast from function call of type + 'intptr_t {aka long long int}' to non-matching type 'void *' + [-Wbad-function-cast] + (HANDLE) _get_osfhandle(fileno(outs->stream)), + ^ + + Store the return value from _get_osfhandle() in an intermediate + variable and cast the variable in WriteConsoleW() rather than the + function call directly to avoid a compiler warning. + + In passing, also add inspection of the MultiByteToWideChar() return + value and return failure in case an error is reported. + + Closes #3263 + Reviewed-by: Marcel Raad + Reviewed-by: Viktor Szakats + +Daniel Stenberg (12 Nov 2018) +- nss: fix fallthrough comment to fix picky compiler warning + +- docs: expanded on some CURLU details + +- [Tim Rühsen brought this change] + + ftp: avoid two unsigned int overflows in FTP listing parser + + Curl_ftp_parselist: avoid unsigned integer overflows + + The overflow has no real world impact, just avoid it for "best + practice". + + Closes #3225 + +- curl: --local-port range was not "including" + + The end port number in a given range was not included in the range used, + as it is documented to be. + + Reported-by: infinnovation-dev on github + Fixes #3251 + Closes #3255 + +- [Jérémy Rocher brought this change] + + openssl: support BoringSSL TLS renegotiation + + As per BoringSSL porting documentation [1], BoringSSL rejects peer + renegotiations by default. + + curl fails when trying to authenticate to server through client + certificate if it is requested by server after the initial TLS + handshake. + + Enable renegotiation by default with BoringSSL to get same behavior as + with OpenSSL. This is done by calling SSL_set_renegotiate_mode [2] + which was introduced in commit 1d5ef3bb1eb9 [3]. + + 1 - https://boringssl.googlesource.com/boringssl/+/HEAD/PORTING.md#tls-renegotiation + 2 - https://boringssl.googlesource.com/boringssl/+/master/include/openssl/ssl.h#3482 + 3 - https://boringssl.googlesource.com/boringssl/+/1d5ef3bb1eb97848617db5e7d633d735a401df86 + + Signed-off-by: Jérémy Rocher + Fixes #3258 + Closes #3259 + +- HISTORY: add some milestones + + Added a few of the more notable milestones in curl history that were + missing. Primarily more recent ones but I also noted some older that + could be worth mentioning. + + [ci skip] + Closes #3257 + +Daniel Gustafsson (9 Nov 2018) +- KNOWN_BUGS: add --proxy-any connection issue + + Add the identified issue with --proxy-any and proxy servers which + advertise authentication schemes other than the supported one. + + Closes #876 + Closes #3250 + Reported-by: NTMan on Github + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (9 Nov 2018) +- [Jim Fuller brought this change] + + setopt: add CURLOPT_CURLU + + Allows an application to pass in a pre-parsed URL via a URL handle. + + Closes #3227 + +- [Gisle Vanem brought this change] + + docs: ESCape "\n" codes + + Groff / Troff will display a: + printaf("Errno: %ld\n", error); + as: + printf("Errno: %ld0, error); + + when a "\n" is not escaped. Use "\\n" instead. + + Closes #3246 + +- curl: --local-port fix followup + + Regression by 52db54869e6. + + Reported-by: infinnovation-dev on github + Fixes #3248 + Closes #3249 + +GitHub (7 Nov 2018) +- [Gisle Vanem brought this change] + + More "\n" ESCaping + +Daniel Stenberg (7 Nov 2018) +- RELEASE-NOTES: synced + +- curl: fix --local-port integer overflow + + The tool's local port command line range parser didn't check for integer + overflows and could pass "weird" data to libcurl for this option. + libcurl however, has a strict range check for the values so it rejects + anything outside of the accepted range. + + Reported-by: Brian Carpenter + Closes #3242 + +- curl: correct the switch() logic in ourWriteOut + + Follow-up to e431daf013, as I did the wrong correction for a compiler + warning. It should be a break and not a fall-through. + + Pointed-out-by: Frank Gevaerts + +- [Frank Gevaerts brought this change] + + curl: add %{stderr} and %{stdout} for --write-out + + Closes #3115 + +Daniel Gustafsson (7 Nov 2018) +- winssl: be consistent in Schannel capitalization + + The productname from Microsoft is "Schannel", but in infof/failf + reporting we use "schannel". This removes different versions. + + Closes #3243 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (7 Nov 2018) +- TODO: Have the URL API offer IDN decoding + + Similar to how URL decoding/encoding is done, we could have URL + functions to convert IDN host names to punycode. + + Suggested-by: Alexey Melnichuk + Closes #3232 + +- urlapi: only skip encoding the first '=' with APPENDQUERY set + + APPENDQUERY + URLENCODE would skip all equals signs but now it only skip + encoding the first to better allow "name=content" for any content. + + Reported-by: Alexey Melnichuk + Fixes #3231 + Closes #3231 + +- url: a short host name + port is not a scheme + + The function identifying a leading "scheme" part of the URL considered a + few letters ending with a colon to be a scheme, making something like + "short:80" to become an unknown scheme instead of a short host name and + a port number. + + Extended test 1560 to verify. + + Also fixed test203 to use file_pwd to make it get the correct path on + windows. Removed test 2070 since it was a duplicate of 203. + + Assisted-by: Marcel Raad + Reported-by: Hagai Auro + Fixes #3220 + Fixes #3233 + Closes #3223 + Closes #3235 + +- [Sangamkar brought this change] + + libcurl: stop reading from paused transfers + + In the transfer loop it would previously not acknwledge the pause bit + and continue until drained or loop ended. + + Closes #3240 + +Jay Satiro (6 Nov 2018) +- tool: add undocumented option --dump-module-paths for win32 + + - Add an undocumented diagnostic option for Windows to show the full + paths of all loaded modules regardless of whether or not libcurl + initialization succeeds. + + This is needed so that in the CI we can get a list of all DLL + dependencies after initialization (when they're most likely to have + finished loading) and then package them as artifacts so that a + functioning build can be downloaded. Also I imagine it may have some use + as a diagnostic for help requests. + + Ref: https://github.com/curl/curl/pull/3103 + + Closes https://github.com/curl/curl/pull/3208 + +- curl_multibyte: fix a malloc overcalculation + + Prior to this change twice as many bytes as necessary were malloc'd when + converting wchar to UTF8. To allay confusion in the future I also + changed the variable name for the amount of bytes from len to bytes. + + Closes https://github.com/curl/curl/pull/3209 + +Michael Kaufmann (5 Nov 2018) +- netrc: don't ignore the login name specified with "--user" + + - for "--netrc", don't ignore the login/password specified with "--user", + only ignore the login/password in the URL. + This restores the netrc behaviour of curl 7.61.1 and earlier. + - fix the documentation of CURL_NETRC_REQUIRED + - improve the detection of login/password changes when reading .netrc + - don't read .netrc if both login and password are already set + + Fixes #3213 + Closes #3224 + +Patrick Monnerat (5 Nov 2018) +- OS400: add URL API ccsid wrappers and sync ILE/RPG bindings + +Daniel Stenberg (5 Nov 2018) +- [Yasuhiro Matsumoto brought this change] + + curl: fixed UTF-8 in current console code page (Windows) + + Fixes #3211 + Fixes #3175 + Closes #3212 + +- TODO: 2.6 multi upkeep + + Closes #3199 + +Daniel Gustafsson (5 Nov 2018) +- unittest: make 1652 stable across collations + + The previous coding used a format string whose output depended on the + current locale of the environment running the test. Since the gist of + the test is to have a format string, with the actual formatting being + less important, switch to a more stable formatstring with decimals. + + Reported-by: Marcel Raad + Closes #3234 + Reviewed-by: Daniel Stenberg + Reviewed-by: Marcel Raad + +Daniel Stenberg (5 Nov 2018) +- Revert "url: a short host name + port is not a scheme" + + This reverts commit 226cfa8264cd979eff3fd52c0f3585ef095e7cf2. + + This commit caused test failures on appveyor/windows. Work on fixing them is + in #3235. + +- symbols-in-versions: add missing CURLU_ symbols + + ...and fix symbol-scan.pl to also scan urlapi.h + + Reported-by: Alexey Melnichuk + Fixes #3226 + Closes #3230 + +Daniel Gustafsson (3 Nov 2018) +- infof: clearly indicate truncation + + The internal buffer in infof() is limited to 2048 bytes of payload plus + an additional byte for NULL termination. Servers with very long error + messages can however cause truncation of the string, which currently + isn't very clear, and leads to badly formatted output. + + This appends a "...\n" (or just "..." in case the format didn't with a + newline char) marker to the end of the string to clearly show + that it has been truncated. + + Also include a unittest covering infof() to try and catch any bugs + introduced in this quite important function. + + Closes #3216 + Reviewed-by: Daniel Stenberg + Reviewed-by: Marcel Raad + +Michael Kaufmann (3 Nov 2018) +- tool_getparam: fix some comments + +Daniel Stenberg (3 Nov 2018) +- url: a short host name + port is not a scheme + + The function identifying a leading "scheme" part of the URL considered a few + letters ending with a colon to be a scheme, making something like "short:80" + to become an unknown scheme instead of a short host name and a port number. + + Extended test 1560 to verify. + + Reported-by: Hagai Auro + Fixes #3220 + Closes #3223 + +- URL: fix IPv6 numeral address parser + + Regression from 46e164069d1a52. Extended test 1560 to verify. + + Reported-by: tpaukrt on github + Fixes #3218 + Closes #3219 + +- travis: remove curl before a normal build + + on Linux. To make sure the test suite runs with its newly build tool and + doesn't require an external one present. + + Bug: #3198 + Closes #3200 + +- [Tim Rühsen brought this change] + + mprintf: avoid unsigned integer overflow warning + + The overflow has no real world impact. + Just avoid it for "best practice". + + Code change suggested by "The Infinnovation Team" and Daniel Stenberg. + Closes #3184 + +- Curl_follow: accept non-supported schemes for "fake" redirects + + When not actually following the redirect and the target URL is only + stored for later retrieval, curl always accepted "non-supported" + schemes. This was a regression from 46e164069d1a5230. + + Reported-by: Brad King + Fixes #3210 + Closes #3215 + +Daniel Gustafsson (2 Nov 2018) +- openvms: fix example name + + Commit efc696a2e09225bfeab4 renamed persistant.c to persistent.c to + fix the typo in the name, but missed to update the OpenVMS package + files which still looked for the old name. + + Closes #3217 + Reviewed-by: Daniel Stenberg + Reviewed-by: Viktor Szakats + +Daniel Stenberg (1 Nov 2018) +- configure: show CFLAGS, LDFLAGS etc in summary + + To make it easier to understand other people's and remote builds etc. + + Closes #3207 + +- version: bump for next cycle + +- axtls: removed + + As has been outlined in the DEPRECATE.md document, the axTLS code has + been disabled for 6 months and is hereby removed. + + Use a better supported TLS library! + + Assisted-by: Daniel Gustafsson + Closes #3194 + +- [marcosdiazr brought this change] + + schannel: make CURLOPT_CERTINFO support using Issuer chain + + Closes #3197 + +- travis: build with sanitize=address,undefined,signed-integer-overflow + + ... using clang + + Closes #3190 + +- schannel: use Curl_ prefix for global private symbols + + Curl_verify_certificate() must use the Curl_ prefix since it is globally + available in the lib and otherwise steps outside of our namespace! + + Closes #3201 + +Kamil Dudka (1 Nov 2018) +- tests: drop http_pipe.py script no longer used + + It is unused since commit f7208df7d9d5cd5e15e2d89237e828f32b63f135. + + Closes #3204 + +Daniel Stenberg (31 Oct 2018) +- runtests: use the local curl for verifying + + ... revert the mistaken change brought in commit 8440616f53. + + Reported-by: Alessandro Ghedini + Bug: https://curl.haxx.se/mail/lib-2018-10/0118.html + + Closes #3198 + +Version 7.62.0 (30 Oct 2018) + +Daniel Stenberg (30 Oct 2018) +- RELEASE-NOTES: 7.62.0 + +- THANKS: 7.62.0 status + +Daniel Gustafsson (30 Oct 2018) +- vtls: add MesaLink to curl_sslbackend enum + + MesaLink support was added in commit 57348eb97d1b8fc3742e02c but the + backend was never added to the curl_sslbackend enum in curl/curl.h. + This adds the new backend to the enum and updates the relevant docs. + + Closes #3195 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (30 Oct 2018) +- [Ruslan Baratov brought this change] + + cmake: Remove unused CURL_CONFIG_HAS_BEEN_RUN_BEFORE variable + + Closes #3191 + +- test2080: verify the fix for CVE-2018-16842 + +- voutf: fix bad arethmetic when outputting warnings to stderr + + CVE-2018-16842 + Reported-by: Brian Carpenter + Bug: https://curl.haxx.se/docs/CVE-2018-16842.html + +- [Tuomo Rinne brought this change] + + cmake: uniform ZLIB to use USE_ variable and clean curl-config.cmake.in + + Closes #3123 + +- [Tuomo Rinne brought this change] + + cmake: add find_dependency call for ZLIB to CMake config file + +- [Tuomo Rinne brought this change] + + cmake: add support for transitive ZLIB target + +- unit1650: fix "null pointer passed as argument 1 to memcmp" + + Detected by UndefinedBehaviorSanitizer + + Closes #3187 + +- travis: add a "make tidy" build that runs clang-tidy + + Closes #3182 + +- unit1300: fix stack-use-after-scope AddressSanitizer warning + + Closes #3186 + +- Curl_auth_create_plain_message: fix too-large-input-check + + CVE-2018-16839 + Reported-by: Harry Sintonen + Bug: https://curl.haxx.se/docs/CVE-2018-16839.html + +- Curl_close: clear data->multi_easy on free to avoid use-after-free + + Regression from b46cfbc068 (7.59.0) + CVE-2018-16840 + Reported-by: Brian Carpenter (Geeknik Labs) + + Bug: https://curl.haxx.se/docs/CVE-2018-16840.html + +- [randomswdev brought this change] + + system.h: use proper setting with Sun C++ as well + + system.h selects the proper Sun settings when __SUNPRO_C is defined. The + Sun compiler does not define it when compiling C++ files. I'm adding a + check also on __SUNPRO_CC to allow curl to work properly also when used + in a C++ project on Sun Solaris. + + Closes #3181 + +- rand: add comment to skip a clang-tidy false positive + +- test1651: unit test Curl_extract_certinfo() + + The version used for Gskit, NSS, GnuTLS, WolfSSL and schannel. + +- x509asn1: always check return code from getASN1Element() + +- Makefile: add 'tidy' target that runs clang-tidy + + Available in the root, src and lib dirs. + + Closes #3163 + +- RELEASE-PROCEDURE: adjust the release dates + + See: https://curl.haxx.se/mail/lib-2018-10/0107.html + +Patrick Monnerat (27 Oct 2018) +- x509asn1: suppress left shift on signed value + + Use an unsigned variable: as the signed operation behavior is undefined, + this change silents clang-tidy about it. + + Ref: https://github.com/curl/curl/pull/3163 + Reported-By: Daniel Stenberg + +Michael Kaufmann (27 Oct 2018) +- multi: Fix error handling in the SENDPROTOCONNECT state + + If Curl_protocol_connect() returns an error code, + handle the error instead of switching to the next state. + + Closes #3170 + +Daniel Stenberg (27 Oct 2018) +- RELEASE-NOTES: synced + +- openssl: output the correct cipher list on TLS 1.3 error + + When failing to set the 1.3 cipher suite, the wrong string pointer would + be used in the error message. Most often saying "(nil)". + + Reported-by: Ricky-Tigg on github + Fixes #3178 + Closes #3180 + +- docs/CIPHERS: fix the TLS 1.3 cipher names + + ... picked straight from the OpenSSL man page: + https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_ciphersuites.html + + Reported-by: Ricky-Tigg on github + Bug: #3178 + +Marcel Raad (27 Oct 2018) +- travis: install gnutls-bin package + + This is required for gnutls-serv, which enables a few more tests. + + Closes https://github.com/curl/curl/pull/2958 + +Daniel Gustafsson (26 Oct 2018) +- ssh: free the session on init failures + + Ensure to clear the session object in case the libssh2 initialization + fails. + + It could be argued that the libssh2 error function should be called to + get a proper error message in this case. But since the only error path + in libssh2_knownhost_init() is memory a allocation failure it's safest + to avoid since the libssh2 error handling allocates memory. + + Closes #3179 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (26 Oct 2018) +- docs/RELEASE-PROCEDURE: remove old entries, modify the Dec 2018 date + + ... I'm moving it up one week due to travels. The rest stays. + +- [Daniel Gustafsson brought this change] + + openssl: make 'done' a proper boolean + + Closes #3176 + +- gtls: Values stored to but never read + + Detected by clang-tidy + + Closes #3176 + +- [Alexey Eremikhin brought this change] + + curl.1: --ipv6 mutexes ipv4 (fixed typo) + + Fixes #3171 + Closes #3172 + +- tool_main: make TerminalSettings static + + Reported-by: Gisle Vanem + Bug: https://github.com/curl/curl/commit/becfe1233ff2b6b0c3e1b6a10048b55b68c2539f#commitcomment-31008819 + Closes #3161 + +- curl-config.in: remove dependency on bc + + Reported-by: Dima Pasechnik + Fixes #3143 + Closes #3174 + +- [Gisle Vanem brought this change] + + rtmp: fix for compiling with lwIP + + Compiling on _WIN32 and with USE_LWIPSOCK, causes this error: + curl_rtmp.c(223,3): error: use of undeclared identifier 'setsockopt' + setsockopt(r->m_sb.sb_socket, SOL_SOCKET, SO_RCVTIMEO, + ^ + curl_rtmp.c(41,32): note: expanded from macro 'setsockopt' + #define setsockopt(a,b,c,d,e) (setsockopt)(a,b,c,(const char *)d,(int)e) + ^ + Closes #3155 + +- configure: remove CURL_CONFIGURE_CURL_SOCKLEN_T + + Follow-up to #3166 which did the cmake part of this. This type/define is + not used. + + Closes #3168 + +- [Ruslan Baratov brought this change] + + cmake: remove unused variables + + Remove variables: + * HAVE_SOCKLEN_T + * CURL_SIZEOF_CURL_SOCKLEN_T + * CURL_TYPEOF_CURL_SOCKLEN_T + + Closes #3166 + +Michael Kaufmann (25 Oct 2018) +- urldata: Fix comment in header + + The "connecting" function is used by multiple protocols, not only FTP + +- netrc: free temporary strings if memory allocation fails + + - Change the inout parameters after all needed memory has been + allocated. Do not change them if something goes wrong. + - Free the allocated temporary strings if strdup() fails. + + Closes #3122 + +Daniel Stenberg (24 Oct 2018) +- [Ruslan Baratov brought this change] + + config: Remove unused SIZEOF_VOIDP + + Closes #3162 + +- RELEASE-NOTES: synced + +GitHub (23 Oct 2018) +- [Gisle Vanem brought this change] + + Fix for compiling with lwIP (3) + + lwIP on Windows does not have a WSAIoctl() function. + But it do have a SO_SNDBUF option to lwip_setsockopt(). But it currently does nothing. + +Daniel Stenberg (23 Oct 2018) +- Curl_follow: return better errors on URL problems + + ... by making the converter function global and accessible. + + Closes #3153 + +- Curl_follow: remove remaining free(newurl) + + Follow-up to 05564e750e8f0c. This function no longer frees the passed-in + URL. + + Reported-by: Michael Kaufmann + Bug: https://github.com/curl/curl/commit/05564e750e8f0c79016c680f301ce251e6e86155#commitcomm + ent-30985666 + +Daniel Gustafsson (23 Oct 2018) +- headers: end all headers with guard comment + + Most headerfiles end with a /* */ comment, but it was + missing from some. The comment isn't the most important part of our + code documentation but consistency has an intrinsic value in itself. + This adds header guard comments to the files that were lacking it. + + Closes #3158 + Reviewed-by: Jay Satiro + Reviewed-by: Daniel Stenberg + +Jay Satiro (23 Oct 2018) +- CIPHERS.md: Mention the options used to set TLS 1.3 ciphers + + Closes https://github.com/curl/curl/pull/3159 + +Daniel Stenberg (20 Oct 2018) +- docs/BUG-BOUNTY: the sponsors actually decide the amount + + Retract the previous approach as the sponsors will be the ones to set the + final amounts. + + Closes #3152 + [ci skip] + +- multi: avoid double-free + + Curl_follow() no longer frees the string. Make sure it happens in the + caller function, like we normally handle allocations. + + This bug was introduced with the use of the URL API internally, it has + never been in a release version + + Reported-by: Dario Weißer + Closes #3149 + +- multi: make the closure handle "inherit" CURLOPT_NOSIGNAL + + Otherwise, closing that handle can still cause surprises! + + Reported-by: Martin Ankerl + Fixes #3138 + Closes #3147 + +Marcel Raad (19 Oct 2018) +- VS projects: add USE_IPV6 + + The Visual Studio builds didn't use IPv6. Add it to all projects since + Visual Studio 2008, which is verified to build via AppVeyor. + + Closes https://github.com/curl/curl/pull/3137 + +- config_win32: enable LDAPS + + As done in the autotools and CMake builds by default. + + Closes https://github.com/curl/curl/pull/3137 + +Daniel Stenberg (18 Oct 2018) +- travis: add build for "configure --disable-verbose" + + Closes #3144 + +Kamil Dudka (17 Oct 2018) +- tool_cb_hdr: handle failure of rename() + + Detected by Coverity. + + Closes #3140 + Reviewed-by: Jay Satiro + +Daniel Stenberg (17 Oct 2018) +- RELEASE-NOTES: synced + +- docs/SECURITY-PROCESS: the hackerone IBB program drops curl + + ... now there's only BountyGraph. + +Jay Satiro (16 Oct 2018) +- [Matthew Whitehead brought this change] + + x509asn1: Fix SAN IP address verification + + For IP addresses in the subject alternative name field, the length + of the IP address (and hence the number of bytes to perform a + memcmp on) is incorrectly calculated to be zero. The code previously + subtracted q from name.end. where in a successful case q = name.end + and therefore addrlen equalled 0. The change modifies the code to + subtract name.beg from name.end to calculate the length correctly. + + The issue only affects libcurl with GSKit SSL, not other SSL backends. + The issue is not a security issue as IP verification would always fail. + + Fixes #3102 + Closes #3141 + +Daniel Gustafsson (15 Oct 2018) +- INSTALL: mention mesalink in TLS section + + Commit 57348eb97d1b8fc3742e02c6587d2d02ff592da5 added support for the + MesaLink vtls backend, but missed updating the TLS section containing + supported backends in the docs. + + Closes #3134 + Reviewed-by: Daniel Stenberg + +Marcel Raad (14 Oct 2018) +- nonblock: fix unused parameter warning + + If USE_BLOCKING_SOCKETS is defined, curlx_nonblock's arguments are not + used. + +Michael Kaufmann (13 Oct 2018) +- Curl_follow: Always free the passed new URL + + Closes #3124 + +Viktor Szakats (12 Oct 2018) +- replace rawgit links [ci skip] + + Ref: https://rawgit.com/ "RawGit has reached the end of its useful life" + Ref: https://news.ycombinator.com/item?id=18202481 + Closes https://github.com/curl/curl/pull/3131 + +Daniel Stenberg (12 Oct 2018) +- docs/BUG-BOUNTY.md: for vulns published since Aug 1st 2018 + + [ci skip] + +- travis: make distcheck scan for BOM markers + + and remove BOM from projects/wolfssl_override.props + + Closes #3126 + +Marcel Raad (11 Oct 2018) +- CMake: remove BOM + + Accidentally aded in commit 1bb86057ff07083deeb0b00f8ad35879ec4d03ea. + + Reported-by: Viktor Szakats + Ref: https://github.com/curl/curl/pull/3120#issuecomment-428673136 + +Daniel Gustafsson (10 Oct 2018) +- transfer: fix typo in comment + +Michael Kaufmann (10 Oct 2018) +- docs: add "see also" links for SSL options + + - link TLS 1.2 and TLS 1.3 options + - link proxy and non-proxy options + + Closes #3121 + +Marcel Raad (10 Oct 2018) +- AppVeyor: remove BDIR variable that sneaked in again + + Removed in ae762e1abebe3a5fe75658583c85059a0957ef6e, accidentally added + again in 9f3be5672dc4dda30ab43e0152e13d714a84d762. + +- CMake: disable -Wpedantic-ms-format + + As done in the autotools build. This is required for MinGW, which + supports only %I64 for printing 64-bit values, but warns about it. + + Closes https://github.com/curl/curl/pull/3120 + +Viktor Szakats (9 Oct 2018) +- ldap: show precise LDAP call in error message on Windows + + Also add a unique but common text ('bind via') to make it + easy to grep this specific failure regardless of platform. + + Ref: https://github.com/curl/curl/pull/878/files#diff-7a636f08047c4edb53a240f540b4ecf6R468 + Closes https://github.com/curl/curl/pull/3118 + Reviewed-by: Daniel Stenberg + Reviewed-by: Marcel Raad + +Daniel Stenberg (9 Oct 2018) +- docs/DEPRECATE: minor reformat to render nicer on web + +Daniel Gustafsson (9 Oct 2018) +- CURLOPT_SSL_VERIFYSTATUS: Fix typo + + Changes s/OSCP/OCSP/ and bumps the copyright year due to the change. + +Marcel Raad (9 Oct 2018) +- curl_setup: define NOGDI on Windows + + This avoids an ERROR macro clash between and + on MinGW. + + Closes https://github.com/curl/curl/pull/3113 + +- Windows: fixes for MinGW targeting Windows Vista + + Classic MinGW has neither InitializeCriticalSectionEx nor + GetTickCount64, independent of the target Windows version. + + Closes https://github.com/curl/curl/pull/3113 + +Daniel Stenberg (8 Oct 2018) +- TODO: fixed 'API for URL parsing/splitting' + +Daniel Gustafsson (8 Oct 2018) +- KNOWN_BUGS: Fix various typos + + Closes #3112 + Reviewed-by: Daniel Stenberg + +Viktor Szakats (8 Oct 2018) +- spelling fixes [ci skip] + + as detected by codespell 1.14.0 + + Closes https://github.com/curl/curl/pull/3114 + Reviewed-by: Marcel Raad + +Daniel Stenberg (8 Oct 2018) +- RELEASE-NOTES: synced + +- curl_ntlm_wb: check aprintf() return codes + + ... when they return NULL we're out of memory and MUST return failure. + + closes #3111 + +- docs/BUG-BOUNTY: proposed additional docs + + Bug bounty explainer. See https://bountygraph.com/programs/curl + + Closes #3067 + +- [Rick Deist brought this change] + + hostip: fix check on Curl_shuffle_addr return value + + Closes #3110 + +- FILE: fix CURLOPT_NOBODY and CURLOPT_HEADER output + + Now FILE transfers send headers to the header callback like HTTP and + other protocols. Also made curl_easy_getinfo(...CURLINFO_PROTOCOL...) + work for FILE in the callbacks. + + Makes "curl -i file://.." and "curl -I file://.." work like before + again. Applied the bold header logic to them too. + + Regression from c1c2762 (7.61.0) + + Reported-by: Shaun Jackman + Fixes #3083 + Closes #3101 + +Daniel Gustafsson (7 Oct 2018) +- gskit: make sure to terminate version string + + In case a very small buffer was passed to the version function, it could + result in the buffer not being NULL-terminated since strncpy() doesn't + guarantee a terminator on an overflowed buffer. Rather than adding code + to terminate (and handle zero-sized buffers), move to using snprintf() + instead like all the other vtls backends. + + Closes #3105 + Reviewed-by: Daniel Stenberg + Reviewed-by: Viktor Szakats + +- TODO: add LD_PRELOAD support on macOS + + Add DYLD_INSERT_LIBRARIES support to the TODO list. Reported in #2394. + +- runtests: skip ld_preload tests on macOS + + The LD_PRELOAD functionality doesn't exist on macOS, so skip any tests + requiring it. + + Fixes #2394 + Closes #3106 + Reported-by: Github user @jakirkham + Reviewed-by: Daniel Stenberg + +Marcel Raad (7 Oct 2018) +- AppVeyor: use Debug builds to run tests + + This enables more tests. + + Closes https://github.com/curl/curl/pull/3104 + +- AppVeyor: add HTTP_ONLY build + + Closes https://github.com/curl/curl/pull/3104 + +- AppVeyor: add WinSSL builds + + Use the oldest and latest Windows SDKs for them. + Also, remove all but one OpenSSL build. + + Closes https://github.com/curl/curl/pull/3104 + +- AppVeyor: add remaining Visual Studio versions + + This adds Visual Studio 9 and 10 builds. + There's no 64-bit VC9 compiler on AppVeyor, so use it as the Win32 + build. Also, VC9 cannot be used for running the test suite. + + Closes https://github.com/curl/curl/pull/3104 + +- AppVeyor: break long line + + Closes https://github.com/curl/curl/pull/3104 + +- AppVeyor: remove unused BDIR variable + + Closes https://github.com/curl/curl/pull/3104 + +Daniel Stenberg (6 Oct 2018) +- test2100: test DoH using IPv4-only + + To make it only send one DoH request and avoid the race condition that + could lead to the requests getting sent in reversed order and thus + making it hard to compare in the test case. + + Fixes #3107 + Closes #3108 + +- tests/FILEFORMAT: mention how to use and too + + [ci skip] + +- RELEASE-NOTES: synced + +- [Dmitry Kostjuchenko brought this change] + + timeval: fix use of weak symbol clock_gettime() on Apple platforms + + Closes #3048 + +- doh: keep the IPv4 address in (original) network byte order + + Ideally this will fix the reversed order shown in SPARC tests: + + resp 8: Expected 127.0.0.1 got 1.0.0.127 + + Closes #3091 + +Jay Satiro (5 Oct 2018) +- INTERNALS.md: wrap lines longer than 79 + +Daniel Gustafsson (5 Oct 2018) +- INTERNALS: escape reference to parameter + + The parameter reference was causing rendering issues in the + generated HTML page, as isn't a valid HTML tag. Fix by back- + tick escaping it. + + Closes #3099 + Reviewed-by: Jay Satiro + Reviewed-by: Daniel Stenberg + +- checksrc: handle zero scoped ignore commands + + If a !checksrc! disable command specified to ignore zero errors, it was + still added to the ignore block even though nothing was ignored. While + there were no blocks ignored that shouldn't be ignored, the processing + ended with with a warning: + + ::: warning: Unused ignore: LONGLINE (UNUSEDIGNORE) + /* !checksrc! disable LONGLINE 0 */ + ^ + Fix by instead treating a zero ignore as a a badcommand and throw a + warning for that one. + + Closes #3096 + Reviewed-by: Daniel Stenberg + +- checksrc: enable strict mode and warnings + + Enable strict and warnings mode for checksrc to ensure we aren't missing + anything due to bugs in the checking code. This uncovered a few things + which are all fixed in this commit: + + * several variables were used uninitialized + * several variables were not defined in the correct scope + * the whitelist filehandle was read even if the file didn't exist + * the enable_warn() call when a disable counter had expired was passing + incorrect variables, but since the checkwarn() call is unlikely to hit + (the counter is only decremented to zero on actual ignores) it didn't + manifest a problem. + + Closes #3090 + Reviewed-by: Daniel Stenberg + Reviewed-by: Marcel Raad + +Marcel Raad (5 Oct 2018) +- CMake: suppress MSVC warning C4127 for libtest + + It's issued by older Windows SDKs (prior to version 8.0). + +Sergei Nikulov (5 Oct 2018) +- Merge branch 'dmitrykos-fix_missing_CMake_defines' + +- [Dmitry Kostjuchenko brought this change] + + cmake: test and set missed defines during configuration + + Added configuration checks for HAVE_BUILTIN_AVAILABLE and HAVE_CLOCK_GETTIME_MONOTONIC. + + Closes #3097 + +Marcel Raad (5 Oct 2018) +- AppVeyor: disable test 500 + + It almost always results in + "starttransfer vs total: 0.000001 0.000000". + I cannot reproduce this locally, so disable it for now. + + Closes https://github.com/curl/curl/pull/3100 + +- AppVeyor: set custom install prefix + + CMake's default has spaces and in 32-bit mode parentheses, which result + in syntax errors in curl-config. + + Closes https://github.com/curl/curl/pull/3100 + +- AppVeyor: Remove non-SSL non-test builds + + They don't add much value. + + Closes https://github.com/curl/curl/pull/3100 + +- AppVeyor: run test suite + + Use the preinstalled MSYS2 bash for that. + Disable test 1139 as the CMake build doesn't generate curl.1. + + Ref: https://github.com/curl/curl/issues/3070#issuecomment-425922224 + Closes https://github.com/curl/curl/pull/3100 + +- AppVeyor: use in-tree build + + Required to run the tests. + + Closes https://github.com/curl/curl/pull/3100 + +Daniel Stenberg (4 Oct 2018) +- doh: make sure TTL isn't re-inited by second (discarded?) response + + Closes #3092 + +- test320: strip out more HTML when comparing + + To make the test case work with different gnutls-serv versions better. + + Reported-by: Kamil Dudka + Fixes #3093 + Closes #3094 + +Marcel Raad (4 Oct 2018) +- runtests: use Windows paths for Windows curl + + curl generated by CMake's Visual Studio generator has "Windows" in the + version number. + +Daniel Stenberg (4 Oct 2018) +- [Colin Hogben brought this change] + + tests/negtelnetserver.py: fix Python2-ism in neg TELNET server + + Fix problems caused by differences in treatment of bytes objects between + python2 and python3. + + Fixes #2929 + Closes #3080 + +Daniel Gustafsson (3 Oct 2018) +- memory: ensure to check allocation results + + The result of a memory allocation should always be checked, as we may + run under memory pressure where even a small allocation can fail. This + adds checking and error handling to a few cases where the allocation + wasn't checked for success. In the ftp case, the freeing of the path + variable is moved ahead of the allocation since there is little point + in keeping it around across the strdup, and the separation makes for + more readable code. In nwlib, the lock is aslo freed in the error path. + + Also bumps the copyright years on affected files. + + Closes #3084 + Reviewed-by: Jay Satiro + Reviewed-by: Daniel Stenberg + +- comment: Fix multiple typos in function parameters + + Ensure that the parameters in the comment match the actual names in the + prototype. + + Closes #3079 + Reviewed-by: Daniel Stenberg + +- CURLOPT_SSLVERSION.3: fix typos and consistent spelling + + Use TLS vX.Y throughout the document, instead of TLS X.Y, as that was + already done in all but a few cases. Also fix a few typos. + + Closes #3076 + Reviewed-by: Marcel Raad + Reviewed-by: Daniel Stenberg + +- SECURITY-PROCESS: make links into hyperlinks + + Use proper Markdown hyperlink format for the Bountygraph links in order + for the generated website page to be more user friendly. Also link to + the sponsors to give them a little extra credit. + + Closes #3082 + Reviewed-by: Daniel Stenberg + +Jay Satiro (3 Oct 2018) +- CURLOPT_HEADER.3: fix typo + +- nss: fix nssckbi module loading on Windows + + - Use .DLL extension instead of .so to load modules on Windows. + + Bug: https://curl.haxx.se/mail/lib-2018-09/0077.html + Reported-by: Maxime Legros + + Ref: https://github.com/curl/curl/pull/3016/#issuecomment-423069442 + + Closes https://github.com/curl/curl/pull/3086 + +- data-binary.d: clarify default content-type is x-www-form-urlencoded + + - Advise user that --data-binary sends a default content type of + x-www-form-urlencoded, and to have the data treated as arbitrary + binary data by the server set the content-type header to octet-stream. + + Ref: https://github.com/curl/curl/pull/2852#issuecomment-426465094 + + Closes https://github.com/curl/curl/pull/3085 + +Marcel Raad (2 Oct 2018) +- test1299: use single quotes around asterisk + + Ref: https://github.com/curl/curl/issues/1751#issuecomment-321522580 + +Daniel Stenberg (2 Oct 2018) +- docs/CIPHERS: mention the colon separation for OpenSSL + + Bug: #3077 + +- runtests: ignore disabled even when ranges are given + + runtests.pl support running a range of tests, like "44 to 127". Starting + now, the code makes sure that even such given ranges will ignore tests + that are marked as disabled. + + Disabled tests can still be run by explictly specifying that test + number. + + Closes #3075 + +- urlapi: starting with a drive letter on win32 is not an abs url + + ... and libcurl doesn't support any single-letter URL schemes (if there + even exist any) so it should be fairly risk-free. + + Reported-by: Marcel Raad + + Fixes #3070 + Closes #3071 + +Marcel Raad (2 Oct 2018) +- doh: fix curl_easy_setopt argument type + + CURLOPT_POSTFIELDSIZE is long. Fixes a compiler warning on 64-bit + MinGW. + +Daniel Stenberg (2 Oct 2018) +- RELEASE-NOTES: synced + +Jay Satiro (1 Oct 2018) +- [Ruslan Baratov brought this change] + + CMake: Improve config installation + + Use 'GNUInstallDirs' standard module to set destinations of installed + files. + + Use uppercase "CURL" names instead of lowercase "curl" to match standard + 'FindCURL.cmake' CMake module: + * https://cmake.org/cmake/help/latest/module/FindCURL.html + + Meaning: + * Install 'CURLConfig.cmake' instead of 'curl-config.cmake' + * User should call 'find_package(CURL)' instead of 'find_package(curl)' + + Use 'configure_package_config_file' function to generate + 'CURLConfig.cmake' file. This will make 'curl-config.cmake.in' template + file smaller and handle components better. E.g. current configuration + report no error if user specified unknown components (note: new + configuration expects no components, report error if user will try to + specify any). + + Closes https://github.com/curl/curl/pull/2849 + +Daniel Stenberg (1 Oct 2018) +- test1650: make it depend on http/2 + + Follow-up to 570008c99da0ccbb as it gets link errors. + + Reported-by: Michael Kaufmann + Closes #3068 + +- [Nate Prewitt brought this change] + + MANUAL: minor grammar fix + + Noticed a typo reading through the docs. + + Closes #3069 + +- doh: only build if h2 enabled + + The DoH spec says "HTTP/2 [RFC7540] is the minimum RECOMMENDED version + of HTTP for use with DoH". + + Reported-by: Marcel Raad + Closes #3066 + +- test2100: require http2 to run + + Reported-by: Marcel Raad + Fixes #3064 + Closes #3065 + +- multi: fix memory leak in content encoding related error path + + ... a missing multi_done() call. + + Credit to OSS-Fuzz + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10728 + Closes #3063 + +- travis: bump the Secure Transport build to use xcode 10 + + Due to an issue with travis + (https://github.com/travis-ci/travis-ci/issues/9956) we've been using + Xcode 9.2 for darwinssl builds for a while. Now xcode 10 is offered as + an alternative and as it builds curl+darwinssl fine that seems like a + better choice. + + Closes #3062 + +- [Rich Turner brought this change] + + curl: enabled Windows VT Support and UTF-8 output + + Enabled Console VT support (if running OS supports VT) in tool_main.c. + + Fixes #3008 + Closes #3011 + +- multi: fix location URL memleak in error path + + Follow-up to #3044 - fix a leak OSS-Fuzz detected + Closes #3057 + +Sergei Nikulov (28 Sep 2018) +- cmake: fixed path used in generation of docs/tests during curl build through add_subdicectory(...) + +- [Brad King brought this change] + + cmake: Backport to work with CMake 3.0 again + + Changes in commit 7867aaa9a0 (cmake: link curl to the OpenSSL targets + instead of lib absolute paths, 2018-07-17) and commit f826b4ce98 (cmake: + bumped minimum version to 3.4, 2018-07-19) required CMake 3.4 to fix + issue #2746. This broke support for users on older versions of CMake + even if they just want to build curl and do not care whether transitive + dependencies work. + + Backport the logic to work with CMake 3.0 again by implementing the + fix only when the version of CMake is at least 3.4. + +Marcel Raad (27 Sep 2018) +- curl_threads: fix classic MinGW compile break + + Classic MinGW still has _beginthreadex's return type as unsigned long + instead of uintptr_t [0]. uintptr_t is not even defined because of [1]. + + [0] https://sourceforge.net/p/mingw/mingw-org-wsl/ci/wsl-5.1-release/tree/mingwrt/include/process.h#l167 + [1] https://sourceforge.net/p/mingw/mingw-org-wsl/ci/wsl-5.1-release/tree/mingwrt/include/process.h#l90 + + Bug: https://github.com/curl/curl/issues/2924#issuecomment-424334807 + Closes https://github.com/curl/curl/pull/3051 + +Daniel Stenberg (26 Sep 2018) +- configure: s/AC_RUN_IFELSE/CURL_RUN_IFELSE + + fix a few leftovers + + Fixes #3006 + Closes #3049 + +- [Doron Behar brought this change] + + example/htmltidy: fix include paths of tidy libraries + + Closes #3050 + +- RELEASE-NOTES: synced + +- Curl_http2_done: fix memleak in error path + + Free 'header_recvbuf' unconditionally even if 'h2' isn't (yet) set, for + early failures. + + Detected by OSS-Fuzz + + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10669 + Closes #3046 + +- http: fix memleak in rewind error path + + If the rewind would fail, a strdup() would not get freed. + + Detected by OSS-Fuzz + + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10665 + Closes #3044 + +Viktor Szakats (24 Sep 2018) +- test320: fix regression in [ci skip] + + The value in question is coming directly from `gnutls-serv`, so it cannot + be modified freely. + + Reported-by: Marcel Raad + Ref: https://github.com/curl/curl/commit/6ae6b2a533e8630afbb21f570305bd4ceece6348#commitcomment-30621004 + +Daniel Stenberg (24 Sep 2018) +- Curl_retry_request: fix memory leak + + Detected by OSS-Fuzz + + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10648 + Closes #3042 + +- openssl: load built-in engines too + + Regression since 38203f1 + + Reported-by: Jean Fabrice + Fixes #3023 + Closes #3040 + +- [Christian Heimes brought this change] + + OpenSSL: enable TLS 1.3 post-handshake auth + + OpenSSL 1.1.1 requires clients to opt-in for post-handshake + authentication. + + Fixes: https://github.com/curl/curl/issues/3026 + Signed-off-by: Christian Heimes + + Closes https://github.com/curl/curl/pull/3027 + +- [Even Rouault brought this change] + + Curl_dedotdotify(): always nul terminate returned string. + + This fixes potential out-of-buffer access on "file:./" URL + + $ valgrind curl "file:./" + ==24516== Memcheck, a memory error detector + ==24516== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. + ==24516== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info + ==24516== Command: /home/even/install-curl-git/bin/curl file:./ + ==24516== + ==24516== Conditional jump or move depends on uninitialised value(s) + ==24516== at 0x4C31F9C: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + ==24516== by 0x4EBB315: seturl (urlapi.c:801) + ==24516== by 0x4EBB568: parseurl (urlapi.c:861) + ==24516== by 0x4EBC509: curl_url_set (urlapi.c:1199) + ==24516== by 0x4E644C6: parseurlandfillconn (url.c:2044) + ==24516== by 0x4E67AEF: create_conn (url.c:3613) + ==24516== by 0x4E68A4F: Curl_connect (url.c:4119) + ==24516== by 0x4E7F0A4: multi_runsingle (multi.c:1440) + ==24516== by 0x4E808E5: curl_multi_perform (multi.c:2173) + ==24516== by 0x4E7558C: easy_transfer (easy.c:686) + ==24516== by 0x4E75801: easy_perform (easy.c:779) + ==24516== by 0x4E75868: curl_easy_perform (easy.c:798) + + Was originally spotted by + https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10637 + Credit to OSS-Fuzz + + Closes #3039 + +Viktor Szakats (23 Sep 2018) +- update URLs in tests + + - and one in docs/MANUAL as well + + Closes https://github.com/curl/curl/pull/3038 + +- whitespace fixes + + - replace tabs with spaces where possible + - remove line ending spaces + - remove double/triple newlines at EOF + - fix a non-UTF-8 character + - cleanup a few indentations/line continuations + in manual examples + + Closes https://github.com/curl/curl/pull/3037 + +Daniel Stenberg (23 Sep 2018) +- http: add missing return code check + + Detected by Coverity. CID 1439610. + + Follow-up from 46e164069d1a523 + + Closes #3034 + +- ftp: don't access pointer before NULL check + + Detected by Coverity. CID 1439611. + + Follow-up from 46e164069d1a523 + +- unit1650: fix out of boundary access + + Fixes #2987 + Closes #3035 + +Viktor Szakats (23 Sep 2018) +- docs/examples: URL updates + + - also update two URLs outside of docs/examples + - fix spelling of filename persistant.c + - fix three long lines that started failing checksrc.pl + + Closes https://github.com/curl/curl/pull/3036 + +- examples/Makefile.m32: sync with core [ci skip] + + also: + - fix two warnings in synctime.c (one of them Windows-specific) + - upgrade URLs in synctime.c and remove a broken one + + Closes https://github.com/curl/curl/pull/3033 + +Daniel Stenberg (22 Sep 2018) +- examples/parseurl.c: show off the URL API a bit + + Closes #3030 + +- SECURITY-PROCESS: mention the bountygraph program [ci skip] + + Closes #3032 + +- url: use the URL API internally as well + + ... to make it a truly unified URL parser. + + Closes #3017 + +Viktor Szakats (22 Sep 2018) +- URL and mailmap updates, remove an obsolete directory [ci skip] + + Closes https://github.com/curl/curl/pull/3031 + +Daniel Stenberg (22 Sep 2018) +- RELEASE-NOTES: synced + +- configure: force-use -lpthreads on HPUX + + When trying to detect pthreads use on HPUX the checks will succeed + without the correct -l option but then end up failing at run-time. + + Reported-by: Eason-Yu on github + Fixes #2697 + Closes #3025 + +- [Erik Minekus brought this change] + + Curl_saferealloc: Fixed typo in docblock + + Closes #3029 + +- urlapi: fix support for address scope in IPv6 numerical addresses + + Closes #3024 + +- [Loganaden Velvindron brought this change] + + GnutTLS: TLS 1.3 support + + Closes #2971 + +- TODO: c-ares and CURLOPT_OPENSOCKETFUNCTION + + Removed DoH. + + Closes #2734 + +Jay Satiro (20 Sep 2018) +- vtls: fix ssl version "or later" behavior change for many backends + + - Treat CURL_SSLVERSION_MAX_NONE the same as + CURL_SSLVERSION_MAX_DEFAULT. Prior to this change NONE would mean use + the minimum version also as the maximum. + + This is a follow-up to 6015cef which changed the behavior of setting + the SSL version so that the requested version would only be the minimum + and not the maximum. It appears it was (mostly) implemented in OpenSSL + but not other backends. In other words CURL_SSLVERSION_TLSv1_0 used to + mean use just TLS v1.0 and now it means use TLS v1.0 *or later*. + + - Fix CURL_SSLVERSION_MAX_DEFAULT for OpenSSL. + + Prior to this change CURL_SSLVERSION_MAX_DEFAULT with OpenSSL was + erroneously treated as always TLS 1.3, and would cause an error if + OpenSSL was built without TLS 1.3 support. + + Co-authored-by: Daniel Gustafsson + + Fixes https://github.com/curl/curl/issues/2969 + Closes https://github.com/curl/curl/pull/3012 + +Daniel Stenberg (20 Sep 2018) +- certs: generate tests certs with sha256 digest algorithm + + As OpenSSL 1.1.1 starts to complain and fail on sha1 CAs: + + "SSL certificate problem: CA signature digest algorithm too weak" + + Closes #3014 + +- urlapi: document the error codes, remove two unused ones + + Assisted-by: Daniel Gustafsson + Closes #3019 + +- urlapi: add CURLU_GUESS_SCHEME and fix hostname acceptance + + In order for this API to fully work for libcurl itself, it now offers a + CURLU_GUESS_SCHEME flag that makes it "guess" scheme based on the host + name prefix just like libcurl always did. If there's no known prefix, it + will guess "http://". + + Separately, it relaxes the check of the host name so that IDN host names + can be passed in as well. + + Both these changes are necessary for libcurl itself to use this API. + + Assisted-by: Daniel Gustafsson + Closes #3018 + +Kamil Dudka (19 Sep 2018) +- nss: try to connect even if libnssckbi.so fails to load + + One can still use CA certificates stored in NSS database. + + Reported-by: Maxime Legros + Bug: https://curl.haxx.se/mail/lib-2018-09/0077.html + + Closes #3016 + +Daniel Gustafsson (19 Sep 2018) +- urlapi: don't set value which is never read + + In the CURLUPART_URL case, there is no codepath which invokes url + decoding so remove the assignment of the urldecode variable. This + fixes the deadstore bug-report from clang static analysis. + + Closes #3015 + Reviewed-by: Daniel Stenberg + +- todo: Update reference to already done item + + TODO item 1.1 was implemented in commit 946ce5b61f, update reference + to it with instead referencing the implemented option. + + Closes #3013 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (18 Sep 2018) +- RELEASE-NOTES: synced + +- [slodki brought this change] + + cmake: don't require OpenSSL if USE_OPENSSL=OFF + + User must have OpenSSL installed even if not used by libcurl at all + since 7.61.1 release. Broken at + 7867aaa9a01decf93711428462335be8cef70212 + + Reviewed-by: Sergei Nikulov + Closes #3001 + +- curl_multi_wait: call getsock before figuring out timeout + + .... since getsock may update the expiry timer. + + Fixes #2996 + Closes #3000 + +- examples/http2-pushinmemory: receive HTTP/2 pushed files in memory + + Closes #3004 + +Daniel Gustafsson (18 Sep 2018) +- darwinssl: Fix realloc memleak + + The reallocation was using the input pointer for the return value, which + leads to a memory leak on reallication failure. Fix by instead use the + safe internal API call Curl_saferealloc(). + + Closes #3005 + Reviewed-by: Daniel Stenberg + Reviewed-by: Nick Zitzmann + +- [Kruzya brought this change] + + examples: Fix memory leaks from realloc errors + + Make sure to not overwrite the reallocated pointer in realloc() calls + to avoid a memleak on memory errors. + +- memory: add missing curl_printf header + + ftp_send_command() was using vsnprintf() without including the libcurl + *rintf() replacement header. Fix by including curl_printf.h and also + add curl_memory.h while at it since memdebug.h depends on it. + + Closes #2999 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (16 Sep 2018) +- [Si brought this change] + + curl: update --tlsv* descriptions in --help output + + Closes #2994 + +- http: made Curl_add_buffer functions take a pointer-pointer + + ... so that they can clear the original pointer on failure, which makes + the error-paths and their cleanups easier. + + Closes #2992 + +- http2: fix memory leaks on error-path + +- [Rikard Falkeborn brought this change] + + libtest: Add chkdecimalpoint to .gitignore + + Closes #2998 + +Viktor Szakats (14 Sep 2018) +- secure Openwall URLs + +Daniel Stenberg (14 Sep 2018) +- openssl: show "proper" version number for libressl builds + + Closes #2989 + +- [Rainer Jung brought this change] + + openssl: assume engine support in 0.9.8 or later + + Fixes #2983 + Closes #2988 + +Daniel Gustafsson (13 Sep 2018) +- sendf: use failf() rather than Curl_failf() + + The failf() macro is the name used for invoking Curl_failf(). While + there isn't a way to turn off failf like there is for infof, but it's + still a good idea to use the macro. + + Reviewed-by: Daniel Stenberg + +- sendf: Fix whitespace in infof/failf concatenation + + Strings broken on multiple rows in the .c file need to have appropriate + whitespace padding on either side of the concatenation point to render + a correct amalgamated string. Fix by adding a space at the occurrences + found. + + Closes #2986 + Reviewed-by: Daniel Stenberg + +- krb5: fix memory leak in krb_auth + + The FTP command allocated by aprintf() must be freed after usage. + + Reviewed-by: Daniel Stenberg + +- ftp: include command in Curl_ftpsend sendbuffer + + Commit 8238ba9c5f10414a88f502bf3f5d5a42d632984c inadvertently removed + the actual command to be sent from the send buffer in a refactoring. + Add back copying the command into the buffer. Also add more guards + against malformed input while at it. + + Closes #2985 + Reviewed-by: Daniel Stenberg + +- ntlm_wb: Fix memory leaks in ntlm_wb_response + + When erroring out on a request being too large, the existing buffer was + leaked. Fix by explicitly freeing on the way out. + + Closes #2966 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (13 Sep 2018) +- [Yiming Jing brought this change] + + travis: build the MesaLink vtls backend with MesaLink 0.7.1 + +- [Yiming Jing brought this change] + + runtests.pl: run tests against the MesaLink vtls backend + +- [Yiming Jing brought this change] + + vtls: add a MesaLink vtls backend + + Closes #2984 + +- [Yiming Jing brought this change] + + configure.ac: add a MesaLink vtls backend + +- [Dave Reisner brought this change] + + curl_url_set.3: properly escape \n in example code + + This yields + + "the scheme is %s\n" + + instead of + + "the scheme is %s0 + + Closes #2970 + +- [Dave Reisner brought this change] + + curl_url_set.3: fix typo in reference to CURLU_APPENDQUERY + +- urlglob: improve error message + + to help user understand what the problem is + + Reported-by: Daniel Shahaf + + Fixes #2763 + Closes #2977 + +- [Yiming Jing brought this change] + + tests/certs: rebuild certs with 2048-bit RSA keys + + The previous test certificates contained RSA keys of only 1024 bits. + However, RSA claims that 1024-bit RSA keys are likely to become + crackable some time before 2010. The NIST recommends at least 2048-bit + keys for RSA for now. + + Better use full 2048 also for testing. + + Closes #2973 + +Daniel Gustafsson (12 Sep 2018) +- TODO: fix typo in item + + Closes #2968 + Reviewed-by: Daniel Stenberg + +Marcel Raad (12 Sep 2018) +- anyauthput: fix compiler warning on 64-bit Windows + + On Windows, the read function from is used, which has its byte + count parameter as unsigned int instead of size_t. + + Closes https://github.com/curl/curl/pull/2972 + +Viktor Szakats (12 Sep 2018) +- lib: fix gcc8 warning on Windows + + Closes https://github.com/curl/curl/pull/2979 + +Jay Satiro (12 Sep 2018) +- openssl: fix gcc8 warning + + - Use memcpy instead of strncpy to copy a string without termination, + since gcc8 warns about using strncpy to copy as many bytes from a + string as its length. + + Suggested-by: Viktor Szakats + + Closes https://github.com/curl/curl/issues/2980 + +Daniel Stenberg (10 Sep 2018) +- libcurl-url.3: overview man page for the URL API + + Closes #2967 + +- example/asiohiper: insert warning comment about its status + + This example is simply not working correctly but there's nobody around + with the skills and energy to fix it. + + Closes #2407 + +Kamil Dudka (10 Sep 2018) +- docs/cmdline-opts: update the documentation of --tlsv1.0 + + ... to reflect the changes in 6015cefb1b2cfde4b4850121c42405275e5e77d9 + + Closes #2955 + +- docs/examples: do not wait when no transfers are running + + Closes #2948 + +Daniel Stenberg (10 Sep 2018) +- [Daniel Gustafsson brought this change] + + cookies: Move failure case label to end of function + + Rather than jumping backwards to where failure cleanup happens + to be performed, move the failure case to end of the function + where it is expected per existing coding convention. + + Closes #2965 + +- [Daniel Gustafsson brought this change] + + misc: fix typos in comments + + Closes #2963 + +- [Daniel Gustafsson brought this change] + + cookies: fix leak when writing cookies to file + + If the formatting fails, we error out on a fatal error and + clean up on the way out. The array was however freed within + the wrong scope and was thus never freed in case the cookies + were written to a file instead of STDOUT. + + Closes #2957 + +- [Daniel Gustafsson brought this change] + + cookies: Remove redundant expired check + + Expired cookies have already been purged at a later expiration time + before this check, so remove the redundant check. + + closes #2962 + +- ntlm_wb: bail out if the response gets overly large + + Exit the realloc() loop if the response turns out ridiculously large to + avoid worse problems. + + Reported-by: Harry Sintonen + Closes #2959 + +- [Daniel Gustafsson brought this change] + + url.c: fix comment typo and indentation + + Closes #2960 + +- urlapi: avoid derefencing a possible NULL pointer + + Coverity CID 1439134 + +- RELEASE-NOTES: synced + +Marcel Raad (8 Sep 2018) +- test324: fix after 3f3b26d6feb0667714902e836af608094235fca2 + + The expected error code is now 60. 51 is dead. + +Daniel Stenberg (8 Sep 2018) +- curl_url_set.3: correct description + +- curl_url-docs: fix AVAILABILITY as Added in curl 7.62.0 + +- URL-API + + See header file and man pages for API. All documented API details work + and are tested in the 1560 test case. + + Closes #2842 + +- curl_easy_upkeep: removed 'conn' from the name + + ... including the associated option. + + Fixes #2951 + Closes #2952 + +- [Max Dymond brought this change] + + upkeep: add a connection upkeep API: curl_easy_conn_upkeep() + + Add functionality so that protocols can do custom keepalive on their + connections, when an external API function is called. + + Add docs for the new options in 7.62.0 + + Closes #1641 + +- [Philipp Waehnert brought this change] + + configure: add option to disable automatic OpenSSL config loading + + Sometimes it may be considered a security risk to load an external + OpenSSL configuration automatically inside curl_global_init(). The + configuration option --disable-ssl-auto-load-config disables this + automatism. The Windows build scripts winbuild/Makefile.vs provide a + corresponding option ENABLE_SSL_AUTO_LOAD_CONFIG accepting a boolean + value. + + Setting neither of these options corresponds to the previous behavior + loading the external OpenSSL configuration automatically. + + Fixes #2724 + Closes #2791 + +- doh: minor edits to please Coverity + + The gcc typecheck macros and coverity combined made it warn on the 2nd + argument for ERROR_CHECK_SETOPT(). Here's minor rearrange to please it. + + Coverity CID 1439115 and CID 1439114. + +- schannel: avoid switch-cases that go to default anyway + + SEC_E_APPLICATION_PROTOCOL_MISMATCH isn't defined in some versions of + mingw and would require an ifdef otherwise. + + Reported-by: Thomas Glanzmann + Approved-by: Marc Hörsken + Bug: https://curl.haxx.se/mail/lib-2018-09/0020.html + Closes #2950 + +- [Nicklas Avén brought this change] + + imap: change from "FETCH" to "UID FETCH" + + ... and add "MAILINDEX". + + As described in #2789, this is a suggested solution. Changing UID=xx to + actually get mail with UID xx and add "MAILINDEX" to get a mail with a + special index in the mail box (old behavior). So MAILINDEX=1 gives the + first non deleted mail in the mail box. + + Fixes #2789 + Closes #2815 + +- CURLOPT_UPLOAD_BUFFERSIZE: set upload buffer size + + This is step 3 of #2888. + + Fixes #2888 + Closes #2896 + +- travis: add the DOH tests to the torture testing + +- DOH: add test case 1650 and 2100 + +- curl: --doh-url added + +- setopt: add CURLOPT_DOH_URL + + Closes #2668 + +- [Han Han brought this change] + + ssl: deprecate CURLE_SSL_CACERT in favour of a unified error code + + Long live CURLE_PEER_FAILED_VERIFICATION + +- [Han Han brought this change] + + x509asn1: return CURLE_PEER_FAILED_VERIFICATION on failure to parse cert + + CURLE_PEER_FAILED_VERIFICATION makes more sense because Curl_parseX509 + does not allocate memory internally as its first argument is a pointer + to the certificate structure. The same error code is also returned by + Curl_verifyhost when its call to Curl_parseX509 fails so the change + makes error handling more consistent. + +- [Han Han brought this change] + + openssl: return CURLE_PEER_FAILED_VERIFICATION on failure to parse issuer + + Failure to extract the issuer name from the server certificate should + return a more specific error code like on other TLS backends. + +- [Han Han brought this change] + + schannel: unified error code handling + + Closes #2901 + +- [Han Han brought this change] + + darwinssl: more specific and unified error codes + + Closes #2901 + +- CURLOPT_DNS_USE_GLOBAL_CACHE: deprecated + + Disable the CURLOPT_DNS_USE_GLOBAL_CACHE option and mark it for + deprecation and complete removal in six months. + + Bug: https://curl.haxx.se/mail/lib-2018-09/0010.html + Closes #2942 + +- url: default to CURL_HTTP_VERSION_2TLS if built h2-enabled + + Closes #2709 + +- multiplex: enable by default + + Starting 7.62.0, multiplexing is enabled by default in multi handles. + +- [Jim Fuller brought this change] + + tests: add unit tests for url.c + + Approved-by: Daniel Gustafsson + Closes #2937 + +- test1452: mark as flaky + + makes it not run in the CI builds + + Closes #2941 + +- pipelining: deprecated + + Transparently. The related curl_multi_setopt() options all still returns + OK when pipelining is selected. + + To re-enable the support, the single line change in lib/multi.c needs to + be reverted. + + See docs/DEPRECATE.md + + Closes #2705 + +- RELEASE-NOTES: start working on 7.62.0 + +Version 7.61.1 (4 Sep 2018) + +Daniel Stenberg (4 Sep 2018) +- THANKS: 7.61.1 status + +- RELEASE-NOTES: 7.61.1 + +- Curl_getoff_all_pipelines: ignore unused return values + + Since scan-build would warn on the dead "Dead store/Dead increment" + +Viktor Szakats (4 Sep 2018) +- sftp: fix indentation + +Daniel Stenberg (4 Sep 2018) +- [Przemysław Tomaszewski brought this change] + + sftp: don't send post-qoute sequence when retrying a connection + + Fixes #2939 + Closes #2940 + +Kamil Dudka (3 Sep 2018) +- url, vtls: make CURLOPT{,_PROXY}_TLS13_CIPHERS work + + This is a follow-up to PR #2607 and PR #2926. + + Closes #2936 + +Daniel Stenberg (3 Sep 2018) +- [Jay Satiro brought this change] + + tool_operate: Add http code 408 to transient list for --retry + + - Treat 408 request timeout as transient so that curl will retry the + request if --retry was used. + + Closes #2925 + +- [Jay Satiro brought this change] + + openssl: Fix setting TLS 1.3 cipher suites + + The flag indicating TLS 1.3 cipher support in the OpenSSL backend was + missing. + + Bug: https://github.com/curl/curl/pull/2607#issuecomment-417283187 + Reported-by: Kamil Dudka + + Closes #2926 + +- Curl_ntlm_core_mk_nt_hash: return error on too long password + + ... since it would cause an integer overflow if longer than (max size_t + / 2). + + This is CVE-2018-14618 + + Bug: https://curl.haxx.se/docs/CVE-2018-14618.html + Closes #2756 + Reported-by: Zhaoyang Wu + +- [Rikard Falkeborn brought this change] + + http2: Use correct format identifier for stream_id + + Closes #2928 + +Marcel Raad (2 Sep 2018) +- test1148: fix precheck output + + "precheck command error" is not very helpful. + +Daniel Stenberg (1 Sep 2018) +- all: s/int/size_t cleanup + + Assisted-by: Rikard Falkeborn + + Closes #2922 + +- ssh-libssh: use FALLTHROUGH to silence gcc8 + +Jay Satiro (31 Aug 2018) +- tool_operate: Fix setting proxy TLS 1.3 ciphers + +Daniel Stenberg (31 Aug 2018) +- [Daniel Gustafsson brought this change] + + cookies: support creation-time attribute for cookies + + According to RFC6265 section 5.4, cookies with equal path lengths + SHOULD be sorted by creation-time (earlier first). This adds a + creation-time record to the cookie struct in order to make cookie + sorting more deterministic. The creation-time is defined as the + order of the cookies in the jar, the first cookie read fro the + jar being the oldest. The creation-time is thus not serialized + into the jar. Also remove the strcmp() matching in the sorting as + there is no lexicographic ordering in RFC6265. Existing tests are + updated to match. + + Closes #2524 + +Marcel Raad (31 Aug 2018) +- Don't use Windows path %PWD for SSH tests + + All these tests failed on Windows because something like + sftp://%HOSTIP:%SSHPORT%PWD/ + expanded to + sftp://127.0.0.1:1234c:/msys64/home/bla/curl + and then curl complained about the port number ending with a letter. + + Use the original POSIX path instead of the Windows path created in + checksystem to fix this. + + Closes https://github.com/curl/curl/pull/2920 + +Jay Satiro (29 Aug 2018) +- CURLOPT_SSL_CTX_FUNCTION.3: clarify connection reuse warning + + Reported-by: Daniel Stenberg + + Closes https://github.com/curl/curl/issues/2916 + +Daniel Stenberg (28 Aug 2018) +- THANKS-filter: dedup Daniel Jeliński + +- RELEASE-NOTES: synced + +- CURLOPT_ACCEPT_ENCODING.3: list them comma-separated [ci skip] + +- CURLOPT_SSL_CTX_FUNCTION.3: might cause unintended connection reuse [ci skip] + + Added a warning! + + Closes #2915 + +- curl: fix time-of-check, time-of-use race in dir creation + + Patch-by: Jay Satiro + Detected by Coverity + Fixes #2739 + Closes #2912 + +- cmdline-opts/page-footer: fix edit mistake + + There was a missing newline. + + follow-up to a7ba60bb7250 + +- docs: clarify NO_PROXY env variable functionality + + Reported-by: Kirill Marchuk + Fixes #2773 + Closes #2911 + +Marcel Raad (24 Aug 2018) +- lib1522: fix curl_easy_setopt argument type + + CURLOPT_POSTFIELDSIZE is a long option. + +- curl_threads: silence bad-function-cast warning + + As uintptr_t and HANDLE are always the same size, this warning is + harmless. Just silence it using an intermediate uintptr_t variable. + + Closes https://github.com/curl/curl/pull/2908 + +Daniel Stenberg (24 Aug 2018) +- README: add appveyor build badge [ci skip] + + Closes #2913 + +- [Ihor Karpenko brought this change] + + schannel: client certificate store opening fix + + 1) Using CERT_STORE_OPEN_EXISTING_FLAG ( or CERT_STORE_READONLY_FLAG ) + while opening certificate store would be sufficient in this scenario and + less-demanding in sense of required user credentials ( for example, + IIS_IUSRS will get "Access Denied" 0x05 error for existing CertOpenStore + call without any of flags mentioned above ), + + 2) as 'cert_store_name' is a DWORD, attempt to format its value like a + string ( in "Failed to open cert store" error message ) will throw null + pointer exception + + 3) adding GetLastError(), in my opinion, will make error message more + useful. + + Bug: https://curl.haxx.se/mail/lib-2018-08/0198.html + + Closes #2909 + +- [Leonardo Taccari brought this change] + + gopher: Do not translate `?' to `%09' + + Since GOPHER support was added in curl `?' character was automatically + translated to `%09' (`\t'). + + However, this behaviour does not seems documented in RFC 4266 and for + search selectors it is documented to directly use `%09' in the URL. + Apart that several gopher servers in the current gopherspace have CGI + support where `?' is used as part of the selector and translating it to + `%09' often leads to surprising results. + + Closes #2910 + +Marcel Raad (23 Aug 2018) +- cookie tests: treat files as text + + Fixes test failures because of wrong line endings on Windows. + +Daniel Stenberg (23 Aug 2018) +- libcurl-thread.3: expand somewhat on the NO_SIGNAL motivation + + Multi-threaded applictions basically MUST set CURLOPT_NO_SIGNAL to 1L to + avoid the risk of getting a SIGPIPE. + + Either way, a multi-threaded application that uses libcurl/openssl needs + to have a signhandler for or ignore SIGPIPE on its own. + + Based on discussions in #2800 + Closes #2904 + +- RELEASE-NOTES: synced + +Marcel Raad (22 Aug 2018) +- Tests: fixes for Windows + + - test 1268 requires unix sockets + - test 2072 must be disabled also for MSYS/MinGW + +Daniel Stenberg (22 Aug 2018) +- http2: abort the send_callback if not setup yet + + When Curl_http2_done() gets called before the http2 data is setup all + the way, we cannot send anything and this should just return an error. + + Detected by OSS-Fuzz + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10012 + +- http2: remove four unused nghttp2 callbacks + + Closes #2903 + +- x509asn1: use FALLTHROUGH + + ... as no other comments are accepted since 014ed7c22f51463 + +Marcel Raad (21 Aug 2018) +- test1148: disable if decimal separator is not point + + Modifying the locale with environment variables doesn't work for native + Windows applications. Just disable the test in this case if the decimal + separator is something different than a point. Use a precheck with a + small C program to achieve that. + + Closes https://github.com/curl/curl/pull/2786 + +- Enable more GCC warnings + + This enables the following additional warnings: + -Wold-style-definition + -Warray-bounds=2 instead of the default 1 + -Wformat=2, but only for GCC 4.8+ as Wno-format-nonliteral is not + respected for older versions + -Wunused-const-variable, which enables level 2 instead of the default 1 + -Warray-bounds also in debug mode through -ftree-vrp + -Wnull-dereference also in debug mode through + -fdelete-null-pointer-checks + + Closes https://github.com/curl/curl/pull/2747 + +- curl-compilers: enable -Wimplicit-fallthrough=4 for GCC + + This enables level 4 instead of the default level 3, which of the + currently used comments only allows /* FALLTHROUGH */ to silence the + warning. + + Closes https://github.com/curl/curl/pull/2747 + +- curl-compilers: enable -Wbad-function-cast on GCC + + This warning used to be enabled only for clang as it's a bit stricter + on GCC. Silence the remaining occurrences and enable it on GCC too. + + Closes https://github.com/curl/curl/pull/2747 + +- configure: conditionally enable pedantic-errors + + Enable pedantic-errors for GCC >= 5 with --enable-werror. Before GCC 5, + pedantic-errors was synonymous to -Werror=pedantic [0], which is still + the case for clang [1]. With GCC 5, it became complementary [2]. + + Also fix a resulting error in acinclude.m4 as main's return type was + missing, which is illegal in C99. + + [0] https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Warning-Options.html + [1] https://clang.llvm.org/docs/UsersManual.html#options-to-control-error-and-warning-messages + [2] https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Warning-Options.html + + Closes https://github.com/curl/curl/pull/2747 + +- Remove unused definitions + + Closes https://github.com/curl/curl/pull/2747 + +Daniel Stenberg (21 Aug 2018) +- x509asn1: make several functions static + + and remove the private SIZE_T_MAX define and use the generic one. + + Closes #2902 + +- INTERNALS: require GnuTLS >= 2.11.3 + + Since the public pinning support was brought in e644866caf4. GnuTLS + 2.11.3 was released in October 2010. + + Figured out in #2890 + +- http2: avoid set_stream_user_data() before stream is assigned + + ... before the stream is started, we have it set to -1. + + Fixes #2894 + Closes #2898 + +- SSLCERTS: improve the openssl command line + + ... for extracting certs from a live HTTPS server to make a cacerts.pem + from them. + +- docs/SECURITY-PROCESS: now we name the files after the CVE id + +- RELEASE-NOTES: synced + +- upload: change default UPLOAD_BUFSIZE to 64KB + + To make uploads significantly faster in some circumstances. + + Part 2 of #2888 + Closes #2892 + +- upload: allocate upload buffer on-demand + + Saves 16KB on the easy handle for operations that don't need that + buffer. + + Part 1 of #2888 + +- [Laurent Bonnans brought this change] + + vtls: reinstantiate engine on duplicated handles + + Handles created with curl_easy_duphandle do not use the SSL engine set + up in the original handle. This fixes the issue by storing the engine + name in the internal url state and setting the engine from its name + inside curl_easy_duphandle. + + Reported-by: Anton Gerasimov + Signed-of-by: Laurent Bonnans + Fixes #2829 + Closes #2833 + +- http2: make sure to send after RST_STREAM + + If this is the last stream on this connection, the RST_STREAM might not + get pushed to the wire otherwise. + + Fixes #2882 + Closes #2887 + Researched-by: Michael Kaufmann + +- test1268: check the stderr output as "text" + + Follow-up to 099f37e9c57 + + Pointed-out-by: Marcel Raad + +- urldata: remove unused pipe_broke struct field + + This struct field is never set TRUE in any existing code path. This + change removes the field completely. + + Closes #2871 + +- curl: warn the user if a given file name looks like an option + + ... simply because this is usually a sign of the user having omitted the + file name and the next option is instead "eaten" by the parser as a file + name. + + Add test1268 to verify + + Closes #2885 + +- http2: check nghttp2_session_set_stream_user_data return code + + Might help bug #2688 debugging + + Closes #2880 + +- travis: revert back to gcc-7 for coverage builds + + ... since the gcc-8 ones seem to fail frequently. + + Follow-up from b85207199544ca + + Closes #2886 + +- RELEASE-NOTES: synced + + ... and now listed in alphabetical order! + +- [Adrien brought this change] + + CMake: CMake config files are defining CURL_STATICLIB for static builds + + This change allows to use the CMake config files generated by Curl's + CMake scripts for static builds of the library. + The symbol CURL_STATIC lib must be defined to compile downstream, + thus the config package is the perfect place to do so. + + Fixes #2817 + Closes #2823 + Reported-by: adnn on github + Reviewed-by: Sergei Nikulov + +- TODO: host name sections in config files + +Kamil Dudka (14 Aug 2018) +- ssh-libssh: fix infinite connect loop on invalid private key + + Added test 656 (based on test 604) to verify the fix. + + Bug: https://bugzilla.redhat.com/1595135 + + Closes #2879 + +- ssh-libssh: reduce excessive verbose output about pubkey auth + + The verbose message "Authentication using SSH public key file" was + printed each time the ssh_userauth_publickey_auto() was called, which + meant each time a packet was transferred over network because the API + operates in non-blocking mode. + + This patch makes sure that the verbose message is printed just once + (when the authentication state is entered by the SSH state machine). + +Daniel Stenberg (14 Aug 2018) +- travis: disable h2 torture tests for "coverage" + + Since they started to fail almost 100% since a few days. + + Closes #2876 + +Marcel Raad (14 Aug 2018) +- travis: update to GCC 8 + + Closes https://github.com/curl/curl/pull/2869 + +Daniel Stenberg (13 Aug 2018) +- http: fix for tiny "HTTP/0.9" response + + Deal with tiny "HTTP/0.9" (header-less) responses by checking the + status-line early, even before a full "HTTP/" is received to allow + detecting 0.9 properly. + + Test 1266 and 1267 added to verify. + + Fixes #2420 + Closes #2872 + +Kamil Dudka (13 Aug 2018) +- docs: add disallow-username-in-url.d and haproxy-protocol.d on the list + + ... to make make the files appear in distribution tarballs + + Closes #2856 + +- .travis.yml: verify that man pages can be regenerated + + ... when curl is built from distribution tarball + + Closes #2856 + +Marcel Raad (11 Aug 2018) +- Split non-portable part off test 1133 + + Split off testing file names with double quotes into new test 1158. + Disable it for MSYS using a precheck as it doesn't support file names + with double quotes (but Cygwin does, for example). + + Fixes https://github.com/curl/curl/issues/2796 + Closes https://github.com/curl/curl/pull/2854 + +Jay Satiro (11 Aug 2018) +- projects: Improve Windows perl detection in batch scripts + + - Determine if perl is in the user's PATH by running perl.exe. + + Prior to this change detection was done by checking the PATH for perl/ + but that did not work in all cases (eg git install includes perl but + not in perl/ path). + + Bug: https://github.com/curl/curl/pull/2865 + Reported-by: Daniel Jeliński + +- [Michael Kaufmann brought this change] + + docs: Improve the manual pages of some callbacks + + - CURLOPT_HEADERFUNCTION: add newlines + - CURLOPT_INTERLEAVEFUNCTION: fix the description of 'userdata' + - CURLOPT_READDATA: mention crashes, same as in CURLOPT_WRITEDATA + - CURLOPT_READFUNCTION: rename 'instream' to 'userdata' and explain + how to set it + + Closes https://github.com/curl/curl/pull/2868 + +Marcel Raad (11 Aug 2018) +- GCC: silence -Wcast-function-type uniformly + + Pointed-out-by: Rikard Falkeborn + Closes https://github.com/curl/curl/pull/2860 + +- Silence GCC 8 cast-function-type warnings + + On Windows, casting between unrelated function types is fine and + sometimes even necessary, so just use an intermediate cast to + (void (*) (void)) to silence the warning as described in [0]. + + [0] https://gcc.gnu.org/onlinedocs/gcc-8.1.0/gcc/Warning-Options.html + + Closes https://github.com/curl/curl/pull/2860 + +Daniel Stenberg (11 Aug 2018) +- CURLINFO_SIZE_UPLOAD: fix missing counter update + + Adds test 1522 for verification. + + Reported-by: cjmsoregan + Fixes #2847 + Closes #2864 + +- [Daniel Jelinski brought this change] + + Documentation: fix CURLOPT_SSH_COMPRESSION copy/paste bug + + Closes #2867 + +- RELEASE-NOTES: synced + +- openssl: fix potential NULL pointer deref in is_pkcs11_uri + + Follow-up to 298d2565e + Coverity CID 1438387 + +Marcel Raad (10 Aug 2018) +- travis: execute "set -eo pipefail" for coverage build + + Follow-up to 2de63ab179eb78630ee039ad94fb2a5423df522d and + 0b87c963252d3504552ee0c8cf4402bd65a80af5. + + Closes https://github.com/curl/curl/pull/2862 + +Daniel Stenberg (10 Aug 2018) +- lib1502: fix memory leak in torture test + + Reported-by: Marcel Raad + Fixes #2861 + Closes #2863 + +- docs: mention NULL is fine input to several functions + + Fixes #2837 + Closes #2858 + Reported-by: Markus Elfring + +- [Bas van Schaik brought this change] + + README.md: add LGTM.com code quality grade for C/C++ + + Closes #2857 + +- [Rikard Falkeborn brought this change] + + test1531: Add timeout + + Previously, the macro TEST_HANG_TIMEOUT was unused, but since there is + looping going on, we might as well add timing instead of removing it. + + Closes #2853 + +- [Rikard Falkeborn brought this change] + + test1540: Remove unused macro TEST_HANG_TIMEOUT + + The macro has never been used, and it there is not really any place + where it would make sense to add timing checks. + + Closes #2852 + +- [Rikard Falkeborn brought this change] + + asyn-thread: Remove unused macro + + The macro seems to never have been used. + + Closes #2852 + +- [Rikard Falkeborn brought this change] + + http_proxy: Remove unused macro SELECT_TIMEOUT + + Usage was removed in 5113ad0424044458ac497fa1458ebe0101356b22. + + Closes #2852 + +- [Rikard Falkeborn brought this change] + + formdata: Remove unused macro HTTPPOST_CONTENTTYPE_DEFAULT + + Its usage was removed in + 84ad1fd3047815f9c6e78728bb351b828eac10b1. + + Closes #2852 + +- [Rikard Falkeborn brought this change] + + telnet: Remove unused macros TELOPTS and TELCMDS + + Their usage was removed in 3a145180cc754a5959ca971ef3cd243c5c83fc51. + + Closes #2852 + +- [Daniel Jelinski brought this change] + + openssl: fix debug messages + + Fixes #2806 + Closes #2843 + +- configure: fix for -lpthread detection with OpenSSL and pkg-config + + ... by making sure it uses the -I provided by pkg-config! + + Reported-by: pszemus on github + Fixes #2848 + Closes #2850 + +- RELEASE-NOTES: synced + +- windows: follow up to the buffer-tuning 1ba1dba7 + + Somehow I didn't include the amended version of the previous fix. This + is the missing piece. + + Pointed-out-by: Viktor Szakats + +- [Daniel Jelinski brought this change] + + windows: implement send buffer tuning + + Significantly enhances upload performance on modern Windows versions. + + Bug: https://curl.haxx.se/mail/lib-2018-07/0080.html + Closes #2762 + Fixes #2224 + +- [Anderson Toshiyuki Sasaki brought this change] + + ssl: set engine implicitly when a PKCS#11 URI is provided + + This allows the use of PKCS#11 URI for certificates and keys without + setting the corresponding type as "ENG" and the engine as "pkcs11" + explicitly. If a PKCS#11 URI is provided for certificate, key, + proxy_certificate or proxy_key, the corresponding type is set as "ENG" + if not provided and the engine is set to "pkcs11" if not provided. + + Acked-by: Nikos Mavrogiannopoulos + Closes #2333 + +- [Ruslan Baratov brought this change] + + CMake: Respect BUILD_SHARED_LIBS + + Use standard CMake variable BUILD_SHARED_LIBS instead of introducing + custom option CURL_STATICLIB. + + Use '-DBUILD_SHARED_LIBS=%SHARED%' in appveyor.yml. + + Reviewed-by: Sergei Nikulov + Closes #2755 + +- [John Butterfield brought this change] + + cmake: bumped minimum version to 3.4 + + Closes #2753 + +- [John Butterfield brought this change] + + cmake: link curl to the OpenSSL targets instead of lib absolute paths + + Reviewed-by: Jakub Zakrzewski + Reviewed-by: Sergei Nikulov + Closes #2753 + +- travis: build darwinssl on macos 10.12 + + ... as building on 10.13.x before 10.13.4 leads to link errors. + + Assisted-by: Nick Zitzmann + Fixes #2835 + Closes #2845 + +- DEPRECATE: remove release date from 7.62.0 + + Since it will slip and the version is the important part there, not the + date. + +- lib/Makefile: only do symbol hiding if told to + + This restores the ability to build a static lib with + --disable-symbol-hiding to keep non-curl_ symbols. + + Researched-by: Dan Fandrich + Reported-by: Ran Mozes + Fixes #2830 + Closes #2831 + +Marcel Raad (2 Aug 2018) +- hostip: fix unused variable warning + + addresses is only used in an infof call, which is a macro expanding to + nothing if CURL_DISABLE_VERBOSE_STRINGS is set. + +Daniel Stenberg (2 Aug 2018) +- test1307: disabled + + Turns out that since we're using the native fnmatch function now when + available, and they simply disagree on a huge number of test patterns + that make it hard to test this function like this... + + Fixes #2825 + +- smb: don't mark it done in smb_do + + Follow-up to 09e401e01bf9. The SMB protocol handler needs to use its + doing function too, which requires smb_do() to not mark itself as + done... + + Closes #2822 + +- [Rikard Falkeborn brought this change] + + general: fix printf specifiers + + Closes #2818 + +- RELEASE-NOTES: synced + +- mailmap: Daniel Jelinski + +- [Harry Sintonen brought this change] + + HTTP: Don't attempt to needlessly decompress redirect body + + This change fixes a regression where redirect body would needlessly be + decompressed even though it was to be ignored anyway. As it happens this + causes secondary issues since there appears to be a bug in apache2 that + it in certain conditions generates a corrupt zlib response. The + regression was created by commit: + dbcced8e32b50c068ac297106f0502ee200a1ebd + + Discovered-by: Harry Sintonen + Closes #2798 + +- curl: use Content-Disposition before the "URL end" for -OJ + + Regression introduced in 7.61.0 + + Reported-by: Thomas Klausner + Fixes #2783 + Closes #2813 + +- [Daniel Jelinski brought this change] + + retry: return error if rewind was necessary but didn't happen + + Fixes #2801 + Closes #2812 + +- http2: clear the drain counter in Curl_http2_done + + Reported-by: Andrei Virtosu + Fixes #2800 + Closes #2809 + +- smb: fix memory leak on early failure + + ... by making sure connection related data (->share) is stored in the + connection and not in the easy handle. + + Detected by OSS-fuzz + Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=9369 + Fixes #2769 + Closes #2810 + +- travis: run a 'make checksrc' too + + ... to make sure the examples are all checked. + + Closes #2811 + +Jay Satiro (29 Jul 2018) +- examples/ephiperfifo: checksrc compliance + +- [Michael Kaufmann brought this change] + + sws: handle EINTR when calling select() + + Closes https://github.com/curl/curl/pull/2808 + +Daniel Stenberg (29 Jul 2018) +- test1157: follow-up to 35ecffb9 + + Ignore the user-agent line. + Pointed-out-by: Marcel Raad diff --git a/bin/curl/COPYING-brotli.txt b/bin/curl/COPYING-brotli.txt new file mode 100644 index 00000000..33b7cdd2 --- /dev/null +++ b/bin/curl/COPYING-brotli.txt @@ -0,0 +1,19 @@ +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. + +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. diff --git a/bin/curl/COPYING-libssh2.txt b/bin/curl/COPYING-libssh2.txt new file mode 100644 index 00000000..f2ca9477 --- /dev/null +++ b/bin/curl/COPYING-libssh2.txt @@ -0,0 +1,42 @@ +/* Copyright (c) 2004-2007 Sara Golemon + * Copyright (c) 2005,2006 Mikhail Gusarov + * Copyright (c) 2006-2007 The Written Word, Inc. + * Copyright (c) 2007 Eli Fant + * Copyright (c) 2009-2014 Daniel Stenberg + * Copyright (C) 2008, 2009 Simon Josefsson + * 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 copyright holder nor the names + * of any other contributors 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. + */ + diff --git a/bin/curl/COPYING-nghttp2.txt b/bin/curl/COPYING-nghttp2.txt new file mode 100644 index 00000000..80201792 --- /dev/null +++ b/bin/curl/COPYING-nghttp2.txt @@ -0,0 +1,23 @@ +The MIT License + +Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa +Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors + +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. diff --git a/bin/curl/COPYING-zlib.txt b/bin/curl/COPYING-zlib.txt new file mode 100644 index 00000000..51106de4 --- /dev/null +++ b/bin/curl/COPYING-zlib.txt @@ -0,0 +1,115 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.11 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and +rfc1952 (gzip format). + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +of the library is given in the file test/example.c which also tests that +the library is working correctly. Another example is given in the file +test/minigzip.c. The compression library itself is composed of all source +files in the root directory. + +To compile all files and run the test program, follow the instructions given at +the top of Makefile.in. In short "./configure; make test", and if that goes +well, "make install" should work for most flavors of Unix. For Windows, use +one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use +make_vms.com. + +Questions about zlib should be sent to , or to Gilles Vollant + for the Windows DLL version. The zlib home page is +http://zlib.net/ . Before reporting a problem, please check this site to +verify that you have the latest version of zlib; otherwise get the latest +version and check whether the problem still exists or not. + +PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. + +Mark Nelson wrote an article about zlib for the Jan. 1997 +issue of Dr. Dobb's Journal; a copy of the article is available at +http://marknelson.us/1997/01/01/zlib-engine/ . + +The changes made in version 1.2.11 are documented in the file ChangeLog. + +Unsupported third party contributions are provided in directory contrib/ . + +zlib is available in Java using the java.util.zip package, documented at +http://java.sun.com/developer/technicalArticles/Programming/compression/ . + +A Perl interface to zlib written by Paul Marquess is available +at CPAN (Comprehensive Perl Archive Network) sites, including +http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . + +A Python interface to zlib written by A.M. Kuchling is +available in Python 1.5 and later versions, see +http://docs.python.org/library/zlib.html . + +zlib is built into tcl: http://wiki.tcl.tk/4610 . + +An experimental package to read and write files in .zip format, written on top +of zlib by Gilles Vollant , is available in the +contrib/minizip directory of zlib. + + +Notes for some targets: + +- For Windows DLL versions, please see win32/DLL_FAQ.txt + +- For 64-bit Irix, deflate.c must be compiled without any optimization. With + -O, one libpng test fails. The test works in 32 bit mode (with the -n32 + compiler flag). The compiler bug has been reported to SGI. + +- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works + when compiled with cc. + +- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is + necessary to get gzprintf working correctly. This is done by configure. + +- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with + other compilers. Use "make test" to check your compiler. + +- gzdopen is not supported on RISCOS or BEOS. + +- For PalmOs, see http://palmzlib.sourceforge.net/ + + +Acknowledgments: + + The deflate format used by zlib was defined by Phil Katz. The deflate and + zlib specifications were written by L. Peter Deutsch. Thanks to all the + people who reported problems and suggested various improvements in zlib; they + are too numerous to cite here. + +Copyright notice: + + (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/bin/curl/COPYING.txt b/bin/curl/COPYING.txt new file mode 100644 index 00000000..3528bd75 --- /dev/null +++ b/bin/curl/COPYING.txt @@ -0,0 +1,22 @@ +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1996 - 2019, Daniel Stenberg, , and many +contributors, see the THANKS file. + +All rights reserved. + +Permission to use, copy, modify, and 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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. 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. + +Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization of the copyright holder. diff --git a/bin/curl/LICENSE-openssl.txt b/bin/curl/LICENSE-openssl.txt new file mode 100644 index 00000000..9601ab43 --- /dev/null +++ b/bin/curl/LICENSE-openssl.txt @@ -0,0 +1,125 @@ + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a double license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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 product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + diff --git a/bin/curl/README.txt b/bin/curl/README.txt new file mode 100644 index 00000000..c439dab9 --- /dev/null +++ b/bin/curl/README.txt @@ -0,0 +1,55 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +README + + Curl is a command line tool for transferring data specified with URL + syntax. Find out how to use curl by reading the curl.1 man page or the + MANUAL document. Find out how to install Curl by reading the INSTALL + document. + + libcurl is the library curl is using to do its job. It is readily + available to be used by your software. Read the libcurl.3 man page to + learn how! + + You find answers to the most frequent questions we get in the FAQ document. + + Study the COPYING file for distribution terms and similar. If you distribute + curl binaries or other binaries that involve libcurl, you might enjoy the + LICENSE-MIXING document. + +CONTACT + + If you have problems, questions, ideas or suggestions, please contact us + by posting to a suitable mailing list. See https://curl.haxx.se/mail/ + + All contributors to the project are listed in the THANKS document. + +WEB SITE + + Visit the curl web site for the latest news and downloads: + + https://curl.haxx.se/ + +GIT + + To download the very latest source off the GIT server do this: + + git clone https://github.com/curl/curl.git + + (you'll get a directory named curl created, filled with the source code) + +SECURITY PROBLEMS + + Report suspected security problems via our HackerOne page and not in public! + + https://hackerone.com/curl + +NOTICE + + Curl contains pieces of source code that is Copyright (c) 1998, 1999 + Kungliga Tekniska Högskolan. This notice is included here to comply with the + distribution terms. diff --git a/bin/curl/RELEASE-NOTES.txt b/bin/curl/RELEASE-NOTES.txt new file mode 100644 index 00000000..a29bf1c5 --- /dev/null +++ b/bin/curl/RELEASE-NOTES.txt @@ -0,0 +1,250 @@ +curl and libcurl 7.65.0 + + Public curl releases: 181 + Command line options: 221 + curl_easy_setopt() options: 268 + Public functions in libcurl: 80 + Contributors: 1929 + +This release includes the following changes: + + o CURLOPT_DNS_USE_GLOBAL_CACHE: removed [25] + o CURLOPT_MAXAGE_CONN: set the maximum allowed age for conn reuse [37] + o pipelining: removed [10] + +This release includes the following bugfixes: + + o CVE-2019-5435: Integer overflows in curl_url_set [87] + o CVE-2019-5436: tftp: use the current blksize for recvfrom() [82] + o --config: clarify that initial : and = might need quoting [17] + o AppVeyor: enable testing for WinSSL build [23] + o CURLMOPT_TIMERFUNCTION.3: warn about the recursive risk [52] + o CURLOPT_ADDRESS_SCOPE: fix range check and more [32] + o CURLOPT_CAINFO.3: with Schannel, you want Windows 8 or later [75] + o CURLOPT_CHUNK_BGN_FUNCTION.3: document the struct and time value [51] + o CURLOPT_READFUNCTION.3: see also CURLOPT_UPLOAD_BUFFERSIZE [71] + o CURL_MAX_INPUT_LENGTH: largest acceptable string input size [44] + o Curl_disconnect: treat all CONNECT_ONLY connections as "dead" [39] + o INTERNALS: Add code highlighting [47] + o OS400/ccsidcurl: replace use of Curl_vsetopt [50] + o OpenSSL: Report -fips in version if OpenSSL is built with FIPS [55] + o README.md: fix no-consecutive-blank-lines Codacy warning [22] + o VC15 project: remove MinimalRebuild + o VS projects: use Unicode for VC10+ [16] + o WRITEFUNCTION: add missing set_in_callback around callback [60] + o altsvc: Fix building with cookies disabled [38] + o auth: Rename the various authentication clean up functions [61] + o base64: build conditionally if there are users + o build-openssl.bat: Fixed support for OpenSSL v1.1.0+ + o build: fix "clarify calculation precedence" warnings [63] + o checksrc.bat: ignore snprintf warnings in docs/examples [67] + o cirrus: Customize the disabled tests per FreeBSD version + o cleanup: remove FIXME and TODO comments [81] + o cmake: avoid linking executable for some tests with cmake 3.6+ [18] + o cmake: clear CMAKE_REQUIRED_LIBRARIES after each use [19] + o cmake: rename CMAKE_USE_DARWINSSL to CMAKE_USE_SECTRANSP [46] + o cmake: set SSL_BACKENDS [12] + o configure: avoid unportable `==' test(1) operator [1] + o configure: error out if OpenSSL wasn't detected when asked for [74] + o configure: fix default location for fish completions [13] + o cookie: Guard against possible NULL ptr deref [42] + o curl: make code work with protocol-disabled libcurl [78] + o curl: report error for "--no-" on non-boolean options [86] + o curl_easy_getinfo.3: fix minor formatting mistake + o curlver.h: use parenthesis in CURL_VERSION_BITS macro [45] + o docs/BUG-BOUNTY: bug bounty time [48] + o docs/INSTALL: fix broken link [62] + o docs/RELEASE-PROCEDURE: link to live iCalendar [79] + o documentation: Fix several typos [7] + o doh: acknowledge CURL_DISABLE_DOH + o doh: disable DOH for the cases it doesn't work [66] + o examples: remove unused variables [88] + o ftplistparser: fix LGTM alert "Empty block without comment" [14] + o hostip: acknowledge CURL_DISABLE_SHUFFLE_DNS [78] + o http: Ignore HTTP/2 prior knowledge setting for HTTP proxies [54] + o http: acknowledge CURL_DISABLE_HTTP_AUTH + o http: mark bundle as not for multiuse on < HTTP/2 response [41] + o http_digest: Don't expose functions when HTTP and Crypto Auth are disabled [65] + o http_negotiate: do not treat failure of gss_init_sec_context() as fatal [53] + o http_ntlm: Corrected the name of the include guard [64] + o http_ntlm_wb: Handle auth for only a single request [77] + o http_ntlm_wb: Return the correct error on receiving an empty auth message [77] + o lib509: add missing include for strdup [22] + o lib557: initialize variables [22] + o makedebug: Fix ERRORLEVEL detection after running where.exe [58] + o mbedtls: enable use of EC keys [85] + o mime: acknowledge CURL_DISABLE_MIME + o multi: improved HTTP_1_1_REQUIRED handling [2] + o netrc: acknowledge CURL_DISABLE_NETRC [78] + o nss: allow fifos and character devices for certificates [56] + o nss: provide more specific error messages on failed init [43] + o ntlm: Fix misaligned function comments for Curl_auth_ntlm_cleanup [70] + o ntlm: Support the NT response in the type-3 when OpenSSL doesn't include MD4 + o openssl: mark connection for close on TLS close_notify [36] + o openvms: Remove pre-processor for SecureTransport [40] + o openvms: Remove pre-processors for Windows [40] + o parse_proxy: use the URL parser API [72] + o parsedate: disabled on CURL_DISABLE_PARSEDATE + o pingpong: disable more when no pingpong protocols are enabled + o polarssl_threadlock: remove conditionally unused code [22] + o progress: acknowledge CURL_DISABLE_PROGRESS_METER [78] + o proxy: acknowledge DISABLE_PROXY more + o resolve: apply Happy Eyeballs philosophy to parallel c-ares queries [3] + o revert "multi: support verbose conncache closure handle" [69] + o sasl: Don't send authcid as authzid for the PLAIN mechanism as per RFC 4616 + o sasl: only enable if there's a protocol enabled using it + o scripts: fix typos + o singleipconnect: show port in the verbose "Trying ..." message + o smtp: fix compiler warning [15] + o socks5: user name and passwords must be shorter than 256 [8] + o socks: fix error message + o socksd: new SOCKS 4+5 server for tests [31] + o spnego_gssapi: fix return code on gss_init_sec_context() failure [53] + o ssh-libssh: remove unused variable [83] + o ssh: define USE_SSH if SSH is enabled (any backend) [57] + o ssh: move variable declaration to where it's used [83] + o test1002: correct the name + o test2100: Fix typos in test description + o tests/server/util: fix Windows Unicode build [21] + o tests: Run global cleanup at end of tests [29] + o tests: make Impacket (SMB server) Python 3 compatible [11] + o tool_cb_wrt: fix bad-function-cast warning [5] + o tool_formparse: remove redundant assignment [83] + o tool_help: Warn if curl and libcurl versions do not match [28] + o tool_help: include for strcasecmp [4] + o transfer: fix LGTM alert "Comparison is always true" [14] + o travis: add an osx http-only build [80] + o travis: allow builds on branches named "ci" + o travis: install dependencies only when needed [24] + o travis: update some builds do Xenial [30] + o travis: updated mesalink builds [35] + o url: always clone the CUROPT_CURLU handle [26] + o url: convert the zone id from a IPv6 URL to correct scope id [89] + o urlapi: add CURLUPART_ZONEID to set and get [59] + o urlapi: increase supported scheme length to 40 bytes [84] + o urlapi: require a non-zero host name length when parsing URL [73] + o urlapi: stricter CURLUPART_PORT parsing [33] + o urlapi: strip off zone id from numerical IPv6 addresses [49] + o urlapi: urlencode characters above 0x7f correctly [9] + o vauth/cleartext: update the PLAIN login to match RFC 4616 [27] + o vauth/oauth2: Fix OAUTHBEARER token generation [6] + o vauth: Fix incorrect function description for Curl_auth_user_contains_domain [68] + o vtls: fix potential ssl_buffer stack overflow [76] + o wildcard: disable from build when FTP isn't present + o winbuild: Support MultiSSL builds [34] + o xattr: skip unittest on unsupported platforms [20] + +This release includes the following known bugs: + + o see docs/KNOWN_BUGS (https://curl.haxx.se/docs/knownbugs.html) + +This release would not have looked like this without help, code, reports and +advice from friends like these: + + Aron Bergman, Brad Spencer, cclauss on github, Dan Fandrich, + Daniel Gustafsson, Daniel Stenberg, Eli Schwartz, Even Rouault, + Frank Gevaerts, Gisle Vanem, GitYuanQu on github, Guy Poizat, Isaiah Norton, + Jakub Zakrzewski, Jan Ehrhardt, Jeroen Ooms, Jonathan Cardoso Machado, + Jonathan Moerman, Joombalaya on github, Kamil Dudka, Kristoffer Gleditsch, + l00p3r on hackerone, Leonardo Taccari, Marcel Raad, Mert Yazıcıoğlu, + nevv on HackerOne/curl, niner on github, Olen Andoni, Omar Ramadan, + Paolo Mossino, Patrick Monnerat, Po-Chuan Hsieh, Poul T Lomholt, Ray Satiro, + Reed Loden, Ricardo Gomes, Ricky Leverence, Rikard Falkeborn, Roy Bellingan, + Simon Warta, Steve Holme, Taiyu Len, Tim Rühsen, Tom van der Woerdt, + Tseng Jun, Viktor Szakats, Wenchao Li, Wyatt O'Day, XmiliaH on github, + Yiming Jing, + (50 contributors) + + Thanks! (and sorry if I forgot to mention someone) + +References to bug reports and discussions on issues: + + [1] = https://curl.haxx.se/bug/?i=3709 + [2] = https://curl.haxx.se/bug/?i=3707 + [3] = https://curl.haxx.se/bug/?i=3699 + [4] = https://curl.haxx.se/bug/?i=3715 + [5] = https://curl.haxx.se/bug/?i=3718 + [6] = https://curl.haxx.se/bug/?i=2487 + [7] = https://curl.haxx.se/bug/?i=3724 + [8] = https://curl.haxx.se/bug/?i=3737 + [9] = https://curl.haxx.se/bug/?i=3741 + [10] = https://curl.haxx.se/bug/?i=3651 + [11] = https://curl.haxx.se/bug/?i=3731 + [12] = https://curl.haxx.se/bug/?i=3736 + [13] = https://curl.haxx.se/bug/?i=3723 + [14] = https://curl.haxx.se/bug/?i=3732 + [15] = https://curl.haxx.se/bug/?i=3729 + [16] = https://curl.haxx.se/bug/?i=3720 + [17] = https://curl.haxx.se/bug/?i=3738 + [18] = https://curl.haxx.se/bug/?i=3744 + [19] = https://curl.haxx.se/bug/?i=3743 + [20] = https://curl.haxx.se/bug/?i=3759 + [21] = https://curl.haxx.se/bug/?i=3758 + [22] = https://curl.haxx.se/bug/?i=3739 + [23] = https://curl.haxx.se/bug/?i=3725 + [24] = https://curl.haxx.se/bug/?i=3721 + [25] = https://curl.haxx.se/bug/?i=3654 + [26] = https://curl.haxx.se/bug/?i=3753 + [27] = https://curl.haxx.se/bug/?i=3757 + [28] = https://curl.haxx.se/bug/?i=3774 + [29] = https://curl.haxx.se/bug/?i=3783 + [30] = https://curl.haxx.se/bug/?i=3777 + [31] = https://curl.haxx.se/bug/?i=3752 + [32] = https://curl.haxx.se/bug/?i=3713 + [33] = https://curl.haxx.se/bug/?i=3762 + [34] = https://curl.haxx.se/bug/?i=3772 + [35] = https://curl.haxx.se/bug/?i=3823 + [36] = https://curl.haxx.se/bug/?i=3750 + [37] = https://curl.haxx.se/bug/?i=3782 + [38] = https://curl.haxx.se/bug/?i=3717 + [39] = https://curl.haxx.se/mail/lib-2019-04/0052.html + [40] = https://curl.haxx.se/bug/?i=3768 + [41] = https://curl.haxx.se/bug/?i=3813 + [42] = https://curl.haxx.se/bug/?i=3820 + [43] = https://curl.haxx.se/bug/?i=3808 + [44] = https://curl.haxx.se/bug/?i=3805 + [45] = https://curl.haxx.se/bug/?i=3809 + [46] = https://curl.haxx.se/bug/?i=3769 + [47] = https://curl.haxx.se/bug/?i=3801 + [48] = https://curl.haxx.se/bug/?i=3488 + [49] = https://curl.haxx.se/bug/?i=3817 + [50] = https://curl.haxx.se/bug/?i=3833 + [51] = https://curl.haxx.se/bug/?i=3829 + [52] = https://curl.haxx.se/bug/?i=3537 + [53] = https://curl.haxx.se/bug/?i=3726 + [54] = https://curl.haxx.se/bug/?i=3570 + [55] = https://curl.haxx.se/bug/?i=3771 + [56] = https://curl.haxx.se/bug/?i=3807 + [57] = https://curl.haxx.se/bug/?i=3846 + [58] = https://curl.haxx.se/bug/?i=3838 + [59] = https://curl.haxx.se/bug/?i=3834 + [60] = https://curl.haxx.se/bug/?i=3837 + [61] = https://curl.haxx.se/bug/?i=3869 + [62] = https://curl.haxx.se/bug/?i=3818 + [63] = https://curl.haxx.se/bug/?i=3866 + [64] = https://curl.haxx.se/bug/?i=3867 + [65] = https://curl.haxx.se/bug/?i=3861 + [66] = https://curl.haxx.se/bug/?i=3850 + [67] = https://curl.haxx.se/bug/?i=3862 + [68] = https://curl.haxx.se/bug/?i=3860 + [69] = https://curl.haxx.se/bug/?i=3856 + [70] = https://curl.haxx.se/bug/?i=3858 + [71] = https://curl.haxx.se/bug/?i=3885 + [72] = https://curl.haxx.se/bug/?i=3878 + [73] = https://curl.haxx.se/bug/?i=3880 + [74] = https://curl.haxx.se/bug/?i=3824 + [75] = https://curl.haxx.se/bug/?i=3711 + [76] = https://curl.haxx.se/bug/?i=3863 + [77] = https://curl.haxx.se/bug/?i=3894 + [78] = https://curl.haxx.se/bug/?i=3844 + [79] = https://curl.haxx.se/bug/?i=3895 + [80] = https://curl.haxx.se/bug/?i=3887 + [81] = https://curl.haxx.se/bug/?i=3876 + [82] = https://curl.haxx.se/docs/CVE-2019-5436.html + [83] = https://curl.haxx.se/bug/?i=3873 + [84] = https://curl.haxx.se/bug/?i=3905 + [85] = https://curl.haxx.se/bug/?i=3892 + [86] = https://curl.haxx.se/bug/?i=3906 + [87] = https://curl.haxx.se/docs/CVE-2019-5435.html + [88] = https://curl.haxx.se/bug/?i=3908 + [89] = https://curl.haxx.se/bug/?i=3902 diff --git a/bin/curl/bin/curl-ca-bundle.crt b/bin/curl/bin/curl-ca-bundle.crt new file mode 100644 index 00000000..8e92f772 --- /dev/null +++ b/bin/curl/bin/curl-ca-bundle.crt @@ -0,0 +1,3507 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Wed May 15 03:12:09 2019 GMT +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.27. +## SHA256: 61eaa79ac46d923f2f74dfe401189424e96fa8736102b47ba2cdb4ea19af2cc8 +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +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 +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +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 +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl +OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV +MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF +JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G3 +================================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y +olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t +x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy +EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K +Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur +mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 +1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp +07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo +FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE +41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu +yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq +KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 +v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA +8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b +8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r +mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq +1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI +JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV +tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= +-----END CERTIFICATE----- + +Staat der Nederlanden EV Root CA +================================ +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M +MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl +cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk +SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW +O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r +0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 +Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV +XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr +08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV +0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd +74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx +fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa +ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu +c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq +5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN +b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN +f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi +5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 +WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK +DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy +eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +Certinomis - Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg +LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx +EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD +ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos +P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo +d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap +z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 +8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x +RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE +6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t +FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV +PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH +i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj +YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I +6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV +WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw +Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX +lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ +y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 +Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng +DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi +I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM +cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr +hkIGuUE= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +LuxTrust Global Root 2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +TrustCor RootCert CA-1 +====================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP +MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig +U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx +MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu +YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe +VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy +dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq +jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 +pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 +JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h +gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw +/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j +BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 +mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C +qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P +3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +TrustCor RootCert CA-2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TrustCor ECA-1 +============== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP +MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig +U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw +N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 +MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y +IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR +MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 +xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc +p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ +fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj +YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL +f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF +AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u +/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs +J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC +jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM +BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x +MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw +MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM +LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C +Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 +P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge +oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp +k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z +fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ +gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 +UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 +1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s +bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr +dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf +ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl +u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq +erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj +MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ +vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI +Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y +wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG +EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv +b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG +A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx +9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r +aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW +r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM +LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly +4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr +06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om +3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu +JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM +BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv +fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm +ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b +gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq +4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr +tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo +pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0 +sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql +CFF1pkgl +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG +EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv +b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG +A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk +k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo +7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI +m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm +dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu +ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz +cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl +aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy +5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM +BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ ++YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw +c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da +WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r +n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu +Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ +7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs +gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld +o/DUhgkC +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU +Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej +QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP +0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0 +glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa +KaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa +6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj +QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV +2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI +N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x +zPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +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 +dBb9HxEGmpv0 +-----END CERTIFICATE----- diff --git a/bin/curl/bin/curl.exe b/bin/curl/bin/curl.exe new file mode 100644 index 0000000000000000000000000000000000000000..69277cd51d349f177b2bfe82b8d9472eb50258b4 GIT binary patch literal 4119672 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 z

    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

    wSsP> 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

    FIN0f1j zverbg8XselsLGnPigp>%I>GNW`2QPR`wheMF9_T+mRm9<3kbUbYpLZvVgf?vTV)^* z{nQy{u%gQ;0h{XXbxV;&w{U8dLe!OK@Lj_-4|7X~1IWtpO~{m-$!pCv6=F5&oo(y*Mrmw(7uQqs=ogH#GgpOC6?Vt z@;=*Y#3+49Xu9Ha7##5E14~prhvw!BKNqdDh}#I2kNVWqd=x@sVgv^`^V1h z*L?=CENLNH8cEnO$uZq!Gl3`=g@InVqeTSXIF3@cVN|yJ?A`&%7O}()QzFRt1_N4G zlc)@Rhb0iuSK4$YQ^a+=v2{M zz=-J;2dONIEeIeF-|yWG=ts0_uGExhHN6d!{^iL?hqoH5CUL7qc{gt9!))%HJ-&Ts#l@)r{Yj-cG{kmb zXW`=qXjtX7khh;qUY^Nvn?cY%zz)@M*Bt5^g?1$t2vrbPnk#pQkCqPUJ+H_IDia$? zDk~$Za`mGg>qV817qwo+pkGn>wr!0*K-o(`GWt_b$jWY&bee|C(7}TxcN6AEQT4nc z%IwMqO~peenQc^nYwK?~8dCvyFCi9+21XWLwn=q`{Kqt_squrabghP6xr;g+L|ee9 zcU@UhKF+c~WNPXf(|U5Mjh$Wn2c{21`%I(%#|R9T{Q2q)FOU0iq3t~5!|KzsU%L7w zbB)TTtG$afYfH+L2ycxe6>O7s zSFtuFi9qT#&6Mw@irRl?Sd=Fk(sG@^RX5eaGej z{~q|qugwMA1wTn1U$HZx&i7Zx52&iCW^%q~S)ocg7Q;2OLf`7le5>0!iA=(I%H;FT z%(uFK!r%Ek^1PS5sT2}StY*+Zs+6PfPa-em9F~%ELtRpG$qc}Pg?JdSsHd)nuUFk! z4~1~yo|=g@ior#6)i@;&5l&2!r#!w3Ok0CTdv6B>LNUR*>E^^|2-a)W8L^IYguqiJI5?`#QH zK0B+xSs$Ow-f+f0=7e_=Bj`L^xg|U>azM)j8QhFF=4h!>AMRmg(_Xc=4W#*{YOw(~ zhC3wZpjXZ)g^C89eW6mnw0iuxkTF>K*(}R>G5%f3d+9d_5kqRGuKriS*Ah&m9}d3eGE1SXZ7cXPV9U%@87s4bYxp#?Rd$o)z>jf7=3xZ& z2k+Hg;}EJs+^M27`HZ%x;-N0!Y#Po*cmfDN z)ufiZ3q{Rd;z6;QsTJ3XezfEFn3i?$PnlTNiW(cYSKHpucwvWnq(l z++Oq<-Pbcbb4`5oDc9l2Bpj#c1(A(8(*n-8tZDEMr@=;yyvaS(>k4gD;D)EdcW`Ok zP6NvXq`JT|DvJD89(@0o>3G*UN*P9e$MUJFk363xT#Z;s8GP=~8`ytAjt<24%ndL%hW zN;f%Uc#g5#M(1hdR2P%|4Nw%H+W&{RcY%+py88YTl0Xn}f-;Kts92$D4GKyGG$SFL z(L}IX#cGwRwbV;XF(X*5Oqhf)90#%W+KbwoQfs~RqIiP@l%TDOS}RH)#a`?gM+<6; z;Dz~re`}w)1p7Si^L*a-`TXYtIp^%l+H0@9_S$=|z4qGaxso(fRf>v7BQPUZoz~AnG>+EkYYRKx77^*7iu(620iwrp9gU zZAv@52{flux)=a6BK}SXJy5h~tS*O>I+s3H2(o}evNVU^(tG5N3O!RC93l|X?Mb#I z3-EJ8RxpfLV2n>=(ul@aO*(xe^J$xYJ|8{lVd+l$#Q1FYa(wJn`Jk=7(`i&$ z7bs^@UKI1Q8hADz-LH^&Bbl*$Bd@abDD#s2A~W3{E#!f1^3b2*Ylb>kcfo>H#5(?N1}%?14_B%Z}FUYd&YS z$8If&55e~l;hP_FHU0|9qY$kp!l1aCBBVnrzDc3O0noHaf7#^vap>`s=rJF}KF|?( zPB@&+`wr|=6Fj00 zddnm`*F9Q%TKJ{cl^u_Qemj46a6B`=fY9*13~vSB`Ym96%6{q2@jK_=`TKvGe&_ON zpE891&*ife>zBS?cJa$j@uFXFz>lEqEut!S!}5J-={vlAujB0=WKsGh+NkJl$-CgC z)MGc<6&LLb93wk@mP1Ij$IbJU4jW#FdRg2JV){ z$WLC?q~XM77#Sstm)9n^1Z1hs-scAKvX~dLpc9N4w!5~b9}q@p2RT%{)MJv9 zk6!Z|Fy+EoKJ-HZc03`1gytowiB$GO%~JpNZ}xv!PoUmO|1qvZakuJb4|R&mY*X}+ z(M^JXjNoh1aXWKzdTg9tkclq49X-`mSZl?(A&YE%-6E@gecjbf1xL%PYI)^8$~ryz zx<~TRFL~FfrizMB;{I)xwRzNq3YEP%ZXN_@K;n=%PCkH(i%=`Pawv3NVR4bJ5qxAf zqxO#bpYtw2JT{NwKBUgIvZ>a`{8;i%IksKkWl|M@QyA0hl*-pT2Dn|az|s2*-jh+i zvy!XO80ge2Qkylis&91|K}5$Ix?uj7w@F97Z7LeQ`G3&a)XXNJ<)iQaN=?zF5B-9T z_Yz4NO|i#|=ffs|Hb#)k0AaV9Z3=#N7UP)+yt|@w6zm@{YXF-uM=vF%PU-J@7m5Jx zl%snAdTEhZYNhn>m1u;glT!IJH8H($cYiYBWxH z2qF({9-71?6?!MnVz5=CvFx1OOhd*!_$iI<~ z*7Cw7bjT4DrrL*SG6gfJ1yBB3hl(Rz+F_RgNRtrEL=O|bX8}-gKO~M!RxSzwQm__j z^&JZaRllTGXc(GkG)w+>bxc6teNSaYUrN0|EY@ettu)O(j4G|LM3|zuN+f9Gm=0wv z-BTDMMcxaBbUMAVIfcrn9#u!Jh;)8XqbkUd05J3uP|j`viYtjeg`a-;@=lD_aCklU}2G}ViX>u|q^1;NbV@MqA17wh1qzi(n9 z{e1@*EQ-aRuVSaFSbP&^qQCh8W$jpBS&_`hzccg8l*==tGC99;7n~HQziR<9i%G9` zB!L8RNO&`LAGWeRP26DM4i~ul0N0nYYJz;J>e<7T&Nq0m71$usro(=x9FLzZYH|*o zhMdvtSHv>O2@J+)*XPZ4fFB}R_G!ueBDFpy2x@f-z+?A0W{?edDaG5C0-31ep)-QN ze=pozP%7WVR=Vp#1eQ4_DP^1B0ADG<7dXJ3GJ12ET&&>VKL^FERVu}&m)(X#+^b1a z+<)>@YJs-KO_9_(qYg(?ilRvC;D{&AfUA!xw6E{PFnKyXnw1q0l|LPstjneF4szW~a9p;TtgRRLlHPIDOwDO~ zrJ;pka>6c=E-jipze{&?Yqi+azE7)TgV57_HW*5ihAF(rBb$zzd*mS`l%Z7RBY>|+ zy$ahK=Y%DxK7D_5^%*JxTwvVkRd&tS2vPj17v3&swW0wq)Ag={RQ=$LS` z)eu&WSl8LwB@eOnk*?np?zm0e3oJA=*~-@r+ZbE^{8rj*8wH9z zL$;6E!vLb|B9{S6zaqo4z>$7O;lXV8>2D$5-*e&C~>oz*yNOmzt-3he-3yAhP3kl@&QW zWJw^Nu7GD~NIQF32Ka!|dr72~MhjEZ{jJe){L_>adtCd*>c`qG@=ee@EU8wxF0~Db zhD+yc5GoUSG1liC}(x zNl9SZm$put2u~+%ROm|+4DmzoH!U&wb#06xpRu(w?KwS~ajPr)AnsJI258%-% z-q&g0T9K^~&8m!i&~5HnMRM3o5tdX9rGk;=d$Dmd(T{I(cpmsPGix^kcEq6^0yOh( zQCn9MpZyMDrB-Fe;}!&$Eyq%$v>-@ko`8ocn_Xi9U{hGe<4-Xh{7eJr2jP5qM|ROa z!8>{w5X$DUX7#9AUUika$WB#%@Y4QOcNl@1n8KJg(sd+YL1399c|(Z6zT#lcw=wMs z*8fDk_?_IoB77!Vd4r?FcIxR8+(&}{gd*dB7i>mC;hF#6?KRtk?aaHdHU5obklcfA zzrjzt70*+6mFr2_GI4;Mhu9Qq4eNc2XGMhy052qB(g7^y3+r#&Z}$9eqGnuL05m)w zeMjmft_Eh#rXNdJwwv{aOO}#2K%V#eYIgo%>e&ys$-h|*=c6l3Hx=%DYZ2jgzJZ87 zB7aB+(M5fU!>51#`Tte^j^2^X4YNpAh8O88rOg2Y)`C~oo2M*|98%Hcqf?R`?mDl& zZ<+?bFzkd5c3XYMz4nXH6LMj;{L!$;IPHll!iVS^haB4%C>5%pKl}{B_|w_tf7-pF z`g*FpCOCa+m8rjnPni)JK81tSQ#d|7rJnz6`d8t1wmu)dg&et>AiD<0eJ%B%0H|H_ z(WD@SsvQX3Uw>DuO?m?LRAF2W+E~#Z4IThaa;bBWomna>h;73`lmuGOE$664+Aw~yo26lpR|qP18m=~3S< zlBaHtS9_V;tnAcE1ym#&eUqnS-&tPI!siFywMpZ3dPJIgnj$wmnR*h3+q>ek+Olyt zmpJ?{(OXbn9Ibg@0o1T?KJ;$z*gPg}fmA8d4Xjxf>Q7Q{H?{iQrh2RJ4mIGa&LvU} zix*C&`J1m%Bc43czl6q^MvLN0?DPWG{=HV^FHq&FR^`=?;k%}9s#UmvNVxe3dOBZO ztoop=G%>3*`emQxkJ}f6iFReL9Dm7+?qIN%`WZsFBkIA0#Eg9b!5?4mPpO6I--xB3 zZ_P}p!_8t{TjSG_+j?KzwCY2EP1c`C%eHwn1TQ!{eN}DljF7T_77dJG=-{| zQ2*|U*te}iC>QH`5Ich_JcY_FFG_yMuU1VSeef(*+=ZhyA~QzKK~#td0@i|j78kCGAT3=&rO-H-8?<^18S zvc@lC6k&L2e*}dQ!%H@JWg4tU$gJSLy+m^C2N5w&;LaxvylslVZZUN1F=ew^%l9>M zrPrkIt0z2pmjuU-zU~Gd`k~sgZfma=f(}IP<|4!AjOPDHwA`*Qq?_iXXE*dUnGo%3 zYEt6n^z3FPjfbbF*z_|!(k?v(N!ufbq!=&U za}~zoQ_PBwW=9^n6sY9c+w(g5OgzXf(wP=PigWG7-7WJ|p!Q9v=Pz^`CgT)oX2z{V z$Rd;IVVz5eiuDZ=A7t<4Pu#E8Wg2*YQ0e=BYZ4(tN9Cj2ZkKF78QK01_ZG_b`6tlo z=Dm;x!iOPB4g1?*f9vfpH|`AwYM&9EGAR6&eDqG>xE9FOhtE226(;#;*VUXa$FBo& zqGh|LEbR(NBO{_ymeQB$0V`J{C3>=HgiWX~Hz&VkgYN(I+x1^GMj9VyHv93B@YwSi z@z^ket^ll<8xC>RD%E?Esa&HXT8cu5{%l0o@ z7*1PYp%#YI7KYOnhEujVQDdD%hFo1=ixXoivYj$aUYP4XHG=lfq;a=FAgFJnQt1|X z^uh8dQ=`si+ABy<{rv&Rh+&g?z=Nm>rrgAvf65Hfj!gFje_(3Opl$s#=Om`QXFYIB z9dn|R<3e}dOLbs>>RB(tW!WzT6K*h|HX<|Mx&DWT*}jRJ|ERjzH*XmrcOuN6ywt$f*}T;Jz0k*P}K6CKc^NAE!r*aLoR?XM7W(dXRkYQbjOKEAtlt|<{+UZ2>TeTxG;cja7eKlYZ{+wE3&(rMQ2 znR>yGM0W)*o=@kxE~z&uMrq2OQ>R=o@5`N8ov54oQFoyR>Zw@=$*?3RQM^|3TjFWhqQY@T2$Mq^(2>j zj#PoHsRCJ3MY8(kWF4_Y(~k>7va(JICd72f{JkQEJ|9>leRCG640WZx-1c3yEoMdgZ8;w zee0K4i_r}WwA{Unz0^-m{H6NI7wTl#u&0-4t8@LYaqspS1>cwNd8u#fj%BW1<>F*m zr=F(J_0}yns|~jY=jur*pSMWi=QYkADLaYn!HF&|@lI|WmSVwAt|Mt`YAuGvDPgUj z10T)Z-s(5iqZ#AK2;f%-eIigPnToH8r&=1wE1e%o`#dNYD(09(Rl4tv_ zSu$7}%_V&tyTM+{5;L18TYhqTjs0pbl^Tov?$OZ3vsa3B0N&T1w{saqPJApY9p&F(u(0+SxG$~pe z-@hV;C@LjX$dPor#}*-bpxZE}X?l*QJkgISi2SP(q;@|KMJaYg8wqH9pG7(&M!{)% zvA*zs>KrAahvsy~R5L-iF^IGU@yPT)@xROhV_6%F1nk6Jn(JDg`NDJSjCdO7r%xpk*-r7J&p3Jo0-89M_h%a*FFhpG4{*Mf`{G$H+3YY`*=&*a@9WsYh_5Z>zK)S#qF-5x;(Stz z=CMx&|KSa!OMA6Um(E{kB1@v-tBvmR_nob`)PBrg8|14OdLCA~Pn)*%liM`;YFx%l zqv8s#X-n$xf#+ARmtW`NzyGxVh>Pk4{$$VJON~7xo_~AJCV-Xz>Uh z5NtPZOm{#Gx?lzAhtlj!&%aLTo7wXd9vy4+U}N0wV+&?(sS#Choo%Ut(O1?~_`6TM zc@tT<#U&GsCdFFs26;|Z_H`>*Kc?;ukiUD^3mkfJxh0JL{vQI^zFV`8k}>+;0++j2 zxoti~hji*d{B785pvlyJI+5k??PY#7ixMKEYvzzKGJN4SzWNr{(iv2H_CNz3*e|5! zV`rYRXbelzONNqy?ydf-QXZMXpV-5C748Rbt1${4Bj@cv)Eoze5~C@qFP$o668N5$ z6W<%AEvEL*G1nq=ba1!NAb+|gkDdia!7H4Bby3$5B`;ZWPsGM~1C_m$6m-UWRA_rdHlusp8uUBS-deX#;Z;rHAhRNzyBE8npw^K-Mq$+ z6652bKc7S(oI4r`zLt~RAbqTfC`=-@VPGCy4?l3%(*%-bwH&~jYE+UBJQKu2!>G7F z2^*7pRl8=GoNf2!iHnxQ*a_@(7ik;b>kY=GHdXpdwaML^9g0m6w%LpWi;{|+xaba2 zyTcn{7^ZdBQ9^mg`#^u0sDol#5aYesaWR=DWiZc^{`J-=11ntNX)C)_^5{b}ay*>p z{-uKrfx*2OrR}9qe%i{P>UX&g$7mJ@;-PPc9S+hwny|jIKa@C@%CFRLVvHfBNKxcz zjp>|CRV3b!_A5ATy}|f{eYCt}AAKt{ki|&Z!?Pk03GIWJzvAAOZ9DiXtkD;H~wcB;B3NDH?)7Oh!zwOnkQbJ_b9k%^A~ zwy|lX^A5iKbP@<#dn>Vq;&k95%avLwMx==r@mI{8i7qBn@ZDcB`I1F^*Blk!*HvI; zM4Kd>ek=%dcC>F%K_n%Y{)PTt-M2{Omi(g~G~D-92zLkl^MXDe=$=22K~BP?FZniq z!LTB$<;24kNiET@_oZd9OT*!q&~n}S^anBgy2@Lnp?eoy(e#w9nFp;?(bqY^9PQYf z9yj#FffVEdDp)56`;-M7Sx>-c%L4X4kbtww0-jO8%(8%e4vqq5^Mc%DA5>lof|{C3uA~w!n%PQ-CF(Y6o-=V#jN$)$yV^2 z|FnX?O~JX(b0dKNT`{0q;!ilJfK~P=4857?XcB2a`qkZd&-Sq z_YkR>&^St$o&v-6>()Udv^@&GEFs;`L+Vu_y*>YC#VfMnht!e{iC2P_V-3-LdCk3V zRll#pdCH92_g2hjZ znu$8SU;UikagRkRb`qjI$^~}+^Qft}z1H+It?4zKKW+8h6-g+Dt-b}3Q>&VIVdVIpD(4?#i}P7}@3Vr4>z^mmc_Wf1 zwQ7cC>sri*<{UyXKBh~w!JNinOxEmdi7EeP6{0Eo)t>*5r}wbhYV<9^Bq3e-kR=-9 z;xo}fbOzSPpM;lRvRH{B*$kZEoXYy4}&W(E|N_Bi}2W_ z)Tzg9jEi*rh#(FL7+pdtm8u)}e`{S=(*D;ZjQcmLztLRrsvFgfVKEyYZY}iWtB-d4 zrjlrb{a6YhLcRr~S_L*}q84BUUYMx0f=o!k_Pq>Sw8YyaWxjKO5L=raYn2;#s!-p* ze?`ly_}zb56+5TE;Y>frF*nI>rt#YRE+H!S7vpRvK+6;fGYX64Z?pkL9pnpYXofgv zSIdW7ot%o>a=jLs_-y3R3SlDXG7Iz?UrR*dnXYo76tDcD6H3R%{d=sZOchr!6`VS; zbCk_CiRm0wHrMDOhr!}(|K z>%4$D2e5J%$J546aFLoMyNZz>=7`NV<_Mnu8TMc?Ni)|! zuJgk0+fC*~x~B6@F`BG;eQRxawJERHPqp`H{hZs0YGwB(&7p+fwfa9DRj)?%D_h;P zwbeJF7tXgiI-YMol&*6+l}Ao=tGrC~LhxrNIT$PRufA$-uV4X(>MB2A?lEJxt^i<} zN2BD`H5I!gB0TcL5*%?|%fWsf?&p8wwz+TM^k=~3XK;w0iB~@Q)eg3gfvAbR=g#3v zeerL+rh$}`LY|kKU)4$YE5l=rpp9ecb&8Wra zKZ_9Y598iFH^g_jg)gv=g=Znf`r<1KDEj zP2(Bjt?;y!T`IY(`y6ZtXyIlrh4Rx@{!~94;;ET-!oL2RbsSDSZx05{W`OSvCVtNG zcr_gX!D7@n%&6feJ!pfiSLixiUn6pG>uLi+Ro!>G&meS0(81G(l8#x|(Ai@Cjq0~5 zZPYV071{d~27hU?p8dY{Mi16kdviTb=X`}orNt>4X^_S|oxHlPvYvH{zHrT!*ql9G zX>|VkWW7|bH~HClyuqruJ|R|U84WK?02$s-X^5xKXo43!c;Um3#0x38qGuL=u}eII z#IwXWC}y;v^OH$FSdw@3VBT>WiC~%*JtED|0}MOmb=4Fy8=!L-8h2Dj7NS025dFlC z)rx&*YKMiBDsnQ(S!UHQ;|<{Us`!|7A>YfKX8pw>+b@uONpt)d)0()hHu*XM^r$5j zlk6OLQ>618LMGKmI#1`>in&%wj*KTAmlzVmY)m!%V{Tt7Kh8;_%(%+7#%C`d5@!&q zj3tjhE|HDnfzr&ZBc1IG;zUO}FX1JgdSVB0)rk{gX4*lWFKm~5)H#aVM}r3E3})G} z3J3y%Guv^mIP8wOl0i?$9+URP>e|M^Q#!hmFaV5L=ON4QAQCSx>+0gPDqhb9PO5MJ z=cK{yTiVi3w~cu(EIShEu2T2R)SQXrMzWoBLG>M64`PICMZGmUzsc|kZ4NTSE(gP4 z0LXRq6l5qKN(6&JbT$(;D6U2846f24G`2(qS5F$8*j0$c8=p}gfZQH5wb61q&a(i<_(j*um_K3uMA$zgDPYnz|12fqq$vRsu$x^+4RGdNO@>5aqS-E9O|nKoF_JJhkbizu@2ZdhL}EjPS- z!~OPN73thn@BXDY_{og;CFRm5-!gt|%?w3D-MYSBOu3ARNL}@M?j2fR7a4QysH6hM z*w*DIbY>>JK%w_$X4kZ4nm+bYe;d@!;d}9QX2g2Bwtvz#90=4$>Q3AcsXHl%3_l4Y zA+GuQ{029!KAHHF2Rtu#kc6FP3E6wMmFR2K%=!w!ae&~qX1w|F)V4v9g<}eZt1pR? z6L46$4qrSQJpXH;e=((2M(W}eXoW`VVjCjE35kJ5tj_aK1+`O26uX~q(2JpgiUowP zCwv>eQVF2G{Hc)u! z)D0kX*Q!Xj42?Y|pK8r`I$p0$$~lqIt~IfZi_1WcvBk}>90Q{+NW?I#M7SfjD-%O- zyYm9exx~0!la9ZPc~bTesoo}qdsVUZ{NKR;ZC(`_R&xldcZS#aQsS@V!JR>7=y&2( z&Ck~9&q#0bm)}Bv!M2ko8ApCYDvVi#1pckk)UmtpU(W%U;%b)hsj0xVqn1;{;H4w} zZ>IvDU*#{ZLtLkNccivg%{vy|VN#Rwv}q=hz6bK9PB!0T4L*lb!5dEs+J|NwVMfwC zsy>HqKmnwvw-lKh3_*r?G%T88e4o7&HnB9F9668Os;zj9VyWcla>Li5i_$$6Tz(6) z*Ys}-^Mm&D+%)9dN?Vw6)EA~0pTRsr8ivC69;@`-9t|fL@@d<3(+5b=HY=*rrqzA6 zEt)-=po^BR!s78~NR;ybzbgCgEqgCdGk}9i!}(v>?<&}TjBaMXAZ=&BbtFZXD*hL1vCgtNqrV&B32vmebk6=* z21YLYU!FhQOYiPE`{LZ;D>RGBohDHA-lOy#ew(2)&M*%Ao~`w;bt4NP-}2H-svcA! zslQhiToRD@;BXJ(@8i6|2oC!~z-fC+20aCT^0J-tJA}Np9**}KF}~ZYfZu8fae@z3 zaAGs|BrniYUE&v7iHl5qx)rZHvV9$hdJg@!5YaDr=WD!eraajuy7f|MUo%>#>sMK& ztX63U@TtW9*`JY<#GM9$6Fgx|r1M%rYzyElMwvwl&PQ)(SBa@YiQa*a+Em*&V#wfc zWqGq*qtw*p=U#edt>>D}bIm3?kCZtvJ2F6;gZPHeVTuFJ7iMQbl}m3R)t6sMC4m53j>(#kJ2Q*rxkna<>B z-+h?7(3i3C?a{5;7U|G>%}Wo6`ALp=GQmA4wQT@y5B;=F>YsSjdek76k0@JfY!xX! zDBHVt{QBR7*Z$vx7oNXi>&D?RX^hrhOSN9drdP_TKHI@iV;g6RQ;OBapGwI-Z??I! z2=#_z^G#cytc-L%PrmS+U8HN3G00L;f^D9@)nc!BUymNr$JhVTsdRowvec#;EXN{U zduc#MtexKM;s)CQy{M?h*-lzKQ3zk{mp15pd_8;jq0)z}YOyGO*h$4V(bTwUm(Qx*Qtj#ycd2W6lx@eted36z1Cw-a-fO zt7Y(B3EF^X+cvY^whdbWrPek3%Ywa~^utNeF6f6jZlMXX*VpqcO$V{pINi((UoO|Y z*>)1UvG3+F)9fW}Ez<^5v|+$OpF2=K%@SsZ<7yf_W({I6r&n2owSd#=LYNiGVl>J-egINNhxz;ZbMv-NLjOT z{yq+q2{Tj04*^8D0sTgB`a;QbS9ALNGNJ5y^R2tf`hsOX_HggzXUt)KG)_jw_;V)@ zy=<}4rp(5NJT(Kp4l(dkLumWK@*FxeD-rP|GP>qX>A75-H}PH-GWYfT`mnO}D%*1s z|FZH)7Vtbw@H0zA#o+O;LD9_82E9L^_YfFkm{R#Qou)}ce-bFW9~$o%HX7)Z$c%Ri z=}#wp;^nO9P-Mw}@Zm3-Kw1-Qx{55-^8=mP9nrT)Y)b%}+DahN8sY|bz4T>GiwUj> zsxNZ~p*e^S8jFkt{F_D-#~}jtXI=*LS^8?+jsx56e5pmfs-?5-Q75%w@+_!TxzaL? zS!t;&S1LZ9a@!zyZ?|m`v>{)CV)#&0SF&}r+9x@M8KW*DLw}i%UVN#x4&M#F$hjqO zJsez>=yw@Zg&W21+!h*!-FzKk8ch6Yqtm8gyC`x+&-<~+0`p}QXI-Km0zc@+jW}9- zarf^XkbxnPxd0AZRP&J8g(m#)tEDFVhu(K?!rn{Nn_g%i^WSK`8%gVIuNEzaF#0i( z5R2=l>R!U`Q#19DjA7nD*!E!1@3i;F7_k4|Ht%+h8BIv0G2Skd^URQrDOmC?AwrX%V!yQ6|m4gD_I`yuGSl<`~I9dg?O7_GNo)YmnGg4J?f z%8cVc-YiKfr>0kG%4a61uP|j84Fmw}Ml&39mW|%Hj12~0>=kQVDOAxK_7!bToT&_8 z8BTIFHb9jQygK9eviX)f-^7r|Jed0q80N5+W&4GJs4_9$^H;d$%D0axY`@mCeJFWU zk=P^HaUuMi?$#%{5;ZG7fM&LJB2&-8d5faGx#pVbXBlEqZ(_9JUtEjD@rS= z0+G($c!~QrO9I9x-h2y>NSBkW)wmPwR)E+0=jvde`(TUE+ygjWgNVpZQ*0*sP0G;b z*E~p_-BpOObuD&{g~W(-zQdx$*2;k$;z{E-3#Wu>-u#RRjsFjb^&R(dG__WUY$L*LAlOY`2; zjzNk20F$z!;X-SUCr)$CF;>md(O2&<4=elnMXs`I41ws0mXj2Q^y)BD`nsJedsi4m zGpJe4J-eJpOTx&ntHj3rBb{=TB!A1rzW+*a5lYEyn-cU{%cC}_cz6bX^3jPG=}r%4 z?gQhqeb6nQ(T~dAN>L!+3I~ev!6!rQax9zOd_q9TaUr95nTspq>HC!5OIJT{!%XZk z^@*%VFOdum#Mu?&-+WR660-Ju1+v~p#0nc;+4NOeYyegzj*qNtt4KecT)jT|;ox}< zk(G(c^n2mgLCuksQwJbw!|&ZP)#*%iOQt#*%TzbjH00zCx_bi1gbe}dUi+d*=NfB! zF#RiPkHoPex7cx8FxiD1LefVqX@R9ixrm{naF-0Xpm1|~lc^TUZ!y;T6!)uf*1(zQ z)qv23{h5n&4AqvO1^X>ob84`_^PaR32!jquve?ArNDxl!(pNO=Wi}zv{%J$v)GFnu zXg@yI*F7U_GXFYBPF4b^q_z)=bp4iioASwQzxUXDK55pF)dlN;*G1>d%^LPdp<(aZ zmk?lDS*R(HBVB7qlKWw)!%Mu!{esAApXT`u8tzYM^=EO=hI z&3lL$TcRs_CHN{+1?YYy-n2aiqsBMqZlDg@6&8D7qk3x0zg=_)hP{C4v(-uKP)PcN z!T?~F5U)Yl+#XXoHcnziB){Z;vwjn{aSa_nW>?Jj=Qk*D|pkMdzU zG}gDY>?21L!kQdkx|8i>^l5!Hm+djh)jc!pVqWvneTm9_POJa=iyj^@ARqnpiAtN; zBk~aH+sOk!i@OFPT|RmxF=h!4-PrDjK8(kGHG2a`zg$qzw>kZ1$J^@&)qPo9Hq-q! z?^DxjacAH2MwRzybxmcJYTTTD%6l>At*WW1s*+gnUfgV3%AKP$vlCr4qto+-@Y!k4 z=27h;=!N=oy8bll&o~iO6lPELaJIi1Vwo2F##PR%Y1S?)*SNhi3G#--O>fBmG3?0r z_t!@~Ss^nsAwERh!iR4E7;ZaQA%&wq1(2vbxjG* z%!uiy&k-mdap82cO!Rja^ltErleHR$en*8bg?sFLxnVqN;mwqMvVhryJ*vfnUDNXtH#)vKK zW3$uAy8V=y z!H0J;L-J3V#r_8v0c94EN<0Vsw+opQhRn`K|M?}-u)C}(s@sWvw?Ktuj&1s#m*RMT zFb@3rGc`6J+DW;>&Srn%?@$cDN#hL7l;_OBMbY~ZAs z#Y}-l(+f0WG1upu@ObG3&}dq{%HkQ)Xj(|4Zbzf;B8{dw8uhi*S_Y16nscN-@P!kS zqW)eBD10QKhwfkY@Ol5uf*<-%3ihYZ2)^+%8mBu+k=8iVX9iy)1b0d_&Q<5Aai+~8 zlE#@%<9yA9gpD(u#yL|Vndv2>@9;!)y3Az7gmvoDjwtOG87(5CFFfyDy2n1GC<|e6 zlT=aR`iU9G<^O*)0~-B)E(Y9r?ZWxq0;jOtl17tz08-nK@Bb2sGQ+0I%H@LU4ooxh zo9LI3&LgWex4EW1?q4xKUTDC$A2JUcu+uQbaop1e_wZgX8t^pk;c47MLSrAM(gpU3 z^@aSSVmR1NAK}I>xmOQfXi*!mq&uZDAN}PQC0?e%+pIetW0Z-f=grsjf*T!>A^2C= z5}Y-SH2$>uwbcz&qvlm6^JGCuQF8zX8hPd1Q_bn_b%F|}i&SI}qEK!lmAx;Ui=0la z$TkVSe@4BQTBk#d^qSPRy(3-!Bz^XM{uoX6u|%TBHKRFwd__atKey?BkvQL?;COlg zWeuO#5Ko`iBnqe&;8Br1N3s5~56|W!A6^8KVi>b$ z@KomZQ8Qx_aL9SPxA5ShA|S4+IS${YQ-E>5r3tqlhzYdgcPM~!$#s$yWh1OZe`+UA zg#SU3hkJmSkKQ#CmJkQLN*E(1hbD0o+{=EwX>@d!Czvu-Y;!=Fyd3_Jgk@{`tK7rU zJZdBWybK3}Bh6^^C&W<)kA&Sc4sBqA0hcp9iDBXC=15mUvwfU?$C3EjNH{+@_>OR4 zJe1PlPh$qLQq1p8QqJN6ua2^?a@QG%eE!LbDK0wuq2 zMv0PyK&mMIR5^cbsHs+KN{!?$1jM(F80JQ!io4IUV6TgWJy-nst3J!TOPVoxr3CCaK5`HKCfT zvF5e8X~EXOtuIUax$0Pv&L(3md0F{is6SKTNax?gj9MhwHbCE4TO&muVQiy1uLR#a z!D*+xw;A`Ph#SZgOB;=x8XEzpfNs8RVKIDBYH8xN=rr3o! z^%++FMxDq#1x}x)&%PGx`9_5n1z-yc3^PZGGzS*GKjG=kwuG2j+}Q1}Kd{El7~c4W z`Cnx59&zpAvfi98b4cu%u0i8;E<5#S&>*KYwWhC_56v}PV)r0QF^4Pgq?><-^XK$) z;W&Ei=T&WUw{(t|KHkR9D;Ph+bwP3bgftpHy^{*JE8*a$GKd zSM>gUixyK`{cP>9Xc=!%N9%x*NB~CS!idOJ3VO{O$@a$9(7P53O6Igh|EH9HvYAAw zr~20?0kw5?B?qH4KsLV8J|y__tsIoONfD_(??~GV%^*{0SaJkyRF`_X(uJ4WK?~3_ zivXRsH;p019nB_$NrgCa`j<1PQDLd&q!hFCyA+yknWf%?-QE9BmPUQTEH}TZ@3kG{>E3Ti*-qQLzUeEg1RkI#AqCa{O=RcvIt0S#Bf5+uT zo=nz;q2iNSRN@fYjiYf-C2;e1ay@E`T%2u){e-(__)|!Y*DYL#GSh!~B4VeYrK#*u z3F05aGxu(P`Q!AKuFy6LZF5DOq9PWnh(`b>qx^J>6|pCRjRgfd-=cWP&LauhM+yC6 zU>Ub+KdY?%fWc{Uu*5QjItKI8yQNKFTFR(Wn(~J9QPx<<@O>S3h<^Mu`$7%d!z)<7 z^Wco}alqb>vxHo`)n|VUmTV zBoFPB{ngE|?gw9I|M7eRoPM!vKh-nGuXcp>mrShKP~r3~<3>Ca zW3*`=HM%WxWxehX${c~05YyC@t-hMInrWHA7@#8)-Cq<0|Du^(-`#}>3G$m*!_~zY zz?jO=cUorZY>g%}*&|3wd^GoD^-X{4jSJJ1g#1 zch;q*2G|h%7(|d2&i9%I$4nA9^k!}$U-%fWQZYojx_Ha}l0Rdg5|A5uA?m({?D&y- z=pvlVIJ`)%9RS)_?C({s?vMLhU=`w?;8bGE3~f3I@7%%qs#Qr$2Jr^hklRZu&reZ| z6wCzTmH+Z8Kk&x9AL;7W_C^)W(wYu5A!tC_^tZ)m>v{)Y%>T%}b`43NrsWI&_5FSR z%c_15;jf7+icJcC6ucW^JBa#fg-tyXDqX!Gq3dtER`7x`E{3I7&ZvlV{#>60ZQc@L z+Qa-OC&N(&hi|0U`1d7w^Gz>V`A+I@)sf*l>*yMTD=#rXp3GAr6JUO*yeq^(?OviGvspqoR>gWmIC+I+DX0mSUrfp>2HoCCBbnQ~;!8MXD z{(S-!zo5FiwQ^g2lT%luHVt?_U|U!RMOh`Y;cc+5vr^d<=S#nAul1^T5*Rp7o0&Tv zOBKYl!u&Qij?wXGWE$9nQ2P9PHY|PC!?G|rf9P?EdX9k%OHN?GZK`blfZ$rEoDm_i z$MUz;|F-q>O-ETj_x$T@=8;}USC6Egg5kU|&&DgC%f6;p-;km^SI!%cfSEld6fgo; z5-^;?mVlXhG$1P$CI(!y&G~j!(2j7)hOA z;HHgselSfeo`Ymy`-ccl-g3C*NS(JKYb#yTw$iXtl=vJ+Ixi!3Kz43Nc51@~vV&xV zsO%PfmdD$sxmgOnq^QcZUS%_M8uLV?OHwJj*5&6y=gG3rn>UfxyE}#*MP^c^?Me1) zJ#3=YfSqH@8<4D0HYFhD)LIOTcH+|9{;qA|_Oi`4Hy?})A2&+E*5s{(?W<^G?3xfb zdbETCHw}gqFy`3+9nx#L=9VKw-d;W4;I;S#>DtP`u*J(Pq68aK=1$Xa!kn#Zt8NIx zsrBTugyBsNlUm-Ln5rI?S}<}zVh?(mXS0mpYpPnGQ<0C|ih>5o&Yh-qNZZzfO^AQD ztS)$wylB};V0|_JyZK*U^$;&Ux#>9zs3z$u#jtMSQX<#B*6*hDWSYxkK~P{ZxevX@CQYBxu-4(-hNB0 ze*2vaDmI5Z4b@^3bVA33=kMUX&ry9QC8;&+)!D95`$YMXO}{4mHNlnH3s`s&Z;MyC zft>M(*C)OT2ZN2dVSt>U8{)2leJ#!kKUA3td2Xe9H_r{hTEOdc5-4-)N|FZ_0pI7r z@P@Zht(Ep#hS!;3mN2RmMjWACK*!7{0@BPh@3#5&FLMlX)I^r}=1<#?II)M0EI5x- zY5<_j(a9^3cn7fxA6AkLs!y^J`4>n2<%V1S;Qb>seUSU)Vqw3K(MRPDn{wFlqp&Tj z^Es|PH6&p1F$A3|S6%sgG*r?(b!$e?+o-NEVDNq><=0M@Yon5(4<>Ed#xa8Lwr3 zApn`^k}&eMLZnIYr7kiVM)tbMLD-oxQ)wsL6=BR>g&0jSb6*TGO7#h&FI$@JL8_2O zBLFMXOtdY`{k1}jI(3d^SJVq*rdte$P!Mw~1{3S`ZmLGQ4Qhl;eseAU7{cpUiZimE z>|_S0jjYerVHAx8o12MK{jg^zI9 z42X1TnZ%M~HnFXlBVJXps3#p}T^A9lTR4vR72&x(4cc&*IZVNMADoI`)YK-YvaAH! zBF!JiGc7aJuVz42sJXFy64bmE2qmI$&M~%PchJ?w(Rr?p5V0ybfA`}eoicQ>o0y@< zOOhivKA)`Su(~IP@R-AlLgyeL)wx7S-qpHRDa1Y`AletLC7JecB*r=wI`%0y3*WU2 zA0}{-2TvcEPkwk%`)@t53~Wow&jD$Y>? zB6D~y1npA+6E=*q6_wqw(h+(t&4o(-+Oow*Goqvyv0&T zdno{yEgp(Nj?i5LMni<|Frixux_`|@E?Tx0QxsRmklc%C$@oU)#f$8m-{HoFZO3R{ zS@R(e_-UP#P?4$6v}U4NMR2wyGWAs&gywry0g+~A3wIB8O7fV&b6$%v`KURy^d=?t0+&(2INCHC8{IU ztrYz{MLQ}SR7CH0K+7Fzf&%NSyCrskxObxhH6}z2T1{{}v@9{=-^k zlu1V&4Fw>_AT;~ePrG1$ZJ%ur6JG|2i-D+`U-#D?R9IT@no9^;sl+tpmN=fkwd`yk z=U+OiwVVLh>^c>OoZU6hju4LS?-r?lL52>%|C|i6cACEx<-gN!oBp=reu|6x58Fy% zOrO{IvKN{1p^DvuBf>q3M2maXXW#~Iy%TDc+feq|TTzS4rrG>5l^XuduUCRL-zIl$ zW7fwT*SAKdtRCB=7C3y_l*ofO3>WOhBPu&zn7?nBKAu`#*_O7f>K(0(J#$}TLbQz; z@KfGkt~4)liztqsH4dgJq>raQiqHKF&RtkY{F;Op z^;HhzPSf52@jhGHl1Y7@v-hi+0DXvm25eykPPK^p4~RIeV_svjT@_hqJH?sHv8jGQ z(bVM!d-W(?<|@3eJRF8SwpTA<>DPMStR1|AsH!k(nv$>hW=WqM^;oiFtuej7ZPYDcfULLrrQf>WdASJeg*4^}OEIb2SMn+1(Slx-@`; z^9_}%POSIOwOS**pa!h$A%xQk98G!A8_bT(t6uM0yU|r%JL-sv6PJt_uy}ZHZYXH; zUbXntO7;m<47fo$dyP-D65IET^}aPQmiqIgDav)~fOyIfLVosC^R70nwk?`Mdy3x> zy4QH5$a@c;@dfwuKFE5^MSHU+c$Lq4nd*#|V%{VBJblUN`+oG;K<@*NsIT{WgA=^x z-;zeH@&yttQ7L82tNHRy^COPkJs0v@o1Zo!;Yld9pGHP)nm^NwEG8+W6EJ`ygN%D)7Anf9aL=?3Z}WYIz@d@Y+E=V2t1G%Bo1$ z$rjW(sMiHmFx5GVpzP87DVGM!k0KBLW{`3=Etc8p`*6^RfiM%#p`TmaI_ikjUm|)x zjQ7taY1;+K53AabOR9Z;L^dxoqY`AsRj_K2*B@<|f^d}(J{m#ZfEKG&XISTD4_D#K z*x?+9^0}t9aoy$dLe<8yp>jrc2nndjo|bIuaX_l4_gy^ zqFJ(Ppp=E@K`yeelNTb}=GI{)bok_9yHpq$rhD-*TjzdR7l5!Sf4HfZDlk-u@Wd`HxRBCJ0DzS5G+CBX1j4$x=*Z5py;U(&Gbd!piH-m&A%Q+U7bue@g#ZQhX2Pu@q2(0vMj zS&LjZnMc8@&-0Jw28!bMN^M9>CYs!Hjh(?jsXRY2NY@? zN&O8Ag?RcwWoG&w45#dtPbTZkRit~~QDn&syKMpwS1@J>o8p;8BW0P_v34Dg)Q);) zS6loc>2-&IOx`RQCZob8|M!3vdFUw}*yvu$dn~eP_BnVuv*=4pbP@Rh^U$XayK+julvP<-uy^d3 z2xzWVrWzePj=zHUuDi#Q(67o$pmppxOr-9-l(3E+hwHs-iN&j=I#`BDk9ls;X4X=X z0dueH*(C9Ya5*Ek<*VIx;_LB(XO2Jb=M7%ZlttN;YX{{pnUNzGEn~eySf*^wjueP0 zjx*00VFaI7C#)uFu29#ps&ID!0*!DQ*mjLl{W;kz8fjUoa|!OyO@_<3`y5h zFOse$pkqga$lG;hgJmP~78m*RV(JQ){gz_DXcy3J0X5Gx99FRkbSkzs)zwBizgbK+ zA97L3tYSce%Qw9kFvkTPUksS<0*)vKBwfJ1#efMeU`R2*a{(WMH7o)Co6sjvY_=G% zZiodK4_Jy?m!+?mqRCbH!D4{t0)AEunBf9$C>5~ZXpK%7=jKy1mP8`MDJnYtq@ zDuz~Ohw$*L3Oxx*cMB9uv%;ZyB4360?>|vbd;=k0>(Mqs_A;8>yTIi(W$(4S6GMU0GX~QtV!oi#d{bhDYvil=0y3!85|F*P43O8?OLtinKezyI|7`42(Vvu}_sSkb zG<`EX_tCov_d9qE`5+%Z_$EVX@alNl-eUfuW*9-_UidlW*Sfmww|N$-;7Z zvr~u;n_SzV-6!x3B{w)W9lKNJ{Hn6ddt?Xh6pjC-66_(_zY9p%g0A`>l%n^^sw)(@ z&3S-ZO$dcAbKLkFzPt;LwpO;C*=v7HNWAgEfcS48E}q~eK5^+tI4`j;=RXd&@k*ci zF?1<`y{0V_)H)9k^Pzw%f*%~oeB3O-`G*x8(VDe=!jVJ(Y_-|wdDFF zy(0PN9oaw7F^VM2N3Q*tY}DfSt``3gPnHouDyCxd49>108eTQoIR-#5?Huq2)8Ce7 zd>F3HleH}Gf!Xd)rC?@LmZCoU6;c#P>^k&$goGXXH^@oVwKGmw8BcMo`9@H94jjf> ze&)`R&IsB|I`NG?Az>{#ObDpvZnSZ?wsa^2w1S=E<*d<4dvd0KsC1(-*s zZ^>>Zq=>Jz5&Trv0taRPQqCMqS6=5EJdzHN=lLq;H_^1C#2h2DckUd$qYQRkwp*}= zh#~7g%bNA+)Sv5OOK$tkaNgJV1_P3R`KWeHdR=PMGpTh0x?YGawx~#RZ)(%)+!DNf z|48>Sqp8PF*0KF?`DUWB4bvKM|T#e#k*4$YouupNixZFMq<5X#=FDQe&XZBY_ zyDIJNsx-?XbZ0SqfD6CFRh836I~Uk*igS2&RxxJ{ScB+=4&v#>@OOA4e6|ap#MctB zxTxH-X#nmL{#>1W7uy^sJ4Uc>3}IE3!xAM*69Ii?Wk<79ol$a@YSfUG z^TC}{lyleE?7gJ$tKcpK8wEtV?{ZDP*i|3*Oho{Ns;A!g0DWO^whr{H*JKlAsciQ7 zdKnhc>`6oy`;(JmZllbuhPIQcny3HheTjeWg;ACSGJJU5+) ziC>AtwYfR22SvdiuKB6;l-yT$F0Py)<2fnbZ>(}_oWg44Xx)A7$mIlW|89G%H@KH& z=LTyZ+j%HV#Mby#lk+F&Mye(na{9WC?Ufbv6{zFtDvZG)qFHSWyZ8! zANp}zW`)A^{kJRIrSzY_Es4Hc@6i`gw^PP zV637Y*|WtYQkK;dZOXD;4^)UL%Z3guD$5ogR!I2w0}%SgM+Yd#lySFM3C|Ft9VBY|SwR50_djgc3 z@Op(i{UiPmJfdVaa?80mZR~^gT@k@TvD?Hwi*hr60IIVq_B{fU94?&DSvGMyRacK~ zUq+_B0#Ro$W5)-;{zPN@+5`_Mgov3I@z*fIBSInR*Ryvsc>SLcetehz3gN$_$ae^z zD_A=r{Nz4D_$n3r?+~7Cc(s-xtPl{MV-ZJ}A*>J(-i{5HYdkID^U*qz(0KaL&l>MV zrBUNmDZj+@&kiUu$L7I=neI4}`aVa_Xgp=6@oqEFQf}Pgm^M=kSnL911m@V<*2liB zkMq%M_cI&{tK%}I0#H5jgq%OXI6pAXpXu`GL%)#oKXFyN->Np=CDDg|A?IIZRiSd9 zA=)ap|Nh0w?N+MX!jlUL-`Tgo`6npIIDdwf@FFn~PakC^99_ux1kqN)+Wm?p++SNH z-@>XwLcdtT2g1clsJ9mUrYk`o`dRZF!&q+3b72Agz)}rnl;Edccg>^B5HgRHcA)DF z`8^zHeH1}&R2sGX-~#Ahlu-ZIpd#w2P6t|<0sT`0ZCXVq$-Y|**g`+FH0#u(vnRc1i% zX`s~@^FdAdx&{#R@BjekqwD5Skc%R1Zd;*VJ+5A_76TT$mVC+rglK~yx@j*%R3Ak| zf1)%(^hF{K(FBzZiMpz$gy+s1HIIN)<+TasRhs-1<(hVKwnk{dM^iB znE}1818sc0EAPqUD^>|+q;mjYRL1Ei_jM%}^pjSHk%fXDf%Rk+#-?d?si1{#S%YlP z{zAK~#`o(S-!K1Xp(7-nB)r)IYF>}h3t81_zY8@(hlPruJyz>mh=vXHp`W3Aw$g~8 zK9NSyBMcdvl+LRx5%gA&pskddT7M=4om#m~pqz!CoeGHADIKkXzC3z>>`^xnk3BmD zZ%|Txj7^*D1&DZe=GF5TYkh`+1kHgxiyclG>FG6bxQ0eNZF8#$TcmdjchD*;+T1^;`s6Y|%Z-ELF{lj}|)1zsW_QCKF zmXJ}wUpm2>?mu?7rqhRh)^tBs4mI6+BCYA>k|peBkL5pGoHCy5nogN1=n^YPW7REg z4F6&=;0_lMw}6`K0bAfEc2AEkCQGui2hc$lAof~jI5s*Q^-;ue$GahphZk^smL2I3 z$B|_?-h~F3HdAIm_bHok{4zHrK4<|dtI5iGW;dgUK8j^6E0onkq|xL2Qd#%xDA8jk ztVLPMOj&0;&_>efdgltc2u6qS)a{SS(lOFG3OLS5Uy->x4-o@7P6*aB$vQ@5nauSJ z!^0eg`Y2-fk1ZiJ_Ag-AgDeTDu}c|-+U^BIWd_5CmCdNpl@qr3~~} z9B5?*^m}OH9EFw}=)n%OK8m1!uQcN6kLyCL->xlU9eiBEdKU*;nE`#Xffi5Ca1>hP z%Cbg1lHNuK4>U8gV@LZF(3V-LwU7Dg5Oo&+g7$-;3dH{nr6WuVtD{2ht{&%qm0c?A zehL_V)3|I+n=3+QllZ0LZ1{V@W)P024-i?6JA~kDhv47-Q6R=>BgV%OD^VXsVysdc z5o0rv)`Zv7OTs4H_)&=%pTH-ui!xKzk|O8{2Kq-1v_6WUFD!t*p#b`r66jeH6?3qtd8d2NufO$}A=<>%DEIYG`AavXq&! zeq^9kmJCw}SXL}6X=UAoQjKn`k78LD7s~pcG;WgaOG;%eDl2O_GL5p78PMa4pcfnH zRtH)iMbMD~=o1Q{D#2FzrxK#DJw0vrunive2<%SGE<_&5vK zn6tsKJlSEX5B+S;YvOi@5(?GE0;;FN2_dS76j8nW63|rcv3VwmVtq`#p38F9a&HQB z^a!k^H_+ul4}Ittu2GfMig`h*K2hW?V1&i2+*+i_!sUg8x02A-sPWYQN87u=M_F9| z|5->ND7Zn{iuYKf1{6yaH4!LT4En5YFxDI1QPhH$mf}XSMM>NQSeI35(PC?rwzkr0 ztNqpsAjX7C0$#yOi+BUI`Yfvzym0Zt{@$ON=h@w)wBPUV`~Us(VtM8{GjnF<%*>fH zXU=n`%~TtcTH?|dP^hjW!?se_%`fk(j~%2qaUXfyuK(A<1d#<*$$+Ur`UsOpgq>*l zdB^}np0(ga-)SqY7yTK^eByePImEAW5Yf`B@}BuB$A^Iv>L@c^v{cy)BiLb3uR~!5 zJ@k@8J>N&YQra|8EO`yu@TuP*!%CFfu#%~aPFP6`dDFernN|^EO1c|7P;HA>lE+GO?#OypF)@}6(5scpqL(%jmGlXu+p)NIj_;ZU| zFFDi~_^5C5Q6HU0eM13iIY0%qGK2c?9O{V%^(c#4FFDj%t|~LN{*I4&U7oH76rh&> z1W+q8sGn6f(`iix^(HiF5JWFI)DQTmUzM6o1i2xPx_wKYAo@lT)XEI%ALdX`HK=D< z)OyLGj`*l=@=+g6NGqdq&2`ql>wofxIxA)(a<@7koQmz*L1JV1&mn7(VEVrH%>HH*@V z2I(bN>T;#gkpEN~F*Rs@UYL6OpScFz+TRRU5-uU3Ep<)~e-W|-{!cA_z2xv;;p4y4 z$3G&E|CT)d_yF6@$_&AVku8$CeTNE7?t`7Yd-dadHfc^j2NK8JmMy;8%K4ZqCqGGV z-zXwzDO_lgxB%SCM_O}?c9PoOEi%3PDM~kpp%?v``TwLanE5Y_oSFZ5@o(M7J~6Jp zf}T}ID%zqlcAca$ViPU?QiK0ai(fA}{O9@jTYdaT=JEe1hd+30%=A3Oj*`$4`vCHq zzD*Al7BfyuX=gT6>6OHb{yc8`Gec%j?B|zNl`pHLpsY!L!i`0KS?394DA{f)dEYxe zX;)i7$^c~bzJt-o#(h0-W2S4qZ^8DFZV)Ve87YkoWBPnT6}vFyk%fFZ!kecZV1P;m zkPTfz4fqZzuMsf4GTpD>8AO|2sWK3wJ01Cv-z&jeqkh6~M%i@ACO!RqUKyvd z@6;cIN5_wx`Ym>@3$vC>Z!5E}~TLiQ_hd%*YLsZ2taaggiJCjD71`>A9y76!)Z z$6bOE61@{Uj}@IBtu`!YF4{Iw=tX~Ka?OzjPLnG`9X)+~Y;(RF-!NeOJf1;9JNVZD zvc(UgcyAg%r50l3 z8Vgwj#FlyrO=Zq6rWuTN^T1Y7!@Gqv#5`(a%mYzeF<0A|24bq(89@pZF%oe`v6oDv zp5cSIZysX65f3Ig$}lPL$JsA6!X4?7aC}oh*C1|n zr`)R<*=`yT9QPF?NJ-PLykRP=ZC-9zx3mGwZx0{UTUTx$mR@MHNSq^!9q}zmo5d3Y zZ?;){c`JRL&7uVk(q3xc#I6h}6!2PF?OQfwb4J+tmL5sIwxU|$2#7DAVW)c zO{UJpQ}PMYR5IlDp>YC+p(csapKS0t&Ii2h12V@%5^W9*fkLPb3ys%z4l#W!hE0_p zCPyT3VkFsDQ;*5!tvHOcqVydm@(C@ZByHx6A^Dpfc1W)KorYxWJGzZl{jiC#m%cbx zfqqm#(*ZWEmF5~Wb?Gq{!&M%JJ1mBva=&+vDdQlO7;iJDHI4flmu>#tq+8vYzfjFh z_Zpl>O8bXcO)W0-GsVv9F+GOv)k~iP?%aMf+i-|Rj!)gY9>i)edAEuo^NGgiZ2O)# zHjx+lO5@G|^Q3BK1DW)H<|tF*?@+JVnG$;)hex^exVH1tvxaloubNc$tAfe+-TgWY+70}=u59*R;7fNC=htHm zaW22U&u6nI^ShkiHLJ7PW}b`qDP0%O5BL?okj);(Pw{?!J;wsOj9)Xqzwz_qz9zGyjSoZ=l7ce_?Lu-t;62}zlZp(;peCKpYM6Fz{~#{=cm#0u>TMrCTI z*TwH+euepW7Y@F{SC;(zxN`_!&o9aExBOP|`;cGXSF_n8`T6Pm=h)rArU1KXH*n>7 zz=JR2`8L0Q{+o2WfFJZ)_wxSCSkccf`-C3xKD_61LP5G4z3?48ALO@&-zI)L`6=I_ zf6L?ViRWbEuH-k{OY^&ev~7g<_u7r@^kywCbv;e8G62 zy_fUbhkCE%C)gq29nMeT!e1CzBfkJRCh;qbYvX-Cc=u3#b^PwQ{KsDf6dQ_>sib`M$eGbl_H!?sX0P`>HpY|q73Nhqwi{T_G{5{Gr0JPw zTS1<_s2eWl*E7w3djEr$z8Kw&pDsjrYQeh?@A-VrOLGJot`qtB@m+-1^E(bzpbxv9 zaGGD;hm0$JU-DDjkC*4u==~hmzCX&dgWrMZ(0v@k2+!g7UIFa8oGke9h0im9PvrL_ zehGe`@tc&%r~P?BxGKZX6@tGs{r6L>AZclnLplFcsQ_Zh$OTeI0e@GJh*roWWuGhSHvkN+%> zXI?>AaVrbnUn5-exlQ}9_f#60F6ns)zin;V>}JaR|Ks;S`~M#Ax|6Th( z{=dY#i}b;cY_^Mcy2pPjzOy{$Rbu~KqD%4r(yjdL zX1{)ycF*r+eJ2;+d$;k=i$KH!<(fkWr`%1SWSv75u6P0n9^^GAc(+sW|`o43irsK7)8ZtK<39xEO-8ppY* z&>cdHqr^k@3KTs(n%K;tcut{1$hdH?I`>ZVrI- zZOFu;*hA>BFP~_te3Ys3{EA0GYimtz?tPC|Ol04W4(w?(dqtT?o#b4TrY<>!3sg!f z$eo?nL==wXvY`@b2c>HII}qKvM(QTDP1heL=dA@Q-E!NVy=}4wO|mZem^`8hFA#@D zQ;$`+0Ij7Fw@|oaf89%a<2@3q($cZv9++bPbg3%+ScMQe30#LeDGD+#(TZw+KO7~d z9J-y6KAJwTR+8+AvkikmSg)<|7a+&QK6is=h7#D64V_NFYjrKbr%wiH`pI25b5iWE zeC)RsYYsKCdT3wLrPKEmm3OAHaS~T*q zq!(F!D#p;N-Fq1>bpc@&Q0YC(^;C`~o>G0RspmG?hT*9>AAh}#FJS{WVgXt*RHb@} zoRqy9J=;*5*%R9K9ldw&enpLqx}km^-5+Hb%;8x_!)cP7G}_zoUNhqqY;Rs{v8j^T z1_#Kq9z>PMHk7NkPF?8r*6-6^Z~cmZlQd)WPJ-#ZzM(6UCAa@;-aY-iSNnM{%jZ3p z;L{>Q`h~Bp|7bHm&z8rj=8vk);Q(INxGL9)|G2Cu)*p6+fp)M}-yS-6P8}XiJy0=R zEltIY6YK*&Jh~{ezdX&!116fBb%hSoYKv|Qw6r%KkQtWqCzm>nloSwrVk}XyLBS_h zyWjs(tsy(!72h^9n|oO{)^f@=cr|k1xxH zt`{V6Nf{H%z429rJKXJ6jGKm%(0Pj|0Ru;p|`P^VXR=IgYf>7=8B zE&CEf<7s*vcH}`h`%Kwx$l6aNdINc4eNFU!BiI1u%3buS- zG{uo9_l7`aCv~r(vSX<{Y}r4=XNNt-gIWClncmxXM=*oT#K{^P;Q z4Ga~pt{d5Ov^25B6;fyRtB0?Y{!6bG-fWMHOZqc^{|~O?`r29s2kI7LQ$;b1o#&e> z+Tr;AKNx~trP^I$Yy5uTSyQ&%Bk3$j6B2%`cjGtU}ntwo7S**v*__W{rCkFez8&Qa)hTNBEZe_DeS9B{pR{ zNmSx`p8B&T3cZ%awLFP@p9eN7ECVqus-F13n4j$KYtd{pu_ZU1H!D#1~FrJFB@4v z@vq-C$;&B^vBCgo8dDTI(@8yCVMRXJ3HLm3kHrE>Il)#@1zgl(vpXGDE0_qDIi%`i z21es|GAAeRt=Onkrr%mGqysX|++-vv=025{7{?%NkKL?s^erRY%(h^L7fqG>4;psO zxtbo2Rg~$KfnBSc;Nfot;*+C$J`kVEHtt4zIvP5;Pf%-b`Q3*y!pjW1l5b5jO|qL< zl8t|DWBX(~ZdpYWweLBw=*R~EYcxf0qU;MtkfPLWI4UO_k!*J(?DsF&adU)CDS~O- ztmdgdC$X%eT~9NUMNh`UJnwx6PcqHtVFoqMk0&bU0>zv0)HT#pL>bJ*OA%1j zCq6L7^GnNsWw zS=^<*1l%|*-jY2pFP-6U#*|nxMDOWW4SjB2pAEwuCn$h7T-f@x_iCP=vs(J16LyJ0#ze_QV z(Biv>7k&QDP(=6l(+MNe7=djQAX{AedIK%_`&nLvk@qyb&bwP@RXfxFg;a-kYRxlW zv>e7Pm}i^$>mIodCD)_KP{GzQtf1+AE$*N6NcGiS-Z|I>R0BFNwHp-jm}q(@LOuBX zKkKhL85r5C5$1|4_);=lJaQ~Iv)y(|?XjoUF6tZWhfh`ZcU%O*9Ve_D=a#xpB#fN! z0RXl?=a#v@vw+tCAaxV9p2+iA7N|J$6?YHvHW zwgR6ics%o7@Cbtg74N0gxIp5ClDRBlO>7YMz;A2jox&>)z|&^nb)8Zws*%X7RV3D{*sCh;y3&9aHim;@873lFi`(9<@NI9cN!nJaR)35r-Y#V>6N zUX@}jDJs3%4EIvpWK-~}6y>BC?xmCGV`Yka90gWj54iAzll{56^}kwh*tzag@N`7UeWXe9m5|XsGzq^Q&!#DG_-z|l_i92nk}TMoR2~Sy zH7NtG1d{oQ6CZsIfg-jOsR1Xvd32F`@m1XTVo$usf`2@*5G!_qljK4tmi*DPi07Uo z;DEoCIl_;qP(-||6w0DpIMs}s_rTC!1@(54T+vdpGvjm=0)lXO&~}o|JJdWTK*_eEvc|v)bJw<2L!}S+C{W--{Xe8nSCP{Azs~6k;~ya^aD{A5 ze2MIUdo>P>OzMa)iyQI>TUseKno8Dcw58%}4T+O2TB?)7sa6++W-L8rvmT)SeQE-* ztZb!p72dKHrDW~ZxX;rXAKPY6U~rW-?whXX)dR_xk8fv30*NM{R5Q81E7m8xtxs9w zVbRo+JLoBtld0q!TZsuOJ(X|&erTwPBLD~Tz8VCLcZQT-D27I^wgkHk``;-HQUX#7^ryQSCROtKqUT2Q*`7b zYHaYmneG={hLe4`cOsnVb8@0?)Rxneb)z;4+i)ilK*lFz)~HTJxWF>Yy!&7Z z)*n_-oMjq4V6x5}NgBFa#;eEr{c5v!RQLCZbjmY`PuvpBCbHkOsbYvXBN3 zG9eo}(n2P9kcrt)$U-K1kjeP_v5?6gWNJ3F^)*x0R14XQV`u}w)XS93viXutQEDJ| z!=KZSB?Hl9lSrozQ7iZYUER;km;U`uHD?Zv?Zrh3T-lIr(!CuYuSkE04Cm3Oo4$bg zQ=eGnB+Lzy$*M^52_dUX-cs3pLe2Ij)B{u~ntISqC?j2?TdA=1rrMRNc4Eb1s}JB> zp9dH$$=MosjJbYzhGIMq&rs<*G~lwK?Nz zI&SEz5D=S6k&@4bdrdoKX%kVA-gk=zW-DXmhaV3viXD)=y0Wh3o4VlmZ=7Hh>%9)h zySd4!>6rF5|1}QMbZbUB&kVL-5Z83XK5{xX^^Np4ZVgx%qDbusvf9{4)tI=XJk0(s zaSAYoz*{K$71L5EkE0Zm=#X%CMaLxT}JNqE~ zDP>OTTrSAi>h8-Sue}$$vBDqjX7_P}kSEf*iU7UHWZrCN#d};Yn`bb&`w+N`EFsEB zBAVuSZXJAal;Ug@8*WEKs!Y(M8X>vxI z{L`4^CO#W_?q$sq<4S?d5T|65Aja>n?!$Ak3x(BOrV=~0F4_DhtXub%$G*k?y>U&J zY;Mp}n&`Dy3p|^V+&i=@(iJv!25&-mleN>G>_&fo;N3J|@&lsSEV8L+APcwBp5#p8 z?z{fAO%J>%`C(UA%ZpmC^@m7!1`>ypnA!Ok>DcBp4Zd$TyHCla+DRvq!PU@iR^$HC>ffT;mj zyy(;SQvob}523sqefL)7QwQy%M*)3%^KR(dZsLdimF&>>QQrRF(DxVN|1o`UR8m9V z<0-z7z84cC`u^^z0{WKOM0xt2Xj6&4Gf4P=4=Uz27jw^P$KV;$^E z$+MyUDx}NgRk|*d#O5%n5g)%de+|RQ)#AciPON&v=TCn5>)mV^}o1S z6dm`0OF*7jaa!tVX6mY5EIQfH7W83enV(A{zQ3qL3s^BeHR7m}BK@SKa_d8!B}qPsB=0c!6C+;tPwLPL^q8Wo54&kEB2!rXW$tfY;~u+MEnTIv z=p#*#1!4q^=Dv6xk$m->*XY|!qgO;zBfewX+okr_J?pji(|QnGGEMD$hpN+Fsl!uX zq`k*60HuRYwyM&RNesjOJ9J?3^xoZ@%&LB;3bYB$sJ&p2*JLM|@|wK!-!<8+FE<$k zwGC!|^k}~$gN$lgLPx$FY`L32G_k7f0-ngDe734U;)QyIgqe07f<0cbMyCE6babTq zn$LVe8 zg4JsIPWR%BCCbN-Q!UEWL{OepYj{_a@ifdzqA$*jQhAH}6UY}$9bOFr*m*xa65H*7 zac?wObU$jWxN{tskvVInWl~YMDYB-s@o=fAStdELH8*P?Yx*PD@(W7R&98f;WvQUM zV-ExemtE2FFWm!`8yKjtQsMqp(!*0|Fy5yq5*c75$?(`XHYF8h^-X*Os5TivfIKaOwp)~}JWqcxv2 z*4v7SDNH4{ z6_0VYuSZ(L=Qotl@fKdmlx@(1IFY~+~XAK~~$M3qgA zCt+^_rDvqYF7xdp6X)MTsII#anas-ipWCE!PE*un){Pm!#T1qWHuX~%3w{q?n^pW0%5r|n+;m3AvT zae}{ozi!?aE`lnCU#;OiSz8w0SdPBQszLJ-PJyb<*Ymw+`kwDO{i{(g>eK?E@Vvc-6}ih_x1T*$O5$aPj16kkX;$ml_H)H* z+5FV)w;{mxqmbq6))a65bMATP=)yaY{4MdEx_l4h;n}NLH4}77$#sM%@a+|_D+KSu zsy?n69E(XPzu4DgU+_b;(;v6C*9PaW3VfV7kFCI|WXr4Dx~r^GJ8KQ{-4>C6OSG4`IwGZeQb0@W`Qo~0{Y+T_m3xy zDsQ^q==Z7oqbsRAtGd+Sd3j4Y%)u4M0=uwWCtH8J+>q29T9w?WjLF)Guub!+9$-eM z>3>gNL*|hP@EkanS{ws>9NL_+*(^EMBAHAt7)I-DuDT8J+29LQ%DUw3MrWG}{e@8ouM^8Z{C$*}=E zgjGt-TjZEqh^%nonFX?RU&}7t9B)UYEi`-LXySp2h02iftq13NR*Iu*PGC2abV_AS zqa@k$8W=-I>h)1x!;72vAJJv&KOj#kRBdY=VN#y)4~a=12V35zE;{iTf*GJnQVvNI zbaG3@9A2Wy(96fGn30+n$@5CRw>!$-QzF@9dL7H;RH0QkdhbZZHOA;w58|cVo^h z@KSaOhgYPdB1d5Vl`FyVBfDx1iEO#m9<-}=f*+rB8gw1_n%FVf&~dr!4SsZ2?eKiC zR>8bRrFo_1fHnWS_+JbFYq_duxsw`HTh+d;Wt};ZiVeY5c%25a$IEW2ErL77Z>lbm zX7}!QTs7R3!rK@2mmftdzDpVCoy%jQJ7MbA;oT|=?Cfcp&7D;rZ zW$}^c9p3sKE`_z`?CDMWi)**FaD^2!kHew#O?-Nj<0nR+9}f@C#<&Ymrf;wl`u*`^ zHEhc1YXfz%hySvTGh5vk|53GueD5YZm+Lj(u4!uyoy#UkG zY+kG6$(9bQi)6Zz?zGgXO-^%{G?qf4C&P9|1#1NsA;FfbIB3FpdY%DeWuj-QRSZlR z7w|ehHR>N4Bay%-h?)OTC7gh(*y&1@YBk03+GO*Jmnv3+F?ilK8H7(Y{gLd;#Vhfh zy@T;9DO5WzQW$Ce*c;60(VRDdCxg0gY!}y1H=ar2NEctaXfDn-&4~u7E_w!=W?m=)oRVuj3#u$iE`CqBKQ zNVfgUY%irAHe4@rI^3t0d?*R}5**I<#RQWM+or#9&Vh~((Iov3RTVMO5aCsKlSVlwk%rcC3B9%)yqg8G{I292iWkc7}ZFG=Hh< zmu@`LY3`Ii8fugc{few+i}5Z|1vnB@E5mc%9LKfym!mYrLMb_Shejm$qsdxOPQZi) zbMwH4$dL6>);x8H`;x1(_A`Sma&V%(+jS}@X}il5V;p}`)j+r!R0YjTI_%A}OGPN0 za;Op2?!4kc`?UvXJ~bf0V`gOy4r%ORN;#1_X#HJiQq8THtak?SM!hposGa$<=4|*k zHL+XtWC7DNIB;qyJ*Y|E!)UU>;P!BV(@YRKlg4Puql%>nt4ZmDLv^ehY`Kp(m{0XF zGN3#}J_VC!u`-{|%DiHtlbXiLtgjC^x?*L%x5AXc3tt`FTVWc*%W!e&T2+Xr83JNg z-g~*8=7@cGII&6tdJzEZU!+Z=#d_0UxcQrbtlu*Sj$=!{Us~hYKi_NqMxPu6TfYLv zG<=`bOxik7Z6qkgOr4lKBVhhcyXsp)iez(0Vb*+i+$P)Mx)_Z9R#vU?N)T-QHbB+Q z6%>RR0F+b=^R0s^^m8J-Le&eqFLZ};cPn)5MqB9fj9m&f9hociNq{QUWb+DrAcR$PB8jWDT zTPBUR2ChR*n>O|b%jx=diN?XEO$}q91v_Y|vnJY^@c;A|g9Wh-e5Q>CmeIiUTk0SW znf#z&%fWs!*m4%|Xc88}G^r-6KgQ+Up_;3R(2>%mX91GYv!b&N6U5LSG^yqq5JTB& zG#5*qxh;T`M0GD8c$FEU-KIUiREy+B)gra5VxgYMys!NRmK}JDAZj{oQ0hLB9dqN4 zqEM=xwwY0JJpoC^YXun65uA0o0LCGV`!haj*2tOUfl{Fs+MMWg_kUdiSmtPdUtzW# z6zl%wU^r$Tc{Df#-7^+=7Xye5iTNt1dE2EHHb%!c;AVcQ$W?WZLJc1L=0dIk@)l&L+C-Nuo7t`0F6)gwQp0&PUXB?IZx6Z15kP+ zahbgp(qzuCWoj{B6o@LCf^|t&ZQH{KKTQuGL-9Q-Y*ug~9xcSW?Sv6IxOcy%#*3&7 zD-O-HdF&WM1PhRoMCJPQN{)1r&P6Rf=`j7~<~2>^OgI;H^`(81fGK1>Q!hQk7V>Qh z=~0>34d5+O;on`NhwYPGk7WPOj?Zh)oy%;WT*w!IMz1XNHwpbgLT@&Sb%}H??}~!F z=X!Y$A#eICv}H?FmmY=PS&*T8u`TSMf1|Kbv_^&XS7DE0`Dh2p{UCK;AVK^MEF@Kt2j;PL`FP|OqZ{@RKt0s{rk(wPrd#sggSmw68i)U#uFW_a>AL{q<+; z0#l*!kC~mO)L;L24MH5I6pswbbH3OQ*B~x?@a@8i!G%bzY60f0ZWI6Uhi^{Ta6tq?h3_ z0Cd{v6gB>(Y8w+KF*U~jjwMn7uW$TM-Fz?k!`oVokzBBK0dHyeb&e;CQ|b?9>W zs7s!9QPmsqA5Ue9JZ7sBtow{pgNaUR0y6MLl7Y{b3_RbHfzOt9${ZBL{{6QcRWJLx zDJ#LwrwZx=!vvD^SNYQFBI>QqGHnwzdG|C`X?HFR&Ya!-?AxlVCqU0@B26nohovo7 z=fF4ei;%^YmafC2_(sx;p5@d*&ob|+4$%7+;$eeICVA*KvqmoBc5kgVj)>- ztlWZiYm;0i6KqwZoYY-)#H8hykP$WbF9joNEtK?^qSl`WN!5-QlK4%rqNU|jdr2w( zv3d9E$$VMK?z}YEI+R*BuMuxfA5PHU&|$20#Gf>HBsD5;QS&alX5L%T#GAjg;k#D| zc4@&3w%$j$VC{6DTWhqWN2;QU*CoXap_=KlS$MEMt)~s;Pgw3eP}M&S#FU6~eo=Ak zxJ6|q#kpRJPhRSl;t%Sr*l}02w%>GS`aw7YR){Zv@axAd!uIaT7nQ~SYOLm!TlZuEPwUu{0W+8yH9^&MEdhTJ`vbAQ zW_9CeGfS_am3F>P&V{bcg(fJ})fWs_YH59L02n{V`wW#j`B9en4_*ZDE`3rUIJlR+ zWGMalBRNVxLo#1nXq_b_kATDzG`G6LZHBq|47UsKZQ%8qqF&ET_g>2Nat#A;E(5R* zHj#L?(8j#6kG|6CQxxvlSyorGdS+PGNhQxyYHGsQ@vnN{ctm8UVM8PY`Kf&Qdt}?O9q44rxz0o6TgW#%{rlIcTzF~w~D64%DzOY&~Q=qi~$ze z5o9p>v}o%1OAZ>z*Igf@Vbhj>A+=3Eg|HwE;-kFiDd5tRC`#LggYP!#8l9?lIzx7G z;018gT}Er-#CILyB;J}<(sqbRo%YV_|BL9(mJ!0kARN%~XLaXh_c_2~-0M}r)PTQw z;Kw}ha~AwN5Bw_++-AW)_rS9Nw-qehJRA6W3k9{AfHSQ~E8pY4J7^uT9Z@M#|S^ZB+}r&@5>1Ha{gPqN_SJaDH6 z9%jKqJ@6wQxZHvd^1ur`@IDq?=7F0%ux_8Hg1roQgL}0H-f1}NfY1LVx^HmL^1vTi z@P{6Flm~vtg5U7KhkM|cE%;>*yq5=FWx+3c;O#%NjbCiRT^@L&2Y$$c+dS|Z4{Wql zsR56A;Q#W#Keeg<;DLYXfmd0^do4^0+&;B!6j#TI-uDng?b>Zj0g3iVcKh(g5*9imV#h2-O-EijqT zo(85+z`*`UXnT>;DfF>Iy%l=TgccG)hf&nFhp@0#7PalE&?<%cEA*5?rA>sSH){(- z2|cJ#FNO3?OIvS+ex^`gg=9qBR;`o=NAC;H-xq}m*%iAC?a z14}1tz=AD@qDs>@E#broIj-)^Ln?}Q7CWiwSQ)oBK4p|#ncl1nY+_H^S4Wmsq^x7_ zPznjPQJ_@Tk*$@_+(3gKS zGED?WLHCeQN!rOs%t!f{nO= z->I=_H_H(6^+Tqti#>szAUgx&Bw?$2(HgrC+z8O@ z1GjP-G>?}s-Fyd;^xr``=u!fSx+BYC7vysP;CZVxO_uq_e_NIB=YTn7t>kzT1>O)- zL}7|$Dp|IdV5Q4c-`%*wOySh@jD>P7*wTQed%zjje<1&0{+oZ zZT=;cQ*CNfX#|V2NMux-jo0bBbirh`H<3+6dDR7<8!Cql$8Y6rTTwt? z3~@3RL%CNLh`#~$`f}W7W&ft(i+TN47P{}fVj9J%2-_v_N{{$5+0*rAoeVWSWZQT3 zN;+i}^+=B(g3c(xZ?&nrm57|=>E%`1RF#-lmGLs4O&))x>N1YX934%LD@9=%JFJfH z(WS`Wzdq1mbO9I)o%FW#5K#$snM;BW`6oQ%j`5x=QLAJpYM`f@hU zqttwe=FP3Nd-q%;hoME*xJ-0*YARx}eC|SItv(llmisY@(u}hvn(jztiSMWkwjQF9 zhO-O=|61k4P^lHq?2OA$YJw%O0kj2Jy%D%Zk$yGRj_I5$PG83wfYLEI*WpxXUaJ*`waUQ$A-g8~}TlDY#_iyV9UImCa~ zlg2b`I$0_EeclN%{k=HSxV)S1aI>K&r(>z_u_>!RC?_%-8c9nEH6#Wl+k_&H-3+>9 zN$Eb`K*hXA-?L(-qJ!?7dol+?Y$S((qiMeLE+4W2WCzRLza!rRfl4hM|!z#X6f0`wX_#)ib(bK!aUY+!j%pA=5}xJCVqtsq4ANq z2bGnk>tR$Xu_b*Hied6jD9GzRMy|GzB+l0;cX)KIPGjzRN8b<@jlxH%etprX4dQn> z8ic~%IAG`StLJwyP$HO*i+QYvi3O*EA^SNU!g46PmMEaGXq&{1PA!z z^kBY>x=v4Q9{6ZrC!fx4WJaBqY}u(NY(nF|5<8KaskPS+N;+4-ILgC`dM#+DY3ZmS zuqOen;P1l(s9qdnQ z+y^Y!88W@rZ)c{;7Q+YDSo&OB)HpyfXHxuP{YSML_wdtJwPRqsA15(8G-O0ohKz{Z zZOFu@UrPhVKv~n=*5e5oCAM#AA2#YrH+T{(9>ZO2EW}iP%ab~H)k-WVO7DV`Qabau zI<|+!skL7u;&|U2pIyfLX{kY9InB%06VzOHjJ?SfSOJ^w?TqawJv7b3a3L$9lbr6j z)85B>M_ok&-F~);Q*TaiQWz@)hfFQ!R~8&H+#dClg=o)X4JjJ*vOvIO$uIX3v*9zZ zNGZ$@pMBy8TF|q`>tdp7^tU({x+T<{J(OpRr?G?^kp3K zE!3!_@g$u!H>q+A#$hIxIcL6MXu%otX=L=0W%kV3Q*jN3sYJEc{(-jr!PeVAmriH^ zA#NbK>|{QC@Bq4`rAu?;zMqUiTF>_SJU$&m%hoeYH!F1mQkgrK)DA7<@Ial|Ra;EE ztz`8&O{$j7*eLhz4RD5p=8|1LZE+V0!Ra8VGNW(?Y^q>vwRWIFOMf4ry=bWQGM#T- z&3~E<)s#XVo(F{lg-W+Kc+yc~oz(5>Hf!cGy*g5}dRl*GU!-|Qma5%Yiy@ZcvBGzP zV|N+?;s7Fa)&j5NeoZ?p&9KJl<0Ph6^2lLh8uy-#9%*jIsHbV&aD9q&7eb!bz!vRp za;yys8Uo`MgSy3cR0mrpis+oc{?>A)(^#+5i-@EcZ{`ttMx)fsxz;PbLX}u+%~?~S zGwCDS;(=t;QFyCEg7lgE*PJy6rQbK0Ca6Ec@tZm2DfJl&#n$BVuUpJrH_Bj;^cIr- z{HNZuUuS;+bUjvJryt^+%1x z{gD>n#7>;X~;WV$(nt{rmU}>Sr2?l7+?T}vYCPB1ff@h9Av5>cP}BTVp86cAHzz>+8iFm-7%-Jn*H%>KjYM@W~=BAAq&gQ^v6`@0zY}Cfjy1s?R1D$lyBU&Ww68AlkxgJ#-#*=V;Pi- z4+M3l9J6okz>Y!NROqVwuq{&x6&_9$!(hAAa3j~>j|R=D*~LVyb%Nu%5CJp}yNLk) z_YeA>#C-9=^7Im4F+}v~z;hD7$RXm_^0e$q0RTn@<0%`!A`K;N2s-K$tKE$=hx%sa z#?-jhbQoKqZ0OKyWoK-CzOi{;B%HA2TCL{{r@D%AyEx+$%cP8bU(v(0Tqib+<1@QZ z(8A9!aEdPn1tK8z(Gn81eG=MqjkRZ{>7$&Q9XCQc(BzZjOwL?CgkB^YdW^&-UPf!| z8|HiOwR*>_CmZ?=5E(Kz7}{O30#bMPPrZN%W$b}@^2tUtd8iDSDQ~K(Ck=xruRnz~ zIP{nQ@?i~5UcAF>9E|sm#FxEf&nMU#-LaOWVs>|kRm(m#IqZcJ4T2H19Cd6LzhHSX z6K$$7X3Cy}5mV!6$qG~D%H_EDGuB+zSYr7FwL9h%qstaFmKqq-fyS|E$u|;@v{ZY{ zy2Cw*OOY9O``oYH4x($jyWlbIThlPWwq_Iz0}R@g6vf7adAn0$E5_;+D~gTmX^KFX zx=(&bsspa871dIqE$~@+xvUl5dW-k{5~24_Umpb)9D?B#Pspg(a(>!AiKNlwY2|#r zhU-ieB=}~JZz=8A$Y*#D8{%u0SL;RD%#>%iRjQAM1CS_^4SoA+Gi*@gc*n2zeQb5EVNshvClYWhP=J%tqx7ckz23uL8imKk&He1$NoHFV) zeV+swfAkxf-cHFSq91$pDO3rO@eEWP|C1v0y{(g)t>Kcs(}Y9cq2}qKDkc^BzQP9+ z&W2tW=AI*|=})GySN$qClE(iRnEHtUQt{QM;w_tbM3ZB*+)kzHm9!(@hNW7cWMv~& z2A6o@di)2IEo;dTlUR{J1q#2p3+fZBDOC5Nm_YK|SoXqg$aePOhQPy$?k(Nz-gtg?CtRGcx zL~1^owmfsB{YF?|dAlU9JLt!V?}3$(_{xAOO9}63#W&7p3?z!f0E+g5@+weLf>Z;Q zXu;DjYPP3B^$;&D7Dl)qO94sJe>ShPH3XgHU}%RQ-JtpOIycHi$R-G+u|P6oh~MPx zhxCc&kG@ZT;d0q}&X!t>&NEy(fxz(@v6`=1a%Ijj(MjHGW1GJU6!9_dT%F=mqe~e9 zVI;CL)ytjAj7vXDo@{81@b?@KQy((pVF695`k2a)hp$B38nPKSkiO64P3W@}XC+kZvU?$$jzaX6JXq z{_8w;qq95cD%zyMHXPL-6mOMjPY;f@g*u3HZS`kLPO@C0Qo*ToLCtyFn~k2 zNU-jmNa7QxCUfJT(sv0>Dpc`HQ$6<_)lEx?&%?bXIB^9{LnVN$XLOop>K!((Rn$vz zi2>=WG`ni+J+aeIKN#eu-O!^p-Jw58$7zMAfC_FgHO~RFls=o zbQIr)>!jZ%U8P4g{+B9Ti0U>+W9xs}&Al*1tz&F72y&t1BcyERvVu%oO(va^1jvy& z5#MdQE2_AAQDqv3eo?C*$`z#|_Mr$Ikz=BMZN=pDuT3NSfzz+H-wgNB-y1G*&pmd7 zIU$GeMjxR?@gjRe%9<|wYEZ^TB2>`akeLhVC=%*K_X^~S%n3mM(hZw?bT?EP-FEU@ zGsVdVrQD;*SM`Rkh)++VC@P%))Aw=+*e}LMpE+tIBHAzqX_;?|cF=2@)|Js@$tYr+ zdm`I+$i2dp<+Wpj_BC@TKEX&Q=$cpRFE4XC(nm~L=dyqdSv#d&PbaaLoZOlZ0*C8+ zz`A6h?x09m(f`DjHL+0B&e4sZ zRIO>6abjR}aDIopCg4~EDdbCM$g@t(r@>ZP8$>!j>2-Q)#7t)ho<+yQbNiuqGqT7l zFamuMR4yqLafFY5a3w+Mh+o#3N!7;)9{VvaB8ksY(bZu|*mu!LDQ-oB9M+X9gFRMtY#~R+CtL+oipPa7@)2i*Rt& z8tFfJ)W^fOk?MDB>=WqtS9}{SzK+{Y?M+K-tKKlp+~4MD8#pLofA%X^_FWr}>kycbt2mQWNO zvL#l7aK?Al^!qBDZhRBG^(SxxmWK*ETb#sjtN&us(v7+SB4qprVKSx@wZmI*p{Fs$ zrm?!)BIJ!{j81Bp;c28~KGCY}zMqVLG{GK%L^Nb^WNNoOkuJIuly>N%<89m%hUu>P zp@#6v(^AF1Gto;P`lJ1Gwr_IQZRTc;;%sPc+#7tI!oc8jv|7|M;*6*E3NS}lLw1=Z zrJn0Uq17%03Tn#N;z=|{1v;2NW80eea+Xw)*r%FGBI<;mNqhtVH$q1!fo(^uN)kggCldi zSGD$y#rnXxeRFZ?a%yGk@x*dljs8zje5IG|ShD#wao?)6Rp{(v`X9B~3=yxI1M4-} z(22J~Tm;=QKj4X!(r#!RFx+rLx8Bd`+v)$r&(;47D^km}5HTi{k55J_nT!A%KiBu% z^)xZDHhE@o{L6h~`|E>SboytOV_aQq)^)aw>FL@;T41R$BNuQIK%9q&|JTNswCu@J z9hnLi;S$=(iGr6ow11wDy*Xt-8#JOTCFt&Jq#_IaHLQla2Pi zAfvEQd#{~~pa7~_}F(Ra81rXoRAgu#^9z*(kS zMJ24ap;&SJ)H0ZYmn~n`!6w5FO7lE}7=MLE!^L$)Vv6R&c=IXtI(N>sblYfk!&CYX zRqJ})Kr%!VU|9B2eCi#-b#MK@n|*Cg-KgPkg@9A@RU>HiLc4LG32HCm!+;mj1 z8dTA~hd`NY-?N7ov~S!s zyK7%xuYC|(CuoN=ZJ}vmN8wqd?mmLP-PY^oj~x1_4#zW`eOaHI@+!8ORn@AYWvJmC zHfudnY_R1Oz~LvbqIy5dac9myUu|W$sWTA9IU|d1<0s+x*R1XjlD01K;r4fspE~c7 z;$PlZ6Ikc$aMSl2J?4l6-PZpb2ml4nxrKIVPczL3IjiatA8h|yG=aR$NiL@PTDz~` z$Jjkkcu7bx{1D4c8*ADY+zeQg7k zet^ZtLaG^nrB2PWjgP48*idTzf@cugsaVe0B?3%eOlB#80*wOp?!HcODR$cAA8>gignA)e)`s@j9U?&c)sjM@kqpCe$ zhk5WX>Y1Fes?)uboPR1p!!TnS$E1+Cko(g20UO5kjK{ck$h?4?`#81;C)jm=t}kj2 z8hK%%b5A4hQPb%0McG&8)S*O{=~B)1#tfrp6a%U@n)skD@s)POm6o~HGWq{}r#Jb- zsIOi)RFfaYy?eUqkXRA!I;BjVP|tlPaS@f~ESmtwir-So!J^YOPRe9jXBeQ*h-zU( z^5S+$3`U3ovQNCWERaE}VK}~vhKyBlH}_BNMqa8Omw0I$oYeEMkw3ODl*Vp^drQhkWoE$=b_1Wnz z6e0`s_b;#l-Bb* zRu4oZP0n6OEN2lvS1O!Yq8Hiec9KGpuPvf3vGHHT&2fx}gSX9ohfIN3NJk_i@~u1( z-zu4XdH{QIn#hhwt)AppI@Vn@*y-LpSJbkne(T54gQIkqYN+KCcyDjz-|5a%V(l?G z#eo%HD4pQFgL}bt9RGbr9Q*mHV~$lHCui?sD(q%(8-AenV}!g)4U~AngrCBsjHU+shKE`7-9^}to3hy7`|ba`+CR?9 zle=sGR`+|HVQZ{zp2pJ`)eiN=La!Ou*+kykGbHsJ<*i>mL1rpEs6RGLf5@O(3 zOLj2O%|5=egjth%*nA18OD9K27Hhym=2vqOyJedy<294F@k|3IHE;=dL`bUDa ze}rCf6QGKd0u=Hr=s-&!IFV`l_7@F>-_YwBJKJbMM zKWoEH-@UN$sQQ{Of-M)>!m=0R2+?4_8AI`vy|^bUI%GR{izM94)mP1nCO+Xch8v^o znBeS65<02JDkkd5#t0`f2rP3bqqAj{fJKPoOzf@htNSsUTH9&oKD0B~(oZ?C^aby@ z%FMw0{zCf+t>Yq%X)GHgE23#K$yHi_taZ$%5jiq49WS~}?7qvcI*aY9bMg*DTZ(7( zq2zm#M;FD8)ygxh<7`RKtoOku=8l*MW0MR$qQPHr(Ds=XhfhN395c!ocy-iVJZ16$ z@IRjJM3sq!?NhrOVXwPeW{bZh*NbhkU6%_Uwh6Z}S`8&=L2QWpmqDP{;p0b8J-K4o zi7wjDX0vqtAV7<~gp7`A42YHTQvBw7JC6QN*QqFIVk_`kf{j6{#SA9*^ZC2Wf%H;QZEmLPQ3AdD6xq{v zP*9%TFdrg1ZKBx^5YaSd7=C6j}i;Wv{yrk|F&Y8h+Kh+(#d0sSwsu+}R?wwR;w3q?s9& zwi}zU4pPX{pSK|$oh|(}P0TZuLNx_itG^vYA%H}z*EE^*gxY6~sI zo6CCHTOl%U(cj(H(@S48I);3W^6LXm*_tca5{m@zpi?Hx`M9>o{Aq4Kz{zi-i^zej zd0`{RYiInzgMiKcopnw1^*%tCr-n02*;F}`Cb3x>rRIGy|-*0KxxFix(3N0Rd^22+oE6nd5BIk%#m zXN33RJPnr!XXhIvnRA71ut9fY4&AHqJi1RK!J%^vLWSlVlnUKzkSb)+ej4PPfpXy$ zw!{i~(pJ^xfJ?`H=fcpS!yB`tFxcdF+)1K$(zQS%$%hTr2q!P5f+=f}@BRr#iaKoA zNMm&@hB zSACtp3TMhHok>I%d&#(2U{!d@hk%xj;e;R@jIN6&wsB$0XHKwwRn5Avp>8BN{?n%w z@7&{T-xW!;pxUH1Q@VsJTGK_gbR<~+HhH>g2#w#MgkLG)1QOQQJX}%6GuTq1o}NU@ z8BETU)o5dfI*DhUj?J8Eq{{>A0&6hv8L~Q@yw{AKddQ}X8YIK@>^;}e+?likl6=h> zI^$x8RH~#b9?olhVp(xD&oDVuNGi-{X0|*jg#HMDt6q-pESXUbSvj)#cQr^bi$2wv z4Y<{L?Ox}t=4m?5lx8}w-0M6gQRnI19sGgJcg#LDIBqqA*i<%hRLke4(xa;r;i4H; zoP>Ys1c$bN8XUUj)8Hiou5LNHh-U}DquVowYV3>9k=~Y$nII=Y=16JM8WET?{T4n6 z!ST|HGW=B`)%k>Ld1Lx%nn{xfK@vE~AW_hp)8!Q6mVV356%RI2u+K5Gd#Z_6g!i=M z597y0Q+V5o^4NG`P-i04-V)Z}*X%?hGZoRP82;6cEGn8&ZM57=SA0=<(H+abV4vbT z+u!AUDL0W(f@cnuylCx+s@7~E)u++t^G^A9hnA9d9J{nX;-onvk(DGJ^p1C2;xU8E!3J2EA`h3`O|zzfcj z#2ou)=#zE=o4twbbbMLj1eQD3Ea!4*R~qDUvA#-VzZ>Fgvf&a7!MIdkOQnr|bMdfY zCz*eusNy<3r+2bfxWk+QbW1YNCRxCP&jdAimp*w~Vp^YZ$1FEYL!AYE%4k9M!Xrv% z9tY28lKMQb+F4RE1$8X?QJsPdYdAXXMK+VFi1Wo9wm$A#6zuf6~x43EzCV40aIyMzE z!~1JK!DR>8rT1Zv>)Mr$0byqN;dZ?Da`Ka0GyD~&Bh$;Di+C`D-`+k%3{1$ zXVQGo=@~&1#~}t97D1Z4)a6JF$(fQE_;?PBx3qf?<6d=B+uiwRqrJ--Rlj7VZqg*? zqU*bHJ|>Se0rnLm~PJ+Qs{l$=icTsjIL}v+b=l#cVt01^1dFE`Y)F8{ia|U zGF5QktVh9^ZXw18EL4fVmz4QU=7&zIZ6fa(v=4356+m0uHd%ph6PT*Nez(n1Vw?em z0W|^Y-)oKmS&TzCrVWgX@Pu;~DPr&dmv!0gqnUHCIOG!sEH z&qKqG8*>w(X>b>U1_O-5tT{^m)I6QjoWSpNei!q*il6-M=-72BzYcyc@#`k$yv%zs5&|8a~m3EDr5yEX9>-j$|f2Tte#oM z3OIazk)BnB&y!n04+FM&&{$_z2Qgy2gC@Ox7pJYAlx7GH1ry z{40=-gnj_%4<^m8RrHZIE*m^D7bmGIrMNvwcq}h-3XsXdE>J3U$QF19mRnTH{Q37g zChysTWR=ZtIFIoF7b33SUhAbcsM1Y|GhIjVzQy3 z(qifiPcC$fsu&A`0po=(IPQgPs2A~(L@OuTCRytw#t61svM>2N+A&j5T0R9V>>936 zqI|Dl;}*oF+$D4NQDMK5K23$mm>t=JMLoJyQEXylO8%!3E;v-YS^QItd~h`Sg_}?q zpSKN_2m0EuxFe|%Xg0gS{=2A3JL&K0&`1f^t;+0O*x|Ks%69DI%9_3`kA2?sWxv=b z;W?{inabXXnSq{ORu|Zv>VKoA+U(v#*sD`ob=uF?sj&sxXG8Cy71NbbG(RT0#6(wN zf!tUe`-T?qW&F!vwk zz>F&#Z|$%C!CwTP$*+^PE_phJk&|p_a5i+l4V7m@XV?(_0mj)-8Q)IWP(wCUWkU}4 z|0<-D-Gdd-rFy?STx}VE13(-mdV|u zvV7%Ke&PICyr7&Zcv1-k3|U#H+YYz~?Nu)Jv)%LBN$Q?ecC1gOLfO!FO=TEfKk9Ep zR;h}L4#jd8HX=TzI_@0--{=H24aUciOvaE?8K+n1^4v=qq8k^#ockxq0*mt}TsQNIM8D9oH{* z73VtgGOs%Fv3J?JU$ocwppQ2a6_hn9W@VuIFXjC`S1$Q1FSfn0HaWt$G2z9} zbIZF*n6XHj{`puc_uwCS&eU19$pyO-KukNB&wVNUGs=X}?nXp}8sy`&iBk&|ds(pg zSI&2b^J%voTBc1qgzaZh5z!C4%lp{*_Qg5|nHewVk#8vk-29XGhzTtdk4Bwi{5n4_vpO-uZ*}(4 z`Gl&Crjj6_F29oa2tV;3P{9)=yp>?Yf|2wT=KPh^Zq2yXHDi#q*V>Y+AbWZWn@2ZY|65rJ?x}`X^9-U}Yiw?vN6o4WWqA54ag*OI16dfv1uxoVg(oKjS!7$&Z&Gr-EtP?s@}wjHmK+V_@PJyz6KOc1QuzeX2?My_5$C__YMW$jc`M6Vohia;+ zMsu`zlS)P}Kq;br$$tu{LiVK(c+Srb${7eN5GHy)23Z{&%a4h?&lhq%Tz49jVluoX4QS`po!hZ=*)Kf&>en8Xwh>o3|w4CURkj0AfZ&-QJ3`!w7k6a91a-x|?ZjWD(}Q*jshL~q_JQAeZ5 zm8Y;K|Lj7)a}VGEMpK34tFw0)g|7InpXc{3&u_^C4{%i>&n%Y*3np!`g+>5!+LE&;&eg>Oj3zcbM~ZG^RI^J3bZ>KsW$muG34M zi4I<5az#ZryKCTuTZU5>Ku~-nxn0M3N~F@BCS=ac%|0Zum{^0=7l$fVZ!o!y;N=h^ zo5X(!0RbA-doBB6R@dcp-6EEEi=Zdh-{4M#McLJtv(M5&Hn{k8RibxnS(OXxE8-vs zf;7anb|^hRp-K}QnboK-9)H=7T zI8#BHirv>qhW3Fs*bg2~Foor-KKZ&;H7K-_;@wcl7-S^HYZBbW{0q?rro1MPZnw01 zE6)(NuZf>#OU~qL2IC2W*yZ##}6 zmvHm7nzgIE@xV>U_FF~9r_2lhv-P+Q65e?RiOM3-Lo4ASF@~Z9nepwEfl67vs?DVv z1X#kUw}XpUTj+0GXtjW~xUGC+IQ408sizf)?5aTH_B-q_hlFsNzh5sbVKK}FbuC>{ z%`;oJa-*N2gC)6RBk2pvi`>WmUc(|3-K~y9`>7MXMsLaWm9|hlD7v0G)}NM2ap&Vn z0d%}O0`O=9oYGLR`3KOl5J(u~!N7{G6vex+=emAto;A0Hf{Q!sd^}k1g%aC&pNaWp z^hB4{en)%A-Z$9%Kh`U@^KCQDK%ygRi&d7bPV=1$CMWJ(a5CR>E;csTIu{$8?>HAk zbeeOqR!qUgUV{A(4my;)n&A`SHl}%}_p2L$%B`Bs2A^QqS)q3q{kWUq_ zEgh>710dcxR$(yNY&6ff%fFtc(pP_pyWHqqt$GuyT`#7SBR=OyP4#amGvT`8YRtqr zRvPnWw#v^`+;WwW?gw~)hE12`H)x%4&OG&{hB6yw&d1I{be~Y-R^A#+o=m80nePEw zh ztqnkLN~Xqk_%NfUf5$BTxBGkOKSwl?U_D0U_S)ZPrqET}-zS_4@ZREF;M)z(1-@PB zT;SWq&IP`m>s(;WWVy7zKV6Qm+}~rNyT|^%;QxyKeM9OaU;*A~etKgV752H|bg7;^ zH|+V`a14G5vojDJuVjbOm^tC}IoO=K5cYCCqABcrTq~KO-YI|aZ?H;02&}Zf(Wcmh`tb1no6wCYkIz7Sgea7Kwxc z**_8!N%3}LC*O`q)wHoBdqQ{5$<{#Is6D360$Da{M>@{qNVidQ6R3G5@!3A455rOz zmGDj(EA(k&@P>K0!;Hi1qUzZ;Dq=Xi>?y)FEmNX0``gF>9~7>E<0U{%3nk+bN%cuj zzC!a0IDo^yMBsx99KOf7hUTj>&IQ&doC~bK#kt0U|IP)5U+G+6{l&PD#ZQ_Z95{Kp z99%e`JXH>kbilG;Wgq@espQXv)%^L^sNlfM`2P(K$Iht?4(w}$xk}}68mL<(>T>Ke z#~S(L8f>nCkYumpPhu`zYJPhs-l5=D93U*=|MUExwj-avle@ml`Jd;17dlGcOwU!< zX(}AgF_gA=L;d~UC*Iueh?$NZsL)aVR__zw$5H>M(*>2lhx7=f2X-k zAg@CcR>M>i9=5f6_)tH5fP|l6jBE|-Fl7$dkKn|u$X9M1L+G-yD!qbA&)eVQ2!C~O zDMoeI2E1ecwVO9FSG0vkZ^TB^jc*5+wq^~$Z3%_~VODZLBmalqR{ z-pD{stCy&rx%i^5>hO|xh!!9%2X_M?T~J7jTMP2H;Q>sf|%)_W#Sx=A`4|24DrLYlTo-Q$9 zx)ETW=v)BvSmy$m)y@Sl4|FboIl#F9W-sRgm^&s5n6UgG%RwWXuLpR!5#8GtNquB7 zUGie*?^;iuMPB@cgT3U%!u2{g1CUfydq21g)d*u-nF)t0Htc4C#a>FR1jcP4nD{B_ zaeL4WmG1WlY@llA*6C!aqq5HmFxuN=rx$+E8qA8XM*vy1d>*OYyL60t;&z=9O&uRS z8r8ylRfRHSD)#-hSdB_NTI$3yNGo2-hhLmPg4!K7RMoV%vXpffIS)L=bjBC_UL;`+EnBjil$Y zkmjR5#D+!eTw>~|FanNySE)%NTv7|T#M-yg| zu6-*yCKR7jlRqws$@n^1#<2P*mHW$9-#1vRROD#O6HH!Yp_f%_5!p|S=GM_vZ2SKC z;Qo`d=!j`5Vrv7*oPmv7G-_LfsV&mCf4=G|MWrU-1*-R3kt~WX?iVf&FL6m1rUO|iJ|x;VVVHMqEPKkjT7hnG09{j{ahk2~JQ;U(?>7dO?9+uz0EB~JV` z`NDqOc1ibA6YvuEro~NW8J{pp!;+d%r*TV7n8xRl)Pzg;OixXi&gY8Mge$_SF=4Ea zjDn+nyKBT3HKxxnb!XkTmI32Yc4DT!oRt~y8C8IfGo4Toc@$n_-8-X*Zn;xhhj*0t z%|sg=?Tm3Xz2Z0I4J{MjVq^b_w|*3@PM=~#uN_r*8|BP}ds6GTf*4MG&Xby3NzKhI zx@AU!vZ~)5JpBv7nPW^pa4smxCg*~Zyy9F?l0P{Ylw_52K}nW57nI}?xx|=0C3&P7ExI~NsQ=Uh~DxpPs`Mb1S<=QtM?O_WO;!Exr0RpZ!w z-1x9#=(RZTRTg}(ZkN0|sNjQvyX4jCaOS*H3*qKu z8!(F=g>wI^y6|e{UHj6GaQd*9EQMt2wHxeyCDuzifU=DW@;@YUS?RA7&$Da8=|fom z4DI`Snd8)twJh7*Ryo@O2Y9m;Si3gbFLxtkuXb(h8ZDT@&HmmcJu+C}0B>?JL&#+~ zl?)(?G7RsL!2+wi16_vLe(4EUoHqH2;4j*86_zvl5w<>q_q4$bWJ=jI>9(02YWw%C zDDo;6Mf4pCs*XyOfHS*wdQc+ zsinGjo{oJ;aaihcFsXAN_zyGAku+%kTYlqEt3&+8K+eSLEI)F~4Tl>U9g*uFZcX40EZqzw`!5-uv+K|@n;I3fxP(f56vi@pb(t2|$|U2;3))VDYneSgon==*CX)uZnlaD)=A?zlSjj`7oigyR>^ zN!4tZNtOt<>LDw^=2{?8;I=La>7IQzdf5GZmtma=Qgv7C_}O{7`eMo%1_dn$iDjy} zB$&KdR0~=1G;H2vM%G`Xz1aAZ_`rVUWWu6eR81$Z>A2K8BB?JL(kHHi;%X~4J(%PU zOSiqGrEdgz(*_xOPhZE>r_PL$b?ro25S^K~HQzZj#S$H>CdAm_C`FYn^F6 zf}!YsysGgw;ay|HM{Qs8UhO2G8P_hMk>HQP$>qCuYy$lR~RpD$cXAM(r z(3FdSFpMvTnZC{%eOM%&aY|O8x3^mNg*uvhXgYNbN!d98J48H*60*8JYA2YcdV!qw zPRCDYDrQpS@_9Cx3^a3Ov-d~Z6S;h$rm&H4dl;mBb8l=uN|dN(*@IQs$mED>bX)iB zkHIXDh8adl1aIpv@~tKBHKM>OEJXvx=1!dF z$G9}P*$W%!Vk2^A!;&(IH+v@&(&*35OjSAcYaUl#jBu7*;2Oej6J~>Qn%3${zwl}E zme96nnRm~}J`K>R$X=8s`y9+FE&q`fy4m~fyJ|VjJC)`k(4ESGAMK09O^5-1!V5h8 z(~&DizkFI424_{KbU)Y`QFr?l_%SZdr$-z9F25gi#^wygsadCJ6-6kXXlI*rkoU#w zBCdAb#x->2b0#YTXogKYs4Mv=`3EO|}@KCzB4GiaQ zYjiqRNn*#LqopVch3PlDrdcogyFK}w5!|z|T$;i>rnAzP453$f1j%9<*Ap&;`T+$d|a2@K)?JY2RIMf73xPbkD! z#tzC%+{1I-HxEL8oM-ed)07&AO*PaB9|py9Orh~lYWiiWmhurc-qyzsma&eJ&P=6B zQ~1ia)4CbLru06w zr#$-UdZ#CaRz%G9%=3f(e4WnOlcvCN0Hu54O0C_N@(w@c$$rXVU_J=6*vbQFmlN-$ z-rSA!+DZ_}p2_O4H`%?A(Zj4 zR91G%*G0n1KGz3HKN=pnO9Z&Ff<-WS0YtLc)JIS3(Nw`h$$-afvU|6@Ven8-R8RA0 z@@60Bn1McRI8U~RBi#1NRNSD%4KA@-Y4rJgm7RFTT3r}t9x&G7#jf7b0~5P23ofml zNG4gcqp!xaPwrHylV!d&RK1(?w>{j@=7DJ98kwexpbAFZ^2J*z$E6ysi7BVIKiY`9NZ5m@O$we2CBoE>jF^}*!Ioc66w$hxkl@K zdZuFbQ87{wdc0;HF~Ou+dCF9cJ=XyIXOc;U;EEGP8g8$dMSd(bCN|Y2Hm~g0J|mQJ zVXVjxki(vEq^8kZ61NQELBq1El%JDn0eusFgxq=FW?cx{7iU55_XDryQ&BzBv)k9b zFY9EwX#^osSE2aT*~42Z1jT$n9~KU^f-BN87*`Xjbp&$jpS@h{|r>$DOv! zdm6%9AXC-Rpim|b$Pvr@w_<`%B&~~yO)Ke|b1$i*A01OgtWNrrKGL17;MQ!z+Vhe7 zF&*X655R5_-~j9&0tVRVWoTooMkB|fZjKg5(syqlgLgKwkvUz9c*uL_NFKlw0W*C6 zFP#acR?jaPcd?Up$pFMo#fo6Pfe1>DGKW;DCM=L^2&xnre@JPpb zM$|jo1JP3wJElUZ)3$`Pd;MtfMe04`(N3rsjx%>sD4o%w z)1Fn1V=TwWKahhm$?`X{9N@CN0IOC_w!ZR$*;*OBs*Sr5uQ|dA?GdBflvxF%)qd3dz|bsh`PH00Yga zo1)?P#Czi~XqN z+k&H4Lub5+OL?NQnxbZe63=KHN`mvGI}`$cr%_-3=&?kItLV=gWdNAA_6;{NUe`0aGK~09B5O5H6mZt=XfL;eoPop zD!cCgZz6U;AT-bAQCTNqo2OfIA7hlg5^HWSDfUY3BN(RfQ9j2jk1o56UjL8|=D2fOk3qg~6U7=< zLc^95N+DVA_P@f*_$XDxxp+x+f$1B)etevyl#t_8)u&e3iy##mby4TUy1Hx~ehlya znQs5KQ6ru82Jcq&Od5#U&k1AFt_!Em27jFfWnxcRv|nNmIva=3V>MX!=Zz2<2|P)XB7o9mwbM(kAYU=QmN_16E$vdvKT4?$+lnP=CvE zRsG0MHP=toj2@Uct(ivGwhb4Hf$a>IPo}-dNRQ#!VgZY5rqe=AC3U7DGa%5ADMhOu zn6U4s0`HEOcjvS2)Wk3O9+k`}DJQ9RpG~T3NCkyf)eP@6tF!r8b-YMwMi)uVF+EAm zAXdm%Snx%0G%IvQwQwO0!dDTVO_;mtOez9dq=0zs6bO5bI3P7Ul9{UJE+#(5WyGr9 zE}=JxRL>kj=IkZ^a%4(PF61J|!)p4YFBO|^c)Rse(iZxV90%2*9VgNbx33&TdHJf} z9t$}T3gGKndp{$q77?4}?*V-Gc~PhbkhtgelHCj!298*>do( z;t;$qgrT_} z-XgL?nxa+g1%(#MlBrlaS;bC-hCrT4s{U735S#iy3BW_GiqXTxt|PHk=Bb6uRkygz z8+iY+nw=w6?&ck9G0})cVLLukX~v_oVPlG z8(Ic=qYtlp;lJ3jyFbRCf=k1d@y&bUJ5S~PGZ4Tx&lH2Qj~uKTfYUn5R*woaf~T31 zIZaovg9y@g-Q1`BC^;&4qo2A?o=v`ItUMZU$=Q%;`N)6=A&WyB#R%98eSdr@0=VJpU zPf>@aVleqM{Xv+LIq9#HH14#I7>;#b#H&5y61+Mv(JVcSo4E%edy}EAXKPI5v-ukG zE57*+IGtZw85KX6K;B?|J7+uP4z0{$sJF=S#7^eejx!Rfk3ERGx0%t<7*Vb`n;=dWoF=KDdBC&u{65Bj~WDr=hy=M)Wu&)kmJGOpiN|**#|MIDSJ` zb?47uK;b^KM8CWIYQOKQ<+&Us$W(ox@Jv}wEnp-520%(|3bb!3e^MI$p~1J?&az*7 zcAqk}Nzb&q_rbkQn`v4BQqd5aCgY{)^cq73TA(fIO8zjU;h5M)U2oNObyJi2ev*1S zk5;)13I$B0Ya#Kcabh?buf*!|o*T#UGGV?dG8ppML8FP$4z7&;uKEc-WzhkguCJ- z2n3T)319by!n+pupFrW4GYtyC<_E}-BMKSr6RIyj`7mCRzDEY;t2(8da z0j@BYtK;fLy3wX-F!8V`3M`Ic+hH`pVcVt5Iqn72z8-9;x4;6nUDAEdz3%46>o(_J z_r}cdv8{|O*_-;Qu>X5r9e$)guUqA|{{t;gLq4X-vVfi;yU$dOhkRvs(Fo?E zqlHbI^DL4knv~G(%W%*H@!=4?_)9QI2xdjP^Z$dv@mD&!6VBdLPM*Z+frHz`CIS3x z+#p$ih?P>HG#ecxHyV}P=LjDnqf`WMT%))Isc9^dnu(PhIWRFk_v)SyZk1&b8EeyO z+g^zDJR9SHg0wU4Xey_B{44oCAh`{>k09Bfv$9kN!x|8WR?VzoHw&0 zG>Ovz&RPU$YDP#G3VxK}B%VWb)C-M>&HC~%98Odb9S0e_v;=fR$2trAPtfs!%YAgz z%*wt`BMV!QhSV*nbinv3EETHkf)B794>lEGDT9jwpe%`s5qjx=0ry^W=%#Cn4ZdEj zH)`Fj!9TLV|D?g6qGhgm*!&H$WXD*8d(PJz;dL9~mbV?Mb#)?8RR^-!|3=-t*ou?B zsuh?1$E~=o(266}ireZ~s-zma!}nkF2&iJbp`=TK)UNZYUJC_}>>+TneMX zA{!Z;mtam6&K7u7O+XDF{BlFT&xKgC|JY5AJG-*LqJ~qmP$QUK&WiW%W-iO4OeLR! zlnFo`Xn;BlK&jND$1{TC-vc*_bZGR;5%EGC562W=@>T+dtVHRlc=(dNhM@mstX2>5 zQPBhR|7PHeV-@3uCb9xeI)5uG_GHl@5yHmQ9!<+nVV<*RP?oVNg9WZk)q|&YaZ?k? z@irLiR_kX;{#9j;voclSe~TO6i<|@#2O9_MFUgy%mc3|TsrvIDEl2l%%O@#oC?{)$ z^{j7KF!7Mq-2w}+nt_6ZVG^Mm3Cmfak+9FgnM?Zh?_#_6VgW`K>U)?h*;!N?S^*t^ zfc79{)Hgs4ZC?9C6szK{wwJ!?DoD@#hGQgWs@zH35o3S%|u)kP9-GLw^J^A z#xK&rd{u**EVZ8ra&$B+RzG;0dN#dxCm6KE8k&&xQcJm0g1QKI_BvyeI(ZkTq@+4F zzO&^`L~hkF4CA*{Ya;Y+sT4{{DWxQQTFX#8b9uG9>d+I!i*NHrk5%l6#O8S9DbM|U z)O+k*FQ?QRl)kC-iJCs#U@dtSAs)5{`gz>Ne_162x!sal4RbQAv*le{5sw{_SaB`& z^osSvkRTx?(E&<0i5qAT+#s(HZbUys#o4{Ebf3=n+iEqtb;3GZ)R)p&aBY1}y*5pC z=TDe=Vy>dQ_vG}vjWDI@MFVtHkh%9waj2R25rcz^H<9sYQp1wb&s)Hx+C@D2G^zNgr9A#LU zVLO=Py)ooQB;$h7;qY*|il^X;?8V}J@iH7bUq%C{S8N}5Z#(-haBuV*21H%MIi^&%%3)x^}Ba!OsV^s(p zsVElo4HZvaATdg zHuj2L`Ah7rZ|1kB2#?^>0LS`^SB*P0c=zg2f05d6@{L$FocS+sG>L3};x-wp-TwOg z(t%iW8Wdc*&YL$_;EoOmE}g_9cWWsi=9yg&q3W*Pu73>rDa#R=+DQDPEAVI~dc^k! zw#W9%P3h_$_Xn^m#hXvxqwt`2q*cWGPs6smE9&1G=m^uHQn#|>dgL$m`oRH!b#3Ws zCG;BAtBnOkyG2FnQ?0jfM16kj2*(?k!btyU5xA1M`o7U^iQQKOZ~G485qzRWn>K9p zHqWQ^>ECORV2SFITV|tLiu_8#$)?ZmAZN6y>GR=ygA0F6*bKxT^Si;}V_R`pSo$Yn8i%^q@P48?k4>sRT-p+Pv`oJ8#Yn&5qcCe1-7 z?d{-yNieA`g9Aj<=l9^|u}AdXQ*&_^dUunOENHX7EOUJcHa|j%=-|*BcXnYtdV)af z(Ezfbnt_Tr4tn&o-=p{fLAScT-&P)VQ57pR1P+KdC{K%)1@cLxIwP^t=^CWY#|Iq% zpLC{|oQOBEqfan74o5h>K*w3=83#p%S~e+6{Jy++e5p{~u%OLg~l zwSxrdO0pLqSVy1Q@e8`q!-VA`G1sCNid{ft5v@$$V;JyxAX=9AyiaUjt|mDGXA5pa z`U!0p(mxl@q&5zbao+Ltp(J)_=1iTA+&GB$NtLxMRv*qR)JaFKA1gQ7pj_T+NY^&8 zdtpVk0@yO;qoW#Yx6d8UNkDWlWUE_c*_zFOsC#mEP?BCKL{IE2k5(miR;$ID$_cDb zQf+zcd$9S9!?s46cF3^qoc$6j^c+-)R{IfhL{FIkg_&2QWiPQp(g#G82jXjb9`Kg9 zmI2czj0M^0y*Lucb%G(CtC=!ea1i;pANd%Oh4z%9Td`72DUDs-IBYwzl0pM2;kB#* z2gnf}3HJr~keCGL{Y>Q*o3RjIg|)&`WMed|)0|X&qpSLASG6`XW2oKEbVTnDe1|#F z(MlKWr<0v#)Qt1lQ~A?H{(Fr7s76eR%MLM2V{N+02DQCub2Vi&?bKhH7o5$V^{0&2 za|SoVnI}YS!q@Q@le`mq2X3)>GmTZQJmqLVulnu(P$E-^0L1gZ&5Pv~rwl5!w6ES$b;13A2Z zqRmORgX0U080Bi?3&rmS{9AL!Hfb5*=*5gUCpxS;x^?CGwPd&!!T`VNS9K@0obmsc;|TZLhk)N z*slfYPEyH20D}C7{{@=_qYSf+I)!*^?M>LJi3Pnm2@ASLz0_vFe?-u(x1E(9FgRaz zSve+CX(uO|ln-s9ShRC`vc6i$)Cx&Ke5(QRiX#tn8SVZn)BwnD|L zWqp{;SSp(`AdsF^n%Gent1yH}(0K)F8ThuVv4o;IkjNj$heNxba0sVM_n|ymaFA=! zx`MXI5~Y_({;YQ}=iBoq4M??@w8uC1s@Yw>?!;d6CJo4y#%B!JJ$efo@QJG29q40ECql5j+zASR-yNu7vR5VkwSM>-(kV+_?_OYqTjBKm{ z%Z?W`tB!`~Fe%C77H`P^fcad1vK|O8l@CmGFl&@TqO}!nYmXtA}uV3vBzoLeWeyZmNGDu?o$b3Mld_j`)M3d+(Tm zfsRrxOh5~yL)JCnLdyU#jjXu+XbsWl-Zg))-O1P0uA#K+P)-@u)?>(K?J8Hh%0uai z;9WJ#)D9Tq{zP^)Z`v_VZ}U%-?6)B6sjJJhWKmb6UswJytLtRd)hl+1cjO?qFBHda zb@ftRC@B{@{&S3XK$yRm{jn9NC79wy`o%r!iW_2Cv9{M(&a=%wEDgl2&y8cUf`@M$ z1#U&Y1|_<<*qF}o3u~DIpiQ+6tr7~u!j55lIXN-61X&+U) z9PHh)^(q}VBDRffP+;5$^p$qbCoFb&Zd4cOP2Lb(I+;CL2Ya$;mG)|HRtW?#k83OF ziGif`b`{=7#Y&$!KbNG^UwXX{X+x3+3NJNPSzk zeRc!FhC022Iu_PxWkF(MJo*9fcGyhGNRLQoVKmF6);wC3_4Yu`L!zuaAq!JS6%7t>ri-rarPq1f{ezRF}8wP#n-7USH2iR{i|T#%`M&FQhlp3&lLwOE93Ab{yHW z4THIK7and;mgv%M?OWmCq_@Ju-jWp37mL-y)sg}_0|LRs(8m17U#fCmEmDGmFKSFI_#B=sNX%N(DY3t zP1s5g7ENT$QLkBTtmf3$*^*7*xDPGKdG35PAuw>;B%EpzToMUu3@;nn-jLqqc!YX_ zPY<@T^!ZkZ{QKHYUIQw>D0H7G#Gf8cWAI;JJa7$|npou}ml%%`{hDM;@D~jq(pY=A zKn%sn)T39UnW2MAjxFJ_3n|PD!pRDfuL{cHX01^IBN5^pTChhDN&N{CN<*qG zynO?<9V&T9<9k&$hhE52ohu=mrZS#0(EE760VoY@$ds~=yO3l4RryHmhVO-awKCaG z?f3a?dUL=T;q5PDleb^E_AfX03kPe*?Exa^bAT7V$A^5tI+;FegXi!z@D$O>>V$7684s0fH`hk?@BXp=bnByWJlM zoLu}wxr~?p+Ps?I?3QYXRx;5piJStv=9h{n56T_gjp!|%06ktUdW=YGo!3z5=&>&^ zd(C^^O14}2gME3~Yu?hXKoI9O?^fR*ct_S6*&AG^fZC25PvL4ux5}X3wu6vn^KB2= zrh~V4kf_NLMeWBoZO-*^@(eehs%<`Xf1ufo_XQzF`~qiILq-N7=_T3()OD_@gXcWy zP;r1GN9e;bowhvJ+4B|8qjOemk>d}r&lQm0^cerv%r^+JrG(Z;t)w}V9gc}4b7WEDTok# zDSTmh>nag@?oudNvx<&vB2dHkJ^X4%+SB+QK^b{e_KrcXWC zHooD^-GYl)CT&8Ppmn;D1IWh4YC3yWMvo+y?N2BpybLN-lH)zmVo;s+z?LaYR7^=n z->;L_;h=0MN!@+*Mhrq|yPSNFph)_N;uWO3JO|9v!2m2|akvqXJUY0vu|(!79;Ytv zoeFK>*94db|C~P&g(sNWUl9Q^{yO_J9J~j68Xuw91i!omln164f6 z!eOH($om5kKR!VDm;tlCN?Z1QH0;7`}+sQshc)XL;HiD*b|!40pTSfT4tCEW4nF6nUvFZYb>8ZZpo zn}fu1ec*Y7FH?cwrXrR0qJ1P0Te2xinxuVQyuw<4GhUqKQ?~(s^9D!W_B%;!zd$nA>*V9-p}QFq>u1OK*MPej^J${ zvfYw&Zn$h$jOt>vzD+?!)ThZ&*sF(D>d?p?!u2%t)T4aPdzwDf=0US`dg93vgtR5m z<3#4usd79zxSHvmG{z3x4rdL>RK0ni`nl7qJB;lPf;i01nZ3Dmt8#P0WyNp;rGDM| zJC&>}=QVKk4e0^x=rF_yLjcpD$9eP}*J(D;Eu4etyktuB188F*Y)W;g}kA}=LBe_hk(|nn#~WsuqH2f2+l|dpFZGgm9){JlGBlP&ekXZ_3;(@m1vc z>2g1)wQSk+8cObX%%lnO{57*J+;IPNtegk06W|c?C2xAjLcNz`0 zCF)Y9NkTArNrw0mkebK7C&c5kQgB>52|)M7kWHiNQpM{IZYGR>`+^$4y-5c(`U7iE`Hz&;Pi`e0HX^F8q=g z4sh_c14ZN=g=8}3pi3cO4;xzSet+f@_gle-@UYJ!GG(B$X|$ya@RGQzq0m~rXDq4D zM(?I~=^e8{^kl25@BZ2$ut@*X3gNpG5D5xPSSfvW~x`rV_&C>Hee+3HbbGp^` zhIO|h+0X%8W9lPJrJ#YT>+ko}*PJ7*==&kc5DOV}luk|bWW$dL_Oh59hjW>VyL;i_ z1b94pYdqegzZ888HqU^p7cagvFePEbKWa>UHlLE~=3(%2SD9Ohf)h3}^*as|j#I)$ z?|N54{hXRh68T=S6S5B?``J7F9bM^9cj=S2lFY6D5mfNz2gdb}er;TZ=>BwMH*_G( z+sYBNNaD8yc&w~FT9Mn|rMEOX#f_vIOVWKa;rkLhFAug#+?v>NWiTlNJ&7Gx1e@>2 zQBa`@NOQ^nOVI-I5(9Gb&w_b3r7ET0Kv*xQUDehH?W)dJt$`c?JW53Nhq!ytTV2po z$(gCV1-;mu0_pYT8a^AgblsdKy?MK&j9xJ{5MS2UOfjB_NqzxKOalS4WYT}C_sBcL zXg!r(L~4w?%;M~E3Qj?Z)Ti14w!>>JBr8GktA%eWw1yvg5L2p6K=oL4Vh6}_BzfaI ztAou4;vn6uOlds8`bu5B1F1k_#{to!1doT+Y3%fxjhuI&vflZc0xCIO@|0Hn#E$)g z3%|*(l3vO9Vn+!a3@nUpR%}p)!DNtz!|9~S-dP;qqWW2?J+XO@=?t4PT6OFK>FEB0sK{Ck~*N2(<`H3`k1p zE9UjUDiH*uqG>j7JH4{+YJEi_1&8JD8;dP#mR-c`7%KV7lDg8Ju5|k-U1Ft<&p?KI zsNXg1ay9J{D4+^4!CEn6@>Np#U60Q6yKVedx>XWatzsAZ`)>^91eF*rm7mKum zX?oWk_P!h))3nod;Yv&8P~wUK0%PGU{z816aRX_vIfBQun<-@oE$=16uy!dw@j4NX zZcCF>bi8307B+ZlD(ju(bibQBAj;v(*F*v=d#u`eY`vO_wE*aAFUj*wv_r0W`w40&Q3Z>K$x7lQ2ie zb_7Jn+-)p~!Z0PqD`ksn=7UwFc^uu35xbav6zA0Gt9YK{%X+9}HXbCHe2dHl3JPhY zTz7Pjb$4P+N0J~rJP$Vint{yjU=~B+OPQ3{YI1yuB)(27WZK|%iqjpbMSQ)xUmwOb zIiqQRqhJjDPNC_~;iT6}=@T}WJbfW{QeRZpJW%VEZHu z@k#6mYS)oL4HY5}amCPNqix@$1h@7UmS*_(;v!tY2C*dF7h{Q$YYX@*`<1N6nb*Ez zJ+5X8qUN+wUAS;w=ayny_Ou>{zPuiv0x9&@?s`G z^qA?!O}N#) zoO^w=w6^`$a>Xb_3yPT$Fwzn|qG|X26canJuy_Pw`xKD5Ja=}}ZX*#By3KCsgCLM= z+AR_hJ+x`JBM;Z8Q9gN?y?^!+c?(FLoPy7Kl7_Ax5FL})(Ld&|QG*4meZVc#ozZ0e zXvOY)?(oF!D`SI->rJepxTG>MMYsRNCwl1kQEL29rE{COero(EG)%zmWKEnz!GWU+ z9jYu$@XBEGJfh^4zGr3ZhmrIJ?6mzo?StjC>4|%6V|=;ce4;&Ad|HU@#w;&Vz6YBN zXd!({Il{+Zf&YTiqt?~)xd;uEkYuh3E__f?@I588Ro`;HAd0sJ?Gl^)u5w@i|59;? zDnHd#K30``jT@2RP)G6ta0bz?ZnLM$E<^ekz1~Fa40wKn81Z{?WfxF<5!n3;JvBmD z%?)5`@u%^Spl!HD@$vehu1kZbi5Twmu0fm7q4E)myp}#?Pf@W5k2lz5SfP=+S`utt zORI{+aC9-}ynV@ef^zOw$3!GF`uoHh!3(jA)zMr1hTKO|c7B_bBhK|W8gf(-9p2%w z4cC^nir)kTtQfqljKE zSFqThZ<8^1h8rN3X${c-kly?8-I#d*XEZF&DLk=iztA#3Wb4r`&mqMYW;*9-h1rur zb%hixk2?eQo>Sr-k$H}Q4wu=j>0~!^5`6vcZ}zHz;NFo85wh@3_(x&hJSvHBe5UM? z!WzoAT7EFnZJykwOGZSLPCt=iabr9n#wgx^>45C3Fs&h-P^+I0R?yGK7TYX1RO3CC zWuYWmsczHVftXau292N4)L|Ma({0K$$7MP_lD@QL{sgphR_}|nai~P!|Fv^ZKDcxr zwfj-kz4O>$@Z-K5+^d8(Y9SM` zYJSDg=@855ZlpsEC=~lF`$W7=b*wM$4OZ^Mb|*cO{)Kjt>5J#QluNu9K>ZmB zi;nFO6L89cgvAZAT~FQY-IOZYq}=RHqPpxrmT%WcA0W36ppng zd5v`NtfgvO>Qk51AAsq~I?83OSRpd&_|GV&d<1e>Zh_%!CF^I&g2~>bS|Q5ZbcV5T z&7WBBpdx+$>Qj+mnX2j-{c_VDOR{(s_@v{EiSJ0{=T3+M|B#@Lef!(NMZR7J7C%`*BYPj_;D`aS^2 zyTgXyzideXz*uj88wFEK3v{wC`_S12Wdb@yvGPDN>uhZa`9rDJd4K_?{&qez!Dkmf z?T;=-s!dNLhKLZAtZGBjmhDaP>Ap|?6{HBPOYFFuI&a4GiUtp&sloHe>NU8wVIB?x zJ1REH)u1kMM)GNRe&rHr-oTNeh|Usi1~S%!k44D5W9Wf9!?(3Uqs&4PJzsE9p#qn< z**aVJX-S0VIFsL|7-R>$2SR(5bQ4LffESqus_=$aM34*VN0UBxu;q9gQB}9HvIi0c z`eg6c+)AG=N;aLsB7q%|CMS%#P3?t;z7Uv(o-Bd2&@}x>AhjdM>^I3ek$hr0NOwdD z^qdrbvJ_Gq&5k97dZLqaR`H(@#uPTmPw3Xt=)oG^v6@nP9uMpxKAfm6nH@!~?*}u2 z-)k$d1)m1z+7fV|FB!vR(_JK%^1(D}&%TSNxC&gnl)!Ug~4OK{lL z>$3}@xi?HWHF;y9jRnb=R7g^<=c_J2x@JT79u0^LL;U4;j$yS$Ah5O(YZ>aEvd*#= zI62o2Z{v$SL~~=iL~~EuFzUrO0oND3{f_>MzqfKJ%tpE!&Ni1(y7>Ox2;bToNg-}O zgf%%}tizq{#LwgWI+BhtVYYeqzaVDcL-@vd5sk9<}TCeRIY9#$b^?%i_;m{H~Pr{wv`F|P) zZHS&n#CuA+52eghRg^if-6TX_!J=Q1eaFQ-K`No;MHX|0 zV%G3yd9|Xc;wY*B$D;R%51kz-iQXkeBmW?Kr`O9xJCPA5h;>UVvTbAqWtU2i&|N6T836oPYJepGF5?It`m!aq&w=? z3J`V z^Qo~6OGE1Rnwj>6mhy#Vakh6jaOrF^?V(`uBg#jEsv!dhX=%l(WEyHlEf3&TV-LG_ zcYeG)H*!$C(>v+8VF(BM=KJ&ZHN@5I%ftUbJ(A`y=J5fZBeN33w>0MkW{Sq z*?QoEh6#%6oKlrU#~R*i68~izY0@omTLfX2B(>$`V4_$X^FLB@cj@gnB+QL%NH3VJ zq?wAdRE?nH*emb9X<{*!I$f|d>gEx%h~X1>3h#du^b{KGT`uWsyvS<;u5qUp8+Y~ z+NNmNZGheQiZ)==S4usMGQI{Txag=qvaDc<72-EoUjEKs8(>Rj13ZTT*3!a=ig_D* zwNChUdehdq!AUPrR_SFN(rK56%3}k?LyhvLkiy--Der9Yaj2Q{XLQt$8`U3rg$2|v z5ABYR|HGmEGYPv7?F~?r?$GL>`mY|^-w|U&ORpH(t|NrK^fg$U{)%3Zz$T`%A$@E( zv)Eb5(`je}nor+P&|0xc|0Ds1rC?aR(>ny2)#1#wH6wVnF*l$nFXbV;j{2GrBn3Si zYq4gkImwMTSpRA_;nB;(%Hv<>5fP?1?9F@=t$3%uHw*iI4%ue-D?rv;|B?2G&BdAE z>+x|4hKk=dOi{YIpbPImCuw-tr@>}jrpS$8zsOPdh{T?AW46+`N@73l0>>gtJ(<*_ zd5Z$Yrt^`*<;uFWw#N3LYbcYvW?Fl>mkau2+^iX;1NG^}ZnuSN?{K|t6PAq7DP?tP zReo{1>oQmD`hd&L>u38XtQ?Pw0J-)}>^v7`0;lzrdw-d<19NYs*5zL7*4`fD*Yx2M z(x6M{p3rMZKTuOCG`{?UaQbO`6gZrA*D34fAitKFo-;InYk8r2{zw#(<4MbH3tWMvZLm5t(`x0ap-|51^KI;{~LZV-dU35Ax0i#-CN(pC`{^1H2K00-k-7pjZ1wj}4rfN3 z&X_2wp*9x@PJRnu+Xi-{cfhmE@btv;a9|^s)=>^bDpb3Ur?P6e56Wep!}ShkQ-{@~ z`{IYaI*gO~Hl7OATcF(Qyp>n9oqk|$j&1R`p>#Mg<>jmXcUjNTDGOh|F*hw=wdIMz z@K{z2Pwv#O7@T3B+2AzfhZhECI|?>E24}1d&T6JLgj_eg|Lyqnm`~jIX-GZKJ*iOY zZ>TWvPEqUt+3`MSl_Pheg7-7QBIy%rI$OlSR>lT~I@bhZjR@v(^oq{Pos(|)f-?=J z{edQ9=8OroZ9M(tbYaf2GlF(rCE+t8<;eC~k0Q!fUvJnCr(kphb;#h&G zytS0D*fW)4RV*e;w2Dd7x6x38qz`$6W}-8qibaS|{}ri|hFHS())( za4#kKVJv`ND31ciTDO2Vkb;+{)YV{eG@nQx;Nv`1N9sM` zH<G>3=)FRcl?M@)eTzRRpc$?7@(25HS!KxwT*rq#WwUQW zl4Nkq)IdM+UM-}PjG#OGuo!9Z>qxrsAUeB@yp8E`HE7&NC}0Nw%2$>B#ef&R1itey^~ zTDwEkiHVlb{gmtvxVqW}BmceTYTIosU?a@3<;{D92~U$KP)v0>3UuCIe`{e|{jf^! zQ;fe;j{@`yXBJd*Xn?tovpRIKJFLwjzs?q&43|bx=2;*c()p@8HvpIPf*nk~d{whN z9d=DZsR`d?;n%rvc`O_vzaO_Z6c6prS2gAPkwvSDoa-<*{(`E$6~VvD~Vj z<#rliu|DDtM(%6AgA8s&-v6^TurMMHz`JR3A%v96tY6DrN_nhm3lg5V0=5&nf@S`l_YV=45iXCPTyn5{)$=Y~9zR^SXYy5lbm8*oS6pvCU8J>sn|C(0 zMSz)(@A6eGF0nlN5q`ggU+==@@x#|KqTZj60R<@IyBG0Itk|Kr=y0pT9fc_J>dh*s zMUjcR(tNQ2cPc!yppr7Zwa*tcnbtKJamFf;bVpnm#_L!(ISmGiQ z{NEGxK9`{|Ex%%-W)^6odT(5Beau%~O%B^q+Y4IV`Bez5o*Z{GXo4$P9&2^lpFzX@ z3Jc+hXR9HO{(K)590n&MCE(0sCYDGa{y&5LTX6Zmgj22JI3T}r-jDN12w;i%EOn-A z%aZ^r)w+W?b}V`4s}!N>Xx&7hekg(l2R<>IKt3~F+%i7K^>ws*B$KnFRWfhqlD>)> z+|eq*wp_6AU(EeiK0LT}BOx8FQZ;wst+R2KS>i>0jbYQ68K-Qig>j-gTAwD$mDpBv zJ&Q{j!xbg*e(Hvb#z2B2l%IQpGz6J@2GN*~);9j?M}tMy`NbDbBaGY53)k@tEqjz$ zFS!hWER#yf7XDM_CQ^r&DgDR0@}Ck=LnZNF>y3=vULT&(0Vs8NcEq&`{O*mn+rpVen!plGyfN60)b>kB_MNXvk}>shb{ar?GEk?Y zt|kPN9U?ds7QN<4jbFa%>n>RIM#1NY;Q-m+$V+pFa0myLl6J0=E9ka`d?9EG;ul{~ z&(g^Dy=5aI8W)L>8c)`28v`r&3TdD}MrXcD8|7BQs&^#0Uc1)kQD@hci59)>r_pTw!XR_uOqnmN)YX}JQw8iv zGu1@-ha#U5#JA@3Le@5K8Ul8`ot178UmZ@@P1lGW?B5 z%2)l;h1+W7!lwdk-hX!C^5{qUK^FdBE?gczT*RICzx{H$!b|8xzAEIxNe)w1m-|WKW@xy0Z_<9#Ej~`xV;g7j+dHnD&Xppb^ zu?v^S51(q`O)gv>KYY4{U**E(@x!NC__;1z9zR_7kg$L5!tGKL5x{e%g&*a@Z^p zM?1IjL3ZZC<iI-*(~h=tsE62m9|XTps-h4;%bPyKs5@@Jb6m*oDjEhd)}b zasn<~9zWbkr`AUgf*Y1QU-cH^rf%XR$RWYn94Lw0`KskTlfcdZ5cUJ7K4opY-|D(s zVyli8d91F?f;wiAH{+j7x6Fcha(`3q^n$Ut^Ho>6^zvBx!Zs$HA95B^cK5NzrqAv7 zQZJ@c(z_bnh6OSw84smi?rg7)9VWYE$8bL<5aUdy#iP{v;1dgO2PnA-1WdzG59Y`} z2ESGlOFgid>@b2ikPic3v3{gYDs5jJ^Kdk+C#Ej7K((h^P9!AJ_67R4H)GMY;=9Ck zy;ejYiPrle$b?o+Os$*9#oI5ot77$Eap@mv7AeV4U3{wceg-k-(2DEToN|6Ryu`cj zANjnPDz<*_QRPZsLb>R_S>RUizwj-tS7tM3T{w;DDksvPo?fKJcCM<6?cceoI(AU! zs?yk@tk@eV75#_IqM@`wPl+y?E(cGEE-J^-knWY9I=w!?6ec!Clkt#OJEoglPhzW{)=S$Wvr*yk*JHEP( z9IUw8ypyrpk!l~^hQRYUe_3rv*YQw0=AMX0R1?Z?pumB-KCa660_j+DJKXL1R~OHJ ziuM^{{ZG32O;+5@;fp>P-i@ExS4WRSuF=`F6iddS(uSp=&e-2M*ET6jkNrrZeOF>< z@0<4xU)~Oae~l$PUD~vInP9^J)$MH`Cft~M)^3?Uuj~Dzkl;qoEMD<_^kIlYX25Wr zpx3TLg#hyas9sVOT0+H(yYu~2$iHgWVWnb6u2LBaDPynbq9sj5pDlV~q;`+4WCbU0 zM*enXqS`GA@-v~W@D3SHS ziJNpV|NdyZ<9noR9D%C`O>BNYwqGRENTwSt6YXe=o+K%7eX&c?S|vL%f-RJM)!CK| zrkyK`q>YV4B?kL<7K&+u6LGjIv;RZAWOSNCw8iCkBRT}0O#(X37PoqT`mO9pj$vL# zv9KZYAfK#Y6yV;t$U2P28v~Tjjr2zD$=*-eGuPIS)GXEwRi%E`QXfap!f9Fm&{HgS ztZJ5eFy-N0ZMiU2Ddi3gW>~UW-iA-Pit1CFK+>M3E_4Ss^%0|yU5wnYOI%ghzt+i& ziZ;Oq+tmv(p{p^852T2dOD z6wb65fv)#y%p6yuwJHs>PC=tM83seH;10iVFvrsiEd^TMGM&0b%Uc{Rhk`E<1&0++ z|0qtJutiG_l>C%`0Ew@^4Sbu{TK`Nn;)Iimz1DGQ;@LWF61(&h*h?Tj@QG$PV|Lbx zQj5&f2K5~UI2NQ9F~X&6Ia`|#Wao!JWa-pK+p_5tkgiEEE&6JvZH`@e5zfT!i=r2p z+!@3@PJ5MM1$KU$*M~>iQXl6|viNXfxxHH+t@J@xk@^^At3kQ4#A(oRX>#3KX|I}Z z^Tu;QvD^O1uJV5FF+kWW%e8WT-Q#?U_ski0&ZokuS2&-dx8g6nL4Ot!@$&NR_U4!Q zL%z`<_X#~Cf+?Ly+uj9}BM?zUQXOuKy{=rW(2Y+43gKXX;-r(3F1tZN>6wF`6!LQA z1G#7+(VGUqRxwTzMhGi215oQ-s21V`K^9gjGE+QNFq!|tp%z&7EMrbat!N#SryJ}$ zT7?&KO1TiF!q(}OrLVBvm$U8k4ndJkS~VNg^@=e<68AV-aA4~wtK7v&&v?4`;R!tw zR8yZWE=hWkY8{2IA;qJIx7SFTlUjH!4d`eUSEU~7>~3t{@C>pU zu}z!mePYwc{Wbsry4AU=GS)w_=^gHoj$WS|jHR5Nz068Z8IC8bDKR+VIpX`RBSm0+ zVp|>05}QXucRw}3J#ZvdvxKD4ed4tx(LRZFQ>{3S-As`d% z+BcV?6ko^1vHZ%e*wO2icWN&Fzt`igOK{qy{of?!`UTdkh4evEvDdLG5?-8`Ph zd+Clmg@`r~Qp|8)FH3B$%sWAeWX8y)GqC=GnI`NU3gk<$yrt%mPZWA6A>I+=q@f)< zN1BN`c?v}LEu>-pyHskni!HO%MwJsDvE)5glh~yY2@$jLs(~sMDSde>MRUyat5!Qp zco$6G3`)3k!AOniEN~jW(OZ9dFOCSygRN|xO0d<0F~$?9srV`^noV`OR*3F^(}>jD z@ESjHM6>15ka6T(vxoxZ-{41v<fQFFwr5aH?hsxJ3(aa5nl6pJ*hYGA!z}4%nlEVxoo^qeNVIToR()f)S<1o`t4uAaT#4XiP#}F>V7Y z%z!XpTyS4VBA6I&+oBkC1Qh!B{+zl!3*pK0Jg@H`zj@Kzduus$>eQ)IRi{p!+E^NG z^AAgIDB)V0He8_twJz-X)v7t`h(6GV~=4|DbREr4sJt9ri{|c7k=#434+t^S|JPXcEfg&2Jz(iq;39uMy+)me19|zSTJ*b4Ai_=aSCHPi!F_aAtKPaJ zfbUwbP`#xHLXd}Cj^d8z{U%oy^COjYvC0~0WyMd={z|I#O!#{Qnth<}mvc~z^3RNqdlkwwsqIYidKmLl#y`OBAp+Z%vUWyXCc)NhM>n(mUrJMD6G|d8H6B|ld zoW(@F8lUr8KX9k|bOLxCSexat%kQrn(~GkxOoVF6suR(oUUivxk<5XrDO?_y%F z6pMlzFE||uJ2f3YDPaCNn)v|1Yj_d7Sr-Zl1{mPcxQq~*?9IPIMbL@*S92iB2?{%I zCQaTbWFX1(TpT@o53rf;sVXtv{*pl z<=7rfhw)s>^j$Rv@cnLrxL|_}0k!1T=dE5N6CmWsdC54J)=tHjSPRfV- z1+Q2)e)S-S*k&=lYFlu}9kO>_C6Ln+RX>Q2S^7gk1*K{Jz+b8jm^oON9~_iCjnkH> zN=P3aMVwCW?3ewdGt+|rv`ls&=uHb3h$1p@He$4Y<)GZR1cKMA%A($~!TnP&xFyxA z?{S>ugc)Acq;^pWc#L>1{wfLGrHstkuBza_Q^<6}f6g?Z7AwYyqd&Rw)ylPras3a+ z9kW@;ZI6z6Av*T*vY9hb>d0l&s1I>Ti9<_yM?1vPZkQ$T8kR8jL=xBM5BC}#;#Cmq z@ZUcA6Yqv|@xOnzH9qFFLk>`+tvhSFa-m8YQqmc5XjjCyD%a=6JDcNZ=4m&G$S`l4 zzxsPB6Fxb*P7ZbKC&4cW*9iUu5sns`r$IDyKF zVL}}G6Vf3A&=F1w;V+DIlXSlEfL-K>53GJ1cjfEj2XJRP{0UQ6x>9H#*evL;=+kJ} zs+#m%Eul^LXzDy~6hcfp@f5o4J{^O_@tw4p-2NgRnaiT}wq=ni=_H-9IlGXLN$3jl z1*Mp{07m@!0Mj{9Wz`^cML`nbfyF9(qAcF01)1(`WEg%xW?GYJh;k`_^2-p4sv z*3G@*R~wG-fxDsWn*Y-G6l5l9Qp}l*&au7n;UlFov#553hHTcZ0L_>+<-mq=w;)Y4 z>e56sN4H$niPG7f`iOW*?j)dhe#e*~az5Q$VE=iMR(Cg=;vye@fiLVcO(b55vd!UI zoUp=`f3gh}$0$E|V33{;@+%@A&UDLvNVohBF#(uj0FX~CDUt_KfBPk3rt7)G4FGj%H&}7o!|OJ=_CH>OsqnYF zIR_UouP;upyF~R3i53;_jraLBOxRV}!hBgIiQ%`zF`7VAnmdRD!}%$EpxMIU=j679 z!TOOP)qP=LAo3fSFUQ7ohZ7YX#zZYN{D^}yW1^e;8>Gj(AZhL74ss_FCvF{M)fs^PMZ6%5N!`AAT#7> zP-j1+Tk`Cb&ALK{0t}B-ujHCilc}j2q>hvxS`8Yz7%=hg3uYB(`KlBaKc&Fv)qFx& z%_mWKDH1a;ed#YBuCel(XS!%h+-_fr4m6-^sj@KO}4Juw9E{=H8wlPP_39r9` zYX%vEhj~woXX%${do{7O*OkTNuE&x8`Eh*nkH?yFmB#W_*$QEsT$La9L$9%n_toR= zyD0ljMWn|jP8h@GAwowqad+Xg`2!Xeu{3;foj7C#yz-cM#T);6UD_5~wahiSAcVj= zZ~Pi6lHt`Kd@3WfnC7*Qskw%_Houh0F=1i=H#bSG{>i7?Y}d8-Z_%kRp5TjBXSWYQ z6xS8u^>++cd-0x_UBp|+D$w4`CZCt+L+Y3{WVN!UQ5FR-bCjMwwJLr_ZDw{+WbVn# z5Vte)`F34uJN54+8m1pNvXwxf{J6to#av9+IE}^;83TfGyW6V3FU%L{l>9Z%viu(- z@-W6+J3lDY=37*-o5Whp=x$Zf@nx^!BW2ON$`-%sW*N60@n2*jAa@vuG80%L*sn+( zsRt9t;4?)qY<3CtNpJ_KxFWK*5Cv+|dSCes$D&(d3k|IgaHxo*J^?Cu#JXDM z@OvN?&Ni9+%9Db`wEuPZ}R@YwB zy`F!GM*VCB)dNg?cMysX37mg($(898gjZ%xtKr4mMv4+Q`rvn8+kny38t;jchF7#} z+*;J|$~B*Mr+p{MceL5XCk;cG({whr$(>aF8Utfp$tsbqs_tm-6T8$fcLf^Tr{*|L z3kp2tKNgq?3Ve`N?al>maRmx!dWon^d8Iwdn@kiHoMMmvReAdb<-N9x@+KLWdI9Y$ zuewKhrLMg4|9yE6wmO3TY!~GXcjXCaXL)^C^|%?#ZPwA!^Fu`YPtXW?LGg|29PDC!!1)_E&5{g`?U~w=+)x@DQvZ@0Z7jwbu05gYJUJo1 ztu&(PNz4LYk-ds$QuKmX?1m7pu|;;5ZV0y$lS>lHcg=3;=u9_k%~b%BwSPN%fKl(q zZMx{9#s*Ec0UKu`ABo+HciA#-_wKm>fpOH zh}V$>)pv`Y;5|p_sBe{pKTsAjeDI5B`5!1N);E3zCkNrxmJcs!LHv{;JR0Pm8GJ7c z;uFF5q#%A;@VzLApB{WqHn^knl^a;G!f{pYre6)47?E zZFuM2Git`oFt1lqU2Q5yV`QiEHR;H=zmAN@`M~#XoC~13)V*b`JS9mb9QCI*5!^bQ z>hGrqtVu9(-2X){AssuRE_2*%L}@XoC{FuYZfA_3gx8>^>x3g08@{f1|E^_^uM_w5 zzlhEx*TV z%wbww<&PMy#sBtf>-*~Wj4;7^B&$;tg#d|;>>>*wPx}o8s}-RnH2vHTn>%SvIRikd z*jo&+VvcFr5@UhxY5lecJeh+$f+)~R+MNm;CNNV-mJeTxT1}aQOn4hqoianNTFc-# zA+kN6Rr?jtk`T{v_IGQx0}I1KXsKlhA4nEWjS|mvE-(I~RE}Uz!E$U0J14oxjlFdH zYs2q5`Orzp%1zwA+&gx3i|N~tzttm)j?;VWK%wkY7r$t>>6M1MMY`R7TJ7Dns)!8? zI1yBQZ+8%&vWqzTP%eq9VcZoU@ZK%0>e|4{4T8t?qCX|8?x-#*iXE)X@=^ESW^N$8 zW!8)S3XEkE+@JTg^iynC+N|tJ>qazV+SVV7`n0Sghn=s8dNph6(tQS+)-{qG-HWO8 z_%)C*Go(%rqNR^1WwtViZ?W--$Zr(e(^RTv$`=RCGdV4dal@|(mPh=?QG|EW?1k$@ zGp}(^*HRM$SRG54wQb5WqqC&q73`sJmo1PmmsQ8WC73tlBO_hA4R~2nQJiBgq_yWr z!dNlpw=h`lhgSW-1k|a-m+k{_^xOGK!?Q2G=h{VAiT7d#kO@z3ca^#VL{z!>w(a>A zaKyP4E6YxHso$92-mS>at~88lNy)EegN8Mny|wCL8&w6s;%3F5T2nE8d{o`DTz;sbn5 z&5%aU`BHLkw;O5uuPpEC%^36z5tB8m(GxhX8d6GrxBw@uRr_88AIyMT4l2zF0wC1=OgAptB1o>!wP-~jO(*q8&q)CK+w=85S2oA?Pe*6@ zHzN$ko;=HId=Fq9$!8%d9#3EALl966Vt$+LXe(u*LRe}=+lT#X&@KX!M6( zrL6((;OnqWp!eZ#m z(a1sBdiZY~?~*olgJ0~lu2t!TO>C3;-)o#2qyT->t^q+p%D*{)a8e;YooL{7Y*PPw zjfWM23*t4AAXgDbt1~y*yaEwE(|;E)SCF7VawhrIThv_s^dVv5X(xTXhEs#eOp&tG z-E!uaBpl`1$)?(Mr`+eWUEKY|W%nVoHh3C;!&l;|Is6ZM-pT*k7D+y(jmo^^RIedR zFgHxWWo)qIvmHw17&MxkIh}mXmhauV)X2cL?(O`f>Ctw|0Q(I^s)*@GQt#HJPnzPo zQQZo<(W1vBd8}jMT;aJb4A3Ual!Sn-YjFU8!q z)1T9635?1%>#Um)z1h<$`FmJpIo$`;OK%-DLpdW~D*ItdeVxyikLk};;w+(3lC z?{$u^Ulniu(lB(w6InS8Z>)j1N=cxOjUYF?| ztj%~Rf=w6Qgo3VFs!QKLlW*G~#rC8?65C1lGqW5zHQgeVT9=^xG>9uFE_Wgw-j)c= z(iTvPpIhu`CO56zj7Xa^)Lw=fG`ofNPCj**!!O4NUgT$>Pc8_9*pN=_Z)bW~z&UPpaBS&L#7nqQi7fhqnGSK%3p9+#-?UD`eT@T+jjRu4Ohd)3HbWdkJ7-O>NB5u=bksXmKRR76ZEUMq!lHhyDoH)FL0g$A#-de{wN2 z#V!oBq``O!@7M*QSSI0Mte+E{Ze_w+wR+^hfS*&|&q7<}0yU9X&c>0u`( zEwMK=fbdrkTLa*Hc&;l*ANms=d0^-7!u6p)!drRd!{@kgedv$y%{=nq6J5AI^e2K& z@=BPmNAdKP*5t_>nryWg6n8`rg$VlNO%rSDlpwVhmVxa#L~^0Sfy-wMNu1w z&WGQeYqZga{!kWf&;x$ZqrF)V{i(|*5!Eo=gpJ+33O!;AnC8P{47p}~7!IgbE%$*gyug2*d&dJ^xOR(! z^p27Kl~N@;x7bKuW$@o|;ra;D&$RFrE?gf$xSAgSKQ3G!LAXX({NK26edv!Bu0$=V zm}f$(f|2iKN~S%E3+#nM@+VE{Fz)9hX5Z5vL%?Q+oT!J^=A3I%IXGwL5zQpad1No; zKg5t+dSCPzt&v(Kq4dj~U-J!6iMV<8kVuUYj}*ohdHF1Qr6p!&*6e~lhju1|ibKrd>Lam`h`ims)wN%{X(@^%b<*d@{v&yN%V^w$y zBOM?H2O!@4qXVJT`V$Bx-(ktKcN3(N)_kae0o)fV5la=^%?YwC@42&pPk?S{ad^!I zXbV*jWgl@7M?UHzeo934p9)JpHCYKbDVIr3;Vn0k{2Tvd$?#}vlHNa2$)7Y3$+t)y zP19cJ07&{Xm()LiB-Q}$_>UpM|0ms815kwbzv;%#Z|X?9Oq^!K2A!u~&gTQ=iTB^BJEWSFa~B+>)8~gXOew@XyQGq(Hfn8>1+ZwR zc3HpzG1cy5`64E|i$$f>Ul(yQPeWfc^QfdwG-Cp8Q6H2{pC&gHxB0!(4JLO|$poNu z?{PkSd6T+>6EqqmHyEt9Ytk;wRE`63G_2F&0+#<1H@7CY?BMEdk}}rd%bXXTEQC|m z@ye|9W&W>APZ&;{RX*vs;8fZy@(i^MW$myZH5A@j`w{d2|ABXj@XDm4JQh_8Z--=i zV|OHDCm;v^1A;>xg0WJNi;vXm$Q2~=foASl*F3qgk!SWLD0gso+~a!(c;5^kh}btR z65ccd1PgX?QzuP}rXN*RbvAWx>4p#bDHt+g8Jw8aFMoKv@9LU<`B3^P4fVGB#@(Zj ziuaY_0A=`my34S;%P^>ChH9o!=|?4cIy0>Nj~STmp79brEd6N6W%3##`lh70E~D2_ zL4cLUdX85sF}sgaWx`(vl3~^FOkuds7c4CwFUs!0^Wp^?u(bQ?#h$|I&NXyev1gUV~@(xmp3biFipo z%-J=aw6geI{~+N(d6XMLpseX|3MbbCCGp)%R3w*`u%_r2@0V)QOEiO?*?(;t9+FBB zr<|#+fK|K__ZZq#%~!fPhgHrR>h_9Txo@i>GcsaSDBe|xC@+}XX zR*rgEXKX(8&pQA%vbP$&wQ`D;8&$hb>s*Y3iI2+7b@g)$w+E=C6xXq}`uE}#)6$oB zOU`*vOW*0Pz-~tBZ^vBn>voa6x~I2;8sz^@_jT8#Uch;jqUS2p-C8At2 zpqKOIBz;ajDK!3L**4^h2N`k(9m+J|X-%3GeK*fS^j{SH(IJXvEo;#?bcA!@FoW)Vdo(@TfrwFfNh&^CFf>)! z4~ack*hXy%-g!Fb-AmnNc0}aEy?~qBS2T*G?^*!;m+1DjmMW;>)wE%)+%NT33IoK;2+x#wM^2bBk}%`RFgu5LY19maz~_uMLAedmCYD!fAPT!5JFUr-qEqVi#3R*OI zH!UhY%(Zpz&ylm82aIyrS1++mhB$ZCykwO)hjZI?=_3n95K_a&zEhVvHqgIrHT|n# zI{j*f%fiwn_HvdxpbT<8bbVYUMbA9l%^(L4RMD}hb6d$NCaQPqNUuX|7E{dV^b zaIf(XyfZb#2~7P~B8k=iluyaAnFb8W!yJOra@Ps@(opOtdRB*Gm+F}a#m>%6)mw2W zR;MRN`M(Ry62avE5SxTs$rg$q*P>5_LIVpWQ~Y2}P5Z2Dp~j(=Ex_gfgnI|%N+|69 z;Y;Qv6s!7e2OEYi&hrkPxh`B0KAASvweaHk3WrXjx2sqC=_fsxnKO%0l2#pBJ zagRlK4g0_gf!*P!{&g245}40kszH#WBApQz1`*$jawZN>o~t`Ez3oSXxZ|RjC?aXP z;%9IJWIe7lfzh*U>aA9i+i|A5jquZrros?c;5d})0;UYxo zdwb-lvIwuC4G5hC-QyxhX%;m`v`*8{Z5O(TLxLvgqUNXm--5UjQ4M+5 z-p;-bcbYrO-1MbK1a$aLfXk0%u*fVf*GJcedru5aY#S5n*YHYwbFS~|qS9OzxNEz? zZS$uAmxBAJ+Ou;3%v{Sh`sE+J`#%3xfBr=X$Snx^Dhc{?Bj-iV$BTOIqpkr+_uV8v z;@AbFBzVz+ni!}yoin(69TVUx6f^$j-llptsi+A-m2t}*%4YM4%wVRQZTJK_c7_JV zc2Val(^1bITG@&*=mmB$ddmovq^$<#^NDREW*r(yy&Orj{VkH%I%dW|PFa0g>-~1~ zm3t<(&5rNgg{x=&tfy{L`DWgaGX(-T9JIOwPwI` z_1h9`)5eBhtize!lh4&}ZRI=ux^wiKd(NpDaw}>EMh5a5#BVUaA^djZ=kY7yHpZn7fBl;V#rbVe|;v&m8bpF+wu2nmIeU z>{-nUVpm6}E^FltuR6*R9liCsGwqDR_q>u`-YDj7Qq1x!)gq_D?zHgF;mkVD;{+k{ zUu$K4HhRsh!)nq^4pR7nMf3^e-=A)Wr%e&?t>Dy7uAjgT#hrfAiVel~SgQP8egE*f zzCy1w<-lP!+RZA7_e7ASQ>GvDN4jsO?~iyymh6!9 zVJbK3R&C}rJ9iJ^bBR;v9)#M?@6u|Znb`0e_P14WMFTJ zUMtCdY{+%o*BAzaN&ZQAo~5fRr4=QQ%1fEqF>l=HKY6|tg4-f&)G^RUT1FD%%0lr& zvKK)eLoj=fA;$=C1}J5pB|nB|O68QkOAiZxUFv}8LZ2yi{3`Yh!IadqG&%t>!KI1+ z(~jett@<8?iXH%DoqfgWU=#_Rf&FZ`BY$U;h3%3{REJHmW2i{1QU`8GaL`4TZdO@! zZK~#rEtP8-x#a!pMkOBoF?(-}&ScPlIkCu!&4=&0QWE2&;YN}BjWnBL=W)|d=0f14 zQEZ<1#lN4ThR72^YX&jH5jcJ7@Mx+JR__HOrvaNBx0&f+GjJ@`|c z2&;9|eUB|<9(z^QmG2X*bFBvw$cc)JE7v0ibm%j^I04-14zgtWhJR-gtdAaEO)Erw z?p`ObF8H~2Kpt8r917bdk;F2oO0k_AVXaIfZOWGMY9+P&gk?2canvL(bi7lTIFBb|<$7|Mvpl!ws&#ok_O8gm+M2T;s5o6VuHy0EUBIk}`R5czrOCi|R65PQ ziAu3C1qzKOFm^~~x64YTk4g{Dias*G>AP1U+t|yx=+lcpxiK7I?c$$4Mm=s87_xI^L-ppv+ajbuF`qmRZJdscvR26|)aAEprnBgR+lkb(;|y zq7^_)txB%xlibqBYh0wU0Ap#5*%tlsL<*E%NaH^nej10&P_6HBVxUuJ7bUqF*~1h{ z|C*&oS=jCm_&)4KuF2NG5pyah+GP5kMLqm08NkWW_!Kz`EKtX4WeSwj-MEuw#Xd1e zbXg%$!Pkty>>)6R1}SPuf#U$>jMf%OC~+}XUD=d;_#iMAmT2_2uM82B4}Vw}R8MVT zOQlc!b0#}BYp>0;$6Gbpa@SId!!z1G+Le@s~3GF$}A({UOj*CU0BgO0K8_N;|nr)1f zh;?ZAC5P+M56!GrGFSJ613x-QmimyazI^--; zi}gevzXL}A;-a_df5ro~>Hc-;YRFVvz``FBK-RjQXb4yY!~hGzf@*Z!1s1ynX+KfH zNs=M8s52gQi=lgMvDdhTk`y*QA0B@yOu_3Ue3qUvrckdgi1!NO(>FQ7uy&vg#A~Kn z+{&#-{-plG8U`zH5Nj9!iNDm2x6wB_LcGOUOoU~xj**ou^$ zNDu~ZU$Y<&V`nCLaG+9U!rSkJcJ2<#f82;XI2fcff_#kjOuS&#`mxfwYV8xes&KDi z4XK2{s@gH3>{EP@wX(x@v0Y~RPF8VuDdF0D_%D38i-I#&K(@&qC`h@pTM4h`o5?aN ztGtcW*~wUwbsu1>Lj`^5WK^TkbWu8?3pKccXrz1(?=Szo+E>JX^~4lb2+vM74JY2Y z7XV*tr%{mCt$cVZUEYM4#Cz$mbv~AeGZOZ`%HB}=%+Xb#hfKOlwF;;8i zQf|1cOFbtE`rdv;q0~wS2AtW%%1Uk9hAXBbs?E|U(s3pI!GE6RL~dB+D@+n2OH`Uo zJAP^Lrh|1Du7vXTx6^v49H|sdy}%l%F8xPS(x#u(#*$m{xb@4r{WX65{Sr>Rnr~l| zqZdLJyZkCuuOY8Jv4&LoljNyyYhmHWNyZie+Y@^-O%t2)#u~%D6$fE~mlw-8r*?KWvSDYwUOGeW$FPi$#U%?9sk!d=v>J#V z8)cY>F`L)Y_e&jk<1o2&w=|x z0Pf}jxR)$m07?a*)B#}UY>;xD@jyWGFKPOJCwcbgow+~!HM!s0%_?#DcA6!Tx2RH#2+)T<#tBv8QK z+>##Nop8iNKKz5@5&eoYe^v-}%u+0lA>@QYoOBvefwHnJ#EmS(*=CUCyP^=+UvW%l z-V)A&tvlHBT>8T690RpFVj4m*NQ)AsRz!%$EuPo#J4^6uJHQyF7p)_HNr%RZ@bcpX z_p!28%kr4Yvj{bKgZYcbAQ$PMPr3+ijT6exgl}@SQGj7J<1-0uZ*v6K-%ZzgEn| zd^qkt+x2-ozS`X9R(&4fSZR=ogv_eD|6YSwse;$+Vk;z~yy)x*)JMmfA~!zZ_q6k6mMtsk&+igJ$6`gPt=toCWI1`1>vrrGNh zP8LbzMl(0K@yS`X>639vjX8(Jtbl6N;#x#xj;i)^Gu#ChJo=62V>HYh97$UUCL+ zEcgFU-T)Yt>%rijfJ$Q>$?ZspY|=J zJ%BgTe!r0RaK0S{AV6q*14nZ1!T7%$DU8v*)MjK?p|;t(F`W?^IW?iSOS{IxoLr6N zB?l87%`kCJ%~dPb%&E$5<*+q5HhYbYB-ts)RpD-_SBD_21E`j;;$^8W&^smETu7K~ z-4RXQ&?-JazAsV`j+g1U_P0^;zhb|_e0J;fN(*m@0) z!?GszHA85EizTD>p;}$H6De_<#n`l04mMu;V|`;7MxkXz;!S zyG^rhP_sgVyvxPoFGJzf*9qfwzgMvuR_??x*2@AQ~W=uY&w zfFS5mdb81^H(>lFvvx%f6ibgAJ!xTqE@TNA=X$|K76B<%#WnH!39$l#R)oM1XJ;=DxWK?mX}x-}pz8h$#w$B3yqx303GFyCl>NkjD{faaDm(6XACe>b;+dS9d0q z9M=R)@@>fB2=xy)aVY(HK&X%T?uKYXmFkAP??;XT7iYIBQ(@TT#6ahifI;4kTvRud z)kPt$$qVAoMB*;Tfk&x?tIoz_3)Q(E&Q*2xunNd<(v7Fns9kc# zjb%OM%q}Te)mik#okjN!ioX4tf1{+=P)n(fdi_L*OyBqB2h@|%U%*ac0=))ZAbU_( z6livj>e=W8QtcAe3Le+ZW?}S?RHR@mB7r_n~JiCm{g&9eDo=MrqGOEDae%;lo z09zFP?lz6nJiK!fA4#Mg4oWJw}TXx>HF1<3<xg+aI(7DWDoU9J_#p9(0ur*9s2k0Z^LIYM`G75qW`477 zYO5{jBcoPLoa(%rYmK-!BS$3ltfr(_(f3S|^FW!Xn8ZTCYfuMCUMDN%6M3^8rWU8R z*l#xwM7@#R!4Td{%$j`q$zVRa-EcF82FGCjx7f}9{vg4 zv+`h2s-6?mx@eaj>bI4J4)t<{?IW`;`mqR1hw5$I(W67j+JWsxE%!3vJ3yU2Fxdz` zq#^~SH&2HUs)5#PvD3^=YVv8jEF~1LXm7ALxYbqD5{=3ZA|Oaq6vvH}OWr+^*Z2XS z!2r-niyIert{Z<%w2|XJUPO*3c?uG(4N+azPKs>*PZaq%bZ}$e@*@fqITzj*MLzwh z7^x>kCUv7oGcybn|LG(yJ@6jHp22Dxw$9Mn1(!p#yS$&HoC z9pyOlL9y08zK_y(@hLk01_InkkIH`}m*1|5kk@!6b@ZDdQT%7x z-n!gz11s=yG6B8AcCNJY2CUTe`S2U%(*1pdcL6^GKy1cdPQNe(GFeNBqIxbp9&ID3 zx9T!=WtZo}E6J)%a;*U2VLue4x#Q|MmJRoqMvYN`gF^Y+77$=M;bTb~Jr0N^Uc+hj z&VRfgzysF3oR*YEA8VkOp-N?k;FqINfoNt4Bh@ZR_1CFUX1lnRZ+Xj8Tpky3iq_35 zG0wXxjOn%-CHN}MogjmSQbKlJv+TjHW?IhFsA>UD++n5WYiyM!8&}zE4|a66r8X$C zukv3$JmOmrHPvz4Q3u0TlY|8k)+JYGz3_5%R_9R>9|H%8+)BBCH&Q;< zm2wOz)mHGp&c4r7G}c=<`p)Wn=2rgS$Vtr$q1pm|PxJHn?U~ExPvJL<-+JQDXNTd( z{I277BfnqqE9{?{{Vlo;3Ma`5`qeVWv_bD=; z>KARd!9cNC$#5vA$NkYg_Jgt1W;go!vcipyFV$wE`I^*bj^Rg9BwV$7&U@jSRjL<95q?H?NEqy;}K7V%Ba&e5{BTy+g#T-FkJ8=^eyi zT-_%+`h~cxpfFJ^`n0=Am*9RrTv`Br>c*9|LD%2~sT@-gHuNe5lLpff(2T+yp`^c(Sq zC^WXu+%Bm7Ea`yGgsc1XmOa|_vnsKKXDwQnxxB2r^Zw%6wB0tTPH7`F$JCrDNsIVT z7689&+McIyB=FVeN{E7?!dn8v`O=Z3}|9Gf_9q}L#qRO5zw zjTb=7X#GmZxf zlWD-f21FMUZwe(Y4HYBSmk64_{-dwiLAqZZ+{|1>)2G0iJO{mtq>W}CGkQfcm@Hkq zpf-I4m}ULLz_2cJRBzoUQ(M1dD?)R|cZskAHk)gy`iZ2VvmDQjsQY5E(OGVE)H|{n zz;FPo6V-tN8L8KTV*HESoAt+9wcu&qZ^N#elZUW2v z>#3E5$igH4`kcFzZq9NIp>vw$j$zIpmhnFTbtEIdIhtv1N10?YU|sSq(JM5sSUn%or9+9)T?7>oe!U4fP!wODZ#7@)pg__#AN#s%B*;q8EM)IZb#`}6EhU_S)d0u6%y4T%?+JmY-dS>NT{ zQfcR%)bB``rntnNKL28J+c;L1nQJv~@7pZk&XT&GSAU-i)xJ}AM3Z0jzOtHgKC=$k zF_+W!k$O8o7%v{T*=tx2A&7#E;qQ@&iur$^N;MPtgJ&F6!m`0?&I0gSG#+p|F+Oc_u)>6@SXw41qO1*!86Jk!%4C(NW#rqneb=V zTe;&ovoI}4clBG5#Ey@yETwYq|LoAvY3YW|wnd1IxJ&FGPs*H(wx2HK-s~Sj7$FY^ zN%rB>d!j#+UCJGI@Qg9hC7@nENBDccZM*6a5IMOE*Xd--m9vH3=LCTKIso#<1(fp* zQtsE4@+U#uQsUOeIf%yl1V}4 z>&R?wcfBW0=ZwVG-ZRvc=45l~U~X?}%gZ_IXd$&XFGuO6gqKRaa6r#O)Lch7EQY&- z#TqIy)NtIvUgL6}+?v56=vLJ^6CM(jT|^d8?&ICSGC%Z;M2_t{a&_t_*NK;od!Gk~ zDD^1FSE|$pa^O+*9x0ueW0PxxAaVl#e2!cJ#9|+H?Dy zxVq25EIQheP2r><>mKnf{?AB8NXmuym+`3{Q5y6Jo#6w^-dC=-JG$kON;sWqI8}>l z4IdR)(Y?Tb=I&d~w!O{=zr}AOKXUf)@6a-*gaPf+56VN)QO{0Hy;O(gPU>}8`Lb`w z6_Lb7)8Ckw=EVPcuVHF$=!l0$oJQA_ooN=KKOzX!_X8LISBJTgMQ1}FRX7tIj_WW8 zYT%kyr{g?`@1u~0koM`agguY`2i;1?ZDtZzLy!iY!}Me++NxQW#&erO@w8za&ol$= zT#?OhV;=R~p} zQd;NyPRAYgmbq~>6dUS2(VN>+21;oVO>h~|oaByPvE!J&#-_=nYqP|BX2?ORg8V@G zU+2xbh@u;%+9qzOq(*hukg)(CkK7q_7LPMSvFjK=mGf9~YC^e8jhlU_2R>-NrYp@J zq|s`(+Ph^n_#CBP%mTBGd`A^^WG|#VfR=~2`z$l$9(7YP{p|x#5>Qb?%g@EwWk6GR z(G6AIBf#LnQO=MWRal)(TjA2PDYEnKvCRGk&VX3{MBu)ZD9B@n)y<9~zFMbXrIAE&v^-+wF8V zt2Sr)$Be+@{+E3ZLH1-j|g%E7_4Ps^>R@|q7fl15iq zHcq4@>s7g!@SWl;*6PytmTjhEMcVt62`Q_EJSduJ&a~M6TJUo=VWQC0L87AtFZIJv zdq3j~IUJ>Z_O8WovrDk2kV+jZfJ&hidJ25(`e=!x9`k@_w5H1a-5y3oQB>q!OVj68 zS~#i<@hh%i2+RI15OYG-{>*=nH;Sn<6NPAdeH242{dwQ(@PQHP+$wwPs> z3FAg!q+XR)58F6;PHNpjq0r_~U;fLt`Fk#_AU?UJ?~IG&Z6q_~O(ME&jgf&ZTE?w9 zUefC7v2pb)^Z8Hm$*(GARFYvJYoO@VJ@1GXJ(qtEb%&j=#bgd^-x)BUH~!^ls)W<^ zeXS%WIN)p6_zYl@pk44$<)RLV{iPnI)4RYwe8$TR`X5VoKXvf!Ht46DMgHvL49Y$8 z2DmM(U%5U15_$KZaSON|V|fGI{uT8OX;wS`%R8^{16Q;6Q~z&Z9132;S+r#)`F?&m z23fm%%@gA*gw(iO^qVhurKoaGt}|a(TG0 zvLn*btWAG3i`s_fE5xwKMuCRn7BPQT>+PP^tN-e-&?K0ddqtR2bH0v&_Ys4p^9Eb} z{RW_3O7+hE#^SpZ)e**PkezY;%B}gkAWo&%98 zTm6r}+=2M$$El8S%2(fBN(F0E#}jaac3$_85))Yf@Y2v>@~mh04y-LT3h{zf$P*La5O}$^=VOE~=ba z_?o1z35Bo8`jVkTM{^CY)v8Naxn+>o@JnDMw+v+96|i6s>&PBq$d$nExo@VM z=a4P8KYBon>~h1>%@W(W-O|mH*|~n{=HWa+gi3w6EnrlU`d{*t(2@N+VbLY3HNQNR zm|a6b6qg`!HIa@c`Rr2nj?7RtU7Sb^?4++d-4`GFTA(j0u!*;e7aYm|zu@;Gzc8pj z$nOJwd(uw(^ShkzoqrYoO?dZo#{fg$dOpohUemAP*T}Dw@WO8%-#WY|v+_dN|DVsb z;PDE-_5A+94@a_joL!rvq*qa1v{089`Tc|6Hh#s>Vi>o`v++^Zg({3GMusv@L1=Uw&Uu|3dyE@z4JNZwP7j z=6BFeX%FA&TX4qgBCI?7Q;ApiadW9soi0rMIhuOePws28W9cYm*^BfpVE-yw9G28f@ z|*U`yrYi$lUAE8C=0NSNSsG<^bRclM1o75R0}{9yZff z#g4Y>*zUHgl3e|HG})}R`oP>!43Oi4QJ*vlP-=T_Hx4!0)^qydZd=k@{Wz`#7~_=7 zh{4(JT9(1Da!%dV{Y(FKXAlDd`#Q&u1?qwfCgK zI;fiW#*lhuhxp|GBr8qWOuLamTVC zCmVXP4b?%0x}vR&;M@ueqHGGSqf+>*CWmWD9hRpiy`XN|aceqS;?!Vc=Zjdc1aKU#QB#{>c;n%GH>s$R9k{n?@pu* zQ(vMd@sjUXN0ZyxyL{6wg`LQpc$00)Rd>_VMU%_bKSEeMAR!%Hnaq29IJ8uiTsLWO zvGd1OUdNIw^+s*_=c>=dbjtcfI#LoHwXW8Ccyo00>Zo_pW_c#ty|(vIn34OU5EeyG zDt*+}TG~d&-$tiATN6!JChpeVNIMe07n5y|X69{?JnOmuF2+q2P1>J`rX>Sd!>z&D zWpdeDnvY;R#s9c0VFs6M-42OnjPPIhK!+;5hUG*-&i+QIPyJgVXZH6BOD>a#?oez@ zAVcs!dV;#rJh|zX$1*Hf^0z8YYNdM8r~W|Vq40FTy?!aIjf1jf6(kPDF6o5vPi|kT zOE)bbxDb}VRfzx+IM7{55;aw4lRGisc01DX~tSq5c&o9JMHHVr?Fs`iBj>rQJZ=x zea8ZpP#G;LsNVd$O z&Zu`+40tuRfAXt7@gu-+{{X|sq2-ceiO>ED1`qCGVuQ#3dMZ9xR+2pSa$V*L6&^|V ztK77RaY(*~My%{uiJjZe5EV3Q2_amm&YS8HiVs<;b`}#fuGqm8c2gwzLN8){#d;0z zO5>1OwwW*X&xLATdY&!wAgDA%ODlThz%hX{ z>FO8`(G4qkyofGUE>-OLQ#3@~s`^HIpDA?RJ5fJch0V>A<`p{CR=?2%_SWjyDA>=E zkDZqgJMN9sm4fr=On89_{ZIXxTER7HNP`fKj%xE79~HsyHRfgz@%>2PrWUsz+pf#=rkX+mD9f#V9LhyFEjrZvaMz7qbA9i+)EX{gmm`Nb zJR@$WS=Nw8I2)f_dZt!OX6|__Saz}{UOoc0Jgt*0KVH5A-*$`09>U5eU;@A8P8mxD zY{ZDJy0N&+4Fi7-mr=eu;l>uZ_F;;(2aY>;_HT&iJVD1mC;5W>lg%z}K;@G`KGJx? zdo@dHs;yThhtqfjw27u?PD6D|drXSq`w|}*+i*uA%eyK0H`NV3LG(ag)T2{ETyHT6 z{s3%1HLvj%K};?aMEcrO5IA5)_1!NlQoA7Doo%UiI$mjb&THI2VBk94Ym8}F2#~*} zt@v$DxC00Yqjvi;GOKr}PY7?2j0Y+}SBW-nfQx{AH0_&QQ(WNb)ThW9ZyFlz>8RhR z>NL1sGt&LNC+BHe)X~-}zI#U-&N`f@c2sCX00Aq20_k?65Z%N{Eh;HH*(8bVYCN|;f%#(swDs4GC!F;1 z&p(W@k6fbKC>c!tmiO-6ui61bI}5WAXKsHw`K=m$LoE!sgg{TobXCLpSl{FaJ5p6`pY%?C&`Yub zS5L?#ZH0`akS_UC5g%9iipH1szAN`i@x!~KIMk>e(1LjK8g*E%J2`6!mEkYQKcNU`JtrY(TdZ(=94)7jK*mkrxESzZzBN}mF*^D=Z~onC z!X4D8P)+#-dWVr1bc6}c5!#KOU?x6=01cPGo!JYu*#d+c&lh|=$xUGzDNjaV_V1&$ ze?ZUC`YK_UvdM+39Uj;|SD2f;y8#L>E+R;>MTZFZsOO`-X%Wfz7wTLB1d`y3+q#A@ zZn)4WoqT_Lbn2}$X%HqtFrEL?j;}Q*%c`;ki8h|S&G~ZynEOdG-z#@ll70%=$Zp5%%+TC+Fz%YQE+(KwL7FByUuQCb5JsG~rD6%SMPvIR(awEVQm{I|X zLTB$CX>ZmfmpG8YW}9cbeOb9oIx&h>OC4GmXbdUg6B_}=^B35BHWt9j)?fy_M0%I({e-ZSoW4~vDY=82B0h|NT$pU8)uY`cRkuP-kpaOu z-n`cpoVru>l8M4t8l|Jj*5FK|_@M2g=#LSo8ZK;_7A?Y5?W6sy?SnY4L8Po)Ydf>q z6u>}kQEB{;qyiq zSl?CH!t9eDx&}xekF*BMM<3XcUvdbEB_*`W5|p}uAc40hTsY_th1zJBC6YXzVSYH! z9h1sq(H~!z{>@8GHpH41YF~nd7hi12=~PYtc^!}gbM{s%#95cCFn#-HKo*)p849!-{X4chmQ1Z+8z4*Km(oQCEZlV@<6$ z0TnANpr9`5N>Q7wy17Gs(lq+Q@it@d8U~>1b~2~9$YhT6@!2g%PrLO*I3D@2R8H)6 zJ27DX=2LBWfvbO3{L#aZAmD(-s<=F0J9j|hW(A1@7V`8@zi9`9nQMA1=zb8W5?cKy zjzb(^*ci&)CFyWI$lwQ)af?Y^z}GjCq-8IXWM`lrAmV+O-T#^L;u$8Co#GTK>zO-uEjiu{a=bK-;zp>rM;S?p=yje0^#l=49RAux{N?*D;+Zj> znu{JtwKq*cAy+}^KxqlUFCcLzLRXm`HA6=BT2%2}_E+h8Eg+)l>dBgH_KxN^;7Jd` zKI=zy=>g-@^^z>(aS?@vLlLMohDEs$Q+ZOog7_BII)a)*8RO-3T#89N;JnC^5)ovy zWrz)wbH6^%)nuY2HQxPeq(1}JLK~NVUZUw@>gT2%PSr~xWcoGJ-<#HcgPN;xZG0fo zMokxr)pj(6kUnTy6n;hy``I$->Drr=R)2}#D*^Wh&a=j5nR;klrm2O4Zqkgc^{-o4 zBs_IB!8-wo$Iy&smzW#DC^VB%h<>LWbU8x-AvtV<=B6=@GCW(V`&~@*MBDtbgAx?F zL{<(X=MAPs2DG&|X_Hld?M;)Zl>RPGS!B9NQxZ_)|5Vc=hNslL77bDb`<3rWOV-}B z5J371bc5(lzmeS1FBZnS#B02R2q6gdvP<>eZo*FKq0?rgQ?aHO_dJfcO)lGFAteea zUFaN`9s{}w!^nblotUCG>Uvn7cVG~aHuRXdf!>HFUGX?#o^ENZY)vdvJwwiE5er6r z#7@J^Z-Y2DJx{t#@bmR>a@dwxjptJ+t>!hH&5M6sFB^uP+;&(qN)eM~wufQFYQYsU zPcySiwY6xfAcL)IDJ1uct~G%C`FDN6U$WjYTjq*riaP^ew0S;`)a4?jF$ENs`ql`~ z^M7({KDL|bzik3Add+oLIJ)#=6iHdarD%7_Na=lV24@ zG#<2V?9DwCY~bAeTjSjWiHM^J#RBbEgDxu-MEj{mr0gw{2@Z&cfO5z8jlZ$H`ymAn zK|hoI38`4V$b{&Jy0a*|C!qq2nS$V@j0t6ECtG1ID-gNpG>@F^1bL9nrt=XuI(N<;|dqiD}Es*R0Snm zKnYwhhmHe?p$4nPh5*#uQj2#> zSmEh8hpCw9odaTb<5;u55B3yl#jt;7TOr!cq)M%Lt7bS~uHd~iwkOASO!b4xF2rH! zh7T->=`-X4F1@UjdSHk-YOBmY8npy;_sRB(?QbwjV$7j#GPU1{sQm^cmsJ6NQ2ekC zyUq{YHgqQa6;nM}lsW>C4zvTu| zzg)kFxw@5QKSH=*_{RQ@_4X?3?CA%}5{CKrOM=_i(P=$px=pW9TZpMG$$UOOh}|(X z1`V2xMQ>-dvr=crxP8=(a!CzlHL119jYVx6`?t(SAdR#|?|?OdP7Ssd(?mMjxY+Zc z9Y78uq-WWkCdXf{|EK$;4X}(2tuu#oD)v@`2UyTyY!+W+s60YoN0TmwMf>&}tAn++ zyT<(n3$UG}VEq}tvTN_?pMBhv%hpH?@bc8PFI1hU0A+$ikNxcrRcXGb+Dh*XQc;N#P(^6PB#VFG&N(}q{R z;{Qn!Dt%gUK3q~Fc{734tc8^1!#g|+(cDBara*QWxbhY5{-W)Xqx8npQg!RAW)I(E zzbN@p6_+=8Lm>v7Ru-w>0%lZt3qe%lBFB)IQC1MO*S4yk(w$;0PPt z8*<|6sS}POndi;FUfG`T=G65o)m2zrm6cCUI0{Yp`uJnn7?Ft+Fvl7uV7BzrLb`o| z?C?Ta*;7K%YL-q>@AN)ufF!A~kfDzO%Ak<7s?Gy`>ut z_HHQWRktHA7H*B`edM8wegYljlz%T^L4t;T3C+IBe;lY8heyfTyp99C`<1$VLeMa- z`LePqq-Ke&Lt+CGTS=wk_|d6NXKG$4Xg|<*dR~<8%%q~!t%^X~ZwpDKnL1A)nKL@0 ziaCkUq~t*qtIklgh1!Kw#o9)ktb%BKBr89qVk<=eY{4WkUwN!k$?Xne?S_W3LQLA; z$lP!`7-jF{KO_3m%v7R{VqRQU>D94Gc_wnj(2N@64vm0OQ~ zYCEI&W2&K=TGh?)!Cktg?4OCxrKK#Df4>T;&@ZxUG`&WxCjrC%4vfr=vRCk#Hu6Be zN#HYj#dUQ7DY8CE$w8NOIj&WXu?~z-H*93xWM>|NlwH-&K1CY3Ebb5nGu;*RpiQEg zJ(;nt=$#Kw8%*zH1~WbTHxhU2BjSzqjHv1!Ppd4OGZdBA6@5}SDmQV|;jFhs3=THr zvwt7~#ly1>r&kpC3k6!861*)*@?Spe53=&uJxN(Z!bPt7nM;dO4;lYVePzzz63%5W zD0CVtXEq>nC)zn7S};yeT*(0cwtw4Ms9;hPqR&XW=0;e8+&7+q53tR(sby}k_48a` zyLs9S8%%U^iP#VA8nNR6EnBzS`QZ>be?O3p;rTH?JPLR2hbPTc;k0u-=q+2P*=P7m4k^)0 zyK^K*NjP`)e(o5JyOnjBtGfA&kEZtbmhFKa8Mp9T{l9gPjpWMu|FQSx;ZYUY|9^)h z5Y~=LYuuwo4Q>M}N(RuhB&1stK}A8w1w~P3L>WyK6d~9hNYggrh>p8BIiL z-80lVuh!a2m?@g6!CwLz80;q$8-AUa!%@+>!;>bKcvv zV-bErQT<`TD5K$oB5Dc5DvKBmOKKxU$^B|0U4wDI%jWX}@k+zrYh(VRBqJF(0!6{d z^1290Ab&}oz2D1lpC$ohYMmUY*iJjb#}w5@k1e(p6jK4~R)rK1qtJSGHUmXT_D2Py zX)f{@@9|1geG;eN!6J^Ox!}}ByP3vz3dE1GlMWCdEMaj%VO_1$dzRiyt$oS>dw@c# zqc(#p=47TzeM>M1MBe5&g|$x$L~DcxZ}>VzRCGapigK(VI-HU@D-aa$*t%eNk`7(P zHTRKYi<14#{6#n|FsDUm0q-uv$sGfcVMSOV$7@WB((`X1TI}7fZyLAMj*arL60~X% zJilrUypPL96si^4pCH`yd5Qr!rg?7t{*o*Tm}UAya<%CXZ}?8rtnF%}Cl=T5YWgKI zyqK>{PwZA38D5kutBq_|2NiDB3nygtg1Vg(h!dc$@}O`ZIfesH$8ud*us9g=7uV@P zhQV4=Lh0 z1_WIzP@82S^l0@js1lb4qQ|OB>$|6h1Km(NjN?O1F8bU^PTU0XkIsFv>gymMmDh1h zTlZUY>=B~wQ#;0Aiiih1sgVrMc(Cn@!n#=5AC8UI4~7A4Y$!<{(+<4R7hMizZ>&EE z|Eqy0xCymUri1j98fga8hgitDhN7jWg*D}9){g6&^5p@T2=vH+SRsquHkjg7)&RuGZu&&oQtIF3)Ph8CG){}nw1GTX-=IDUZpwj>8?R2ozv3v zD+km2Wg7ZZ>Xf2D+uFil^q|i6dN4W27!u4|=8gx>cDd~WG#nMAPEorWICD3Sm#-T> zNbZQ+3mo#uEN!p>Z)mx057W8nkbAOQr&!zNQ}@2sa`oORbznL2rd?UOP+`iDI>|s4 zh#rnN0UU^LZ0MCdBn#ghPQX*bFgV`GQVw@wgP7tTBe3~lZS;zg9OPuK!Zi2Ek2D9# zK|*L^sb}&ZF!EZ{jnROk2;O+Ni&jMc7F+%Ej+d!XCpZ5bX`yTLmTMz19vSVfa_%u4SRPH1KW0nUiUY+!`LAI17S=HO~^C$aVjF*Z9h9@zsz_*3u z(mHOJi@eQlrGck5I#2`)Ji+K7;7Qe22Xo=Mq8QH-vK-_P$nX+?_ovnHAXE#RV zJHP-sM1cONo_mR_rh=j8Eub$?x?Lkvv+vdv3;vr{P2Qhv>y|>+n)EluJV61I*B0drr*ugYsHR$vqqS;;C_O7y>eTP_K&pkFIl z5Da1E&zD1ujl6<~ZZ11bPlZ|7qkfdm>1okh%iZm;MB3llP$?2?4UF*@)r~o!w5np| z)rVBYMzOWCB+&M8Ax4^R`OLH!BQ=z3-^VXWB($WowqoU^FY08a1XRIjo`euH3!^L) zyRC|x${b)BdD@;c*8gucMuj8N>@t_rsz{wJD2HUiy9rV2v4En#bCM6UEfPDct1;*N zh=@aiHe!{DxT>>>_?d`4Zo~p2fMgdsyMaUYJ^QF4+eNU?%km)hP`tn>^p4kuW{xin z>bM}H=g&h`{0iqX6_2fKYs3D5mJ824@8bFk>n8>xotLrB)#~HGugfthF6ev^LjNEX z)j9^>^Ji5R^UbFW=THMi!`^|GbI%)l(b@Iqk&Tn~o1G0`nVen7nWw9NmGM-yHs+hG zjGG@4{0)09t0}9iRGUK{mCU0r>VP;mZB&++y^0R;>Hdpyi0WCpyi8#+k4qkx{v~*TPGuA8X@ziio z{g*}*2=u{3n6HH$nafDgt59vDCt3fs$hp?PF!B@1(< z6Cf7_7BzU$BkWUspw`+=OALi6+3SQT*(kLQs^dm$|mV-l6-3_V{^@by}_;MdXnI8e=!h1i-kXt zsMcG(iI#LSi*oZ3oo73JV?+N1;yur3pmWFE7P?jgDXh%Q|FOaqLo|?Z4`vlZ!HCI; z)jV+@5=UQb3Pwl5NtP6wqEfz(el7PryQ@lI{MKP~e8HEb^G0PP`A` z*XuP8i&HXt_A(o}^ep3TL}g7Pq?_$dbFJ^>_Gehk_LS-JWa-45kpVe~n`o z9wQGJ1AHXGV@e`dmWHk@&X@J`X~oeY1r?hjZQh#K`n(p*Ti$1RWJp2eDkgy;MfLl@ zF87Q}&Bd-$@?5_?l3?Xd_(VdE7wM}K9V*)Ksr|J}r0roW%&OuIe*kS9wCq(I9by`R ze{A2c#{gw5P+}mCCQ>jTm4?|~^0PGqV14GwGmLqZn1Fmtv9_jJcpQhS@t;3KXYnCs zy%5a@TUhVK0co=ndeUHWzYai55D@V_Tp(`N*8;wNvwrTIJC!;juXAxW{BM?o=hVK3 z5M=S&LEgqg4oCRKp75)7CEb2ni2=B?ce-)>7z~;`3nDWW2&C^)aE%{I1@TLuc4n*FS|XlzvmeYa#H>UB4C2pnCamMttU3C z1H54j!KSst*9KdK?tk>g|4Q%=ZsfxpX(c$|>p84kc+U zK~Z>_eAnsUUP|(`$O~@9bryuu+>CIfmy`WLcY!~8MRCQl$P(`{Z};K!%dnzA-s^p^ z9VI4m1-g}CMfHP`A1i>*3^VTVg<-wEsa%dI%02Zx4W7Hu-}u?+vJI_O(?)|DZ`C(0 zMBAl&eu8Yj=&tU-n4+&ad_5;Dr15tK zU5U&%ik}K}Vx4&OtLH{o?!JVl$E#t0=eT>o3|liSV}*}si5M9o2Ka=1t#mH@Zhy%- zmr|vc)tx>q*XG{xqcj0d*zXzba;AxEv-3-nsH$PVc)ql{$ulfF9F;?Yo1M2!s(K7~ zGaP6KsWVEx=2-r;IxO@bi100!F#b> z(=0)^7lbibbrY7H+|*lD#$pL8*zcVBPs-_*f-;SMqlflKN8m5_JwGN$#X$ymk#qK7 zZ5N~qXjR#S7YFi|2l}kG#b`Bi0413WrUV0@b2%JGkaeL}9FPE8_z_;&9IO-bG0GL= z#46_7e=rEVd}kz}qm%+mV^|4IkY0F;fZK^+Ke-AjR%@ntsn1J+yjS}y_X8QjfRrXr z{Yk9&hN(pw35k#S7l>R@5;?2X-=dyQNaXNG3(CyUm(#n4eh{70JR(et*`EaJrjL~V zSN_ReDq_m$9|M->3zh~>+Y*jZVnJ^U?tvr9+K%XV3awjhBE3w&rKPo>K3 zRpnt+nQmW+TUq?y9h>O#q6hy($k%Vrx1pc9 zUESGCY)j2hY^=cH;98K_I598kZPMY&#)+MZxKf5Uyn~&PUmbbfA6mE8+az9iR(85t@ikg+uJ zR>xWIi?UsT&&Ycnb7vjCrKS3Bg8NWE@Dbv$)Rr0H7mF{idqg1G(l` zHlQOB;5n0kW9;>=oN*0R_xn0FM5ZK{_K_XTFcs}Qx`{T&Yg`q+T#K3cPP~BY3LRPW z58y~&E4~jg)j?TzR1wF-G(RN|Hz|`xm;>3#KbYcP8&Pfx2yI$-`3|AhJ+MAttzB`T zCwkD-WGA*(<*Mq04aj?x&1JhedPgfy8~v==t9Y>R+g;Dlt?I;^ND`!1X zW!DoJ^yO`Av|G~M%ywI%ff-1qRI{=&oBDF{vmSBjBl4QF1QTtoi`ZSjYDwpB1`aq7 z2Hfg6J7|)nCDYfJd(4smLNUuII8e?CpZbK#tUsfFwkx^i1aoI5WvB*f+M}^oCrw?U zwh7Kt6O2V3J_4v`Pts&`2)XUI@QMl{MX1o6lL<}KZ3FgV2vH^xrRLmDXh|ycQ-OE- zcFY+@-Y>jeZ)1AQvaS*hH`cC!*8kBW!yw*R+qJXJ+_ojOnapnjH^+Qqg<+f5b+d^1 zx7z7#dP?zjQ29+uo%u6mC^Sv+iEsI58GKefFv-*#t$TH5xXOoPgDKt!=ov4L(V5CF zjqgb3$bV8E<{AX(FIk;ipiU!4h888!scY1v>#@PbI2PYVa7n+ERX5Xr0nE!NHs!nj z8*$@l`p{qU1FU+?N5dNgYm^l6EYQDa8u^#<#gv2FeEEn^YvsTGXpQ{t&5pNy(J6Tg z%hl3n&L^0zb#@>AtI@<&dT&&0VgiU*tSK#VF>lC%<3P<@Jp1uEmP)0pn5#&m%M|vHHuM*J#J%Ho~f0g$(*=jyKQK(AtI7_ z!!H2}3*~gu)Jk*v=wc&7{7Y?!O)k}H@C8gK^!xQN8S5WE!FkhRjMzSNn(v{zEKb#b zr-DVpVd{gos)w-TJAe$ldKGAL$8-X)jzB}HdQ#YwH^6nb#+b`w4=k3dOs*MgW(jFWlZlJ`U zT9qs`?aq*iP5YQ-k1EZcg%0vr~aAxRii4m%8ZyUSY$o1^o|`2 zg&ek86xHS|?aw)lNGnkiPfxy8u_(;nbB?`z2ag;LtBkGniy3}q43|^Bmy;^au$%qa z(&TPL6EM_JMYllYDC$b>l(c;3e&W)6$Mp|jTZ{MlU{Pwgbum(&#Z%M!Yp>SI!#%X7 zy)g7hY~My@x^%Ls4VG4`qFbeqI5USuc9>rS)-j(3Y=`9)Md!)M*eO3VWvN88uy5e|1F_-M_n{z&x%PRM;-kJ^s|6gL0?iz+6Y&4(h&-PxT{gqbFg=noJD zo73fC&h*A+s)gJS%o(&E{&@8SrC^GlFW2yWFx@~}@f*n>gcuHyf&jdY>hboG2L9s&etyDcZp^){awZ+8Dxt`yr_6)~;qms6r4 zjl}MRWh2!3pH2I7?(5f>d9^mSz3*tSly&qT!kPVIfrC8_f=frKU{q)c+}7GYP`-BzJ1jnlLn_ z-qV0o8JaRl-by1i=&9c-cvtFOQ<^Ai*^0z#noMNdl9Rj>Id_*YHyz!LL>9Sr_?42fIJfVeDAT*`eQ-6+@+gji1*h{&NF5O9Xt;i&q>-vmX;Rq^( zdYr8F2VBc2w>KEn4s2MqQUV!GnMfHyx%tdR{>aG6U` zA;1!wLz{*)oQ7H4*if@OnuJ4PY3s$f<`=3m! zkwxWvH_oi&e_nd0Ut5@L7qcyIO=_j&eWNydR4}wyOx{z!gE_lxr#*GTCYFlWyp>Q$ zRdi-4KW0Jsp7XEsCAY*g8GD+H%2LRg6K!td%X?#@f%#S}yLcMiHI|Qdik+3{UiE9X z&1jk*GZRnf|m6qM_)>b0~T_AR4mGh4#- z``KM-9lU$jxtlX00C9L|pl&$VWb>VKFwiD3X*M5?lt+S{@PXtO(6G3rhQK6!Enh^| zc@>Ie_cd`88;DwWeC4?Wk9zk*=)A$ zvD7j3s|U!#HZ9WG07nz+SPT1%WXu-3^pGP5B{nicR8@1}u3sNqHLjV=RM!&@T{OV0s3TXEZHH`QB&+CfLYmU>?93@yR=(qrQW7Tm3DQ z9NB?pa$w9QWr6%lDxV>avulaT=mCdSqMJ1Z)C{l=I8+jfFgF)g6GKBkrKE30UWJUz zttmC~BoaEB<*lY-4~HUPm@2j3*QRjS3l8U1q!PM#B`e?F49Cw7Lh2ykgF;ley8#mm z+Nsa0bvbKVV>K3EqVn1ca*B4x=gkZB#0qTV8~UewCoQ#oF*?&1|MZx?m~E?3UtC5_ z@tPi58*sX2Rv>yvZFG^)2f($BgrfgOul0A)Vs&)7=)@mt#b*`K5&@VmkSu9O%6B`} z`6JUum?Vpb^W$mQKN!1C;!j}A>7<7)MoV{j@vCS-BX=o@KWZ{?&S=VRARuX|B;mYY zpxuX>9-@-Oxe%YcZ&%hu?-v~0qS>RYZCw$+Bg*n(2W{t%T+$=fW4ln>uip8uhknYx z;v(;Sc>sPw8OQXPf&M_|G_d(ySGaWq#;o>7Mi$A312$Bvoxi*ymeN++XB`|GY49bi$Gstp0K}!grN2zM z0%u(wMVqtQHwR<8v6H^E6J>S^8XH5(z^xF6($!Ix!z|q*clV6t(^<>+`6N^0=9i_Y zW^Wd4QC*)es217t=epSW2%jI+_W8^^t(h`v^NDuzIL-^?$%gV3jL^KM_KNqt(C&`OAZAmztGhi+4W5K#TDzFR)^&_%j zyKMz6ARimvYDUDCdo4eb=vDS!l#NXy^JrNNpK zEa|7LT_G}?U=iqgu0})SeXPNPW6TgT1QLi|UrcKQdAQA3@(brg_2o?F{GZeUZ?o)& zKkSsDVISk(I7Cd`Kta)wJrZ)FN?l3NpZpsyT`gsImFgzh+kFKu@2JK3~bBJH2fxA#}bwif+IHE3Wu zoN5p7bTX3iQlrdu<(Vw`L6SlRB9mB8%J=2_ba339DyQAFaprgvzRHH{!-Px0wurFw zYP5rVV)XSar(TWjjLFm*sc|qv#{6=>XEa%%aEQVj{G4Ar`$m!4gu^0Bkfe^~6v)hn zsbK07<7#8flE8(nZ`7Sr%%}{sC5{fXZQ75GqA|-8<}8FQhh8~qKjggWH~`m0Kc2)! z{>84bC9DoyxO7`3)J9L~TNmrmtu}J}0KYlyY4j*lf11tWXHxILg+D(MU2_4r4YYkp zy{QB9-l>fZEssntzvV{&uJR6BT@^XAEP2p^VrV_Pw7`X%&mTK>Yyg!glq(Xnh!;*5$N3yNGCGg|VO|6DIdxx!zoKohZsw&#Ky3gyd zxN!R~@ z)XD$jGHGyGHlMK%Trf8Hbp2o_75a%2Xp6`jSxMH5va@1M!o_lt<4Xq)E%(MQf{Wm! z#vB%l8s!vAvw(g3v5f*sy-k|omsRHFC7O7FWEbykc=9Xyf%o0|^On@JW{&u%fOr%& zQ=eB$+P5-GRR1=@E$qHaZF!ft<^6dxr*YRL{-(lWzL(w5!>NVPNjCIoo8@yi@<_5+ zNnU)qE6hEzRBDCeNo|(Ax-;9?&1SmQ&D6@qA%TEIXy}*D9`WGlO zb1nMMx68Q)0f_-*1l;JyxIMwTXctDW(d22mLCf?EGP;8mknyBM*0yhOyz)7U)^x+! zKGKXzYx;s8quwgj3zghcD%-_%&Yvc+#FP-=yxUgpIWE@YavZ`HVF%t7$10-Z2iW^{ zXvc%(E3MzR4&VK~C2`|RpoDVHr5v5et$e1E1Wpf%OLmd3-^#w++c~szV9cEc3l*y` zFX)#_?&A)IvB$)#`WBq$K>^ga{;~_NbdxPsAJ^vnXi9WyfGCiM)jvLNO#U@V_PcH4 zFsf&rSSgM703}1bEHS@JC92Yff#_~VTk3jw&m0&pxQZrob0*~$bpQ`TKr?Cs3(mRd zFMxHP=h#S(zG>j#4eh`^)cU)CyG_Xe?ke+}1>EsvVDHde$X>njcR*Hu;kffIX{i5g z$cl3zD?}%?O}u$r(AF;2f?}DuN-_^$A{q?GqbImYG7*Nz;{(xArDzN?tHyq7ST|O) zo9vtTG(ykK!HQ+|2e6KO$}U?gGt1U*HmE(m4|X^7u4U^&PFlMpf9f0T`>yWD-I#kX zW!U$C>6Gyd;<nXvvy7JHV>I%x5u->pEAqX; zBn-D%f?HfhK_2750#yEOH#1p$1xCdb#{H0pWCehT$tLQl zs46?t&x-Eg=8EXISU;Ae}&s+PYAaY&JVb&uQAsd{=_VSnzN$Kd)Ja!!S?cp!X1b4 zN>(E&-*Jytc#>1Hx)61oAfFmnN7`XAsjM`o3(qpuObl`-*5h_qVBX%SU-c=JZ)Uxf z)_+Q3Kv;p`IsAuiEf)BNopkSXsRkGWb#x_Tz}>2kW{&|ZZYuNrU6%vLu)x^riskh? zkF7>C+4N^kF?91_IX&RuqlS^uvK{nDg=cK2CXkoxtnrbT9x>bM!~EYMNALU^B(%KC zw~rca#6Yv?_g;Gg;Koe|?SZ~^9McS`+*!TK=CW$8fDCHV@?ce;R+*x(MAwn0UU%8U z)j?r_CH#OqSNA~*4(8-dT~CBt7*8OtyHD>If4H_iQxu{?5T z1Dn(5+w@qTylc)lM&6RyCDO-NrgJhJ&c&e6^jjmvplKkGFcdEeT8GwBpx*vxuyBWp zi~06+0eIjW1AxTrVPYv)pP$tizqhW}7{lBeTb=U#0J%z|**;CxB+Ym{VkgsJjYr>l zuCVIO5P+K_p_f=pq`-t3r8(1<(Mv33K01yu*oCq948OF%{N?Dob(Tz*%vuvxRNnU* zzmpjuGl(UlazTqyP0=~rH`^pFg131xADpd`p;&4Agf|P7r|Ui4RVYh+GQab$spk-j z$vBxag4&!xU!!{!#vyTrHl0wvC;K!SIVjH#OFt|{gL$v8BNB}E%0O^S zSP)FS(df04JtHsR=rS)EjO3?$C&$f&RPUmAepvjik+_GZ0NLBO^ z5n^ymTW$2I7o^##jb4odGm8NU$~zhmyv-tvjZJG|UZwR1;|900xhgPL_*YR1s|fwz zph%i+y6qr7CE{N275o!@?FMJd4n~b$Z3qir%WM5eW4{r0eg0D zY#^b16`F6+^TH#V^)?J04Cvzhyy*fO2XL{F#jAL7uzQ?x5H z(mU^>vJ=}rLlkBlbWLhk0=)K>`)H$gkNMsQ6~;XLe_KF5ph{l(zs(&~?m_?C+&8!w zIs8kvyAt@3LU*kT67lbqx|HWJp0xbXfq&f$>#2%dTXrvfg((tzjH3vFG2t>#fyUfi za~n?}g6AA{W;ATLnZ6$|-wmGV9b$Db^3czPxVu}1YYb=f6XkeGe4hTNWLZnPEKd1a z_^j8#i3b53?!#H3s;I5sne~MRtW8th{6k={hoUdthmz%tu1?Hoj+*NxaYmEgZ``w_ zd8^pjGk70m5*`!5LgL=CR>8@o3z8p=wpNprfY)GKjHi~`G2grXwA^_I`jy9>A?#2h zF_pv3aIj_Yz(qO;RWaW)t(yGf4aZ z=1=|k1*yWxk1w#&OVyK4MNTBWpOcp{9Ch_;gu3i79L z>x4|;fltEw!3O0pEq1S!(t@NTz4$_@gb&OFQ~t0P+r3YD$I_k*@kGG^DdC7 zi8s6_Non7WfC_37yFwzljqniT)X+zZ2T)vs-CeQXLNyJZtM@WD??-$N>eMhw0Jf6W zQ~zh^r2f3x2>Y;{|9(_6UR;nU)_It3c41wT%d2c&XnT|_Sa2Ev@X~Ph<~$5QcF?pYA-@?Z@Z04IkIO0mrauhq~wh6IEi3OL^I#}Kezwu0f+ z8a>?Lq9l8owp?q--bj0!oFxEQ)x2<9DKnKx|>O1KM`{m2`g`mQ>a7OEBv{!pnC~wzITv_qB%TB?2-r+U6z}NT5eVa z^^%mjSo(He{CG?1F$`WC`XhB26_Mo^~-DT42ksp#1yYp1zRs z`TWLyCU!zA$Y+cDS!6%I+n!OfnJJ_L?HSXAG|dfTHwpIqM4H~ZHQb-(QQoEox&$Vr zS!58tL*?##5I%NS@avs-yG31SDN3WCyL&@t5o+Dl#eDav>d92?_9MFylFf_gGuw|{ zGyT{t-H(Cpyr~~&1bXnc$-MRCZL@jn#oJHj&CA=*=B=2wU(DNfyotPL1h(gGi+S6D zH!VtM1bXwPfj=YQ<4xxrX9RZSP3OyJRPF@*o{YGjDNQvZ=*T7QaX6_$)jC_Uz zsW%O8(x4QN(vbAdn{7JMJ8!P(Mk89^Zu)VX()A31BEuKJI-O<NmJ_+SV4S3A^dElD}(P znnK)yy%em1KBAv0n{641TPP6wTGzhaTA>z^J>{G54BQl>{>ao#Ab@EnbHcFA7`0}f zpGaFfvq@k)GDLTFjdbH74PwNZRD5b!A{~G6sjJ;LYq2|Qq!b_8ed^DfD@p3}2<{%r z`uy=kKBLnljz=pe*~9w}6gT+e(lRRo{f?Wz={NG1lD~-j7z{VOiAIXESu=-&HK*)|0>(II z&1>_y6MLEiT#;$Bi9vnEDLZRuO8M=!;aG(q2hQZY^=9E&_RMH`yQh3>Tfo1yqm`tv zGm4XTJ0veT;*BfGpg(iCr&Jnu+myozYcEo`Wj%cg>Edej-N}Dt`pXy}qvF~b`(IV> zY1k#32I>VvI}MnE9>X@Ry&E1t{wsXsBr$@XZ=b-Aw~Bp%!krU{kOYhSf7Bzy3@`dy7TSF32l63O{`h|uiC zJvj+O&pyWC7$nUbO{;B3MAw*-n%$C)#l^N#wHNW_mnvf7xwX-dB7o&_vnlkhvvxH~ zRkUip6WoA*y@x&(us!CM*mPHS9a!M8p;J{aMw)K&Ipog()$|vUz9B$iSGqa~RP-gQ zv3;3^I?$&-(#s{#G=aU5O<+q8`yB*^ez-dh7Jg7*f-|-&y~@|84!xLm=B8U%BbtOdxb8|53kZJQqs`*gl?vRljFEGm2$P zSY}D+5bAUJgdNmnKw}5>?a7C@%(N8)aZmlKjnj;4_l6g_g#ze(1SX$r2l;o?M-v(U zEBYwoD#G8@KOOKZZypxEC&Dqd#%~Ax)+p$Pqv~uJ24nVWOlIOD23Roqs9~b9sj@K- z5ZX$~foQ}UV$LoLkkd|0!Pp(@*Uck5=m%$j(0yb#p_edhs4Y6=LGk&(&im)KDo$;l(XE7jW*@Y?&lo)>2WizwV&ng z=K#v_M`LOP%W_Ez`okRTqoGpWeHw_|Zue~>bB*kh_yXdH=Zl8eCuo*=R%pxi-s!jV z(sDeZ@FWz)SQch9wk;y3M57W6$1g5J%2%@lRxru zwR8c^43Na$)gI3xqcvLs)3a~VMjG43L@94$z2CN`*P`Ehr&Jd6j{#FzO8LND!vDnC z*oFdRyq6@I4UX?ENd!-oH4?`(mGaGfTw_d2V7H~(nwStb0*GEOsEU*(HVvU#1IkHM zYl7n*H4CIAEBp)fs!b;n?-gpr`M?fW>=TIfzg0`MSkJQq#HRhW5PS#0i8DbF@13RO zI8pDaEA9zWl7FH86KPZ|{o5mjH~&I|y;%RL(!Ussx!B-Vtw^~EXFJnKEo={d6B8@b zb6gMC%{yIpf|)Key-^kUI1oGdgc`v$;zmr7zD#}0q*^7wW>E?6C+j_I-!I@jc@=@v z^l~XRji;u>dIM$QYy}=f>^*uJLBWskLZai8$hCueRB_m~7tXhFe^A^$j6c%tqj#NH zqKw5#SIo;Yy>#K_RhwZ;F^R09-Qd@4&=i8`Q#JRfH*%YMD5Z65?v)*zd$JZ^TJ}=Q zSiOH?-zVyQjeVc3_t#8AeO}cUE1X4;NNL5Ybe%2guf$T5s<4UZWHsqb*4ZZT;M)kK zrLTBhh#lwJ_S_6UPojx`WSXYj=YXf{Y>wN~Ia;05+H+`-B~PKiNs5jYHjr2#9oe2l zRFXW5xN#~`7_HZfFgnQ=U1^JUI<;pK9dkt^mfNC6{B5J7zL_vs#KL0$a(!ib_}vMD z7a_cPlI4q(E4kMqF@)qUix?_6OJ8JcK6)5eI?2LCa2!u$eQ51uj_|eY%!jucUlR_aw^vcnbFO2`lA4Z>Blpv|CS zx)$pkw&-c`_v6Yfw$Lsr^zQaT)xluyM%F_~EKkf(6^04htgvU@Frk95n<>xeMlIXh z%aCGnmllhg7KvhXi%G?>K)y?# z77n-0GU{BUWmEEi?8e828g}G09!maBb2Dv^YSqXRvs8rH!yv#94SoNbi-UY%N!-Cd zw;mS<*E3odbq9*%l3YZrSH$*;co5#Tg2BRpm015(dci?k|IhXEXI_5N%h|jXlOs8b zmqYY|aa#X?UWW2AQZIwkFNgCoN+AdGGDa`#9QD6QFKBuD&(I62ivEHv*@c%|cnL;h znvb1TMU8w0Plr!=CT_`D$k6MYcKO)$=*HYPc+p@dI^W`fh@e$mLG)qhxp;BqCwrTqP zR{f9cXzCwq>u)f|DxK+EXv6nNPHl(Tk}gZ5H=e({YArFXNy`{!?v}=e?0&L~S$2D+ zgD7zKgY8J|Af0S260Ae-Nnzy%mVCEW_m41G-JuprRcYrYUKo*2qzsYYnFFcUYDJyJ_zFW}FX@6CM_72fH4 z3?$c>g6l9(#yw-aX|+rIEn+Rfh!K6=k;Pp-%MLF{4+{hgs&i#u_CBE`$-K@<`%1uP zp8#U;N8+JP+>2AEN)SOsa{9~8$M%7OF-d3R!s*ZQu@;q_Oa=+oi=!RT{F#79Z`>J1=};eV#=cg>iSh1%%r3mAw^qcji% z>ikk(WQt%aliAdk<*E!x%+pfFzXf_@QoNsbkfCWYyHts3)Cj^RxCrxaoaVqLxd!SA z2vRLRIyt?tub9*h_miA04J{P{kuDs^ z?=@gsO-%mHHu0+Uxc805MgvYAoQR)b^hUehFisV8Dk+13i{}=wEkn;>4(q}Eg?a=D z$DdQa8TV0O+V7@YzrrtV50@3uE6h~CuTRfr$)`!q?bG=lOYOJDg=1mQ;#hCscnD|} zj{k&uJ+U|7xroJ;;6R3TE@E$_EN8*>E@F2jKAx`uXG_$Ziqh^`;+<_`?-AvNKn8!y zQHU3U(K|#|(k#w)BgzyZwJU}}<&;OHST}q2IySl^r%}|U`P2+P(_@=EjHoT1-y;Kx z-V(h@<+i4n0dhpg*8H&L0FRTL<+di#-^MRjrH~OC#r?Aej`Pe~DX3N&J95(#1@H zjyh%!o{xl;x2`i-soy=GFIArHU%jb+`?58b_z_s*_~S@N>P?Y5DDpib-SUgP;o@Cv zt6NE82WTIFaQa15@=c+-P9KuG& z0P`Ba!j$f)$6UhEF@+%VEn zYR_?$DpQj|$4Rtcch1o2$%;CKDCf-@W->+8i2p{GLDf3RU0L6sb;t-(SVi~(h`|ui zxwH*Rbe_Mq+_i(!3VJ=)M>s(@>On=R`>bn4MeVVIEz$@c^EtM9H7q8@RLXY>X`n`Z=#TK5P54nZTpu>vMMNcc$kP*6?+=OVlmfT6h+}l{P*Afq9g~xmk{Q~>_OQ{OCqq-eEoOa*rTnl7kY`bw0We$2= z>!=KqJ8)u#$=!;4Y_T+=Up9!>5bjn}(zF(d0-yn%+UX^Jqo~qo&o{!wt-XGT!o@wmyQ%qz3{`ppo-L1V*IgKr74^KBX zib0cY?Baa4u~QVZ?Z&>*Y#Tdht4|v_N_XlFazgKX*f3@@SAWR=)(D|%I?@Hz1+w<73p@02q4{(oK87)OouW0 zHcO&RgTim@B`zcOl~!{l+BD&A8-254~fD7CUi;@lZw2liM^ndwpDmvj0V~(T&rzkBpsK z3Slpvzc*>^T%~H`=!2J9%aApLa^!#Dh3aw7h`gWup$8-nM z8hU}JzBE4=nKs^+t~GHmvF@Z^>TMFb0?`H$ypu;wjgva3{@`som?dO9fBy`WdJ~lU z3Cgb-e|6Dm7a%1WhwGB%m;?15nJ4UJdfm3*!LV&X#nvrg?&Oe1x)FiPtT=xvg_!Pd zpe7dX$hL`7Ou-h=Q7TX#nXi_76O25)mNDy!R7fo@X7whRFV!tL6_kY3poGS8zcYw3 zkP#F>@7Eu;O!QQ(S@o<mg>HFzQ+a!3%b9b0a74Ar4gC~mxW)wYYsXy|L z(uD6|L?@0E0M;H_f_`ORh&FT2^!Y@xz!+VmA}nxST;Tq`*2>xtg^{)S0smP&bW?w$ z*|RxpM5zVRgQa{A-((OfrKgEHgQ4q2&9YIO(oy+nvEum*3m18Mqfrk6m~hzk zH8^ah9dwv#LgH4bXdO%mP_;H5wMS}B?3c=jiZj9dcaAv5MdU!T+a=M=e*z;b06P0I zN})^@#(lr(L0Rf;`eTWSQ1Q;sQ%yTsdB^H}IN4fwwI=7dc=dg9qlsUxc%fh-jbUA? z^Z;rgWVDXE27zm1Q#s&c3wI{Nsl~G%koIY+BxtZ_4y>lBhF}*(<7}xb)1~f1skN*| zTyTxRhydPoBLcWuDvt2tK-i~UrqEiuOu2J^x_GrP{H0bOxd3J@Rt<0 z6c!|dP?+g!TdK}4NgnOVP&7kO>n9M&+4T(mRBp<*bT)X1H|axvknCf;0+^A1Ng)is)HHO!sqJke$paMafo5Y}8mq4s=!K1;)|DfecoAbdR$$4`y&*0f@ zG~~j*r%Fl};r4>549DDoK1(QKdx~)GAb;(c<#qWn)lwI+KT!jL>08z&PBVvFM1Xbs z)8_QLXIFqRdECV5h0kB+X<24#%$uggrQ1sM|7hYsjasKa7hF1p!StzR`}$B-Z+!`^ z-)@$kIU}-RitVhz59s6Q%(dN7qrvmjLZkH$-p)CQIhBHfB``nXYKW-XK)7UtmqU?$*RB?H_;)DO&ihJc& zT-#o8Rfme-K=TIuJwRW(DuE@xSS0_uEJH=5-lirH70+i;*G>caP;b1B%kRX^q^1GG z;SPc5$#^21rarHW&Xf}oX>+aA;^;GXg zTK1?>YR>Y5BwBTWI>B4w|h0$o7A_i1O%q$wHstma2!on@MiQ(|f zcJbxa&Y6f|OpX9$5d-PHL*>qnFXp?`KzIe;R-WEdqQvjoE$Fgq4*f0KkfFc9k7EjZ z1x038d6lZ%XGNyUi!)WuMa=tsRnFcer^?IQt6cFIRqooM$~{%(%9k@$Zl9^L;&)fM zS8kR2wpTe)RW61Ovs<~8Z|CY)^6mVvYOnutOh37EP6OXrpTTM3UuI0J2lbaYqeI0P zs^Wrl#i#za75_1};xpST9^awjd|Pp|8Dre0;iT}(1h-Lu{Y4B9WF1>eTBsWCefSP?R9u{I9(5-ig~~?L-7(b zw>f7)AUcyJhOv}Ug^4!zavbbaO|gY$@EUhjoZrGo-=mL zB;La$PO)Satv9>0&Q|JUyo%p1I_Z&lZ2e{3m_svj0Dxj_8rI+Q|ql>+iwl$ z>6ARrdn4`=Vj4vLXj7P0hBoc!H~YX<-s)B+(Uqp2u&Jc&lkKOzl;`ORwDv@tJaqMy z&|k{w2Cn+v?A$UBxfZ_$IBk;I&f+lvNiRj(rU~<;Oc56ei=Dt`=A`!+7 zN8ZG*{>UsK`@N|0X19elc?FToixUtufJ&X1_o-o>&f^cU zytC^7)nNrpy`@)(X;PwNtC>Dk4RaRxjvk4ysB>VE3_0YkI8iOt)5 zj)A7yv$3%!GCkX|eLlb>BHBC}0Z4}cMSA_#NLi%r(9Kg1{PP!`FZ6~}$S%?wUTYG~ z$m2|0KV2FTzeTPgY*tkCT^s*+u(#>X_ho5uEN&2Na__uj$k2ettJ#KrY#k*mF;z!Z zx{lkZ1D!*CPZg-xK*dj!xG;1i+A$lTUF+-KlU2i}V4sz>X(G!?Arq{bSCd4lE7N>V zo;$V|UlO{)Wpim8BZrnIb_UR~-pgA>*pi*BHL7unEz$1JrCV6XrPVO>?S-tkz2PB{ zo^q&oZ}ZoT$J&ZkZ|qlI5+9-aVV_ANC2>D7XyW<(3^Ltii9SRgM|}u+6p~ujL(K$g zCvT#wp1D_qkVA=qwNSz#$YM}M_+#6ipC45B|Iy?%_H9FWO>EFW&5^x&Ia9ZX*cPur zEHo?5RUkTx>!4Xu&xm$h8;-wjr};9o-~T7K!WmSU_#=QnQ>seA(5OqbnsF1-tneW~ zz6}eZM$$Xc?@ZIfhd_L;l~U6qywju`sUh)z-qCDLh!)|}&l}#JvLfBBVQ-=jFdOJn ziKmKlz<2HeTGOrvOuJmg?H%VE#qH;>N(1`5KUQ1D1x`D7r%%C;Dl_xrUxLI~;ajMg zu-#l}eg@xWetfsm%^CY>615SWIN&Xb{1AH`OY?H64CB?bDh)Ca0CEqgHniyw%n5jj zaG=!~^Bh7dGr-S5f=>LxKU0teRNij-I^Mn9HhfB~UBMwg_)h!Wc6HzT#9x&mZt8@m zXg!qj-6bVk-0ZO`A}9r0yiwb$`g3^}CK$HGpaa;P#%?|ZHgw<6rhW1D1^Q43-!I0Nwya(>hy;n76a&GE z=jbnsGM(jAlSQ~Y=fdN1DHb{SgUE(Q5nyke;CTzwxp>Hir_#bRMI@68&+)dSN997w@Bnf}wbvr@On9v4TAR)!P2yo;gx)p-PTy(As|8J<_bWBy>88wEvNW z#AOWlcR^Z-ifw{F+IhFog>{cKtZD8xaZoPF_3FTJQay5Doo8n_!P*~K-AzzHzQ9oZ zgDBdho8Uu#gpW7j*V}M?xZ$%*_(U774>$Z~6MnW0*M}Q!M^(^<>%$FSZ_@X(;rejH zH<|FAZMZ(%@Z}~v&xY&64PR-(6O9Ibedw<``cIun(O&WZn6PHqR)U=?$7Oc>6VC2f z9|l^KT&sIj4YF)CUDAWyfy90M%bhYlf6wxcf8U)M01_3lgqPUho9Rs>|GXplha%$n zrKFK{z^zCruJWqL8GepornkH(abSC9!n4Teo&E-XkQW?JhJLHK|0{Oz4`MB2PH*CT zLNYB98B6NaClXLR_N>X1w^+LDA&UedMMMgs#(Zx^DWZ*Zb?liRR2_+wT$yEi~3>1Yykl{kaBIK4qjGXnIWw@IqO43d4LO+TI) z-)aN(ldDx7Krm+-gMaVz!+Md^Y@pt${?!KR{sbXA3$x50V?TtY|E-LnAZcR|vn)G_ z=#L*G8oxJrX-%_CKzG$l6tN~SS5TKRfw?MQ#krdFnMUV^LLBE{?BQ7n=+m@f+8cfl z$=od*p++E}ra;`I^{?LL8r{z%O`;q$&|&M5(qP`5*JTz)SKP_D=Z)Zhp~;6xE|6U@ zTJmuz-?>X7*9X^h7$bw90V;2JDm6ndS`~I!0cx3NN|kA3Uy^CyBV=jmH+hcTDSQ@Tm$t7Yk_H|| z169wQJ2*dkU}y^xPR3-WmfGq&=Ln>l-~9{qAKa&tO1^hbtDQ*S#`A^JjM`ow>3DIb z9p8X6ePGfZM3m)TdQ;@)RYbO$$U{uNjP104p$3)}hGV{hk3_QToEPa0@bV9J*%P3- zeM=c@WMwcza3SQII3=f4H#+eynedYp`0-sFXnU{SK%!tC_%dsR+CHrik=BmE;?$X+T^Xr3$=T_Pg-kx+XY6m{M%aFrn{g>d)hQ{ zA*H8FFzV@Gyw$3Kjh1>CWzm0aYwXxvdmH_CS?+w%`j(A*o;a6J<<1wv`1IGo`0?4} zyZ`BCd{15q<+X0HC+k9+im&Kt&aX^|V5*{JQ^gLX1h>!{G@lG*CBEffhE;s|CsWj6 z6xG2-rDbARr(r6S5`KyA`^GcJg51d{+6^=Hs;(nE#(~m<+TsVY%33Y3L>$$+2SdsYzwR21mp(p$4JNy zFVo=Z=VZ**1ru5Ox=I+j3>8aQoKA&qt;`t&rQ@2AA ziEF5PEBsncX%a0}qB9JDJ^Qa@qMhh56Rn2aYD)5k!~B=&PORrH#EZFg-kl^ks0L}_ zz0wn;_LJ+*)(uPbwZ`yoQ$zdsjrIKcHRb)zS+QGt-p|l&n8{Unx3hUUX@k+=!mPZq zW}VA7SHFgEJl6D_(TMbXm;zJ2dz8=x<=*V#mW&oCsE(9cMP8UyWUObs$$ef{?y=dq z!*1>q(zy@J$vxQQ-rwd<97H0mh@~5nxlZ#gpwpcnFi_Sl1_Uo4mFJmVgwkQJKj>j# zEFyw?&A&@q6GYFTDepQfsapscy=a@8)W#dCtXp*q@bn#Wcc^vX6IGPv8;^IU*+mFF zr{l+-`XgL1X@hfqvpI88N-(aEm6rM6pSn@$(CcWuVg1z}MMBif3V;q~@ZbHy;%W>1 z&hZ!J?zg7>e&jyy2FJ{67MrNpFr~=(>N)lHvP{)qO;^=3m(zMSVYL!5Q9ACIx@i`l z?5Ehemyj|LtKmAm_1=)9Zpi!DtuIjV(xjV!Tne{9)2hk42M;u@z`3=8_|beUf$fzZ zTg}3^_Lbp$Mu3T$W@L);W@Vm5X3ef@{WfOT4WrFWU5W6Ly$5_ZsoTe!rav>xP6xM% zjr_}A1bw*0>@adYeHtQf_&)M4(j>0=1_t{jP3Kxhax%_W11(>VWa=>Ud-|fIV9%07nah_e<4dxB1Qs#blOT#gzd6JiLe>%3nS*3#f9n+@+yPSUzWW- zVxkr+f1|;PgG@_Yt=s-1%oINUSu?xF1|JE?8DN`EqAj5<9Bw~#F_85pxAz{p^fpC336(CEd(DY2`*ycRxZ(-=<(ELU_&cB|3XvD42q%qQaR8 zF+v=kt8h3*EPbYB@u$~qp|za3_T6IxomGUy^F>=0e7%9os{mZBxB-$$oCdUJ?mSrF zr4JWcpR4A8v(JPpD?Cr)pAq@(vdR`~0%L>A++qi*Se-SZ_Z|o5)Yz3M;CkdGi`HGP z|IhMZ`)OGD0~1GTx{HdV-6P8d_Zqlc;vX&~t~BYcmaZiflF*XOIrm^Az}AmLUQ~eo zGIHe6sNl9GNA7RK({kj0Sb4p58iT2wbtZd@nK$$j?>CNW%wA(vWG!BBN74LTFSy)1 zz$n&W>jjDV7n%ddTw}=kd(`FqQf@zhmjncX(DnH$Dc|%{&LhQ>lx2p5Xa` zXL}}qGkA`rgopUu{l!%3PduA>PGGTdEzfyK#;@@7LzVX{&zFe$e`A%?ht<~#o_$&3 z9)e=wRG#N}QatrO<2eGj6u0g-;u|pc= z{gtN^aJ@*~^$Sv|fAU=NX)4u~Umwq2JO}V7{xE)z<_YkO;yHomT%K_}jXc-#+{kk$ z&$4Gysf9dkJmR%0n|SWxd4T6}9`%FbUnhPk?=SPb#q%N07d-2Ez9DWiznw_eoo5bZhH1}7JUdax zTE4&H*~C*onBt51J%UHLIg#f$9^vw8o_lzf@w~>fn&(lTdwCw@sdeA=-SJWU3r}-L zCC{fkZ!?DU=)2>Sj^Ep{ac^y+T|7#su=n`=lJb7!`Gx1aAMCrnJ3fj(nm$RVSw&tw zN~f@sh`WyG0iH*A_90I1+jWPY6Wo-Sd#wNn%g=?jFnB z9O=x(MEZ9AcA`GpoV_1I_8O{d>dVd5wP7)R#PZE~EhO`VR(o`xtu5bNh7uXYJczT1 zTW-bth^_U8T>{*cJUZLSaXpSQ1GejvSR-{Ia4v!3SAl5ZgS-Y(Ye`ZCKhu4? zC+o)DlTU*5M}-zhNq|D(1O7+e4(I~9o#j0k@7$BhaDR7hSzrHi4id1fzi6dFqG4oMkrbeDDFxF8X(Q+=&>^rJM5tJHHs{`Z_L5F}bVTxi#2z z<)|IV%TqwRF-!F8_ELODh0*CFEWL zm0Shj{JH!dta1nXtMZq6Jgd*+rE%oW&6KaoyiI0@kOk|JMiIFMW5R}aTvl%IoyK;h zw@-ap-@3@F!MK*Stm$xBlk%PGudp^NY$TWkdpiCtY<;t9l5a|1FBJ3qSahD z&`H;}?Bs3wh=6CsGyLRAdXmyXs&>oR9i@n=jUV{C1 zIq8JGlPobN$1vhd5VxyIny-}HWtPHQ@|L=$ zPwNYVxCk%jwima(f#^7ci>7?K5M!VuPN>uaFQ2KJ!1+?WM8TuV?ws;@D=W0fmFzo3|_IFYbw)ZVLGk8|H?0k~_=Ph@RWQzgWk(7wBKg*L*aWnPW(D zR8?e?x18RiUn^ZAI@5pF(hlQEx1yH;3C>sOJKZ%D^_SE}%j?otSa7%NvqG@CRpYTX z@)>tD))dp9i`7-e9jC6aw$7(*zx*g2pL*mCgJ>+uP|v@oz{pT=O2p$tm>is3PWj?C zO5NZMYZVVQfl|z%KdZxDo8xeom;1eoYl`X8_)u-adLokrLVYR3)o@fGI=R%ZZm%gw z?wU(aCdyk}&0*%6A_Mu@NEgswmhydY6xT{dYB~j@H8lC467KcI{l!K#y~#)KC2MJP zvc`^^9tK4EFP|5}fw2A{!>{V-uWwFQr`FM5pPIJ@xh_cg-qAg_H zgE z&{8z4TopccL4k3^H?-8Yd?+EsBt8n_S7*}fGmFPYj^7@NNp~c22Hw8+(sRQe$5?0N7gZO9wt_0^`WX<&hz!fylr>e28gDd`NL853M~_ zh4)>6sS@z~Q`%c`$WH!0`_oCX%f^80$XQ_=ZZMeoEeP9UbxcP*Zd z15ZQ1(-0R=?}DZWe-WB&?|gQe@BwFepO<8J^ZGikY;8rjt&X9HtPV_>znt+n^()7W z!Z!oaKjN>rHad5SW)d_lzqlC!(djKlv)CGl?Y_RvC#J@`;XqmeA7N@uWwV?8?4%1)`bOg}tF4rLE5V}#5#$z&w5 zgHq}omjwoKW9X9T;(tPH*b3NialTBOLzc%^=6 z;%a{Nr&Ab>`o)f>QmM&h4CqK}!b#gqy#7?z9Q_if%{f~#fSVApH1Eh(Zy)!XoM_?k zuM8m1T;tt9EvQswYfW-)DEDs1W>CgzhFSL3)&p2q_|19>d(_nMl34RMzido#)9s~2 z&}!2?G(xwT&7uf)wU9u@>y9q9Ho(V4fyjplG^<~xR^2P1+SHRemONY^wq3Ql5^<6R z#^8tOz9=6Jjqxixq|7Nr{{kHlO2b{pCE3IKGDhi0AyAV_8C9M~m8n^c3duq(ufn$e zVj2JEb!Fv6d3h<{(-q>ARb>|o+cy(qtc(2c7)=N3Y9n7t zCHTn{dkFYZ5gNOQO31xlck!vMQ}vkc#AxIZnHGj#%5GtrAZVeo>Mt85%5Y*%1|ds-StyzM^Y-{Dvp4PpBH!!okJ65FH(HL~^@Ds}$ zs_eAS3E}?o*&;Km z+Jrnv1*3OV{}A^s;89gq|9=J&2uPf$M8Rv+D2dm^YoeeT3~)v# zfQpJOD%MM}rHU{kc*Ec%z%UMCz1FuEZPnUZZEF>|C?s4G@K(T9K}ErOIpc_eRW2gT z|MT7ZoS6iDe{bL4|9SrZJkR8uv#)Efz4qE`ueJ8xRPa5Ot#hBhS&X6V$F{O~zOp`k z=}%o`O8?W!E~Qi7!zP4-(6S@BwL4GdIGhztCC(#ryf0L$kB;Z2V8)V!VQ@0s7Cyoh z^-DA2<%T0k!kDMUFGrRpmQ&=hN~6#6R7-w{AQHR+y^E5SiKdL8y}k)cjP^SO1P7VDhOM@+E688tOM0{K)Pz>lFuSc+}BD5@t4!AR{;Y zn_}BdS<48LM*@{p+e%vbg8zA0R`7)&GJiS1s)A31a35+--Wr=tnt1P5(mlXm3tA{y z;B>d(^JwLZ#x(KBmW}l4vC{?>JfjNOhV~@Ux~S<9o>HZ58$=tfvV}O5Vlt3UZBjbb z;jST(pQpQ>(7ft(WCp1Pqf)mj^4kMYE8_MtYN^RBj9qmHd;)aB|?Db3)qPJ8IZ;>q5hn zPM)thfvwGL?lqGPciUUls)r0OF3K*ot;;hzYB+#g>F75yzW>kD{?o7oQ1bwpTIWKR%^V8=kFZ17bN>%@VCpm!=yudtBq(dj5+p+tkK{NwoEe(+%@`wT?|KtUcd%1H|BJW#@s{4}>MuIIXO-_$9 zuHwTVRw1-q?05~Raki;%yBH86Z{=iGRs>6|0M zC7tuo3%Sl&K{m?0k#haYyfKk18si1#@k+{JUSKCg9fm!Zj@n^LUFXIGiP#)NNltb! z4!w#y;+x^EGYAJumOV(!_J=ApeAMa@ioYXD`){>J9tC1{ju5p6H~WMjpVe60J)qJ( z+{v#%rOztxaM(imxi(HwWu(lvaTb^!$ZhB)FRMM=rKm@+VRdsWn0uTLR4YpepWrq3 ziJ$43X%M#{0kUVF z8osx4@4LZt?oh#&DtdTsu5&Zj+u>|!)YdTL`)V+C|EyC?(O5p5l*g@7Wp&TPEZ+Ir zT%Ai(?4Q;5#|Irt+Jb2BnyqG;j`e7fy4!(w_GC?WL0WnXM7K5pnJRf&5AIHL zw|q(y5=9>@qE;5+bHU^vO*=UK>aR!DnZQT0t4Pvelf>@H+#~CslPr1KgshAnoGt62 zq#Z>M5~4p|@AF^d%PRN0ze@T8PlHs+S~nEjr@mbOO8JLw^dOZW7Wx`55%zW(Ma+UR ze7QHC#^{InmU#Mu9qtthVKG^?(@8l2;%FE9yN~|{%sIg!U+}p$Tei=+CSUY+86}w; z0w!0RJMCU;kW8J&qVXSLn`ku36%sjGB(8PaPp#w#G2NmzwN!%JaFeBdpMgC98ip-kP1VUpTOW`?qRKqkZ%pu3ItbOGa}f(Yn-6 z%(IidwQl}M0?hgXy`ZCZ%-9a}B96V9o>*2~P_VnEHB)3HakT~2(3~#%AnYCHTE6%kI(b#a6>cddsLU*}bxb3(znje&4{dB8p52&#%N*Yx_Sw3Q(p`q!8m zk_|Q8o;|TKIAnRaYI7sQqgW~iVO6S+a#N8}=(vykW2dol1Y0&Di)VU;i3eyBqOEXr z)$Yj9tRV#h&kVMV1wd&$YS9L8fEoL)-m>6f_>dCd+_q7ci#8DR2uQaCa;2MtD zM^Z2q=sxZ^r8nXU%5`{E}MhC8$(_ft?cc zBZ2zfPw-PEIH*&CauS#s(ko$<5`42cUqvMe{@$sCGnHVSNf2!QFYqHcs?kZ@&AXFS zlYnj?Rao70TOfO4tf;*qkTp@&VOm?Aev0Dq7{Z?LKW8e<-29&;>zBFUKS@^3?J)mA zrInUG^6EC>C|mZ}5XOm`mo57RuO59FjfZei%*B3s_9GGG7u_#{3xkt6(|p-?&VJ-F z9R>>#u_JKB{EJ-1X&1ma?r*>Ms2>l zL2O}|)82!zdWQo!+-OQU+37HQ&M-q@McQib4BW7hOL@&rp6$Hl?pNL7cC7F6Ia8lW zdcoYcv9(19k(aWGucroi$oKLbp+lH-sQBaVP z>uqe0ka2Q#k|*1<{>oz|@s~=4++gz*s&JBv4ASCv6ce(U@c1GxS{jf@YOWkCo1V}X zt6fg=fem~aM!Lnl{>yL8`DU%&5ogbI=e~37tQ@_k0l-zA&q**?=YG8}l8V-h2`Xe{ zyB}t)MK;)SDk&9mK>=7uJ!AF|B&M53s-$tJ=IGhlh!9E4)%FBRx%pN~E;c38pV#ir zzN8&C>CfP4iRI~!^gv;5$g}92%7Vn#>D6L)Hss%fa|G-1nx1PoVcE@p6QEn%<5V0F zafOqKu<#@;JQ$E$Ky@)rInjOw6#8Gu674#~5~zM{idiQQ-;>z5jD|`ozB{N$Rw}6- z=gGf5-6p)p@2D?`HV)BwD)$lSB&Vw%BFXxCW--sOmaKPZG22MwigdEv=Rg0I`<@yWcx-(W2J}i&q>X8L@lYZC!d9p zmD2+@#iL4bkwk0}MQli#trd`{BN7ZYw*jn~Cf)0?-=w8-G3kQMbxLMx-`CV`fT#tC za+80qp|fOC1kC=Q5IxZm*N6U`WKyJ?Ej!%)c*HElTsKE-ZE7MW5bY748ZC(W9td09#~isl#TOcX z;KXuf*H9wJ^mj(hCdMtEWbiR_{d2swAbJ$cOBl=6Y+9g4eiy0R=L8I$MK4KCOt=Uk zT^$ab)YPar4(Q-~iEC_k#@;l$v~HxJP%@aAP0y%HQc_CiNUm0b(_yszrDrU0O=2&+ zh#~fn3|Ix}AlZqYLUj5KmIj{uCTUiV9tg#OP8Ta5WaL(ORDVxjyTkop-*2<&mnn)X zcz!D4OU{&n4oh2b!N#M4cmA0uCw^-^v#05X_^tg4q9xNd5?l`1#g5J#RNtu`;d@G@`e;GdM46e4oD#o)PlViKONW0alD<+#S6S2PV&WlAzXq7&Z8EvG>G` zd4#aCI-P#x%N%T*Sgcb3I%X6w>O{Md)SuUyRAu-4k^aCU8NNo$e1{ttCS3fc82;2T zLpx+43Pv}VLi~;wj#fM1sbdOeb(h5XbH$`41qKd^9@4o1^~j^qy@GSGgSHbH!>;)? zAqVEu3_LU1Cpee$co4BU{c5wn-P8C9o#^g_rZ1BOc>v2D#Di)->4#cEQ`4^P zm{Ck1!z($XGppzsir)dRINo?G2{BU|46j%$3N0|4V(;A2X-w#{kd{y3)MPW#(e`b2 zw_RyAp1vJFt6&~k3S!S?UjNScG#%@texZ(q*K~%UNBmX*I4b8Zwe6g)03>YvhJGTc zNw#84neJ3u@y1ZD=7pJmi4VA&_?=t=An(THk>{D7eIfV22yC5G*n%NG!ET z(D1E!2X=}37F#!R?DF&+yL@L)cDcTijyfQcy2HS{MW+hBJQlXNlrG=fToqq!u8NnZ zjp35F(6gcB-kAqI{5jLwgs}9eu;mB&^`dPDEN+B&!&k&7ANWkTMT)p-tZ+QLTw|bY z+8N>x)AgZ0!tFeFoelTrIpd9?H6=`0Lx>3}`uNtSjSygI^p~2I7!E3Y9sC$nBs!)G zI}E+f>j%THLi5Z}0<7Z)D=mAVXjamsC+9oqbNT#Uf4y<^P$cR@vL!VXA6UV(;}8eS z`1Wx%X1b`bY4$Qu6X=-!AqDHNW4iEY-wb=_mG)12!fQWVTOAl|`IdaD0B8%+oA_|z zi)JcoG>9V9T{TPz({CywHQjI_mRuvlEH!Z|X{d0*ivve{Y-e$S_tu$u8HZ*S$|b)I z6%AU7j&=_sP<4MrJqszhAUVFGA-;=^g4gqfe9-&`G4gIg=@8%ECpaTw>Mwa)5C4!W zC)tD9QoC*?$lXv;SrFfKOt9q%vZ8=#FYMkMEq?AO6?$FTm{nJDk@@oW!ZQofv!IIj zE{+6TK~FOp;=8&BTf}lYrmvz5)BVUsAlbd;QdFZ7=u9%Q90|@%ZDWfR_y+?;e0jG_ zPx(i|CoR9+UOqYK1b^2t@iQYD9Yc*y$5M3R_{eoa(%gna;J!=A)H<+y^5!r(CVlFp zZY^@+*`B!G#j_>R^Z8#Ki#hWy92L4?)TqdXPTi1#*iSpAt9J#fL1boPXdbYGfHb|m zuVCLF#6Ym2j_LjUluD6tLPjXDDc^pKl%E}GQXbGTy|15AVhfw1;@KV(%jk~zp^HX2 zH7n3R6vnp<>ea@Myu?oIg+2uY)~DqI2m*>!ZsKiqdbRrwx;IARn@-)BifT?zWEC;8 zSEx^BxzOKo3Z!S2coCM+j(hzW>y`RokM9fst+5@1yI}JM^+l@ao8SH~M}XNseB1A6 z>|2bX#B!tLltB6;`Z1IkQjoTH0X9FATFrp3IYt(JZS1T4#+K`cetZo-<5r7 zI2kgxbRtI4uSgN0Av$c}t;ho?H|^a}PHI%eSc{I)7nps!N2^Q5Iw(7<@D|(A?Y6R} z+S_BLO;Z9TvEEHny3th|L6Fam%?*?jMQg>QStCMaIh5t8NZs*x614%6#pGx0uHX<^kbMOZ^ge(tAb))_k!^I0Ct|?i4Lt z%)Ej~Uk|u;6$xi)>a>u|1842*oEz&jwycB#OQArV7*@bu=*1LY?(GaO*3icSQgWK$ z6PeWV#jTv+f}T}WPCrn_hs_;%l-y^V+(u*)4UJ=kkzOto+7*XpjQq^aI#-L1&fv`v zW(+W=3z*G}BFJ3hSjF{MaW{!%7io+a#7eeK7s~^vr&TgOf2p!Y!SUmZ>7aAGY&Wvl zOP_5z(yU*j2idjjvt-R2Om%KQWPTcbnq3us^N3c3@17*&E;X#LPY$f>DP5fSVgng9 za^3|A4ciikH_2x5hA^Z-@SZBA{7Qos#ebwG{EhggMH?uzAefjg!)S80`U^SxP<1y7 z_~dNOX#|ugphZWmV!0R#Wb_xxdBMd5!H2oD1X~GFZYv{G>)#!DoZ|m!8Umo-)Y#=~ z6eg#!P7_$wQN36fE~Pub-dVz4_(EB5Mwu}8vzK>~V7ep$tq^Z@lD{6yyM|7+Q@7L! z4qJ;v93Ag1^O&dBxs^ZEJSBGXFSRc48~FxAV4T%qMw+SUE8rC(*I%G*(9>09xN7Z9 z$I)_C#l0H+-Cl>%1vbv9TAMkBm7NO8oLI9deWyj6(q_xbX&L-QANoU(vMCuHD%i9y zQWuEz%gKpdmera4B8eF?iRYswhl1H1?ynA|!^)_vW>X?#E+j^vXrU5#;!CJs3Zge= zKIT386A?BR=3nF9!$H^|fy0HOz|0R9N;wtZb!_Z>CwUq}+Gw_*iX|&|VEEOq=)|i5AoD(7PXdv9aSohUA@q|p%`w9& zW}sr~1?aQ31)~*uv_cJcmEhT|p#2min$0AP_96Y587^g0sEs{XleV#Uk>8gX41Y@b zxISmUCB=z^t>e8B!?spU2lBg;pTf1i+QWWQ8PWA0ja&_s_=l5tEt0HiOg^u{!Lp&) z42~Uc=pec~H6akG+dcWG8VlMg@_`gUpAdt%aB-+<;KAjw5#g$B;dr*&#M8oouW%(V ztQa)nJjPse55^V|JtyjbhNU#l${k|VkDC&L&1HsPG+>Re!X-}2%F=COA6w8d<#hd& z8l2Bj-U+^Nd@3BcWs`Z$c8~Q0hKggO2P#wW&Nm6R8IL7nu%(@EyHR}Jv7j`*qlmMD z2#fDP4TKq=t91ARx(Pt1HS_)Fvu^~nWsTl0X^uXu*~(F0@$GvBXG}JUOLW$FPQpa< zG4j9A)qF+yjme=_rP!Yo#zo*8_g^pzGen6GCx_Ql*$NTPUTcj?`9Sh7;@eC8yqEg< zeCj8Zdi`5wRx-D>d8OR1@a0~(hKd*7qVT6pc)7% zeCGw2Yv)*P8tnKjNBavR72_hTRK_N!6+-Df+Oy1Z>i zkHG5dR%#d3wson(Vh&PFOjiac^=mU~t{Ohpxvp)*XUm3jT9nP@mbY#19$1y?+m!12 z^T3j-)$TnpE+a@eoI;?i)LITk4)_H};L`b;Ufr|TNMBOYn=s^K=@?TA0l&v-)|%EX z7A#3{tbnf6RGwJkUUw>`S$F%Jj>XHqXpzxgN++eocNYt}*Ki1xE9 zU0&HL!%T?j)hybVI;ll#NuenPrOiGUnyy~ckTk0W$$AxD)c!;zxV<^nhOMb05bI-0 zRJ$^N^2Lc>o;VTP-*Upa4?$o9BfGPU4I`hPo3npLpXKN5pHPVW?sIeYr3Ani(Aoc) z5>S&g=H~1OM}siXl7x%H2O)|?2TROs*_dM_Z!k??$cxU<=u0IQN;6SwX_DiY{(i4& zXI^F1t>s4@qjRc2I5VI0^IB4IPa6EQVb-XMDs{*){!L1+vloV4PJR6SlTw_`+P~?W zBcc~IeKRIHws}qT+C*DJuN|?En!aHZPeU76dwU4M|HN|MkXW53R-->myuwwg%`2nq zYiV2l?#b04jKGjHUfWjsoA#ZYvT zy*!N*aw`rHtv zWoOoZinXLF_Tdao_pANvrjyj=-NGmlZW|t)yO;Z5otClD!E|DGd=qx%5i$oy`$*!8 zNZrSi`YPqmNGZi^Bz1!z*(eIkM(di+EN6E-OR;lPr<_dU$wxukSo5VbTmZ|U@co?B z@NVDvzR2Wo(ygZ0C5XObZZRII&8I-G|1@6$FwDY>&=c#VS8aME$pOo?S%i}qPBSJ`|<6Uc}IKRMst#d)0WnFUM+e3 zWU_9)%ne2`&zAK)TKwfd@MrPtIkk?_7h4Me#2-l}j2M=@M~*DUWhCDAT~8D&C2s#` zO$Te!d9BB%lZVM{?OEwhh$NF%WNIr#(+R9|CoJmnS)&2v&z*p3~u< zd>q_hWjtp@NbH^dDaCYA-!BeZbrp*+j(+ov2QQ`v^X>a*ne#4;ac`a>0EYL##G9xj zdfR36UfYlWu!-aUfeOy)7>4X1;6`8vn_)xHass%f@&b$|)??3}f$<&rAF_ix;lpOk z6gm6T6I*w7wLg8t)Sb6KO-4nqr~Ro9aENA{)C(IVBc#fDF;v7gSDvfX=G5hN?roqc zXN1~LLUANkwA%kw9c&Eb_V8;vv*Fa33Ngv^!-@5cRbK;jB=IGVQtmE?Ufo2@ zFfJiLa3Is|WKz_R$VUW+k}{?`nw|qh7A*zd^;wzyE&nmT4VhjIiCv!lzv;G$?3v+U z!@Dh;JmXe>utq;^G6luwnS!E+Cx@2mglz0wZK*zqcpG&|b)?D?GnEFHwZep(8J0JA z?Lna|ZAcuSf}!VROQxsdcF~44|n)jp6P8WdF+9$Nv}gbC~TOV>d7JcBy~&kbM2I z*33HOEze%{*a@sNSzqVpgPgqzPs<%{1FR+afQ%R#6754Y3T8_kpDkN`n8vZu%?qby zQr^QZ^^$LwdJY2IcrTJqs%WqKHN1AXoW`d`_`_Cs?M(^!?znc2VH$b+RBC|bgxAq) zo$OOTP$%wTpZ4UJW~D#gLcv9a2gkSf zj$X`-Fwq<1+e?BiGl7XIx_hwsUcI%f3AWs$mrk}5S)nt8HKq#tpwbFgt@IUK?zs;3 zloiAo_$a3^iUH&s9S4*e9LQXrZ>{i8OgBUUYK!$6!T?bHHxGm~5owy$xYt z;^fSLd8|DPGJTD7lzHFCeSUlV)Fd2^a?C7$Ff=*a-nRHcR>>k;CGs%{C$V(q@NMrm z_FoyUTJ5((qSzh7a3jaRY90MGRpJ`zDIqjcmkHjvgh>E4uo4IX?Npjj6l2$R(Smze z5vnEDzgpyTI^~3#e!q&)-5wT+FUTAdu6iwcR5})8N!OTa7io?Pr-m52B;KuKDvq=LY1A0<#ny7R-u;zV_D<%%2DBK*8Sk+S zUv~5un`3cs#@{tRrb^6RRldzJoM6CUSoyOttWf{ z#YvsB+kSCSJGZ4Dviq!H%Sc7Umwvlg3lXn>nr<6ZFfiDBFhN@C5zPU?9TVNOtc*?) zThvp2bqT+^<`4*>VhoMLwg$7`53>~g5lL}+L6I*t zgJdJjX2F)%d9j4f3klMii)|C1q)_zxl0@Lr46pN4JsW2&F!u_IUsM1EU1p#-RZtva zpvYOsT88KwKEpj!Lh|+LZ%LJmTl-Y>T+cQY+&`)^4M0ig_Y!CO06DuZ}&xM z5ebqeL3^P*sEu3hf_hWS4)@AJqLuM60&D}irT@fx-ddgm{X>G&%TzxtTuTenlJdM( z=Ta?Fs$Y{z=Bwr}m;lo2`N}E24j_cy)H=ZS=IwWN?#&J2fO`i?NfzO_cN1W*ng) z)0PEj2GXyP!cb(hG}upLPNTYFlJC^PqWXDW?A{`Cv^a>VUSsuAC&WI6(HT?DL@xtp( zcx5iUzZX8(gjeOl173K82|p$mo}OphJJf_9n+spF{n+#LG)&2+jVv7-@MEk4Au@HgPumeP<>3(_dtvfddby!rl- zdHt-XVrBG7P5T<9pW5{3G8ph~Cs{MUk_fZ<$(G$yYUX=Q9XJ=Xv>IFnhqP%qlskVbudg?! zjMavv4}0BL!{QQ@Q=^`eSEGKf9#(^G_AlA&WLzarDYR49p32mLPy5Q$BY5kiOg-`s zT|Pg2Qp!|Zi)IRbU#HrmBfwYQ4=OpQ8r`XrIKQ+bRIV7OBh(Mx;AJR}_457n2RQM0 zN?Q;;#4Ji4Tp=AE3r(l#jDazZE-G0Jy=2&b?$^mlcg0RJTxORWgNd{NaPxl`2hAP31P}zeMhE)^wa8Y8y#Xck%P6-V*H#WuG+ZcZ;tj zA6(_Zc4T~!SqerEY&rue^K+YZe-U;wS<{~qfPF2#Sc((`#((oaeG_;9wx6j&j7X`n z%k&1bd=$r!%>G1OLIB~fL-`6%5Ncv8H6b(68u(u9ykl&Kd)sUNKCqKa`DL$y1x=Vs z-^B|_Gtw@VNXwpG>8DhM3MqeCQ_&3LP?IV;V!8RUTg4V@tC&YA@kO#{7eqN3@IjN7 z8*0v^CDW+Mef4j~fbH%3OmuKYq<^FxyAtV@xa}30aT6QU9TcQvBrhapROcA?4YopM zh8tV%oIdO;TT04s>IPp6;kp-`I; z?d4b%92!9MOGLZ3&}!pd)%-D;OofM0A&P=*+5WsFGMRHtXfHpsfR~JJDfvgPcb&f?3!F?_}ivNU7a#T zU5f2AKL0PGV(a6Qcq?qo1wWyNuxBp7sIafEBXZ~C>6q3jH%>Bcb_j8J=YkFF5E4gm z;tLJi;9_dN{y?eP&bZJHxaQq_Gb+jpqQmLnCDTNz`pfenM@YbhX8<|Gz15yA$?IVNKIOg&Q1 zNCLC-?_LyW^+5(pMrcjDBlm?wZ5K`KGP}d9{e(^;Q3?Xz0& zfTc5xtJNM`eokJ$Q#WQj2@Kwzp8!$-7b}S&v5-G9XuewcYD_$>{tc&|Uu)vZE@`r3 z_=*}kP!HIT*yOLY(}yBAlZd_pVJKOj;f1X}i@>MRr&{~ULyAt_sx3YJJD(7G?Hu-| zOV5Pir4Z{0tEOE%_RsY5*8};zKGDK~XYR4z=j`VsXv}NkjF5}g1 z6=G$qtwOIJZ!89H<*a>w$-I&musAQ_|HfX?0WEa3H6qh^K000O6~k@q|0jFN|J{C} zAr^uz)85{UjQ{O^p{KvXZL;frp@)zAzu7NTfph5p$^Np8`22pMp~eb1Thzh+*B(Yg zq7VJ$7l`?NL0#-G58TeAkt*tQhX&ma_uPHV8qu@A^r3{#{cHF~-u_a82qwb*59}|# zJo*ogwFuiS;~Z<@P#fpvM)%{sUNP(XSTF6f|GH*t=3w^n&w+C}ftA^^D7vgLTvapr zG^jhGLwwOVZ+nO7R7V#XPFxwBtqtNF7ZORd*KES^175r1R(QkQKE>hW1DlB)d`6!$ zVwI6peISw;*3T@=SpWp0S4fE*y|iX!=AwLq=a>p-fCQc<#KFO)ttaZjy zTUbDFQFiw$`mv-}1#s8FO#^E&)85yrD&z^g9<%j`a%m>ck_IDozF%C?mA1HQo$XfO zRQ+2k)k{p7>oJD+BTxl`jzbN9^XeFk3Ai>iv*CCqwB-RI106K#$A5zmTHRRpZLlSP zs)a3y(Zl?@%D%V-&;wt(+cxK52DC`sM_6uUOU;&*p%cuMHzuA@LwK0(k-`@L@9ye> zXIvt%LG=X_O%%uU@74}LRbgaad2DpHxvC4=fg#v31zJQLyE|2n+jr@#H>uR+UwGXQ6d%nJBUw#;ndo`|+ATB8J(f@n#Ws zSF6nTZ5Pvi0R43sU60;a;c6t&+%1$Lv9Zdd`B|#8!`nS}tI~9`&g^i14rQmWHCc0e z$Ew4rVa7x=R$7aJIzh#WB(AQgXL4>ky-=iyKxfp9K7r)f>m@2ws^8d@;w7`~60oWhH z;c_+%oyM7d7VHR25X#%pvkfU z-~}v~=@D#LC7Rbg!Sm%cByzk51cVZ-I{KMbvY|~};M0s6wG3ypZ{eiH!8>1974!Wq zd*Qm_g=S+}utjzRjyqwf@luf9LG#oaZ$DFuE|85cl5K=mA8z2ZJ>lLkzyQ$Phd{}& zVodaq6tR`=L>t+1E|GZYR$@=7_qqgQY5B9?*YgQ%&db?XePOh0^Z zd*R8wk>dBF8MI~$r*~3c7)XRy8`RiD^~Gb%l~c3%%WvxGD`Vj&H%Z>h-<4&N5eCFvl+2mN#zN4QO~i z^)f?8Zcr3jK6zhbNac*Cb}X&SnZWelYdWW<)taNxag)w`w(JHgZxKSLZ`>YPnKsqAK7QcMXZ9OAWE?R2Q|kkSrun1TI0}9bIfSs z#kQRF6Yc({BBc>O(R~Z2P22S&aN(WXk>BC8;lBJ1rv+5k=^PWSkwR%*aX*AYG>Ta< zblu71M;X)Av|ZnjD!Mka*1~bT2gmJ)0*5$FW-;LJ2lyHMHp@=Zi@d1cBOSf2Em;>R zsWF4yN5oO200>3YDdKd>NK42eZn9T+xgzQnaRm|A&bfViHhT}hFBy0}u#;U#=u)3FAqpw^7eFa%?INzc;{=B*r?4N?1^}TD?Ea8d%H*VF|((+XCpZG zynx%+3wVUY1axz|djW?3#CI1(kD7H(_krcnLkAuon;J@*<4oe)dq#_N!^Y1-9X&*y znJa|Y-9>W9Po2ULZ|@#SaY1!_b9ZhJXux^-cw}w%8Q%Xf5+%|Me(3C_U~9)__vZxZ zC`GXwtt)1IG=Rb2{`4H~z1bdMXFx|N(ZjejnJpQ)a}+u=pn9sz`EPf%56r*O+6Vp% z9&YRdeE>zg=i|viyJUzYPZcKT8j0Ej2D= z4#bEgZyp^^o|t?|supxe-IG(fYe1q0lE%{$q%|7K#XiziVMAlST<7+@aaXpg!?|i3 z-aoNH$(N*0Lb1i!H)C|p-#YguvW0@BGsKssC-aSV}BS}o3m{-J3$(IZSc$w+Cy4+5_esr+}ad9QRRFz zoke)tykp46Q9!6f$5?A(>ISx_nyJAZJk11Nb{jAgBH zGU(&VKEA<*o~2L>ODvy*uod%DKo&D905{hT^D% zn1}Z37@C8*)=mE`r}-ROAGVim<#n%2V4m)^<{+bcJ>1j1o=er7bS1{Thc1)riMCFY z%vT@X*K8}+oe4~k+ucQYsN@u{jF-#n)uUzEuLhWlMfMq5nY%K_C}oG|LF*0^N=#+1 z$xZm653R1*lu20sP4TaYmU;LYYAaQ}-pbv3nFPLX|HvNeW8KI#((I+cea}h$fCUAI zAI`9y3ra&BLMpw3j@Y}k%SoPF8oBE3nTYJzOzKt!<8x?VBceI$4R$FGERH00Imce# z4^bVJ0c&l0z#rFm;s2Z5Ukk`46t>zMAl3*qBbKlL8=`%2 zN2gaq1)VXX;Xz&R{*<~lmcd*kaBv``+VrwswO?3p>L6RMlhws{Hb|H^^4jV&45Ds$ zX>j^IN{3ti1(}#|q+YN3X9Ta$YB*XL$>o#x1{8$a3s1a(&`y-_=b$#joZJq@jlB!^c=x(}^wtisF5?@)I=v}a5tj6LR_V~NnT za5+Rj9Cg{pDAMq+3htvzq%0qUFI2myVcqhsm>OD-vnLF}2s!om&2-(bYV7?68jdc0 zP^2v}b|bA-VHS$q>sEX4U^az5scO>Z)&>_Sr+Az})&)lU!5_2aF`m znTj3VAW|HhCSa5ZC8j?@HJq9AmQ@($-abxAh<&0dpF8N9^t?A z=jBs{l=AYiUbyJK=wG}m2kI5ZmRf|>II%RIEsR}^<%TmC;)~{}(ZObI*A6G|o{8L; zE!*@tGg!wAedrI1pi(hAzC+FK3-`+pz{HyQQOPJZ{R@(6KfgKqiduIHOlm!VS`i40 zgX`yn%{OIg^R}aN+hMX3NUa#9PQPR<+cCDCE~=G&K6)N-jW%#yWZ}|>DI@uSQUF(* z;5y90rC2jpH&6j=XutF)^a2#8itJ+?^*!d*ceAZehd_^wBpx%@4@D27O5@Ls8^wOy zt+&bGLm~RhFt?Ol?d7kt`R%H;hU0Bl(h6Kuwdv@P50LK?%f#NU6D4rB)=ct;6Q6~X zGaLhFb48Ovl7Ak{C$&!Cku4i?+9$qq$y=&be%pAKIwx zN>ELFN3Y3K<`pwog1=i4lE-yHFn$C$;A9=*aYD`cKa#UZZ$xL*j|j z-b#|a;~0>5$5Cohaj@ln60rS?DCu3DX|M2~Im1Ag(b3BX{@7ApIX>QoM7~fu8a+0? zA`su+D<|nz7CySvg_f0oP9vmEPx0THU!2Ho;$VApJfo!&&D;s-#F zjP{|a+HkjT+@m1FO2Yv=5^y@ot){@90Z2hyH=A<+$rWfgPj_Dy1rP z`{r9PQli~@{?Utp{;e8B-@|%NeiM1qOyJsu)lUQ=IetIYMcwzcXrT+fCJV3-*K|Py z!G;a#FY&{n<^|XIH9ySg^;q(o#HD9a!nJc|ptq{$H-_Ie{I2IWnO_sX|Kj&7zo+;G z@cTZIpRd32@2YSTuQrWwLj=?jaI z;B?Y)r6_%A&fgno+#A;H;tpmBJq6JNFLB|JGR*!IpOv z7~fSCyi4<)j=&EkT7*PiyE$zeim?KqFg%z;K9(X3f8kWUAG}L$QH{wMzeU9)MbQx5 zH=LUO7lvr&fSi0!>~=zkc!-CStTZb_X=Enu*qQZ~iE{g9RT#>0X326fPV_azI@5O1 z=u+;J5`1;*gDrXqapRkz!dS0R(_xC@i5;( z^Jz3YuT4EYohmmR@X((C{VcC^@%9;J@{RPo~PwH=i5b z$MgwHt?p3SAkGv`Nhjw@nuq^hK?av#KdN6oN^=C%-_@F*_eVioSrUkzZPqObL+>3+ zz*{E;y&FGNha^V($2Sxi{TPgjtc8DMk`X%$~xCt$8QC zOifFb{L&OB)xUIB|Gax=7Ux!a?{PwA4J+2E(Md(dJBsrIT>fJ#+=sq0O&buLJB$sB z9omNPLK&&DBL#@@1#~NVaNL>UPM6H$Hk9aKd|kA15sy1xXju5V=2YZhNTk($oG*}a zY?nfG-Nd^^lyfnFWP-$PX0L@hyPZ(uS?M2Sl-Lar!OS7R=ifgOEwyJ?uW;Re8+bo- zsxZb6*ZDUehz6%yc+AxlQrt;tzaBWionp-CHV+$L=8XKI?H~Ghe9BjAElA%;6Ox+( z+1Rp%wq(oxWG*+tz{b*)?Zm8MR*;^(z^x*wuIpbXdsNH9S~({+n+iJd=U&FX5 zS_F=k*81RmoNNdQk0OJ&Otz;vK|&Tfe|=w`c!N_Q+5_<07q}!1OUYGB+Z%dj3($9$ zEjWS1nnA|CW=3qZdpn}(W?(DV^4u@UKD+3%M{1`5r<*719P6`!Hd20kjma6Cc?cu5 z%4Yckx*oK?sgg&pK>U7e#?EX8yXNX_S(}t+fJF4kqJ+P`$~RV*$tNPf-a=x@&b2D6 zUWJi_@lT$bl?Yv#M(ZMKSZ?ZKj!z|-GL-w>A!~Ro)^W}DuaDPdC8mTkDFI)RmfupO zbU?L|ChOfk$H?osJ(9Y*!qNDa?8&5awdMkA$zi`A)W$OLd>cnL$0$sN!rOb9D9$BB zjpzgfcUAk;3!IKNu>(&ZADVwPmCCW{`U6FYH$QB&vYBp)g?=0WpuGj3Z_-8;*xnM#E z<*(c9O4Qx)Dn5I&g=+qcyn={6$bsiV$?p_>v&f^!)tuGU4-rjdyy*|J_- zCniLr@?L}H3l$m5DQSX!sR9x`5Z*<=_jfP~bOaf0megP*l00{@{1w|yzW&!lR@BcD zLF#q)ke7ujC*XcHfD`rAq|N|gd1F&mwhX<14^2ZCX!iaeq1i+JKzEJsfphO)AA$4Y zpHtduc0!*R4i5Po3jYMQ6q;8EDC(2MEQqcRO&@M15*O-czQ<`%&sUOj*04f& zAxf2wLQj4WKXtw^{Auql{Peh{vkRgFjI*p*lj}bFfU!&)-N`u}4M!D#K$I5gCLZS` z`36nL;9D0x2`gy~lUSpO>U`}^dttW~e*b?bBI8YwU7042SGq{fOZL9xq1D$mbgnB|%$QwgEYjZhi~-3glvOYxk`)3t>8{BIBZ zkCWU?Ki8{ry^PjN%Nkask?2S#6}LJPP9^7k0?lz!Pfg(wNgf+c-fypt=brLYAN?U? zD>&p!Cw1>=MW>RsKNlVcAmM4t=i#iD8BQ5mu8N(gJk6k#Cq&!wTFnHe^3Knfw+etL zPpylj7OIyi?@7vYl0V~D8%Z7!YPzP+ZY{l2ryfE^7S?=eef_x;AN1%5cxLPnSun=B zm(7uJkT)V`Dk9iC5-38+o;qjR>{OrQD zNdEcj=U5`zDRi=$tfzuadPk5O=_G^Mvi;scgt)CDLd%Qp`hkEQvRRC;9y-5L-)!}K zYnpT^Jq-uVmTi1n{2OP(mfulQ+SoKZK~$M%(Pol$-EsE`h}bO_farvLLVgZ|2%K0#~AbvBq$CQRV4_uy}cE2o1Ti7e3*=+MNfgWtWm5j7_E-{PLVkb2y zHrm^d;3UVNMSIt)y<~FT_;TA`!lG9X3C=z4xCT^UN7>dLuJ=oE^`X&ap{89|M1%Z4 zK6X})pE$|BXW@oHdw1LRX7&Z|8(`7rUiBfa7i*$dSs|in_Cp$5Lh}-i7-Fccij&X z|7=Qw48M4#aP;mOIew*=u_`dWU_3dy#ZFT%EgTJF$p-Ilby9`(@fVj$r`2uVDw53~ zO)A*Kib%5WUeQumQ4;|fJXP;iG~dm9C-LZh!Lp>Sv7Tnnd$Kx|xV;?DAEr&z2FYtm zha7oLANGFhGqiPCxp=|^N=(MZ)o`rC36RK|O-&0;JA;W;&^(F8le)Aq@n*1jIa%GW z<4AdlFV)-6^UYmT+sWp>cY7}Q*Q%joh@1iR>??Y~8)NU#))~5_99DG~?PLF?GDd9u z;p8wtX|iofYP312@$f#QbmR?=HeS-5F~~953y;;RfTt0?%^2F^&Hy^3kJO+Y7c&tr zM)Ot>TC|q{K;X+#ZCZ8HqGFuq33m7APE*sID0d?aF{h!27760e;vW2`q`8!ozF4`4 zFDI;PTXasb-xjf6Nkn5MyuCWr1LYb6iWreCS)fD(O2C4`4Ir>V0ab7PIoy3%Z+SR= zSTR&w&$DaAW9T-&Vv9tmLA*)g7MK&Ncms1tUz!k@0Y>RwW0=hr_q|yjbeW5UD6RfN zi{yqT=-#C0^i}**&3V8>iz!_wd4@dca}>XAnN&YGHL!7v?}F$gWl>mHV3*~w1jQ+7 z4$A5rl&F&FS^#WJtZHED8}C-m@t{1{K*^*Fl+ciYvYJxTGJ6kc{xCT6EyZnJ)-5)f z|M=nUEAW7Y_&s1TXFPk<*QLk)c$-(-)=|QV+GClbaI%Dg(j)lilZWsEE@qH6eY(P_ zOj)`%d;=lSxFz+ZhMFcpx`+PAP1R^IMKPb=;?+OF)Gx@>E2Wh5kjn^#xv8EeqPo_T zA|y`@7QtRU4T7pfmD^Cd)qYH)v8@3He z#EPZB0u|Y^T8c5M&?#MI)!cC$%%}c*ZdM^pG!0L~2DZ^?LH#ypD`%1Kv+_2) z0>kkaUootF{wlIB@L2ikNV0H0vGSzP%HxXWTdcf+jm_}1351x2PSHy^`KJoY-Z#bY zm&SprN{PlQ&ht-9;#|C=GEX7YVu{=4on32(ZC5hs@1_fKh z__e*0!`9E2gtjg_vOKYTaggBjMW(W|>V_4^hR1i5OuiDeNvh;(h5Gw4yt;wxG=l3w z#W5^iB{xzO{s61!cgDsAvIuVU(WHp=cKQ}~Jc*SH=Q4_Ldr=cHA zKTKbLw<@aqZwiD}dy5NL^?0%Bjc(Bg+C;rrid(TsFr7`0Fl?^m`4Oe_vM4Qaz z)25nyRyu5)y$BU-HT!*ysq{67jJJWdVfIS?-NB=6VP6Cr3$*P^=HG|Lq&Df zAipR=NLyu`JKI*FaorgX4qXmosNh~QnxA#5(6Moy`3K#jwKc6Qxf%)zX7=f+ z6m98Zx{C|AS_7Q18A~f&)e>}_PJsIac6Oh%UuKL+uLvoncXpq6Ud=n#&Y9V#U#I*t zBmDwhKf87P?B40q7|ZJ3<`C-YAV;YBc^yYs0Hu2w zSlzmRKLy6iNk|k7*Gl5dq+hO=`RQE<4VtV&^MM;MH)qQ-kJZA=rVggst5%rpz}KwQ z%-G>TKquIvm^p33 z+Y_#ut$UQdojVsEH(-SgSe$#i0+;}Z^Ksk#ax84{r0?cF)Z`XysK9?kUR*1U6{5bg z6++|B;%sEiJ7$-dxulKT8D!mWp{r(Le?kYL0i+GD6M4y&U1nhkHebc3j15A7;|Gd` z3wtP(PkC+tjy65BC+KE*3?x9~mYc91HmpasV1b+k6mcREYT@k=fTrY1vvE>7-{tSi zA{V@S11S|#J72~{#XRN3wDav*UbeU&|IHS33cDbs&NdP5DncW5|DJrP>c9uEY_*fu zD{pbzCK{{Xfkq(v#{KP$=JQ6g6)ZEp=AF!qIm^y;ul!M*4T{27XX8z>$p=U1|Elc@ ztlHw#t+=g51EFfOSLkK7j)S#>EL`ajBj=?Qu@^0kAMbXQHU1Krl@00lmr7Caf~0KwW~-qb$6?>0WL_u-%6^sB0rH) zJfsYrnMSU4KNW?W_Uk2ex0c~3X;tUn{iqjgRJn;V;5_F?{nCWtrgL|_-jWaMY>h~A zMl}z2wt`f)4q+n6*nAwdyEpjJ@=a==VSIGkXZ(VX0=!M@2wJCiFniiiVRptGKD(fO zMiU`K{DlW7obibLT;+YX@?=B=+4!eo4ANMNY<9oaw*Xtu%dAL6T@xn`vUm4xmDi1&+wT{ky&JZGZZTxiy9L32Qvl`XyKRy!AbN$(+&y-vGp$4LnvRpk z9JzLf8}X9W;(*Tq*CWdF(Jm9S8WBa7H07E;GoA-f0gY>U2;symSjQT{2G{AFe}E%y zxF&ifvst8W$)rm;P%Ch+bz-7mM)5K3?zmhoLJhL=`r*2 zeiereJS>X8@ecwshxT{sc23$qICn79*OG3{tyB8L(5v2Z>fWC;RAYTD^MzxE_R@+w zqV=4D*Q#MwwYuh=NL|~+_qMK;wQCR~xM1>XoLxwO5BicoL$B7Rwg9_T|KcPrE_MQ} zpf4}Y{F%#c{-6MIBRN$%b>B?-FF{`hPm-V6fno(r+)T*-%1k3=sS0xvZ=}r)?49?A zO#5sc<06#Mks2Ul@6fF2%TWFeso7K!;9RuSUB;UdDWDNYD7aTP^wL0Z4$2Q`FfyaE zchLnnDLgRgL~F~(9{@W}$lvHQ%fp|?=cX~WNEI`oc$@zoCtrI5 z9TD2vGeFZ)MW>#lRq2)n-L#f=ulf4hEFO`uGPwMa#29-u%}={~{Y%cH>@1k2@&QNV z(FbR^%t}zkOkuk-Fc(>1g3T2s0!yq9$wA+NWZB@(ki3I4hai#L*k5go)b!0bCL1ui ztK?*J#a~3M$-64%@kIWvTQRAuX4AEE+CIX$skGNWtz@`j;uogD45X4t6qfkZed@>9 ziZoJZA!NbcK*eR90BCc6003ql`9|WvLIz+h;WveyXYu%n4G-XO-7ao=8A$};- zxhqEEr{Z_T&uxq#-m$@hc*kAR!<+ZXKGm|de|X+|EHKO z@^dX!t~_R+F6C3D9cLhJ&(Xr4>hqZ0;%?oN$HMPzjC%Pu?}J&9002gyap`LfvjNy~ z?mcWrHf1ki{RTb0+MqdXi(56$2wrU5MhPR^#n9(8B zmuvp7ksN()vySs_Z1W{kE>cXY=ysbxTSb5Ip6CmX*6$_J7iF@D6DOX7zRw__P12WC z$f~dR_tkf5m-=ROs&BZhuW!D-D!;xbU+h|6xnJM;s?SvRD_J&dI5%v|bdD}=9M>Zi|;yoBI;>|n7C%o zOkW-tjG1v`hi5LV*`!e2@N>ZsgEgI1@bo)4cWX*U7AqM|I5SkQE6ohWHah&VQbj{; zYBN!{xi4h08+N6$2{dUedl2|$<22i7bu`Vh}BVkpbt zan`n{*3fqM&!@<>9(S~0%WbL>?udTd(H)#UoIo3zlhcuVR2;3YL0D)nI9|(RHtHfH zmkp+Jr*8Em!b%P@?<;OPocFzXuUV5p*GoN||3(2Gf8C#2Fz-KDC-Xjzp{bHD&%j5H zNkiv=8RGy-oT`}zAJa6j3hMh=AofN3(1W-<>9&e-1<`Bf%bd;5G{$SC6L_m;6RA&} zd2nUZz!M9i<=jPgVqoT&%0Sa?CvuQsANKMh`0lEoxK8(5EDy97R`$lWU!`-?>@|1w zP5=i5bZBRyX`T2ap$BG)=AT9-rlli+@c5g6(5d@$(m_sYBu;e4H`?!;@bM|D=beSb z0kr9jTD6G{%oscfeaW_Ix$!jy$}?t;8C1|T@C+JtMf#BV;hAiAHg z$C;uvgLOigb!mSNfLmLb9eBv(543(rm1V_+uPVIL39QO)AnL1u`%YdSoV#jq+mIr* z_PjM|9_J<$N0K+RTtch-@W&;HeGCfzxC=-4NckjYUvwwxr#*^jWbM%x_W& zp#W+COv8P2n21*HJ28m82Em&HYM(I^8hR0KRNUaYzr`vtQ$eQ2n@g>ZgzHn3*Bt9p zsi89eBJU6BHyAHdWU5cSx;9((kLSJmc6(xOT{al!Fho?sr?%5o98Jf%h}%*+0y^J` z?{!+o9zO=&6JOdrT$hc#pVk$*{xQu?72{zChd4>)sS}V=MK`FNRLNC(;2e_vR^@mg ztKbNA&X}q?jgDszc&}06Ie064c!w((v0U(K6E*Pe|KG!V`wu(A%hqJzRWJEC+oMkQ zbakrpFIIgPY=(2>>RiP;b^iAB{}xBRy43lIDYE3FQ%N6RmZvcssmG~&bISGkr6P&W z(djs1OTuZ2B9raKvh&t#wDw2JV^+u^v{}gnDrjL3UDK zoxiFuz7?!)-xOlY7rpzd)6~0VeblhvFxY2F3nA`Lf52(J&mi53;@i@@0YOUK)#N(shtA@3T&lD%N08UgJ%{V%`I1I&7E}&D-Ihw+6>gh zvk1uPr}&2^JuQ3Avz%Tqy0>(R+zrHDVod6~?RTaTqz~ye=$L|L^ujmu*;MxfClwZd z+&WMwZFrg2&+Y3Hr)ot_mgC+|sSp09V}ZP-s=jGVIfdcWgdXA4lwujDSk;Y@Y0X$D z(NxHHs$3IVJ$>^81(Bhf`^sqgXK(7Oe*wL~D^ArLp}$sR|L7Af=YI(v@bR74NoGW7UNsf-5p9^&zv-23O*>DBoe@c$XQO5Tsuy)&tV?ka>9 zt_Te5JuwsEz?*Gva+NO!s1K~E=Az|zdp7nJ+87+;``{RncsWxf_Pc`-we%#Icip;4 z`+*3KPf3;Z1LR2RkTOBePRP9s-KGZh;5%IPN+k88VkdP=Z!UaWhp7dE?5~Jm1G;lo zLlJN>HUchiDH(+X%lg-802j4{qv&FO^gK;1dj2LkAvL%#k~+7C`{X5{C?nxs6UeiF zf!nU-Yfc$h(;};Zr_5({Q28i+y6@iqDPHfry{8}UKNar({B$=`#$#SNe!kAn&i;R0 z?0eHblXe4DQ#d)Y*c?;RsDlCPmaxNA13mF~kc%*byB7xR2p(!vBFR%Pnq6DqUd?6Y zX1>vuD-lVhjx`&L`(wqpaNTD?^yvy8Us0W}UG^7a3`8a5x<~jWNTIKT1X*6zE5Boo z9(LV;pWtB?g&shHmeD-8?nfD~dTW|YyI1=wil3Q!wYM|6{2##nQ(u~vckTxx7qeCUfi&5QTstRU!mP#uip2%URi^);JR?4jdj@__eO&l^ z`XC=6?oaIUMwqLPP81xoO1XX;$U(_TVvnk_Ml?QSKr-v z3Gzhu^ObEU2H^N@z2hv1z%nU*qp(Yl^aM>{MGTHlP}PxRD9!RTAF(0i^9#%G!y zWY^v+HCwHYk9~YQ+}|r05%_w~Jd`bqJ#EB`=nt5xferhy%r+#wjij*4)6`94PgZXY zy0IGDMh<^inkW21F1KJH8IkPJy+MiY!n6)P$&l~T7N%oJ3F;3SY? z7^SURTdi8{f=jEdmQ^ufNpQ!tB2}?^znucHqFZtz@nLW6rd<^^CfgyX6xk8B_Daqi2hG*^PWMqc5 zRuzjFj3$xgkzYQ>BNTfDGbb+13aR8XD7iHY#cE~_d^R#MP*jh0mgT7Cs%T5g2VFTe z;*V^d=P%fZ`uiWcom+66Vc_^Gd5_>o-pR?00+nkn;k8?p#Tf<%cE7y6f2+{`$QJx% z*n77bL!)o6dFjO$Uko^pZws`1aU4=L!l&By0^r1ZEX#Us$P0l{yJi$5d$D6YYS+xJ z_3KLgO#|@&sV(NOBGFhRQ;CrkYec4+k7xaWWO?6 zF6)3@+q}?+j_qgJW9aadd&e0@XVLhG$(GmC6v($ly>eujGcw6#2nF%UbH%&@zvDW+ce4W`nrovQFP@uFK;Hc5J0s-Hbd^a;Y<$G5o zH*?2=V8#u6GuGH0_rKfoc=qnu7$?ik^(~yqdsxk6t{eBUD&A~e>$G%c1r;6s^q#FG zQTjfq9%d81eWtzKHh&_Ot0z|aSVpIc8dZMOTx9U9*%4y?z964z+ue8O=-MIUw#Fb= z3+ub?RPuFnG{^gdUq#Muj|_2nMJ3Y7g2~jvr&Q5sTmCe4oOCqTiee4DPeVgjw+CwoR0oD(c!PS9o*cG!h-qUbA0stS8@QodYk`HWcGbq7J^4O*@^&%fyvp zovvd!v#r5wE-0OjnAtbm=8Io8C!`AGP^$4?D(GpO)@iuOl+??uoXtr$E^|nijm6}O zO@*pusajM|z1Ue^UC47_s_5uO&X%#E#_M^Cf{eJ@Mu(DHVc3>zzRD1Zc zCtOrq!y6~1yVQ88yp|c&h^#eE1sZki4KEp=3B96i32}BF*0jkCc8GW=lix;Ynnd{ObyK_P{_-_t> zKQg<(#|h=gnxzz1=PVR&N}n%xuexb(%2@j)d$z}&PaNZT{(5z^-Js;4qKXL})1K%g zWz^75z5%2vTK|%5&hm=lsZoPp3pQo=+H&YA9S>7FQP?&m_9cIX`{p1HXl4@~s~Ew_ zU44(;rorjX__-bXvD>EUb&6iI*t2XN|I8SbHk!>)pR;g+1i1KpDx!v6wKw%iHnn%j zTr&`VtmFY=B!_)knMDd?)rT1Hj{A;3>wuK?UdkoaHf06Uh*CbGl*nbP_%6?%a&U?B55 zy%}>lq(-KFBvEXI)4QSMb6x~O9*CrE20=gm85r@9RjqJ*U~XXkI+G;cgJ6q%os!z% z?<||zg!>bA3iJB2l5l!g4ajb-8gLkAF9!6P5}t8wAdCBM*Y&R%^7Yi{y(O=!;#e>D z>5x5e>NLJf43}4MJr%Gn)%>W5t!ST$)l5b1WUMYGmCqlaPz+64pt)F`-BxYqVs-w^ z)@seg>dd)VUF>(3k7wppGZ}wAzkM>+D#}jACNmi$Ef^BtVaS9uEjemeWSu{AA{xs{ zhVlQRkE7mZ{T97XQx59+fF2#w4V84i_HkY{i^=e10#zvr4>Qi~ zu+E`*3Dllx`SF1DMiWDX`(s2S#a#@k61A)lTC6i=InC01W|VDrYcb-~-BzK3$X-Zc zC03+TPF83U+;Bc`Skp(EalDu3Ec`~j8t-|9(xk1eBl8M;PD2*DH_j7Gpyc`U3bK58 zK68q5r6N!)MQi(I%vHac_p!_SVMa}f+-l@BzQAU8;!W*%$JT5Td@%S=Zv(;F^15w0 zcyhPs)y%_gt25`}66M1E=w%X|FVHk8&@{Q|c1;t8bZ$zIOW;FT%uH>|nKVfWFPACR z11i$;B6p6$@p5F4w#&(od-)_@8O)KED;UWJf*Wjd6RsspvXNcJFn&j7kKtb+tBuV0 z=n<%n!F#YV1~Kj@?R)U3}h?lEM4t-1fnHuA&YaysWcj&m2@cB5gRr=wKnn zx};;|?siAC8BeMWUqH?9w05HQ$UEq5;&k5C_w59JinCB|?7dNtk<^}mVyAnU>5r4t z$GzN-rl&FUB9zHs#pAAbw_~LCF9}aYNiKazU}_cK0?y_NT+rz(Z?1Nh zf5_TFBQZC4mg6i~OuRTvyy(M|(C2kuw=b3aj{lj%)AglU?ukz16{tm3^t#TokGX2{ z$Bef_O^y-tnIVE$xwR2i4N^+(~ zryb8Cpfnm7q)r+^Ck^d9X5m*}C!MTDLC@$0S;%qK?*RT%6YV+Mbi!}Y3 zvpP|+R_$J-37EFy-CvMQol`del{ne9MCD_omC+F@xtMs7A>291MHy}kI7I4gRYW%K zZ`pbjc$tivE#!}n%bE&PpD#Gz;}HYTck|ufQJf~?r0ddsT?q)m_!T2E`}@$MZv0#* z)ca5y=2(WL`{1{9cUsat?WRL@cLsBXKFK!mVYM{UiZjt~p-(zHbjR9sN5{;3VEkf} z$K49ra)>Tdza`|Wi(WaAUg@J&wbeJ#3HryIy)v`dY0NbpbKaytv`H%_O|96^ObCnM zrmNH!vrc2PDmH9K<7Tj(9l9zIyE1?;4hpIdteBtp{Tug9J)cGOx;euT((7AJJZ8cV zaDlWru3tov)?>wUqYGX{9<0f znSg)F#_2@>(m`(h=3G$XJAhXc|AQeRk+vaXl9w}JArb;QYkr{ze%5@o(>6qL?k6J! zKhwBLuXvaboMqbTckXTTM|S3!^#Nby=EV5B)W zExO<|*j>gnOmEDhh{fuUzRY^S0;tdd0GYK+4Jj}B-Ad7nD#zw3pS)Jljj^j=Bk|K)BCuSuTGDB?MVcpNsRD| z4W10StBG}R=+3<8EXdvaHy=3uhaGbKr#ZB^(W$czH3Q6AZ)#gbNspA}NrTfo=>%r` z^dZq{L)$8b`|5r5X)<_*C5xvzk-?XdXmAe(keqBy&10N8HUBYd zusiKJx6;fpgO2ZE+C|Ma_V$z?(?VZprCbci6GZ}vsm58SdS!0pM zK|-@eitMUt=O;Fe;V0g8ksSGO(o?~mdktQS9Mb~BE~=s<%eG(uJAb_d_0EdiXS761 z)S^y&l&$bTVrj4r&GV_euO<9Cam(4aI117KN6@u%h+j?oi^O+mOr|cWMwTxObU4k+ zq60hK&z|<55{rt1q>5(#5=PLW)j}SgX5ufi@p{oe;+sr-rH$8%{u%cW=DOqt^PbjM zvd;z8dnFM2m0_V^1$Rda#dm9lAk*Um-KscP7^7J5Bu~ziZ+2HbZ6wb|V+;<$;l*z| zjf*Hf(6&&8>0d%;-7zj-!n--Sq1vTDi#3@m?nXV&p69FP7#mS${T6N7#&Fe2oCl>SwrqOWk>Hf@V6PziN}aYs;w;Z9*8_^09tWAA8?+| zuL%;b%tSrHFBeq_TQq+u55LjK)edP1vY6@IdiPmmITnkvHO}x6*c`exkYh4o(XPD6 zo4GTv-#a(kRePag+hCNrHKUg6>kO{K+kgCw)0}0MtW?V-;|~gs+CKyP&Ss+zjrTxB z-BRKX7HBYythN>3A*eKYf#^}DD@R(xY@+QyXL(kJ26F0>SmrDC8hoGH(wvX)3fuop z-I}h>lGFFXrm@+24rm&i6M+4-xW!FlaaO3%;HI%us8DIs*e;k_jBGlmtCSU>$2*#;o_*SI&L}#|&dH8!A3n991q*s5 zkF3o}+-}O#N|~Ll8At>y@9Sr0%?-1ove_M0Z-g~gkZg|2oFmWH7rN0N6GFQq9m2CD zn>w~F_l)6;4ggTyGqAJYU6X|?BMb-F6B?=N;II3WC(xlNUC~4@|Am1b_jcHiD~*>M z%|0Xh$CRq3qCLM$38QCo!VQ{WVj74s>TNXt0o&Id^I6s0+_9@(Vf-z2Zddx!77?^eeV6jWRC%5=LziFPiP;=tmBF zA-B9V?sf;-_h8mH6ni0wIKAt>e+vh+vbLIH>&FZapH)AP5p-JpyzJrO;c|?{Nhx=a z5>diCJQdfPn`OSWR%J;&I9=u#IofVBp0u*I`-gl}JB2-bOp&&^m#f+=Uv_F)21EuDtIe%4Ag#j!``dsnI`A)AA}_H0>y?&Yp8`cpKZF=mMiJ)l?J# ziL4$##_aIeK>V&!La?2DWbQ!h&n{mz_aWZb%A&ZYq}Xq+ih)IIr-6=L&Vf{12 zw8Cn!*Lg76#$|>66^wOB90A%7o^O!7R}5m)+Z>k6MW1uG+zcWk&4u>NFIs5ocNQ8) z)vO3h~+g`kd1=EL%N#d6AT5A`2_%*kE*r#F#~Ki?5uOw~bf!-eh+_ztrZP zt-LGLEdFH&8qK=jX*fAu^*@>pu4u z@1q!~Ffe%4Jw#Vy)Huca@&!7jfYm!Z%%_Ub5Swm@DMYAoM|w%unWUPsv3lt#bZz{x zQsArHDIMwaz4X6Gr{7V(9*tNwN3KlLL`TwhCt7?=>qt5=GpPhI&j82~Ce0GQ+@{lpAX+P0%!rM4&C)seK!ODd1?MxxtMuTpc< zrHZ22!Q^)FlKw26R0|R&v0R?^w=kTq;qcxiw)sEKNcVQLbC-GP{2A$*JEyxr z<=y6`J3J%Z#?I-ws=TRQy6yC@X$tTS?%4^xl`8LSFWqw)=}J4N>!(%s{wvy!6eKn=G1bg#T^ zssNZg}vr<@*#?Jf#`_`;h%?!oTEmfWx45qSkd9+fe?o;XzV!*GbJr-eM>m zc?a{Tjx7`el0&oKP^&HyHlI^P7dK()v?Fv&WPguYwFds;i@fDa^ruWn{v+h1d8!GfoHwdJnc_W1=)oRY zFt$)Kl3CqQWTRJP?ZdQ$U4aTfl7v#b1NB|c%taB4ogbxavAXW6>LSSb1?oL&o z>M_e<523yO*mD1TO);yoYM<6uzs^dp+qtzF9EbVta)hWceMA&0v@ z=eAMey78w=0=$-OSz>&C9t{XGh6+q+Fv$=A21q^n&qQ}pBu55I=Ghk0pN6d>+{~Ff=a0y{U~oNr?$! zRmpaKYf8StXsoK_Ykq4={*A~uSegb(r=C|qi2KDK_oWh>na1t*ZL8{OmD=+FB}veT z=dD)CH%@}rn}SVYU!@CM^;0kXBQ`x!38;LDhPl5bi$wopW=LFWea565vLTqY|Ikoj z!NoDTZPI~EC99<8kD<~5Wob28{$uLik*=E*9a&EGvOL*2%TAMJ*CDg`ye##dv+Oom z_8cOVB{(+|n8G*;M%MQWax2~9=h2|0hwt3+9YdFa^?Bb+ zUpt1Lam9ni3v%Jw-!l~tF{s~7kJ2RLC}SE2&~Gl(if1Z=4uh#lC6n+d$_UPM|FR@< z^EU&Hk2|}T;o=;7!;HC1Ko^QwGrUqp89L_(_|Q^mwwN4r8M+-v6*Vh5T0Ovgx`2j|u8&sdwpHho#1{=0miG@8m1l?9 zBMukGa-!pMlfA7yq9UBa98N#wqpLN$r>Eni`-jrPj?31S(gxcgs$Verd2m##v-of+ z%tVo%r)&tmL?n*&tb$H@>{IjoxV!eJJjzfVyIpuQc;Bau`oHIh3bwZA?P>BV*U98+ z?@TU|OVgqD`E2OX?YDxULv-CgjbtAO4l&eFPVVV94 zxH~}0656(>hjZ&nQR3(eE0EvlW{wCiB|>VO#`_h(qYZZn5i<8P@2JdioW=#b)<$2n zOL^3ZmAO;>X!F*n2sWgfLsvz=iqBwoYQMAayQGb7Lb;NIa^(YVIm>D_@uL<071t%a zl^kf6M)kX!oyL=h#rp$F;8A;=g@@~{HFpIx5=9Gz^(4ZNVTmdU-$TvUbfM-A`Ml!` zPzwRH|7^lK3*V!G(e2K%9^IqQ*Z))1ZZz?&if_e)^Q~n6`aRV60uhncY*4BS{>U50 zDFUN*I}3HCabOCdkLcU-vD``2^yL7}c7J4d9u~Nx5>BHQU-7zJ1M77r^>eC`<1O*& zIe{rV$a-qQ%g*wb%?YZXkfJJHkslO%XPe}&L74is{BuBjdY+fO<>SJFx8ikO0#o?b zqc24jY>(G!6_TPnj_5xfxCt7f{p(8 zh_0qpuabhf`dno9z)&UNTlcdDs0E-Fr7jvor}0fwP*n*=1H1aq`w3?T>-}w24Q6r& zr@RvD(cK@dY3PwGGZ_lGD7;gKv)eNaq);+Ag}L3a5vywG;g3*i)>J=dW}U`M*@sBz z&~Fev?~1rkd$`d1dX~PvNGt~~{n5oX0k*KU@!a*n`OQ+sudIhORKWu9Ee>O@j^gNQ zzZ226-Z*Dj`KfIAl{AM=DW`WoC(aLbF$tdMrJ7?dclslrjPbX8l0Ozaomy3}iyMj) znA>TuP?FSODGRTojv(eVR5K!UQ!rMMFEz(09Lc~D$ew+(YEiIe2cx{nM*muA`b1*y zrw-BA;y~1&&t>n)lbNQv>W^vqT4(Cei`b62s`XX8 zF5k?)FBP8N&5ZVc5e`gw{^0qL)!IQx){%(OD1aJ&LRSM}HxI(ljcMp)^L8lc<}2Pp z*Dp=G!l5)|v#zpG&AQw|H0!(n1DaW*EF|HD(d{eXB+$Cu;p3UGEqL1x_0>&DnkK$* zzMrk`Twe&k-T0o4^KF|FT3+N+`_h*0Jf zSlwIwy{sTop~K&|DX z+bsQbr#og2;E#;-D&UTjVrBQ{8wP+6) zaqezbxu>n0M%OwI?V5R#WUX$|-Tu@Y{-&yvQ#GUhGvlG;VHBI}Z7*b3f-e46z8UgG z!#W8CY5i*~Z}W|Vd@Cmduia)&ZS8<&>Jodut@XagwoL&xtt97mT?R>$4M8gA+7O~m z$cBnjMOWJpr@1HFP$}zQ8)7G^#)c|VMPqFUxpSlq)p7n?Ayy+1uHWEH&(XXtF)!`+ z!@bf0ajK}lNp5^nHB4nf=tvMC_emA~XSNFJVhG+FG|`+X;uBY*zGFU(6ZJ+LYrpBN zk-n|5-+1NQz4ja8u=)0&{br@(di$+d-w@0e*l)Zxho(^%o31AQdK+){VC#q<>BV1c z<9TfkapBK-6<++=HlEjJj%miu3wZG-*mz!>L;11s6QkoMCfVKP4vBAOrF-Qo8=_ZS z8=_a1Y?KQ z#;zYw8=DInIYWDa_!qY~bzy0Iy4|jAIGea&>|%60gi3IZ`BwQNyOyYe-#*H~BH%3XK!$)gq$_iG`~R6na`Akxi|*5?ctcI>}!x(wTU{ zz7?*PpqtRXJ>LebMqTJjJZ|5LS3}NxiQnoi_S4de9UE{5f360r>K{uWh|!f$bvj|U z-``lG2w5p5;Xr^`PE{;0n>H=Y!$(A#Zp8*dw@}h0xl!k*cyXgRv~}^G3rWQIM@glX zPIR2cSa?KYyCkznYsKn9%8Twx9>z;xb#Gph1q271wz3fuJKd~h+DLA?{4oj&MsrIH zOpg)E{!7>73Cv2)LhAg}Q1ARxrvp+t|5TjZqQ#o-76``rVM)+XVzio)(6sMP`%v`M z#1|XyS-M24*!qV4U{u7|UHhcLXlNd&&ko(_k4>03Dll7p<#QU|r?V4%jbt~s*cbXiFou)ME#bpV zhm(QpA&lBRe&qOEF`v!uOcfVxRX>JCb2%c;`G9gp4NFGbRTI=z`*OUl(&BRKcd*{^ zxS@8sAJ|;G9Hn&!tHEtsJHoYP+8LqpNj%ik+oTN(Cr>uF$g84w5 zi*n6P=0Ng;u?fZXqb>{ogds3kX{Ng0T&a$irq$hUg7|IhF&HC&+*HxVnS9gO`cPww z&34X5ETKSVPH|1Vnr5}Qp~<9)_ZUtNv=ps*wXq3v~&z1)0A(7cWMuvC>s6SVRLxD{u=kK#M6dY8Y?Yod>p zG%IJkXMxG~MZl@v9w>O*JP^pic`o%92e3zdKnb~=T67$Il79n#`}oYt8`r$ep`!Yc z+~0QO!ffgKM*mn3r)sZ(_sGl4TlL$uv5PCvW}s-O#a-W#e%$_X4f#bTOWpz=LCS@U zyjhDCL+oNm%xge*iY@CU;QBNG(DeqE8qQv`vpikvhG{yfKUsQLPN#E`kya-Gjot@L zQlly`H@?~ZHf3Q2Gbw$fKi+d|7I-1OFj<3gUWiM(v~d#yEFJTd_Nk(6(u^?*SZ0hU z!S8C`Y7q-#CMJ5^Nep-dmB28R^5y)U!yn!PQd9X0@%I9M|K=}?LnA%-JH&l56V3ek z9^(iz4s!{rq44sR6xj!5pGKfM`chT&<(4nHMn29$RTS?jjY2zF_b)oSU6AVP$6(>i z(7DD*Ou$S{9|8}8QutJVefgN-p>v#NUo)h4+-fAF?vjj-L>~Ij%>LNT44&27zi8kX zZ4XPfdI{NTlkBrl+hZM3jTYnzEZ#Km<1m&?0pcww2KC`To`T^RY$R@n{eaS0hZ_|B7PixlLfFv_e0|oisUHy%vDtgsAfGYwWf48t zSy)H3f5(RWaBqEF_Ggc~JWgwL72&@U7n2}}QZYYq7h^=B!o*@PG$3)S7b*_2mZLfG zpUAWW>P0%+FP<{Wj}PHIFPuy? zP@$*)jNc6ZJU7d&tk;kZy~Rtmd%Ar=Y2>(%m~a?R8+`bU{qTgc;0>XvQkk<&2-i;Q zu#9^@`HR-vF2I4Dw(~j<(ChL=Xd(2Vz6z>TB4-#CAiqZ4kUYj9CUKG({0Ajb|M(Yi zG=HZs@fdGG{C(&`?dZ;`7=+zNrF z>^aZ5koG~&*f+%IzSwtf%AS1Yddn)<^lD6qX_Ii#7cI#V9k?{#tLfFBJu#f~*5O6v zqq&aD?^L}=eN|k%(bUx}axt}Xmf<~Q9nS8;kGFQUH@1ZeOy9k6tuz%h-au}&gLkV% zI5Ms<#+r+G6MtVl(cn(LwA-o{g>n$F{Pp`!;EqVcRPWX2tbL3xF;y(`W>T;j6uUtw z=gfj=U@F8(7m-pqL%4xB3xk%;a<>HwouLxcOMc}Ze$Hz?uV63OkT`pMSk)OehZUj z{0>MC<+nI_JX$<^V9 ziJeHpRaZaCf);*HvlhK~dY1dw&?L?>=~u{ZJPWRpxB#)s255fXVvvZ;QuM-J z9G`*4y%(ELf%vp+Id>_Adw&7%sNXx>X}p-!VjTpf4{5EYL-8p@?l`$cAf8F*o}CR3 zPpy)1y7tocDL&fT?gij;^De*j;aFOSvoq=)1U)0gZW7(hPZfQaPYS{>&hdgUj4@sijxoXuLSu(`L3qYdUJ$0y z*9*cm^1UEzW8aT$x$upz2s(x1>ZD*TsUuWjLKRM77pHJSp;LG<8!lIr5=r0i%k5kI z0usN-_tEW%{m^RcpMD69^bnPB-}tUUf2d2Vh{4en%f{629TWPFhq#1$E#IT>fj2M3 z8SP(wt(@^`S$vZy=2Yz}+rssL!@{$J@mctMvK@Cv3qs*enEZLe!ape6f;web_`1>Zmo^kPG|gy&U|coPy~#dO&amFfNmlZk#q#Z}z^JchoKjvK z`lx(Nm>Wc#WxE)EpWkEzo$nA_d!q?D1kbRs%+6M`MTUho#&6KO=I}}_2zFT8bEw#V zE@WIpH*nw&w$_5-?2A7#&GbB`izUFm5O%O1cHMd40Eo+n8xsK>PBKzi)Le7if( zKqtM8om%7Vdo5Fo<)xW`BW#wMtbM^zUj(_Mq$cZ2gH)@Rv1WyMllpYW5N>EkG&}+{ z!Mz>IJU5f!NKJiZPgX7G21k84GrtK#>b9)p1Q31_2nT6kd>i?1wrK87ux_?t$&aYG zCY;QW{wO#`$eG&K_4rd-$7h!kmy_()+I6TtQUoc-8*fGQ#N7-MsC}yF`%?$8a=*5O z;~t@s3M{7;Swm#m4lf#-nJPMy7*9aKJn#YJ@=OVJ1Yg0ERi5Y=v-awZg!()bPyHx< ze-(*hdE0nMRBaTIi*=W%dM>nQv-x^1q~{eIg7R#zAqdZE8-niq#fBg|f3zW}&Tni8 zqVo$Ig62eR2+-##q*ncuK;k3BJ_F7)z5SiHP9*RGVm%T#-U|XqxfcYIGA{@yCwM_% zIl>D9OraM9nmjKEID3BBP6EFq=oD7AlfcS$5}4x@o(l=Q5E6LVx066x@)$+HgAWJ# z@-a?hH^@z*7eD8Jol5N^M- zv)XZW?AhbfVH{_%#&ISK*AKnBur`^$UNCnO3LrqpNo+}o0G+F%qT}k!U_J%86q$5{ z=((@4LaX`c^F}KU(BdWrfzT5g1-q zBbmz246Z^}9KnT>xe!37VF~;k^2%L~x!5_Ce+9YY`eDgi6N6bB3`H~|Xns8>IU)0T zM*cU_=tXXrDF)ffGfhR-kzvGpq^6=;lBSAQeqTLhb>~smiGGe0IE|A34a+u|!9H1%8qzbz zh;GjIFB+d+P9mLn3Pw|jzvv^b_9@SAwvz;SfdM=;6QC#aA)yOK+VMTMe$E+^<4$0% zofFT+?^$ye=U`CX%+3m5B^gf+W4*dps|oS*veVJ5HsJNU*`;m#Sd!)M`3_Y!sS`Ua zEMINQgyj}E0-XCuV0oVpiTg-Y)@(AUlm{p!`2$+e)+yI`lgnv1lGNmULOFj(*c-4n zfrgy&IicM0GsD*t&IJZIWPbT@q9%ne6K13sDQi|8<&W}%|9O3WxYsih zbIc?uRsy~asZoD0m5P2ug^C%Z7(9G8?m|nG2!k>}{p3qEP>O2x=)I=5!(2Aeb91K; z5pNhgLskZVclxyZ@Gw4H-Us3=uO(-g4z(>As#ck1OrjaX!$$<^2+7btJC`L@yaKO~ zW(=JIP&7EPz;sT}yG^ZXjQYN(sWsFatTpl>Sw>2#OyWeN=Z&3G{;RushFNwU(Io%A z9+)%1XWXNyk!6{w5SQW2ZYvRT)+Vf^ihM@lX$S5m&7tTQ&_}oBH<)kXLK~3ZJI53N zDhH}qV*a5R>@OPs1miUVOHCB4?{>H714E<->u32PM8-2ZSG0^YUW(dP$I&?VNiW@D z+Ue9;E9?VCl9)@M!o8ALS-Ef|Z=p-+;KJ}|=!39#87C`DH=m$ME{$!AeDzGCIBMmr z&-L8twj+FU;*U%dV>HzJ3IV?xfA}U~H2Y4&CwvyMXqczz6#ZJ`V`nhk%+tQGBj!KE zScajtwu)1;IIE)p9Cbh`nGRGauu8we_uo|x&>SOW@y^!+@qPnjSYWmw{W}`xlPovf z6Ael)Jkdel-cKT}SF!vBU!v;8MhhqFQqH4ncbBp?>v1h4AIkk9{2ya#iJLH+GA{@R zI)R`z;*S)d91{CnL!qkVR25Yr?9~DphMM6kOnHm=RDQhEumga~FNX-gShcWE3}m*6 zhdSm^Ech=DFAhW}-q}!$>}Ui?Ca9{Wqy+r03Gt=aeIUF7~kPsxfyExjEqBrwOUi`=uLO_@I(eZynw) z?2XH$AGyg>QoT4fnbhuOxY61+8ZifqzV3=a(1$hV^N;?1D^p0 z3ve*;D_)G$xyM~dP1a3%gNbA;E=B_fD8)kFmDZjnbU41o zuQicJV7khY;kV9i%;B-s;d6%%PO2ZHlU*4&)?hOpMsx|@XHu_SV>2%3(aMQ8&%X;RL#db zjknOsbK=q`qr!_9T}g6lov$fz2bpNoHH*5NEO-Vzzw9;ihnN8Mn)Rdl-Is@c&{Wf} z*w}^z;ulC2^`T}((Ggy)*QnNLi^&}r^+LFhzv;8G=cxJwp9~*-_%TJhQtAm(SKzs9 z(Ye_wH%?tqV9HK5vPrRpsPJ2@RsD)-F4jeh?Sa7gO0h}mwa%AP@DWy zyFYYu=B^l}J+~8Kvf-AD2OM(zhy@|{=Cqp}(&O$E)vQdIK_zp4r6d4hs6vY2P@B!9od(FE8O(!aKKvA;MV9qstGSO>)>tL)6ZyOxfb{?6?OcR zHHb0z$2)S*FB3y(TC=+|wI_vSwSMrrCDvZV>iwADqp-|C{e*M=cu^av1^(tLVY&?p zJZk4p2Po!!#n>gWY(7T4f@@9{$5wVH`5SvktQl)XlsTA)A(IY9ECsmsy&LbsxHbbY z+d*6e%7~h0YFvkf%N7JYce;6HQ{e;mDih=yhw`K31ii&Q+iBFMPJkm2=HI*kHpL62 z`eV(m-8ZydM&sVs>Laa%o+LW77p#z31tLDa?XIWbAf>_uk5bm7#Dn0tI@Pw6Zch1FX;K5pYct>Q@HG9q}zqP)-W52b&jjwt2J^YF4d(|lPjH%N9u8+YLXoJJj zKep5HH9Bf^IH#<6U1HNKs2(!yX|2EJn&=By4H?q(iZ?{IyORVSdj;8ORv{;~=C#Fr zmjf~&;t%&}=)Qy7SNE)KEb$Ds#Z|5sBja+%sCPP(El)EZA-D)0yWQU?zpftqN_od@ zCw1K3e4$#-Chhn!_kmHg5?A1l#fkAw|o(_3Zz+I+a9SENbz)u1~q}-mE32NG?d)W z6EK<-AN^fPy?Jt7kz5i@$0~msBY$$0mWHU(>WDOIsq`L3X%(TtRirBhV_QEO!dlI? zNjsyORPHN#_sEFCpbsCTbOI?@UYb4BVuMNsJq8Eu^BOh#Bb#(}Gy@d<2l_Cxq+LO2 zotCt`+kg1CE!)CARUgluswww7Y?n)-&ccTDa42Gr^3kFE`Fr8^zVHXFx!++h*Owp8 z#pHh=CJ^^$1%_;^T6EFjJatGv+h4!uSa{UNMTa+R3Ej9Vg;>ZAUHr(oB%itj5_45# zZOU2mb$srQNb1;GM{!VlO8M%VtoKu&C~NrSvK9mh8sIim!d^%$-?-0OZb=IX9)2Mvwx)dDWAmiKif(I zOQ8@MYGPRWYe3-BvYrq6CxLjH0>Q|?zSzuPy>H|lfHg-&k^)R7%}3Q)&(ocE4`wuWy2tJ<87VL{lD+c0JM$1m zrz@wv(BhCv3SwI(!F_fxc3z!3QpG4$EbliPz;mpkG>C;ADiQ!i&v+IE2VR&4^#VlJk@IYFrk2zbr;6G4IA5|1 zun0SUL|~{B$D3E^`o)8=JjW&9f3gnUPF|$U0Pw*aZ{Zyo4KYFrYILM#RwNqeK3UK zW#vKam{WBFXj~;VP+sGYs5`UHS?M~*=eJkd$OVR}#As6LD)i?XxA>hqTdK331EaMu zMinMs%@l_|W2cUSXgC`K61_+VqZhWfpSIRDya4voo@Lb>fz2Kn-8qt^>ej((J5n|=0Pdari8a9g&M(0W-I&B#xlMOSj(rRQ(9 ziXD#yBG^B-TQ@cvY#|9J2Y~W(_^jn)bo##3iqU{b_co(%+)B`R9zjMvr2Qc)0$M(s zWM)neR)C0dJr{AIDC&&S+*J`TI+7YB9}c31)ux7HJTZnzg837Lu(m+&?tat;lfV;a z=&(bZ)o7_R*cW;fEM2`;Q|7#U9V4r!#n3ppd$jh!&ay8K8!Me1^s+EHS$ zFk_ONsw>P$-$&`yQ^^K9n>ArIfkh1h4OO0 zQZndYXCm={Vq$p@wb*88Myn<*!OJ0qsU@lh__!mc=pXN)(;0_Zx-#X4PfPRFsu+7o zd6Ox^&Tg;i<54%V7|#lqk~i;tv}n2=h;SR_s3Y#X9y=9_rXxse`Xr%?I-wkksRFxK zv`xlgiXoXenk4;Wc22N9Y3QRt2kl~Im~h>Zq9#()<{_42_bT<7sP}E8V)4fj&kvc( zMK!}l`l<@H`lIHk9wu{~40P9#nOd7ntqW{UcD|eju?=}6onVKZHs5^4g#Rq#>A?8teoEW{FS>z#(;*74zovg(n!#xydhb}~!`nSGl( zhLvj5NU0YkTB6>eKaOR+f&Sm9%4qBsY3ZW76Pnx5zl4OZ7$hVIV!_{Jq(^+2DK&Yy z*kOZMqTyW3*?^`pZE0~Q2@Q}%bG-JPcn>^iUQ{yCtyVP397RvYRbdS_4t$vAp2P<= zx0voU%aL93wm8mAAJYky1}-2yGYx5(0u;us#0dlwzefMre*Vtdqcfvp!F=)5fuJJ) zSwn~H*2mYgn1Nj8}zU2KX80e4~+qo!?Kz>6pZ54Mm( zFJ@w@=w4#HeGh~Q9F*x3|2+Alk>a6Xp?~~eVf3z+mSmC1Hp zx@{*JxG@&g4qkr)R;Aar?&-GWr`y&&RrGJE>SVQRimBlK4YjSZ!i%6KubC8;6TKL? zY%?*|x1Q>ODLihIOtVSymOf(|_scDopVt$85I^6@@Jq`by2UD5Nm+T)R zZRFEuKqo4R?;eO<2rhM@FU(!!!eje$B(sU7ym(Z7 z|F$^NZnwv@wD577Jj&6jrIHI^tVS+)=~=Vec(|l^sbxb=Q zqYz@JS2izp2r9--I*f{_#f--^B6${52r~vbxfG-@*^6%ZyFsYb6f36gOFgR`i52{4 zYz^?nR-qYN7n`v~BPd6Gkl%vvg-tH{dyfNj0qph>wOv}R^oWXILI1aNf%jH)aDnGd zvW`)8!QKN$mGowvN7Y@#m{FBu2h{?bVwzfqI&c1Zb);6yiZK7$^;0M&H4LV6O1LhR zSIwP9y4+pnw3*$YP5$pCLO8YI~>&yV0p`P+|;1UsZw|itMpn-kx zVKsowVyj;=`lM-slYfS~EmKkFsmqqM!()cq3xF_FmHqxxqbWfQm+wN$F&ZLQuxNMLUaijcw-c zdLCv9G9}H_LeiP;z8NzUw^@0V(4zpJFwYdG*S+aqRWirqkBytGxOx(UgNg3XRRjrZ zVnsXurdd2mpy4T5+gx)CSst^Ne4Sa%^!1khPSrY1+$I%aXZXF|+R~fk=_$=5H)~3W z8hF=KH9V%!K8yA4U#T~L>Vi^C251u`cbXreuonyBrmw*0{1(G{c4y5hhV@)zK&0zf zPN){RPqYgxwyA)|fmPZ&ZdzG$BBj2FCH<# z)ggq4Sv*&vxdZkjU}Uu`74Eb(tyXHooR9 zH-D$0Bmpl1ZghoBQs>1?W{p9Nyw{;ky`&lInTh;OHwuJA4*}Ay-KdGr9bo65Hc@`_ zA1fERWHj5*HPN}9)Ehlilf;p69jXQ^j>Ph|KB-~Bv6YNIuQ2+J4hhL>H)g-qSwfO_ z13Xt!D}?L%O!?@ZG3g2m+vT6eWwM*V7s?$aTgl>IQO~dI$D0?FaYa$!QjwX9Nz&s%SxaiQlogr1K~l>j6Usv>w>?*NiUw*V%{e!q-hA zuM5}ML>*mN4W8-vj4r&#Cduf+C@}|hpRy7j>@H-beW= zBQT&&F-KPO%a9Px_Jxt;Po#KrT3gD?c9x>{mbzUEdf*S}4hI#K&M=n>y+7zH6RXkP zXqPWMmC3UGRS5gQjh3)~SK9A*QIa^3_LGOI*Ye)`3nKysGfbsOH3y5<=Uyk8-A!D@ z^;}I7_XH(x%X^ft{=sy(2YWR8$)mUM>$~w7ZvYhw9tbYQxMT0=?Th9;&G*LU*{8Z*R`vg$aR?)*Z+BbQLZ)U-YF@=SNWzQwgd3YO#1w-Y!Dl6An_G)C$ z5i?FjvCfJ7z>i-&@3Zw2WOmo`1+Mi!Jud63_=um!M=Z;FYsmKc7B+TECj8~5Br2+8 zPJPQ{UTam%!06hRPy0E`UTbl=2EJJi!)hhFkAy0hBBu{#JENF={i`==U%qFE2drAg z9&P`mlkTR~b&?%A1`qms)8Bzu)Oa0(a}GBLXZ&JOkX$hWba+ROWM@AWl9p&FvVC}z zNtEQW^4$YR`r=J5y^V{a-G|Q_xXM@ma<=o(^E30=vKSC;P4+XMZ-|-EEwZb7C~pm_ z^;A^*vUEWEc`v)aKL4{~Q6^;6DQplPBku#v97Dp)K9}wEdt0^wO}IxOhHMnbcO&1+ zgV^98dbU`r73>!8G|gyRt6G9>&3eE$7(wp8!!q}od!6pv1WBh|@yZZfgjV?67e01O zIh5&NA+{(Vwx`#ra8^gb{ODSDKz$zV&kkRX#zP)Ar%jU9=)Y99&{Q_>A@DVUdv1=< z?bSt>P$LCMAnkg^zLdd)aSM(qyaaAz@X#=yP-I`1(45G=oba(^d;VpU&Hef^?oDCZ z747jN)?QA;cirSyg8vMv>SN*8?U;Mq5t|)fa-a@$6$YkY)7A59wBE(J2(xsco9davN&Xwmj6xWlvKFV_ z6-e8=)p6=G$vlPbiRa{Tft(p&(E8&@u)olVI_U%jof6nv4Mm_j)>D{-v-4}LR{OYD zLsuwILzVJMlLhXy)B8z5RV+dF#ap#uxt(78`G|g`D{GebnLC@aG8|dh!W$?6XG1j3 zmoY`u8fJNkzDXrn0`+ls=5d3W$mY5wHQbzO@*rg=-X}g29aSuio9FKt>Z|ZkrBNy2 z(k`QP)~|-10BSqJ;sbYcJDJ5PNUQ0Cc7G@0SH9d z2Y#6w?nLS_BH&s#ehbqDoFEc1!>|{9OrKct=_GUbH66*`>~5SZmjD5CJnO*zZeRZy zlLWcjPR}0q`#FUw%T0{vtwj^XYp3IdJjD{kT4R?xI=_%<#(X16r1mA=1xGb`CAy?< ze{I)q{FnN+XWROs<(c(e)~UXix^}Mba<9HO$$RMfI@@2|4Y_cJJXKQ9vusEG=zlMj zbkr9n=KizHP@&^n^WG;iE4s}YY|}9ul&#Z#KV2>-u^I|}SNWi5?$?kj_dZib7`uEd z+iK#!E2-CT!uA?mV^CqJ}djtlKxc6M2`{ylFLA zoMrzHj(S=HWhOWBCf``!*J+oblyDBy%kMnC6Zc|e>=-(Qsz3+9g7aI&ZDsNrpiDZ&Ny36qi!Z)COy89DbJd6q#M6zU&J&R31jpR;NWOxXi@ofmm}^V=|^?C>#d)dGpJzN5-8P9^Tt>%r)YHL+1* zkw$Kz5c+k*W-b8z2PMQBHtT_#5qcl()MF(BD9(5x;OR6Bpo@dF?OGFyX=`o#q<;kG zZxHKHyd1k~^;L?w)<3xAQc&rgVRPC}7P>6pM=s$QHCLcIk#k8bAzc7V?fh>PHd-#r zOI@s2^!dm?_eb_*hXW+`1S{>oOs{dO)^dAlpshu+77Bpp8@EU~4cgY$Oxeh#Q;K(g zdaXGV&@_cwoQBDi8H|;eNWv5F*jA@yVdhoS!CK zh*0SEd)J|iYPt;u)pnxZ-e{#~wFNKdJnnh1Jfu}08{?7Pxz54{ z;xGVzc(m}cmgDYCfvinrdiQyxqpbv%5lG13sACeIerB#Nu)^Wqu<9-d4T!Fb z?8*rp9@(4iG~P!;+Pd)LOZKuBX2~vXU1$yaF(1`NztM4oX~KVEB<+`MiQkfw{ZuC# z&XcPYIG#YI0%$W&9;-lK0uQr@?SN+Ll6D+C*#whDemkqDo;aN6hID3Ui@WN4Nvlld z9ThpnPD2|&q%&y&-3*l44Q>Vy_xfph#>z=Aa;F%O0$wS!kcbz(uNB|bl!ppcNg})Q zL#GRRZjU5}bk1_$=xL`w0>}H&MKvQds?o_&Hvd}XKau=N)?7A2VCA$>X!`K7VP%0) zI1fnY66y@SDr+|D02QRGsryy1hJqrvxs`iUu`as(=1jUXJ&K3P=3z0)0e|$(%+Y*; zYe(}wfDT~Wb~nY>L_e;L=YA8M->k`38yiuAFTD04Df1U;hijtNLLods>|jmi2#qzg zYJk#yr%?+cNi>w35Mjl!AYM-yjNC*jm7iv=(~!&Q8+1;m@(9EhC~<(|mk1c<>k~Yy zVt=Th%<9-(&5Zb9Y(WzbQRRwYY>l}(G^+4lrLXXwrQWmH zdlq_6pZDCRc9VXq_uS+?HG1sCa8G0b7HvH~<@i#g7x;YroW@_PWwBhgu$kLOEXp$^ z{|6v5$~_=0?vSGffUmq}En7gFiZZlcgZ$Gj28g8uIi@h?5r#;?FEj z+*|8}kb(MgxxR28G$pCuGdqOdT`2^w+Q<*|?bSs+4y*qltI6`5mFlcjP5h8fU#nsz zhpkZ8t(*>(B4%TCtY5Dc>cy2Ky_gm1$5j>fjf2~{9KtXiTz=RJ_3g^LZB-is%BpT& zxuiX&N3ZZmdR+nm28veyC72(e9Rc2(c-HX#HqT&undoLPzF-=UBnFEAmrT)}%wdPPAm=G_qo#>Bz)74q{5S_k4N3*J&hqgMAxx9*NNlEU0 zn8@J;H9xkcyK3X*uLS3}Z6$#$jRAL;z>hU-R8$~lmM(ej)*p+MZFcYeVIFPTBb%@& zm%((k37m!xD43Hdz-d`v6-OD4p&O+fkrjgxFMJqq>(ySSSP>e^ zIcl%Kc+oLu0q0}!JjR}?SY-=gPhzwCmRT85eoP%5J{m1nWVJ^NS_1JNFs~Q#=_4q? zc3QCdqCj@N1d6&H^X05RH=MWnqKfQ#i>5h%z0yO|2Tnvh-p~+vir1d+SHaG72AX6D zP4)_nwv`%f8d!b}oEQQi+s2frTa@FA7V|OjHm_=?2Q74Mv0<%T^Bma?e`R6b?*dAF z!vpyO(i=k{{|<-NHeWscf%+M7c^9)8Of?f3~~NZFIOq?>Mk4+pYvpQ+Z@0 z*cjJWZNd?9CgG&&HdFPAO(b4vrX3BcjrDMxh9k(q*r=z5#9@Tp?`>rX!k&9G5Ou7% zzH%?1TBh^LXRYkURh-n>KTAKM9kq$>?1XD1$157SuTCD!}Z zPb2@#68HW80Y_pQLPACU|GPw50Ld{DX;%Uwm15(C^sjr}lihe}aX-3F&jv$={W}(j z2yj{ggAu18zo#bDKxSn%oePIsc?LvEtC}x*@I~wH7WY5b_BV&_H?uU33?E1(t{t@h`S%HND36+ele?O|HSDUrYkv9xw$x zR;9ET=iEvJ=ZV+43;GuLjAqxY;}hCw_&U-J z{bCK<_;=fF=ICb5dBpQl&mr?Ipb2I^klt(oB;0jM4_`TV>%qkjI=J{dzNPr3Dt^$x z#sAPN{@xw~4A5LrK}rciH=WzOLO$uIrN|LLXXGn);U`< zu&U+zL~)6YMz=?)_M{dW3yX!^Z?(gdchCzDW(W%(`xqSYjiUxsaqX##Ja<&Qz{(J z0h7Z-uXUfwX2j1VGl_{x%j@np^;862o=~|)aAA?wiaN$=xZPBBuVGxe8?c^tfZQ2~ z)v-NNUw&pcjtsWe%0D4~4CU_U<(U^aYsycFq>97%o8xMNQ7_NwG$UV`5eMb!7Q|h9#kp_$SCVpqvU8GISmF2YKnNP`zm+nr~`fl z?);JU(5v0%8M5|T}hD!=GPAuW@C_=;4ohX8~Stiz!^dIvM91IX5 zpf=-SFspO->WdB<4}T<+>Ph9>$qU6P>0G{wo_}D`Ua9YHpwxZ`mwLWe>ZK4g#)iCf zO?Dd0wXMtri0LpD;=-@+z!2a5W4hNc5WCs~lbUIz>hZ|IDog0njHRXd7$ z(^Ba}gs*Q$(LLuMgrc|SbV5-Bm1gvtLD9X$fubpb=kNpIx$(?H!!w^^4+T#khGH(W z*YXbrsoDcccti#EHEZGnK`O8yZQ_%=V0~v4eLU*WAboN3{}H5c-9cFTD|yv*>PJBO z!688Usg~~Xo}+mrhC;G3C*!)Y|8u--z2czp^7)mW#>*!yo$$~xUcTW2HNVNjy>VS< zWNc<(pTV}<$IAyd9U2*2aNsRxG^MUN?;uPpC8IFWY%y_BXQ0e@xz@r{EqD@ZJHr$F z7I@D87I+RCFKsmTv>9}tJY3R3ti}40&)A#k>6u2Jd{64W=hn0F9XDzEajVbL6V*lMW~wFC_sfs?#j{<24k%yyl>` z|9cjqZfh1Y#{;x;RI5&RXqn+OK8QyvvB0rE5OzG>E5gGjzP7J{!Y4}YQVZJrg(fmG zyU-UpJFQ4CE0^$f|7Di|it#Gz9JtMTJ)ElMWVIBp(u28e-v_v-&B6}3?6;yEIJr?e z#GRYUwUpIr9^ao%SZPd>8uDQP-?r$hp3x6J zAQLs1=SxUKCey+C)AI)TS{qJM3^~yOshAH~lG21AJ9Y8A&8vp^YPmJb+@JR%FSKJh z54CvdsEl^RQnVv>uR)X;GqTo-$ps|m?hi`u7KRhQPprZetxOSG58%J^>KHU5}k^-kkwyrs)b z4pnZcF39~M0-;82P3#78_h8d{ai^?O6AA!CnA{-h9=oB{S?h%=pohJhCKzuhnT%{< z+#<7SXoln3e=!`_^wS2#?PkWzZF01iRVTm z&DlWAX@J}~IZR~_@GSd$)pvQMmuJT1(42RThGGTr)*VqJeIT8N0TiGFxCZ%?m!Uyn zLsi?S*vL7zeTjexP^HSLg-mo`Mg2!zB|h4-3uRmIbZ-_&RoG88kR45k(f5XqkcO?N z*)UfZi>{5@6)H-sCZHne5F(t$M|svnY2bhGn4j-%om)T|>rMD~gacEyaeI8%&`JDe zhi7RU>u)}+4M%MYU(Jiw3tK6{&9BiBL$ENUBm*d8yP^End&alJO&3^TFso zH7R_uNZ#FirSt1nYEam2bN_Z4Cr$-svRg-TKYQ<0XK~cWS)9u*Ei3B82MlbZrYn!W zlO85k18H>P?lU*#`C<#UlImd!D-0dcu05|DESR>rNvyXzQWQH4e<5MnmdLaH(1GR5 zxl9-iL`JdWso9aT%C-f1-f$( zwpYq^08YarhiOi*CtybAQff-`rSN5ppY}#H1A9dp_7!*2-jxCMAiC{9EEmO)J=C<~ z0ez`E;EN9+LnlJK1M!6u`KB$>g(@SRjaOyVtJ2z(OBLh6MPyCvglBlbh_-|(b$Fet z(Te{57vX8Md&ARvQueD_hK}PHJ|6d^{df@{O^cs_07&W5@GB;karpIUk?Oz^2qkMN zIY{inU_s=3k9(txCF4auAHrv<`JSz3q-=f;e>_hEhU-xqmXXmdc;4Fpp#IDafb*X)8vr-|iPeBC?;`t7 zWS`$uHPmVRB{5!A?dnW-?ww*AE$+C9Jk`jd;;+$ltFEPP{|XHvKI^DU$xpf&)zhma zFrdOrXk6`ieMy1$j?M0jOH~GEfPI{xb$>UM4{>v@0NN`(fCgesTvD1eeS6$fPVZ~* z>NA~~aBn@49Ef3@-twHRFqW_Tld)uQ8poTCwS!WF{D)6^AD$@ez?OU4v37Ixa_Q%p zSV)?<2N(cAi9({7(Kruj){tqUX=&C_D^xXHnnD{z(!Mzrb`!DwJ_`1Q|K|;?J`|`18JCw|`UixaNld$wHGEX3G6;t9D z)!&@ZF7OzTgp+NT&_`QB-(&EV|5YTxissT=Z78)y4*_ir z!Hsfcg^X($z3eFPYPR_o-!OntcH^g5Ml{JICea9=Kb;{(T8lg3W}X`NzcHV%D{FC2 zoLzu=s|U`~P26U8_pAc;9!S-snD}^ZNZkn7(T9eJ6}x+$)k53TEy7`O;7oxGPhvN_ zpOHB*<$W{6kR{c~=$;cySF0hdxdVKO51FGNyODjBFX>MJGZ zYBF;O2057G^-uJ!SOJ#fe_uMpXU2!R?tThYXDt)Typl+3^0j9ItOv=Ip0vu>|9YG6 zLkOg#6lE}XWQFO;1CilA%ssB6-i=u3lYFsB?jHB#0H}K6Lu+xDFrDxL!y~bYLfzxn zADYHr_lW7UZu)ccI^ulS_2#VTAatXwkW=sx5R%UL9N1kr+HiGACYIuWr4&jb+o;JAuKh22Q zBuy7GlW@8aLta>GWJ2`c=T>b7I03@$Eo%?mPaBq+e!7Z&LPk|D?PiRC=#ZbTdY<04 zHz7(g-~E&ZyBYtd{K2GmPk7Bb)p?Fg>49lj*^z7@Q^5PAOE`>L!u=G^Q8-N>{wG$q zWFX`%;SqysTeEh(ZafLHO#l7%eD*!ooJq$fYTh!{Uh}wyot3E5qI4}%`;Sh9Y(K5p zW`*g*BY5!?yRx+U9rv&bkx*qdF)~1u>od3Y-;hFR?&%loO|gQ&O;gc?KX=sOelax7 z57K#SxRJA$cJWk@{&9g>;|{|Dokqz~G8x9G#alYOG=}9JY*nc>79&c5tIo_y9v-q! zPNox4`|VTYr*tFT>i{5moqJdFp}YCLKbUS_Ygp3UjM3-W(N9k2ei5 zxb(egaJf388m;u}somW#L>k?TW$GOW3po^d*l#S$xnw09EmF?(Weg^+m+#Ja(F_Yj z;x5byc>NwUOEWa~mpv&fQ>y*9X?-8vk$4v-qnS6`y$9WnzHF1^XJUdiMySaU!=wbM zd_32ryN2RdK_ksXxsWY-7&r z=1XWb;-2>Gp%Hw`?+t=)rELOE^v>N(e@TIMesSOQ_RYVKi4ChFiJvq&9Z$LR$>bqn^TzAM+nPuM75#9Z^KwqixzkKD9zLx z-LVwXI(H7wezeY=W5Jl=H>TfqFuuKJI|?nc73f8pW3$R@1JstYub?VNs507xuKiMHdD+MUY1N;B2u4k^O1-e0nL~ zP=(uTuRYNtG0M)OCp-Ty9&TyhJ+CjzJV?w)8!(-pN)=+*8=G%>;;syx#3j${uNgAT zK@+p7I{n4{%{V#-j-6Nq?>lW32~wrkXT>nu<+ZzBAq^Iamy$QN(dj-N{7py*x zdZF3ZeRZI;lwc+NpyYOEZj2aKOcPz>yl6%{)I-SH7UvD&tBiS&=bl2oAZRz?nor0b zSavaaD^@yj8RfRFt?+SfjRgA=THU|7y27<`K)jcdnYAfL|1d*v*PViY(Zp&mp9l-h zq_hg=RB3yrOjSB`q?SFqDez0&s;76yd{YO6Kg+Z;Z*onA`4suc3{D*}rYVnNXhmVj zNXH9|TZB*|_U<&*iw!^oV13T!vtGzcoNl=vs6rZK=**SQOlGr_%eg-C zk%U%B(M<%^b#-VaxLtXb78Y-7vlS9Q`iicR5VRN8=P?&25rXCvTMGxuoT zR`Njou@n?or1hK|`hy)Yel#*NFO=^WV*up!x72YMl^QFpduNy%14-1fWY~+6Q)ONW`>e&!oa|{Dr z5?u}+;iJ;#eAU~`(UeVD|PtbZxX-&s5OZcXtN)+3$R!p+6q%*8TbyB zujVcR@b^Hr9g@>-6CqidcRaNN-qGPh_>Tf@Hc+(?{RF6F8>J3Bl0~)#?*Qzn%}Gip z_5#UFpBCQ;V0Z8>a3;xDU#U`wCU;340kEjCx9Zs<(Q4521M}R+{qX5+;g1kbN%u+L z2yOh*es)Its?WpqY06H{R@r7WG)t6xN?m%ybc7tvPLgt(sRKttuFpY?_TUbE#9x_C zF_qisK7T|vky{pd?y@6b9IE{TYP6s=x_=!fX2S5*tkzc{J(j8|#-{9J6KM`IuIK(d z9aX#-m>PL2Ocbda-HrrdLBwHa;(Hyecr!PCGKC|_q-b%kxT$+y<+j!Nk#c3d5N_F8 zr)Tyv(qQ#*r z;4cJzdK@8>O_A9~mbe`(@DsCO|1-=Zb+%4DotHiWsJGf$yR~#g_1wmbhJ6G7%RANSQow}r$M^q(3b*FQxbiJSFi(b$mHP+#hJiF=c7t%{-KG0Er zHcz9}Y-k_2hF8t$FPZfA0*`lF6dK3E~(Mh$C zWbv^ir*d=!5{rAuk=Y0ed|pZWuTx0fH1T36>}=ytty^`nu0|nD+v^A&h#*IXLcbw* zfnx8bRc8KqX1-6{-?%df4lFy50=A5F_SU5AFlYMyeHezG|9S zt|l^9k8vL~aR(`Gs*NinmlxN;1b-u+wb3-Bqs0N$%@Bp~KC!1*sy!WqNV#B`#fHBO zwcFWXK%yT6q`9=w+&dMi^f$y!*mE}QSVKg?qQ&&QNI`zi+ED;n1iZABKC6b9>K6C# zS?ho0SDbEx*>9_3Co8Wga-dhpK=6Z#;1)&PHLa?#@@UWy;V*geyls6sqjU42`*4x- zuWG#MtWFeOLz3jdS1aL%`%L({60S@Xjvz^5L#J=1oiMT$OXkd}dl3_#X|I`#f<^2k zGmO_!1NRI?F-llPJl>l_s0ONKbrCxiL6MS^Nr?W@a*!W@2I4-P zYboIU1H^qlb!U*BZvChSgC{>yHImCSHM3X%=72`mb_VNLyMKDlSBk)k+I9)Pb$`6m zXkhLKvXNKa?Ju;aha27f2TPIAgdxaBC4jF6>f&puhN(Q~AI|HH$x3T^au(j~9-k>d zo5HCfGDwCPkTrm^$L0*NN%J+?8_z*$8r1U++n_HGY@Kx)I9g52_61bv3CdGD?>=Zp z#@%Z6GhW*3U{r-|!NVy7O3djV1MLVhdsBcWwXCM}lkUn@%l`afqn7PS!~_2D8Q`W~ zv5MINo5dY+1;2Pl&Nz{_hdGrTciU22Y>yOY{2|zmk=Nw%#UV@9VkXLT;a_ z-7H;Lb>gjR7KX;Bkh=-*8o^qvv1SIebvCogIg3LO18<^Ff7qlsNtD9eeQFVdePVMw zGxI$8DSoL>4WL4)f**o~HknC@)8<`p^u)^4&|S#kQ+goD93K6#Lu7yvQl!~B9_#D$ zeu1VA=ZapNm}S*MIdW9xj4uG)yyN!8J4bxWv;r9SrjT*w!|o8~{cVJ~-TnEmj7J}9 z^@Cr%;=>*ge&o>yo5GEC^5}E*JEv+`G~TDK#|4`4=yP8wwA9pLkh))tt_@wfPo?#~ zf-$-1QllRs09Q=z)4$m#+6D`4nOwBJSgf%%L+zz3Y^1#&25((6cptC{JNYh^R-M90 z{NOIkt)?8!YDNdy3M04BbbR8iH*M%`+aQ(FhVFF#av=JM^cM5(ev8+VL}TrzIyhY0 zQp3sN$QW#_G8^c~c9CIvwQ}xhSvOr}-*>TYx}4}-Ao#AjJT0&&IojNL>gm{Zr;7XC z?<4jkg4GXPJ)cKQBr0ro|2oewi1+W!;@BNT{nGeq8ZvH{I^oN=O#@zUO(3^Q-AP0B z#s7oWF%?80lxN+}{V)85y%TIqTYq7HP4)hDs`mr=@ATjJ|HEI{rScbs_Cky($6wfK zG1i8u;wm1dv5Tjvl2GsbySF3#ND*Iu56q_~h7_6vk*mDl63KVI{l3UsV82^t3qT~~$$F0X zt@gXZ3)^qce)l)`Eb8=1B^E{>5xBUFA{om8rtFz_!6GTRl03CL^ZD<@bSFja-|>PC zdn>*I9CD5lZXX%PMZRNF!#3j-V(L+x!uuRpq*!Ynr5?Fx-|aY@$ZR6`ErQb(wL3*- z5!L|3_b8wrFDvzOC@)RCM0b{k$3%B_kL(w4mK_VC3eQmV#pcT|_^9a4p;Mv8!pDe8 zd=*Tce1|El``y9(Z!@0}VPLb~DZCLRr4J4z-XMQLpTefz%&`4 z{eSFxl*)PM+xMUAJ!IcMR+=F>@8$NrMd3%<_w9P`Y2SD0z1Y4t>OJ4Sf2()gHPXMf zT+hBAtg=3~@4fZ@Ht+MtAy`Vdyo=ux{Qk^u91)N4E8}+>zu)t_jo(QWFpKAzJkRmp z^?hN^`$XQa=Qo{S9ltyIJI>)Qa#PhFfJa9$qRvv!xOH~)?Kp^EP1;mZT;Ft4 zFgaw>&zOSP&$=2fc{Qiyg@10`9!mRE^?qOK%w=mo28T#@Jf&wSHHvGKyMM*bG~x#X zo0Ee>juZebp3N$ziA=ib?FDn!2$$2eYbyfV8;VG*jxM);hm788H{S$V*8~wKkX>8-#CrrN zeERDu?c_^{E0i;oVE@&4@x(zQ?2vFGTHH0xjtu0L8rNrlT^wlcXkTI+u^v%ffg3Di zDfSB7S3+V>F8`JxAncU$lKU&K&4z|kIXnGCIm22gzUXIJ&B6L~p)u%HraB7bo|x#X zgIYz(tp9iUN3(Y^0+r=vIj&+8ALvFZu9!OYU2Bf;WVy@{ZYxc!iZ?wW4m5;>xhv|^t?rML4$ONB-JAQzUlM^N zbPE9_qyQ=`_i;gHK=Uo#;;kIyHOnGDGKbimL#y&y{Yz$xzXND~@jX@igO}OjyQ=J& zw(Q>SDSp|1yCSD-+&)rtwlLoXZr0zgG4@{EgC6A`+<$;3sXuC)HO7)1q*JZed!F$w zY_HPf&JJIm4xI1b7+Sk|kTN9R(E>z{zFuBaf*GdHi3?q5gSrDc6!xEYc0y`g+{^q+_90}?N#V}( zqn{*N`soHigv@VnOUsOduXu_W__WwHKAE^+Nh<;2M{;$^U;43Z?%JqJTy70cv^F46 z^<)#?d+p+DFg|F%pihiE>{(7@r;Q!CtsKV*rRVO-u<)u&973KC*royoI1F5Ksm+cO+9*c}T`?PsxIG}KTgV{?Lg z#0>NmIkj-&Z-C=~F{lnK%=dIBS15UAF!``0k}iucrLyjhb)p^9@4>{&-;ikOk%SxO zbO!*qdz|jNoi{pfvO2FmKZ?akr&{niv*2>Yu^HJS9qZ$?_Y9HRLLj-4l<; zm832Y|CNB{r_C7utJ?*d7uOqmqqv$AzlB&i3v7QWb(i0=uiW};O`T$6kPQ;6yq}VS zc9b`$Cns>Bx3Ygx$7*7g01P*Eec0CZ!<%~yiy@(3qQLeK+Ch@Ak+g0?u>Z$S>JGIv zRr(jJAaQT*z;)4m2=jgfW6|X@(56q8vMVa2F6Qb~mGd0mO|p{UT#ENL&uaYQrb?dz zO8OWL)lEd1p}Lv-g2)kDK_YG7mb}SiX%gS%7ui8Y9!Pp`HfbQMB0W%iIiuZS*p%N@ z)#oxgf-Bor(HwNe;*Vds4^I~jn%2ntAALh_W(tas(&B0;%`}6%hOq$v;G9eQTvk<< zUd*U6?52V2J{GGJ-&bLPf6Z)?R8OoENpKtF{?!$$ZtE`XT;Z{}g-kT0I|g8`BPZH2 zzI8_tOb3X1=XR$AB#G4p9jG~1^)|#PRw4xxMj{<+K=HJUF9ztaZCQl~R}o3fAHnp+ zTr^PxH=#QJd%t;`7-H(%LBF)5@q1Hm^;+WNVE^xRYIdCo+UmY{k)amNQgePGVC;TX zv2A^gvyc`!v3`(FAh9Yvg&*##pqCp2bLr9KcdFcU*QHvCrwdJh`skX!FxR=rFyh#| zFFoLA&8Ap09=xYT7nq+VVL<>sy@0OlC14E!15Ksf)K*%+soIi$qSarionMl8WO&i= z2~=_TX_A}&`#1HqzWO^PN0nfM5-xNnz^Ie>i-%T6)J%a?3zByDg`AtmcJ(c;wV)w#eb%|xM@PPwCokj2IpX`O+X=_{2>;04U6#5xDUslSS z_%ij#l(r|Iq`N`H&sKRMx_O$p3Hpt!2e)cW z0u0GBhg;HTO0=TMG-{G5y^TUZNw~k+k2XUEZ8GOR&_+GMCbxegbBp-r7L13|hnfk? zTU)5XJEC9iRoq6ts!D9i?J&e|C+;$-Gu<%g@4}V8w8#Ae$^AwquPX{gSC^DGEEQ^^ zE#1QFU(8P*oSVHeFWH3%Cw496K|@96`ub=i{x^RzbwO}q*LlJGmdvLynB{k%o_WC2 zRUUzw(Sr-jL8K7wbGYx4UR0X>&0OJn+CTK8xjB`?GJbq5-BX=#y&9f^QIt*8gG7h> zi8h;pTrbTNpz$d@gA?0(r<2K~4{RGTxU&=gmR?q&XBeQKH$?FgXO!tZBCC@psY&Gx zvL|1F72UAUQpZ+$i~W2LnQ}aCZB^-y@wF5P^cKdzcatVlTK`dB+d=e15C7a21>Q`g zYM<|Ir=5BmkZlL!D}J#Lf3uH_bPh6t#7o1VdjG?Z|2t28|E9G*14#AgZuRM4>eDZ$ zJ_Fk7s5r)YSJ^J_YaZ2A=DE$y1fA%vN#&;HCCZBHi|?9=VaH64fa1O+V*! z63NTH=z@68gv=a6-kS-|ls@ob8*;|9RR-7ls?2!5G9wKLZUF#<#V+tUF3jZBk-Ews zsJxi(7TuFT?_U7$%eFlf`x!WB?SJfRzJ<@X_1G7DVGot9R9l6(VAL?gvfN?$_rIE9 z>BR0e#TZ+#V2`Fs`Oia29F15T#C~bS4Na9=w&!_s_}5k)Iw*G89@Uw+TXk^NLv^N7 zj2Yo=)fv36>RgzuPN$se4A^IN{9cAt7{K0UV>V?m==afN`sh7^sXu0M-rBYl-qU)Y zXi^hfLhSENtnK4g^5TMy@u|1Cs{RNB$a201{PWT5QPkLMCdDV0cHtwjb& zT(PgjeQe?hWavSfQj>;$$&?7#lrak6>~p z!gz-90J2mq!=Fv4u1EQWawK+pKunG@eJ5x}Lyv41i${sm5@l0z}L zX^8CS{e{jX$ce4vB^aIFj~faalhX$$wnsnfv=nZg7v0{;iOD&og7VAWcH(c@q%a}w zye4o!bo&4_xQXWICT{oW?8KfYLD^bv9_LxPt*Kj>%OIu?$cv2OqoiJqTO|Ahjb%sI z_U`DrjkkH0aJq(!72#AG>6L{YRN%)Nv`Q$#SSL9h3}?8D zAUU?50WR_6%@wV{^*O=-H(kNuFx5nvn}!;4PYxZ-*Rg3-Yq)E*;E$@ym84i|OmxzLp(aVg%ksR3w8>FF{_Y2u1QT zf#cd*mG zo@YM4gE?t*7QdhK`y)SvDPF%7eE)-A+h}Oj57%!x4E@2Ox6+9IEWuWX5?syjrrBe* zTQXHQ$svO=kv7+yzpD;3u6`fojrGoVGo*5%J6T8s%v|T@E#O8tljb&)<__cLS*wjQ zGkLIUT1Kg_adDi+>3O0%DWgR2DK?FaK0>!hY}yqZ0)&!qHx^Hgi#T}dO zt$;8LBF1c`vHEO{sl5}shyboFHi{-w%@yvUwLh}TlwceW5G!sg&Jc>uKoE;Xsh2bx zok*oKV&zz_LSuuhb}mSK#rDw>;7Qtfvzl5I#!typHM=$ulFn&Iiki#q%zIG^~mqO zW>cFw%rTHTFFn(5r35uo6o6N_XV7>WC}6!tCQmVlnM4ZZjg>;Yo{ll%gIQP^VEc0` z_a*tjUQo}_^5ob`v;1syZzD?R>aAjuW7#KOA2#ggT|Ytx`z-$ABD^eqZuRjK4kZvU zeEdv!+sDt>q9_^CX7O{tvfc3Wfo+Dt&q-v$sgdP2s1^sPaTQ)IAPjxHB3m)jz6%KQ zI+)4V;O$oyisIsOnQZ3cKyuWW*lW{@LK812OLvez{tG6fkjoGDY}nS=J`5+ju?OWc zfL2duYv;>Xq`?cH=y%+*=|5)DPjVqavh*LinS!DzI(%n0DcD8t|Tb1g%L2 zD4`#y9e@o+&(}INR!?N=_1vS7!Pufoj+$V1cv=3Iksktojc5qNn!sQX}T}cQKg-0{0_P=LtU1P?8*T49yBcdO|kUH`4=!~m+Iul8z{S&)ak8YIv<+{S~uUDR!FdxkxjB;aQo| zPfZ>Un4vl~y9JU9CIpj7qq~rBk{B&3-+^o%ySFYjv>fRXOwMfp2I1ONb}zT#;j>nw z&kJ^NADp&5Q#1E-SVuc&SwpnBD%>O59EkL;Np3_xUX<>&+}JwGzQqQWr90LZ-J~`HF$mVQJq>i9w6lu z3eOWhymxn@a^vE$Wxcg(KvfV(bWA?~5!ltPQmWLA%QLa-mi!YPC4xyu6Ek-mU?e+D ziZ0tA6maw8O=u}+oLQbT!v~XHG58H~n}kv~6*Q9&$+roo4RZyd>csVUJind+xSvh@nLBf{^zHj`w4ss# zgf|`2>u&Sk{FQcj^I&xmPuy`?Pq-UnERL z-_A=Pyi^>O0vOyetB!v zLCW2vvi+?t_UiZyNdFhRU)hE5d)1?;BxBo2pq`UXZad8Gc|Sa{svcU; zOP94Zed(yy`e>`KUL%ohFICI?1p!)^;9*|{Cim0itY&e89QqJzTPOqe!xzfpaMl9y zl8`RuKYmBJk(w`>ktrRNQ%S$mo!Aq^uI`v;wOLy3u>Y-eLhv6<&L;OCEM$U-j)oA3 z2oDJ+mWV*uk{xWKEFmR3MC#HFH0uYm0K4o&FzN%Vbi0ktrPreC7y! z=+9Wf8!qHS3U@DW&<0#Xsvu7H=Orxj%5t&tOms~Yc&AQ(4$nBUEv;FtdZ--MmW=r*Qq+Sb%SDm90MF9A_s`Wonw$ z4ArW`eZIEUJ?y^inX1J1=}ugM#Az2OnyDqvOf3(s>Wg}KshQlTb)YA2Ne4sGrIs_E zfQL0R8HJBDu(YO%Y?NtgN(?fPxl8HF*DL&|gfrB$Vh4~0gxJ0>p)LIk^<_m_ty0IB z3EFd?I+r~$@u^rP)YI06)|y{=uYsz%>aX%;w(nY}=PTQ$=MP?Gdalg9UXl5z>&D#q zSp*N8SeY|FKT57Fyoz`J{rsGoH6D~2)egz+Tz!S|?qjYVX~VN~b*qoM*fXksEEBmR zy37?@3114HjcRMgdCV08Jhm3hU~kpvcF|qJsnYXF0m50D zxD}A$K9F|eJ=-(eX62DDKV003%IdAG4fkZw7ta1S44VGiuY5}&dTSpsJng3^+$v1H zV(Y1TAlsKsvrJP68rJEDK&P*r`1cImk;$bE?0}7wCGwZz|SWyMxfd6}fOxAv)?&-2#K0_((2F;$$&>OT{i!(=mr?@%(HwQ?zo zT)~$HkX(p{dyY)TOZcd+Xb2aNtca_}oOp;lem^?#EtI6c)vg~aaS!|#E3!sM`^@u73G zg*ZqM_ZP&gh_6n3?vtn4>RLg#`{r{}F1~8^gN>pvTCaHt=*N-+*5SmD;3YY08l9to zSgNmOPw~|>OaCW)l|}Z46+W_^ZnM;t!Z#=DjTZ7-cMG#j!sL_dek&r#faeC1Db0L|xkWIK>i(O;`vsy)&7{b=Z6KIT50eRg`q%4peBd#C zAebf$V0sWxPFw_Uud?URrxp!=r4=H_C7*+Q&1O3KJ}5+ES<8+BMu_2|`CDcUd+rXD zZ}CT_6aP6Ag2&28Bog#7bEROK4!xHMRyE7A+~TS%w{Yf8v3ZhHEjGt~>idM&jD5w<~rg&k?Qx~{H*=LeG}fF>F3GiCncCX-(lLnVL^?!1SXv}7a}4AeG%Mhl!+ zA%*cFvCoM$Yo8`n8t_YA^jWsHpAdl!UW7^cmjCionryn<_iVmwST;>=xZd{+|94^k zDLf1F|KxLD_4?n!S6+J_$XJZ}_PR1KNi7<$p~xnM2+Fr{i!L&9v=iG&SSy1+rwARa z5&Ana+@i~@p>1(=*}KdHblzY1Utd<4mv@A5BRfQ|oOpm}et7^Y=q=({Z;-}cEr%=p zb##mS=&D_)sQvK7DmI}4iT#vZ-c$n7<-g^TZ&xkxq=M`*B!p#-oWMU?(>U=14JR1a zXQ0XrovvXHm0!d>GcYfFoC3eVA$Vd{)2yuWfoOaZZgsCY%};!6)>>ps`Y=WOi7iD$ z;XVct2o^?HMtXw|GX&d=bH%RgAu;8wxS53_qJ5qdUkKY13c_zjmz7A`NUVyiq#%U4 zOnqfl7HM#RA$hEkoVf0iV<;?QGIRg%3FAPS((^SlDi5ZOdbF(yw0!CG3=0E`E+FU> zh2Io=ilWWNu?*Wiz_INib1HP$Tit6X*cmOUa-++Q;4rPToq!2~G<-YFGS%)flgbKj zPV8L1o)$ZB7OZUeynW5<0gjv0y+kf1+m%%n4cMKMq-mDaB;sfWm4SLDQ5fP@H~$ED z@?HNOh^)>m5IjdvBgxTgkOZ1$8I&qaQ%u@KA_`RIm%mms=xFGP{icS*-0l<)PEVXH z#?<1Twi@+~A?Q=+9SazFGtW~wq`TyLaDV1x*Ohq_YD^boU0b!qDu zxeeQ-#H!tOO&z@3$SNJ!R(EHAOTJG0DidZT;1+kd$(ALG@N$3XcvU0{)GSvY1tJ&Q zdLk`w8>T|)^(v@G9hrst6Eb+$iC9vlf4<5#q2<+Vo4<#PTOjIQ+XS!DrmiD(pgusj z@U*HmPh)Eym9~18njP@EkjdyTtoF5xa}L48TUKL;?qwmS%}sR@92(xur;`ewFzcwg zdLu9tegLk6iMj@TC6>RaN3yPn0ky5BhC=eg=x;PqmVc}<9T^x*JuLnw<;)#ms;N#C z3L&!S0D%fFY&5)Sxv$}COrSI}#_j*nem#{CSOdge*{}}?(lhTapXTVBY4PjTsXw%W zkb3Jjpd^}-QPsovS7)bwzeG!?#z>{iOOnQdJvxnj%|o(0Vh;}Ce#NmRbjHa~A?Dnb z^u86ioa|HuyfC9g^7Am5S7~&S!2>@0{MZYKEpJ#!`R2?-q8)p`+iIkhu8bT)=!AA) zS8^^MQqC$0n8Ppi`FZU)okpzD<`B-&8AAFIA>z~j>SSUvStY%OORBW}({*hix~8Pc zdA4CC=J=JI7m#+o4B`k{RK?dju_MT9H6y^F@8_*i@1klwA;@v@irHfzHRhzI8olHs z$&`M-Q0uKarT4>)T9vF5qRTfZ6ouTX4O!BSE?b}oC-zqu9|O8bEzPeA)6Vbcoo= zau!R%#IaImRJzNT@5&H*Y$7!Q2Ak+o+wug63{R1eWKKNFMuR;(%IzMIsuJxgca&%X zuJWo_&F6ENE%63uV2r?F)0`G+ai1P4)9J8Re>5pQ*V4kk306Zez&-7Q9sYXh4WiKP zXjus*T&ff-mri?6%dBjF+m+S5B*7+X!Ks=+cU|U#(pm4#?*na+3Ytk8^i%fyQtjpe zu;-=65Wya!6MI!JiT63jq)q$lAJ&oyomtp(alKC(A@0={6T&V56}C>a>iql$-FdQc1E;GbAD%~lbEt1ytxoJz zVl5A@`O;^cI8`)$+?1Q1x##(6 zaXE8%D52VoOr9_@^|FXhem!Q>ME&7Pd$tHxq|JUDqcX8FJu!z+Qr3yMJUS|mb)4n? znxR#d{H-}6QI&W?6cec3A%cmN(JR0CneD#m@8ovh5-p6=9kkUIJ^%~y+E-P>-PE2s zXZA(-^HAyq^?4xqvL317oDeH>>VA(L#!7d+e0pUyhm>j*Bdm;~w#Oz%? zF+Zh@=&l}4>~mhYXkgcYPF!b$)twWpBBYQGMrvCJ!;{6zi-28R!#_>+w_M1vDQFA^ zkUcgv^{-F}DB<>F(Z0?Ld9NY1+6ucHXstJynCPy9SoPCaRP|@z&51un6-FlO#LL0? z*^C7BVG~2h!n==LO~dlaC=RpqBwyx?QC%~+0dhCt;m-K~yUmFY1XL)oMU8Ep$DCu5wp#hJ~WYc$FpCiA#cM?gO!w-fu!e*9e@@mZ)a z7VA~~pp%+&pCrTD9iym6xR{r(OuAc0XW3iqU6z3cCGQ&<@=3|YKX}tgKxzy1RbgUV zoeO2NL)L@(gM;qSosmknx(%38TNu9v253Nt6B=TI7+v}iu-erRB`jcU3t?gn0GM*A zMdIzPxpgL++!`a~9SfS@#u(zHLW(Wworb)K;muH9kOLUCQJOzvB3?(Kf=>EzbP9F1~P=xauL1sn^uEWbvQ(ZINODEYwJO3y&DP9)7S$UtJA-qgY`HL9$*Ll;uC5%fY6=lu&{SkumN!u;|r zPm{L9iM>Z-pGNox32S);ZH8kCql+ybOh%Nvv!Btopt`kR+M`ZR{5Ps6ceCt$B=xpm zwH-;lCOA>5`&8)$0+*VzsMqM^Y1g$d^vN7Xm1*nc=Bz1V6o*U)(Ng3Knpx$y^BQBP0ludIJ)%bO{A3liwBOlkt%jvX(=(JFN0|+_lLOT*q_;Z#aW4-}dFIRPZa#o?1 z)olR@ZWZSuV741EPn8oL&Cw*FZy&N#^U8uya$Y6bGo_C{EoF6`KJ>@9F<@(Ve90H{ zCEcz8{65dc{Rk4dJaL!Lcs5C((5ZDM`g64xz%JIfK4XJA11tk-ggKcYr%G?qv>-|k zvRJu^?06i)ERO7uwI<9V8qLn_Lj*8YdLGHWIlMF9f<_4_&K+M-1>z1il5NYd#3pyh zUyzQ5ksCIEn1XnW9WLqZ?B0zDD_DPX_=+2g8TWGJ+&~(qU*X*_C#SzHSJ&34{2T(| zK7_15aWC+^*9=RLBc2`?FgsH2D$u)xv4U4S5=iW16q)mhW&x#XdVj{5_wDz-JR&wb zAs`8rp`qxpn#JECn%Zh(4Q(A1fyCg%FW{xAvW&*&`EB#MQHt%|?_h%Na20>3if;yj zjrfIMwWAd$Zt8tR+>%P(G^y6Tsj~d}6AOq`>D%MfBZY710h?d{$1HLEmXs7MdVqxP z=8M#i+tf!;icPUN~MXSe*4+vO#XBPZiyS*GWm<<^VLOk7pdm8hr*QcI%X=nh~R+0rHZNouF(+ ze1b?LCwkwIK;#6>BhP&p9zhoQdXZthRs{OhVd>+BxljQToNRay}tL3Izh=XYM?ojPL|;v2V&^Sy=(T1$yx zUe8W;Ux6Sg+JqX#t$f$$8S_MpVQq3qtXQOcLLdGnUEL3J67p+KG+8Y)@O4$F3$tOighy%qQnJo6mOly>mPYnH@v>m7?H*= z11Lr`$&Oaf+Ah*5T5miXgirDpoYICJ1(ZU++s}P2Tj?XnOQp2~Or=ZtQl&qoW4uSd zHVz?UQE{kL>6fODw~D8oNH;G*mf?Oc(h&FhXpxhl(*qPI4(+Y6ao5Af-7=~gs4*+U zA6uubE}EB4Csm+k-kvIGDl?my>g1C~h@cbAZ1AajMhbDj@)ENgc~(2btQn#!@rzT{ zf0JAc_6{0a9s@|Wp4C&POx#Eo? zJrV~aSyDYSj0Q9!ycy8>Y)WQ__KhP!K&oIixOk6O?_u^=nQ{h@JX88C+Ne-sxjxe8 z(xJ}0;nE$XO7EgO)RFC0h%kqnX}D(I0ML@3rBm=w^Uq9XHC-U%^a+3xzEvE{lh@cX z@d=uQ7m`pnL5`F!c{Pe{ba`o*I#@pSH3WoU;HgAEPqW}A_z7lfDqcMR)b$aTY}TTDaA!Ok%JOzSgcM9wOm2a_61PQgm{s=@Qk)FAnS$sobg=x$#pJN=S1 z!WC=z-9)PZ_>Q8r)K^kdp&>^y2(l}IJJM#3(>N19zl~3`Deh}&kjw0<<^bCCB$K53 zFzB|^10Yrqyh@6W@PPi0ACf0Z0H>kH+|^5jN2WQ+b)vGNntHbcPaps>5nV=CgwlGty|2$xrLIdl>3KOVptmZg2Wb zMoE2_gLuTDJZ}Rj0IZ=P^3INlE+I3lG$wjc+mMe#}|e*=>&nFcbb6&cbu@-EB;ee3bLi&h_j^pPK3I%OZ!AuMg<{ z0Z_Qn{UDB0oJP0)a}+5Z?FHrtTE$9%?d0MzgawDLUIkwh7DWQ%H6quu(W@&tiWl&uFXV&9(G6 zA`lkcj~-W}BVBDiR$acgM>hUR^){tQU-ABu9eBLfes=5rf0cY=zFD2@G}5j`QzO1( znSEoYP^xwftxlIlGfqTbGJ+LN*Vglb*kAr3N8URJk`IZGBJ6}xbEUctBuoHZ6TT?^ z;fzC!K&JCFrn|zOQd9CP{+jsqR@_cCgii&IF`QX%3};rT8v}{EHPuq<<|=U0-Zack zH-UsX`jozjE!IqN_@ZcLKOKv4!dC{O%cSjM(*J?~p=7PKe`Ps96{Cx+!1}Y1Npl)W z0;`Oa$Em{}$4C{#9f`~?B9p9|J|G~m+=;ap!)n`eG&|b<(KBi2w?f1A)7t{ZL&;xh z_I?@&C0u@zH8wxYS$3bqqwvwG^Gl51_-HOar+oKl4q5Pj6UJjtlD*wzpbiH zOx8?P_ts%l_g{}%;+~>y2V1oR0p)4uif>^~f1It3E|M;~ojE2pOA;m__7p{NbdfZ! zH1HjShQKysK-Vrjj55Vvg`SG0T9brS=`n0T4pNWEKirk__juU}Vznl4H!O@`pwSZ> zY){-I;7zlnEujIR#~c=`X2F;${bnd_>F2lQcQ&EWUqV7}fvHvPM{wy99}kg>$TVH_ z@ZBR80l#d^Bt@_%KPOq7JFzqFKMVlKtp2~W^Y`DcHYhBex>C7NkJ^&K<`S21dEsZ<}#Z_IpZ&EDFY5j#q;cBmU- z{hSt7w~i|g9h&&kx6YypBOcBQKGPu29BTcLOy)$b*?E4_CBS7jf3?G(BNhc z&1&>Fi2#!Klxf2VcGlCX0Ls9^rBEoS9HWPEps4*2GvDNynW8uxu=k0;v$#;E_;ZcU z4yUoc(^xK117%5Icp`9)t(0ih;0}C9D3O4}0pYLFno+Av>EC&gYl?G4YlaUQrKo7j z@XuD`ML13+4hg&=M%vq_MPhiUUn(OlB%{Rjfh=>aYG~!H51vVNpZra>e>P}q(-f@r zSNaTN<(Dn2L|vL?XVOp{L+5H(UD=xd-q!rShN6xD1l25vA<}8tMsNRB-#jbqOeD=C z{I>Hu3<5cwU)CR5>-@ykKZeBdPG>f<*sFRGz9uWHBk{^|8+}!JHOSRc_lK7t`7>#N zA$gxu2U8DeUJ50KzSNA>eAIx^Z*{uVlOv!!z z^?Q@9#XSR{>65GRocY5>8a<;oF#cfULQLzKKhf?!%GVw+p~R?u?6;u%lrPIr(l#V^ zs;PkqBlk)l@)v)QLNgosplQ>>g2q8NpFh9rYCdHe7=Hg8wM*jI#DCV=CAgF1}omY^$*<5We}2_XFRd8 z0Xg?Gv8H28xp+raurrS%L!z~-&am`;)Qf0n{u6CZx>aX4M;P5t7Hc#oFMW0vyFlwR z#4a}P!$?FLjL31>q&-Pm{vo!LI5{Ozx+51Psr%$w|7Yj>I_sjC9eyjZ~`gb!w zCl*DKnzQ$uG2^2cc$O9RyX0ryNlKC`-K44>Wr~jM-euV8{io#ZRvfNG9KP9a7h-C=yvX$Avb{EQyV}j%go)W>FLyM9 z)9&S7Qb7YI-D7cm7sV%*X(3>%Bc+BtUeu2a?o52%rl(}*6jke560~(-xI{v8S>$98 zv+Z;Ujn2JYb26+sa^TZ>WkOluT4Gr4Ez`rA=sc^mBFdL|aW~=((JX;XR~!sPi$~c$ z?`aRGOV8{%)N1@`GlnYZq>N7SvYRSRxSkFE^F{ypi2t1LKWqHw4gPb2{~Y5#EB)sH z|5@fgOZ;b^|NMrks=Q4+QPzx+FhZ5a@Cjox-uGMFcWy#fU}ZMtQvL@P1r+CuSR;EF z)A9Jhn`5LSC#DrPC%@)&9DJHRvN-q>CqAD^eDP0}i^2Q6fH6p7$D$Q93ht(S?@3Z% zjLH$U@+}lUxJHSSbFDd}_CQe84bGIV{)M~}hmXsYR`I5tyG@iAs8@34qB}V)Opgpd zO-u!6;0>P6?^K~-s&-zMwh=4B36vCVIWR)kVG$wo*>Qa?#~BpM2WfpCS-4%7#7Z^D zF1t|;HrQh@(hh#RUygo~_^s~zFQipRziiZkNmK1!QU{LchLQ$G&RA|e^U78z$Lk^q z5RmP5xv#1WCXWkWeJbX$G4h*PL1R`vr0|D*i7}%6W#&CR&L9?i7}>N}yB~PcwEKRB zg>AQc)$gHtiQ{9lVa@LOgqaHbYc_sSG)$NRYhM*P?q>XGysxA`$F)&e^+ep$Nl)v} zj^Ju$XbBh@JZV_PmrmVH2D4vlJufM;iuz9?_UDqcDs}K}u+iaWO4nXxJxR-FY34oM zb=`4D;3yUXheVr;!(E0{^6tccqHbx*pHx-xkDFfbq^)ya&MZB|yD$81yLNJD z+Ok1fM4&NjbnnNZ@qZwjc~pT;714zlYToUDUwj$}5Ir6eHuMHaASWU);#K{+ne{+rJq^iXfgQ2v1e5z~0t36pHbNZb#J!$tt7VVZ>3_W$Vx< zCsr*!&M*HVKTAj^AlbxHn3US|b4~hJ)5qHJVea-Urs*QG+n=$T(n^uyd*^J=czu|q zhb1j7YoDnX+O*OZH&e(6!^qH{`Ob)*xIlcg&C1q|Ux7Ac7XVt4R{^*d&Ng3Ge zr!kS(m{=i4`)f!SkP|_TzusDX#TFqt%PJ!FmH^|1s@lUi0}}h%Lmisa9}tAq=i5P? zKiLf83o@lMuiVEVe)G46m}^ggzfOh-vOV8A%Ad0dz9s=U@F`##6yR-@h$8y)xzcjr zQ{59YrKS5S>2eEbq6MTC(usodtPym6Z&+ehTaC@ZSMC?>cW|KB%vmk9pXL=5UdPSd5LjyS2O@ntL@-OoOssDZb(NhEd-GPF z@wi`ulc|&>Ef9NmlTPKbZj$E(`nNbQH!yaMp~WUb4C7;jtvwkOrwTU@MC<~sobsd0<@ z#L=cM)wa@uskHV$Rf4Vj$)@t*Gfl;dY{idktN1Co6;A|Jafwy>^Eem6tkB?H2WbTA z)fR6eudVuHbJi5@{!UPrWR%-8Tp+MB+*d<$J7aHgC$i~dXK%=8)*~G?l$PpHI1cm0 zWXs%@KmKSA;g>o6Ib5kRV=rIX>h>ROW`TkV_ts;aencuonNu>Wft@bBGs29G*f@?* zYz9pKRS7qIV!UD6sh~!?Ek{vna{}Nroe-%M!d|8KP0&&Lx`67X53QFh5^uQqHEMq| zTt*e{{W}h2A{f|H*v3J~%4`D`*#@i$PJG+A!%_MNFJc?xoi?3Oj{I1$tyV_VMI1V3 zDPgd~eKC*c9J_X&lv+P>eRNqF*guTRq?7iB2&#DJL87g>B64@?2zm${s55d`#_8_J zcKsv`5~;=*USOv17I*#iJL%SGpni9HY!%kb`oZ|~Vtr|Pbqu#RWt9MbkUUbIG?zr% zK2Fxzeq3VFu)+4@k1hM|#}@a0P}0DWIwV$AY`AqmZcokoUs-}Rm zUZ>h6&{L0LBC%!KRF)MJXilCkX|{3(;E$^rH1JkNb7?0(^(~}U)o^kJR^)DR_Umjs zGV|wQU(xDshvjZHliD3iOeIf1OJVL!{t*T#3h53N+dSQYeTg5si{7gjb)at<;|mhH zJn5;T$eB;&YhuX@S^uw}$(0iqg-M>vw)B_2de0 z$VvUisr)54J#2`-1lAgi{e6@!V*DjRsgKx+@cYj@nQ1L2iFUM{8vY@ag3e9{7`fqoL;`9c2~d}bHPS;R%cPQ z6YD^+#=}dwaV(3}|P2v=xthI1g z*O~NfBSNaJV~k(v8QrrxA`2SQowMr;-Q6stIk8_;6=z|CR@FG<=-*U5ajxnaYW%c) zb$ipAePPo*y^}#@{6RI6`8sJ@hxlrniQB%9fPy{H9kmpYD%d|UO95E~HGWor-}hVn zR!D;K5s^OM;v0~Dy(2>zBbn0kl-NhF?-MXl@OIW?psjT3-28-f7Z@G92649oaD9K{ ziLZU+dG3J8Lc1K9x`G3jvov8KK|AIdAbJ}3&Gfi=}27XX3{t9?Jx2*8(yh~@#od@54f8|&FlhnbnCBRP1ugE zOv>|je-?duS`RTgIeIVg!HTBH5XqneSVc(5Fr7eToc_sKMF0+*ZdqqU*H(v5lqCJB zyXJmYvdOEeiDSj2>JIY?nPr0Vh>OIN$6F=ki4>D02uczq`a>*$?u??%= zO#`cgb-24mt%833n}4rHa8f;4j?W_ z7500Qw<1M_$w?ji6WROsL?QT4I3rItn{9QasFaWpFZU3<4xtR|;)7`67 znVbu3Ce63-0LBe*2sfe0nbL9<-86i%0OY{zMeux6z)B0+{0Dx|R`}zUV-NV&->?;& z(D`w}_2?3Jmik4iomEoUSwA#@-qW1}^J6m5HOIrl9{SGc=E=sf15p>mKqI@lT@43fZc*F5q0Gs<>8FCIkd6r?J2HZ}b_%Pr zIh=VMT;V+2XwEVBUpx2&vqW=7W2xSeI|y`F!ske+)mT$ihEgNAR}mQ@l)9{hj~@CM zG%|H1m*C*d4_)B^vs|p2Gcdn8dCW-Mw~cf!78Ut7DZBurMUPOoOzGn&#Z>D=V6wTP zW!hx8-^0WQn<{Tml2Fr#G9K(2*-JG>Ca*6EC5KH8B}YyRGGT=h=TEDeJrFaw^Vt?S zD-)_1Hf>5@VkZY{S3E+-OzCKqAsL__a6`4jEZoGf$vB>Q-&wd8L?CX3e<77j{9j05 zf#eAMy)}1o>STkF_&S(6Zm6m>u`13Lc5Y@ z-e?h0#m;f;I<%i)XhS`?fpBl2iuQXqE*(v7N2pFp`3iE8C@j$sYCocEbya@Ge1_VO zF7vJCSS$tIhkw>LFEyKr*XV-#g9Ir!r&H`TZrVt8sSQo2G2pu-0t2$doh5cPm@@Lb zD(d7{ClcCMRgNIRUR4=U7D|j5ARv;Qy|>irEX5}IFcce0DNcvqTjQ2wBI^QK{@eDOff3(T;8CIY3OowuTPn9qt549WQaia)&fNpI;sj%azF;J=`qoFLz+W; zfE-96R0=XYUwI7~eg&0y!|f-8)(gSHeo@TJD@*UDb}B1&!2K<@ewLL71W9 zJq>`pdIZ}472$jJ$hDJ0?XNGRmVZ22ih!@&&o8yhlB=j%D7va&*4on3Iy*QLv8M%h z#S*a}Gv%~zvJ<`+%(f+-AR_U-rzIuV?uafAAjBX)eyyp*u*s_{J7bHcL3VvvU{3db zfjQOv^2-})wjYOY+r~{jYPL^VtW`6&r`EI_=fpNcbu}$hIc~{IaShG&Hu4szmo+%m z|Dr!*<}KQ!fAI*5*bCN3dSkbtYWzdEb-0TX#@}Mph=77M zgYvNQ4*x)|m0!*}44-zPw7(xnFTPLwZ8)xQPtSvT0BE_2ou6v1bW!-zSd{b}S`$ z+xJSNjZ^oJy7ZxD*YQql8VQv82Ai1E zDEI1FgQLno^tK|@Cx?`NBd#* zfXPeuGShDQC-ve5>8|yvS-P-Z#282n!$a2YTtZ|ZyeD>=YY20YcUWs({ic)#r*(Rz@2oOO#u}6T(8|0BBp0{FDIC>+Sit~PAgGq38Yk~4j=*6{kh^tLLVTItD8bP4A8au6TqL;35k0&q1gR@lLu#SqwUYw|EwGCxjzHl!jPKgv>b6Y0Qx`yAAqQUSX ze)+r2$9A}6Q@4(gc3{`r0aUL^6I#SbeWBBr# zmT8em(KVInN$!_ibs`de&UOPt{kVN&r~W?PyzlkNL?!CjjW~CR*fcHg#VEW9OsRaiY=h4vgL25x~wV-QsO;NgQ zvE19`>ZV03l9_X=IE!&Go!R$Q=Y8oyk|@_>mUDnR@?W5CMm^uza((d{0i)MqWqfpeXb`3 z59Mt7b^M;-H;@DMH}kuT-zt7P`2}&7@IB8;p6l4;OY`f%&f^e%Q}{j1?>EGcXGiTu zemL09tm3zoUxc(bv-bPH@hhOd|2N?NH<%-7(>Q*Y{Fk=0T`(~!D9Hg=h_a+4Fg0X^)|lLNXZ9`J`)<*uMSINd z#*-qHT+m0i6;vlXWIkYjio5f=;Ndc?MA~2EJZ$>n=!~Lv5iUd=B}dn0e=t;rymr)i zee<-tVse~C4&Ch= zG@kym-Zuu>B*+}Xe3m+{g-31ym9U34px*+NZyyrEzP>qOlN{cgJK3kO6)N3hKf5Ew zE}zjqM>qG=!Kq}ZC^H5%iW1}~gt*Vj_g`u5>r3{OwR=b1G1-0w2mwA?CRD{-HBpru zT82_QGnP7VucZyw20-9)T#^fL8NIjC^jh0L+kaz&wVSnBH&Ta+%pTXLf5WF8xEDOJqT#D{MQaH-x?xk{oO9YI);4_A-lRCD;nRXSLkpCm zz@#{~VN?4#=M*YMp-FLE!>8@$4DFy49ZZVj^BO4X1le-+(@xg|le>Uv@oVk9f9pPb zZ5M1Um?=>~X@^yWc`9k<4DFb$;yFcoRI$^ZRqVWH6}#+N#jbl+v3Tz)QoEg3Qaf9* z{i#?ebzxC!9=ZtqbVv7Df9-cJtWU{6E;rd{w8&5qy( z_lsiqPpWHg#`lTA{(mc9uh!2a)10b4C(fzva}p?kJUX_vAJXVR+`u*jKpTamJh=@6 z5Jv%NPH98I@uHvVKBuAIMJ-3 zYQC*OFm-(5wLA*4SUYS^jo4c>8t|`ZgK#xnzp?!0v zY2TWyd^HmK2g?Y4wDkNo1Y@sH zx1(=yk{|QEK(~Noo%yutK-}p`5pxELn3UQ}W@$$@@`ttf2K`BYIx_uDVMRv1Guw1n zG~$DMCY7l5*QqpYHud<&P{Of(!i)I?&Ks4mzn}1D5||JNs70c`???a1ef5_Aa3>w!#Nt(q&*w-G` z@S9E++@EyDH{}i>YY%1ZL5=VarSDuwZ|jN5Biz=zg#S%Cu&G8p3M2hRg~n+AC`Kfq zr*-uD{%LxGw3eqWSL>t_K$Dibp%*6+R9dyl3 z@&-P1nv0F!v=GSKKX*(4UyVLYGu{7N#)E+I{it=I zawG4UOp(u51?66`wE!z_gj*-IMHZ+A{+kl1Ss8m$voVs+sOF%Auu=3M@?mW6Xu5?P z7_t7rWLSxR5KlLx&EzN&FT0&LHhy>>HP@wOfG+3C|BysoE4ylkcumW{pQ`a4JPL)7 zme{J?UIkPd`aq@4BG86@WkkvFAKy?l{3o&K@C(rWp%|&pjtGStCZj5H>Ykal>+xky z>N-?YvfZx7tb|gz<-;VvZJuyd_5_a*m9Kedw7+Nl_2ICJ+^sk{C7{%A(% zWQ`|9VAt^({!=C-u~0RW$CjBoqz1I>5+NS?q>9d0L zW}Du7i8QpP{;blk4AOsL(|1}TT^H%GtGqEmntXHsTiFt+$(44lH#A5)%BJ;M!l|f9 ztMT>=(sr|HJ1^n*)uiq3l@L|i&`F22yI+DjLkUjG zBuduH?(w3cpYx;N%ttR$^kaTBj!OO94=DOhKYD3C`c6fs{OBk0(HTWw?ng^VvrS&F z=&^pZS)vUjzf^RsA3YImle-dI1P8}#}UaOUo+#ZnIjMbjS}PT4T2Z*7TDh&ZXI=@j!ukl|6> z{m&&|c6txnIKim6pHCo8G*3SDMR9*uzNt1&Jt)DfYc+AX>&T>zD58vlxd}w57m66G z9On|DE-2zq<)|Y@zM(L56xepu{NMGDn4U}C)zPxO45dK%iSgvSDW2GY}RFf zSYNRkllxzJhyPk-yO`xnm~|%*(TmPBzX-pezApCk6;{0_8|~~BaI#8g?tyKk`-Ip# z)m?14=+0Elm8Bz{l;$J}&yx^d0z*R*jvqwC8WREgRYW-v-uN%MpaHC5=eO;3(|*Ab z>Q@)U2k?dL*Eq;CT}f|BuMgYj zExx$jP(q*LKA5M<41N$N2PEE=<-q*Efszue2dY=_m^q0J!UgCX;x-=)iPPG?9S#2? zu19E6&?g$G9$|8 z@S<#Das{lvA$=!lp*cO`N6jgZ51msQJ2^3V5Tcz;=)pyrALeQo{e~Iu-2(y_$Y+Ho z+RB`}d-^6>FU={BEzg|G>BCKGe@70uALCKbh$Iq#aotl_@gsy;P zc1@V3%l;~Yj31jj*(o1!j8i_c&gq|CL`5Lx@B9JUWXrGHG9&lnUHkO3KdFh@_ySW3 z16Le7+V}3&MdRTZRUIv7W0^UZHc5=XH(z(dBRzN3 z>ocWK!R>jZ#z{R$=jOY}i=;?%HZ7mhOo~R8$oKaR+3Rb+Bw}8lTIFsO43QIdCUA{^ zP?Fm{vfzV0-|Kx+?^T>mzFVJOQQzwBs#m>4jF8n3!xSYXE>JnEUv+n?32|O^DATu= zD;B5)+Gs9-$*o@mfIjH%Q$S}hu-aYM6PR3>Me$82IsF)I8e8LzLv+=Fl?|_UAErP( zK1CGPfA!hvg9MoS3&a@t!noZ}n6HZ&pd&nQ9@!-D|K~W=OPSu$^uzP)baCZwlgG4A zxcZDk8NB2*NbsNrGCriEQK;_`k6Om9mLS$E!Tmr!J=y%*6t&jgs7AE_23X>$);@aL zPMO{PPY9KGdvz({l@ZMAdjkH`g&+E8eHgi5n=BDf7!5r+2TLsQGP7Rz{A^qN(XaOW z?^LbN?*sU@!5{tVcK(jlS$V18FGzCQAHbd7bjr@RTOdFeC2LgwRrQ&WV~6O~I59DkR_I{ZCWTJqEWce2Z_m zbNE(~dsuR;CRHoAIdJfX(}1kxeJ4$Y^GOD6fj?+-gg|gJq+#JKK1<>UMuz>LK#J|D z&6oDug#4k)v83oA`_q&Bs88HgL>Y0x99VXvXLBCP6<&Eh6{Xy9k2+`x#+lpr03l;G zjUYvIzob(0#-X*Pu%$-2lxrpLU60AJUP_uHLy+0==V>_Jw*No;@%dd)G1wR)1AG9|~HWeU|?2I!0MzXgh`D2Zo-E*q} zJkcb*PahmUeemSKYSyv*lR|+b#W9{6J8?1JDJO0l_a|WdlVz%OruGD9qhXZobdub-UO_ z2Fy>~Qg)}r{aEP}(R^@Xj<~qSoz50itLB^3l^d>$5wZQl4U2tQw>7;K;kW9!*yZ7x zreo;)q|2rD94cby@g7YR=7^UHASj6(fxc_ zZfBR9yW9`#0sy(6XU3MQ%wm=YZs?v(YeQ*m^36IMqqWuUtzW3uT5X4Dq$IRSWrQjk z49M}X@lOQw{lNraIVrgmGwvnlN%~yNn;`s ziE=s#A#HL~3=a-$G!lAEs}7~(*l^}t+>pgiSN8`41Ls5<;*+F@e!>h}{C{&7EN}rr zRB$unVZeM;Q$F1meu}@vHO1$$%gqf9a}|PW4ry4}ZIE#YONp9<#@U&!Z@sf|9y@w> z&n*OyL{?E_=BYs%(L`ry7?nib&UJ&v>cP7UaME3xx#da_`_+!FvF-`{tmuR=X>BcXdCyH{7lEPoaf%DNoZ0y*-PLTnuh0T8vf>UVdPxc z*w#}6{K^f`K=f~xc$}2paAvri6dtfTbJNWGlCrRg7+bKHGG~{$^BE2iT5YhKJ+8}c z)|or1FLvPE%o!v?%kD8!f5!Kn774Ay?`C7WL<>&`CeZTpD>rmvi8Hx$zPEdMzTf+ww4CQuT*h6?7f&!GXaD zIyi4J`iP!RvK2r(mW5(trZtHHa3FYkB-12ZswXFAB4s!RJg(-hDiW{TEq7#B`NJen zX5-c{m3k-<-;mpx0=*k1PAZ9A7|kvg&s?BMB|h~vC^psV-ZVa6Cd2wUYEG{ifk-+_ zgeLQb^==$`p!Gww=y~pJ5)9?9cVD1_T>m8oH9Oa(ubkLcJ1JD%+0Bxy03#0AG?Sy5 zn+*urv}R*{wm~5jLY%zuNOE~Jo7VIknR>ZCYx3K8E76#UNTSg&=Pt`d9i72NGbPoh z10v~Jsy33gCDJ$9DQ^mfma(C>oS!Va8Mo3cLez_9a3KqG)v35-W;= zU>)u6f`*yNpiSYp|EPcFRS)&A0&kG>)YtSDqb%!Ok#3!LJv53GlKPO!V3tD~miViP z;kH%JOfyi<3B~uRO>W>h>+DQ%&fG!O8-kSBze$PX1!U%CrQl0#=0>%W2zB=DG1V0B zXf~Vu_;Eq)x3<)lJrhT4+~h8_f(+_}=H)5|pl5XB;wLNLEjFKy*xm097bfDvGPlhG zY;nyW!k?5f`I!82a}gHYIr#UJEvgnz{RXJ!GRqs zz2(y`n}}k55f1cm73?4~>8bQEv86NKJ2OK{ESP}+mLof{RqQB_EyG%8yHzL`DD3=NPbfle+Jb=0;hwlf$>ZIbZ#9YsCx~f{gqMz#92_ zZ1_iA``@VkXVU6=&2s1D<%um9&%2mroReDSW~bFNL&2$ImZx{IR~a<6p7`@jJeDlj*o>@_WrLvTMf$fZuWR znSLiy<6bvyJ6#8!X*WuK8q{-m&-kvHn}u~&H?N6x&FHYvr%QwFE4O321e}$P544e( zUqyQ*6TN9o((ljd6MqLyBRc#|?!^NCaD#ohZ7hilYZ5^57C&p>*j%zcY||2p#d1pG zf5Z!fq=S<99eim)Es4*JWJe8kpFz4$w*D3%3Y&0f60sgD>2_RdP5(~ zODeo+2xJBQzP&%6dBj%Q!Tt8eR(HZ= zW*fG3={wgRK!6IX6=9NMUQdD1k(*aczN|liKdhG`)`^t0+ID{khFCF}u{Z34A0UJ7 zSh*P2c&xly50s6wlp((<=1A zJ@(Vs1#kfo8=D2RmpfML(xspRPhRR2GsT_%5yje@O&`@*hAV(>?1&IgUffO={g*Lc z81MGH?z8&wrO9Y$ZRgqu8<++XqnT>m1K=V7;6*c41n_=jU}<$e!&boW8Nc=CJ<%PL=p$j3HHGiBMk>hjx|- z>&%p!uytBkg7DCh((I?qFDR4AYWhospce{)rS-Q<6YD~}15MJHh&5Z;B!_Pio|R+>P9c{%V<7O#8)XdysG*ZTBkC5&+A-+K*;x2SzhHM-M-}9N!1y z@Ns1&71@nJKTy+_&e`Lb>FH%B>_pSf%qMo@5tJ`Kp&w525%c}IzEisPBAIhHOg>JK znCZ+|g#{b%1=eF*+}T`UGHFxx@fMP}6%zhtB4?^&-sx1EX|~L!*)SWf$+%}mk-k(XrT4x-ixF+(W&DEa=Ye#UxpzosJp1yC|Ng zchO$PY{Lv0osTVyUYbq*T5V{m8vE1T(TnMrJghCACK8q#bWap>Je5;zY+n>P`Ta{K zBLYoq;mKO_N_+dML$%AZK$v+dzmmb2k2jGR6vFsk` zhUljr`VMDKEl)S=7}zMQ0+bi#~O%3h7UmHm)bemvqzUX zxiiJ{bMk9gcxI}dL9q5`m>-%-$@j(Vx0J>QXBy1Xz@!VX_uJOQ+ECT<@FH=3-hCx! z9wD3Qel%^^IPBO80fs9xQTj4b{;ZM6G?$oZ$h6cJg0~v{y(F`*a|OmWW-D2TL-Z3o zn$QO?Gg=0m0eBM|M_FfHofAXYtIG^l9ZqVRFl(nTEC%}46uw$iCC0+K$0zz}csVSe zG1!xtnwmg9Z=^Cc+;BCI%2>GpYT;y@tEV=|c$avO6U0Eu-{U491W*_Yk2P(R_1@O6 zFu&?TTg|VnhIj(`cRa+8fWq*iE-QI8g%V3Hh1kIKdmLAV7lj~kI|~@x{-lQ&eI-aW z^*c(iGX5GOtQJs>%|ocnX9qm@_k|*V$|B zUC(ush;t?;IU5?kw&LbS>hUIs#4$*nElj~%-{vpFKJ{2Xe0kD_4<+m`?x_-P2z!?k z@otbP6mcI#=T2Xfj|!o<_B83q zqp7Kjbm8217e%~%)Pmn~0p3yzuMsUD#i?djc;j19I!B> zr1F)m2qKv6Rup5{(WZ9JzSNMjrhCLpZznmP2E&UC6=+kj@mZ3ufunMFV|#IEA0O;ECEFOMrt zl{tN^7o=cyY@&^C!_^#Bv_o8p0a{g7X&gsi=7Pi>5-{#-nB6904+xl&opw!hI)xU4S>SuUIW z5IIQmWFKCBw1V}_)kJyMn~qs|s6eSdriuXjWnTe$mzlLSr5;B99b^Awg8*Of=w(@1 zAb6yjVeH;(o1hA_Flbe%RZrxcF>K7G@-oBy-2V5>Q?@?Iuwpu?<%gDcD==U<5-EjWI`?LiUInKZ)c_zOg$uUV{p%!*P+RLPO<@`Mrhp?>0&CC_e z2_DyBWD@rf=Upl4XU(jjy`TqEIe7cF9&8kLcS!xWk)tDky_G;7>cvbQef zc9N4y(OP7Dvo>5&9<3)--?%wcizSv8v8Xe$H8OstjPrO*E9#utQeU&2Kdl@YI5U`c z93h-KE|R{iu)Wm%s9K#7U4JFerk^=M-XfhDe_-Su#al_|#(mVsBZ;@=vVJ+4Jr~OL+q&EZDkm36 zw%oaXxqkssq1>yacWdu=qJDWndXxit&;32ilsaqI=%`vPXkx0L^+tXKX_@8g(@$)V zPJr|ZEnKs83;Ss*{)Bj2ZlPapuP)_=ZC&nKt=5MSA8ey%euL)`Z?S|Se`7s!g4~__ zt2pL);bCVqhK!9>0JNwRbZx+ag|1DCn|$rlZZydZTO_Hv%q z_1ZK9W-t%+%VFzMRPMg5%Vi{s%pg8L1SRUqaK_ly^yWqj!Qd`6EoX?jK`@-&dk+^6 z-KQG5M?ikQ?rTIkuZuMVd&p~joJYP z>GxtX81!aN9pdBkE4r13<6WrUd!QIr&Qm(QmsPL9-@iXruTgIYg!#S@lAq^41sUDC z|FpU`g7|!q!+AN`dp2L?E#0ep(Fm@AoG6CSt;)X(CT5pEre}Ar;7lus8nzqTty|%v zNfb|()}FSOHn2nS2RcLfgC*i^sLDU>98hTvUL;cfVwE~& z)OXT1Zyv(lt)OqNS89RFX+&$?QVenm`ex|wKagR(&UDnM5Pt1J(zAy%|Js{ns>VjO z+cgTSI?{xO!^AE%s|Y=CsLX7GXC6xxxyh!=hO&_NJ%W~;W^d?5PUd~RJUQ*EgOaYx z#^0eEuS3Lhd(NmMS7jx>zKa=~Qetb*rT_0<2 zelL%;>eo@w_ig;LjB4Yhm~AbNw6{o<&pk0=)-5~;uD8$kUfa!*3#k z@Cm;kGHqt^dzxR4-wJ&B6rG1hWC@#@FG87i8u~dW`4Ql;!B761zgqC2v=ZwS$1R0J z8G-+1vU3uW*L~bbm}i&mc{%!_jhUUol}(ZZ%*pz7BxiQ2Y?4IKFy*QeCwYmfV3XSe zLs_)PcBQL9s;K8+R8l8nv>(s=N}T~xFz4)CvCtfg15tnSRlm`38k(+r&Q%^5^Tr0%1Ttq1 z#rlU^!g5iF^^YkLSpV=o1U&@c5`%)2Uajyv{;BThg7#DznyJq`Xz_`(^g8Q!SDd1q zoiD69BU+98kvB?A$pfPg_pSllXKAT2uAmtZ9-Z3kKK5DxpVP0W2xH}bvkppgC|rjF zL`6(~8wJlBW~FdOt@6$$pELK&aUHF6{S*RWdz{(P8jAJl+ao;HoP+i)^*>A{a@B+7 z&`>&E!qG!5-*v(OxOwP0n#GHKm72QfL*lfBC_d4%SYNGGD`PFu+Ks7-Dzk=5c7vh{ zR=%Ykafa9UrTD{?rwsw$P1!(W(ch*y;_!br@x zj}-((v*t9y`C&hvKwHxXs;tA1Ff#g~#PI^R>@)~nBuU`57BXaJyuiOT&p9)un7Da_ z!t=;%+8gzTy3qKgRgb?*4(}cQ;lS+yD#}+F$4}^OqlpP;W?aA@Rrgn$Ztj^mslTXH z<~FfcjJmhSU)8K{>$UrModvN5?;Z9pdU@li!#s!X{$-pJ1F+5zSP}m5ku^+hPHZ`VEIzfMTrH}iY zDHW07Q>%O7!A$d)t^HXTv(E>iZ^lU`&{LeZri%hwLP$mu8a3 z`sI0CEoNs09v45L3xC_q486}z*Q?8kDRO!K7N5*URPpWO9>ukRf#lc*b<$?essoDF@qqoGGR)>5NI{s^e;xx+;@*|eFvKQh?o#>8gDw0!vYUz8k5>STFsogG zKMt?4%`vaza7QqVIC&^5k3SC2!&j*CKsyFUngk3vzioZCmpAg$ zJxm#-%#x7&LljsI{E)Nrzq<%)W-lO}7sxw#bFA~P{0h?>fBx3~ALEStK*}+P@ySuO z)^-3RfH5+h9%AfKNQ5a^TxV1o+WxzvEU8 zDe7na{2gWup&2Bp9W-;GZDzj}G^0h;bk<-By)c+ER@&J+|4RTaD+b^` zD%yTOhgbj>zBHsHcVQ7ezqOOnYx|vypSu0}54QCusoxs0h$;T+rf-jnsIp*8 z0Sr%u!I>swyr(I0qe;TOWU)y&gJPBA+!uL?c_5BA$A|ud*MlSL>1U`>bNM3Oq}3IK zRWNx*%4`H?O4w&5T9m?_E7Ps17Q+)TtZm$4G%9tiUN35~f{TXdyjRT9l{#GWFOLZ) zc_`uhfaKUeZDVpSB#-wsY33G(*<@qC_Gel*JD$ER=A_V47!tg4p_t1 z9GvOhr5lHVib6NG*9WYyxXE4sH+E1SRDa;QFp-yNBp{w05PgMU$@bgtAH_sJ@yC|v z?;z19`UXA&0_qCJ{&_Hb5-tKG9t}V^ar=bh)9+C)6w~j2&NmC?5vKV`y^5N)d_8}~ zzbK^}odc%f_qt8Mh~yc5ES6{XFVd?bjD9O8d8WWgoYZ3kw%@B7ss^z;(<|>6R0oiZIc(o7vvs8 z$?$lwc!56%fBt7qE@Q3l#sIotbcD4^LM3FJ#27*jo3nwj3?yv_d@d!KBp~}D_;$waVzz&}a!8Nf0=i{{!k!PuGsI4SMy0x-Uv2^_Y(m_otvTHi8)KF~lozYqj%WM@dD3ypaoWltC^_Br1>1cJ=-2!&+|G#WO*#Mi zDnc>WMqiG7>^F;#8@q$8t7?tyY{kgQFXzgvTs3)l7nwoQjok|9hULmOBR0hL5J-=6 z5y`4eX8w}JJ~z{>&$+4FkoUDc%g@BZ_Sqxa7h|XETeY6ZZcwN=Ffjbv(|4o7F4H2k z)m?+3QxO&p*d7*m2}(3!bv>&5rWa5?aEZ2Yi&3wRYV}OB1qSr3)F4r`i01xAaQj?x zA5x*Y!`q;_OM{)wUf`;T{=SVHpOJ4ZUi+;rz4=TrPdVglLw8->+Q{=Gskp(~lFSjWC%!I?4dn^0_%4|XUN6PkIhQ%o^>;CGqb+Y?JW6JP9f z-5!zgyYsHsbDi&I#^8l2J-dN6aXo;u$eO3)uX{5n?58A22@)3PCi<~v%j{>Lle@@| z734wQn{!b=c2*(QNlny*KH5*YwK(NMr3~~_ZZA%$6G4dU7}rVo$hQtmXDME#V*IA@ zyNBNbexv!JZZi7*BKnJ1!BNt@^;%XmS-y38P5_|%gmF@132uMV_{@6g(&9<;(I`7; z`%%6QIv!p~$eGm0vyAtEDm0-YJ!km3W=pOiag_JHuQ%Wj}cX>r1-nQp)8^HF#p$ zrc~PWAxLp<)b$?^9lA{gfTRR^zUGA{d>c-UGu$87Uus#94w z1^5-TTLieu6`J`{8_rbFOm=EXOJ`@}7XB@95?|6_x+&Hr|MTR}o##V5u}hLpuX869 zP%xMS1%Dxo4?rf^H8W!p1$3RV&Y(h}0wh;aT&5(c35>IUtqQe~e8O^uda#zXw_l^c z;pP@rZ~^O>`~@s?S>!NsbB`*2+UnoG;16d@!tbgISNQg!GBY;&w8BM)Zm0?##&fTRNOu~WU5^Y9h&R(VgESWTcp z>^{bog?<AIqznWZFKSNo0qH1<5A&Xh399x!5}e@FKcYdnG3=#1t;o?x8v4U#i8z z$1bq;CarVhW=jv>b$1!*Vka_dBa78HRIgueR_bm2_9Omieo~TeD}8%$qqdP>?OaYr z|HyAOzt8zy2%%;8-OBfU{LSC@F6?g*&2epszff#TI82ERS`_$LNS)63FPg~lTYcl= z3Wmn{9=~S%10Z9tq@c~Br{d~D#Ya$a zeR@P0mB$Ze?bBPBx07AVpgj1y83MTpJp9O_s;u#HzV%6#b?yehnXk zg;MYb@vggezB%eVE&U8HS;zL`by%~?*4XOR()Z2hIvGtJV#?9}yY4_@jU&UZj~S@D zJ9CIEa%9;?zaEo7$=eus^b5NrYkXa=$_69?3tL4TiY4mn5om=$ZA)~ zJd2XCeU;wBrcYD))Fv70oBb}&bW1AuDI}Gc^!es8JQH`u*H5eaT)F;AF7ITL3XSId zarqkU)5~~3Fi?!2aAJGRKVG|R-2erjpR(P!9`j8`kK3B>@fN2 zni=+FRAwm1l2*BlFTQP!%q#hkIg&aHBKAHz1kXoYgTPw~+xzaVw8I+;tvpU>`$!mK zk+A6rTDgE$(x!i?v&8H759ix~~4Zq*6)7;%-c>7cQ&j_=``o7`QW6h|_Y;EY(6yS|A0&;$C%{KZGR z{s0#ac2C|u#{DVx%;TC6NcX12H%~MZBK0x+-PZ`1=C|RvDX&k<+i2(vY@4c#Z<)o{ zKp9vO2D)we_}M<#y9<@seuo*b$!WkI4A?SvvQ`FxDg%o~=HQ)-IhO)mvRW%W5mA9G z;p6%J4<*4YT3@)oqmtYYtuL+bb8==@8|WmEYj7J- zbb_5X-9%?@opH&8#hB?B5$Z@LQ5O-)$S;8iHK&^hwFew3cS~XM;5@X*o^{Ab-#?cG zj{!#1C_>3~zv}KgtMz`14ldmriw4V8o6^Veb%6YZL3?ugac~_ARB;+eM!*b zPr@uJ$n9xFlbmD44V@_(j1;ZU#z{_~|1tXeA}w4D2g&&px^LaV%H?2@>?(EB_6gTN zh;DiW4mS;Qz?u@vrQL$H^|#jfC~2}8{mn>C3~WZl@4gTD z$>h7BpToQ*Ha3!(FP4oLX8qBBnVaVEZ{c|L&rA=f!JN=cd0sEr4YKwUn7P}c%|TK5 znMyqy|F<5HKz|$Qaz;?FH_M;r+b3M|qf|K1xeD|K2Riyz2Y$7Tzmj|Zw}&DEhYn8a zCxio|ek{AA1o1W!KO{H~cao&4)EPxN|Fj@}$G{EW-H}V>=ts`Q-8BP1A3YgQt9pGh{)o7R8(k6~_uw zWIL5Af6){pVm2W$~`c1y0@hi7qdnIkNfL;Gk@x;6MIKy~r{7IMleyBBV za8C09EB{Uhp#KH9FZe5NymkA)9%O;t9bi4}ON**64E=U+u7lEGQBQuzfO+Q3JKhD zJt-4=9Df-HEZJrm=tgk%B`J=KQVlBDV1sj1oM4L$N(xXlas^i9=R~elLHTb{PS*yP z`vqm=PO5ptfz%QkTPsNW9no43p0Glu?!wWT=2RO~Y z6ArTdHXXsAz=2nN<=eP2FkQ;bo(L%QH62msl#Xa6m3!{bTj(+;1C<-E?Qj0Ja=(d* zhr^1Km*WnQJAPr&8@Go?tc%zhRIZY89nI=>X{=v;#)($0!*aRSxwVaRU|c5a-?@UzcjcEEkC#h%Ez4w@*QGC=@u0kZJ zASb9W!&>=bq-G;s+{iJC9yLCGENSUxlO^8U4CkWY?#=SF^dq<4C2cI_@#%*&Vwq-R3{dlo)BFS4#s|s+bklgj%h*X&aTsOnBr+o;*LqN98?l&MaD4>o zZ10V}h?;#GeL|OApbWz>5+$WxsBZxHw~*h$F_bKjUuL#JT4tu1ww0XQ*{_hyyI6`)Tm>uALV+3|$k!^9uYn&SofFdB25Y4KNNOpJL-M*A3pVvFhJ(QN7`7rIHWAq7cO@$$E zrj&EzC(OG@=7K@zwfF3ToZD9@-bYRd!T)XVHnNHzi2baFd*Eefc_j3Fq;fg@!Abpt zS-_<6$HuxS{0T+oA1t7pKVk$PCD_(12N5B!mhbOGp`*^BxR31ZVOl%@WKTmwVpOTu z!(IY{f)UJN*xi4(nz^p;Y#2j=-cI6Rlg(%KM#JkQL%;>`iLmudwBFyXiN1=GYO@k} zW}23+-r)6cd}MU+(mF3xgN%(*gCEHlMbu%-sBXgI3E)kP9W_`t5r$HLTFd}`;-qGR zeIH_&MlCfUx2V|2%2qM(flmt_Ezgkea`mS-=G{h|S?|8VjUC_c?Ja27+W=?kf?LJ~ zC$NS}E1x%hjZR)=_{u8xAUVpzjUwJOeGH(2y|_vyGJTf zRVlfG+IWsS$`gX)8ox0{b~BF@j(SjgX0{azwz%hGR7s<;y$hb)IHU4iWTyI+8Paa= z4GENZ)1hB84~mE0ERu%y&O!Or4P_gJt9KaTc?NYRxPoBllWr*cCu>F?W$gsqE7^Jr z84Cz7ikXMHVXNx@d~D62KWt`&tp||R{Tq9$byMuCCzXWyWsQ3;%Y>?H+6!zUs;zcA zl_+c}`I9?DIPV3Qy+_cfx9;F=ba!h?|I3+by1hS8Ib)3uxxR9BeN8K(*z%}h zc%!m|b}=_lLXZOtVtrUISB1_&dKp*;))v?%{DeyFFU_omYKPV>U4wq)|QG@NgN*? zO&-GBNpMn?e0QYYqiW>U7H=PdS|BeqE)9MT+P}@E0W-}WNVA_pdPuiv21xB6Foga1 z_BL_E0|&OO*U)i&RButV94l1JXIWx)NEjFydzh6@Rr41?=0A$hri4vu9p~CIFw&8wvOR(V!(Y zU_U^8&X2dRC^_0r6uqKk7rMj>Vv%;P1mz{1c@FSNd@&y--U-AS;isXZkED+lA~ORQ z1E*Z>C3~=8$otZ0Nx!AXRH|HV$%3ewyUiKfbbT}BU}oBDYZ??@oCy3)(&>-U^xA9} zDjQm;+qH|*3_KBhEM}O4+j^1g{=M!RQsSguVu|r8NHyDmX+6@d4eO4ay7L?kF3y4$ z+~nh?K_^)%xq>$(Yj&~{*NxMuZd+2;(d~*ama?kf;9bGZj?>gcr#-pXDw1P?8(+-b z<=71pa)U||CB3{F^7tZT!@AH^PUqang8Tnw|KrKPNb7n|qDu$xtBoL2r+~X8iN)U^ z!CiZAjf|PG3gXEa!Ls>M+T+^IQgQ{@NBu75VkX z@gjgf5`~zdXV5P-V!#&|q}NxzQ(x20>aaOlxtU%M8W&0TV2KzuQW~J|v5rbLunK6q ziUxI+n-@zasH^-&GQxl0Z8e`bGdJ+JF7!n=>0l;gm6r}~B;cMs!g8fJfsyHdXYTGM z9SpdchBZ2q868=GARWwj*I!q$vCw_~w+;OpBZ&laK)L5IIdq7%&RwTOD@(oW{_`fa z@|kt@;LI$cQEwd>1q+&IJMqZ+aT1bw<#7%@)qe%oe%b&l)?gPmQJu5J0(_T?hrv8) zIJMGDE?XSpGTWBC$`99-WGmWIr`H>YtH}>x3*K#}XrLa%pq)vujl7FAt^S9+?Y*fi z&_1leUeCJ(cQ3)F0ja6&F@TlSwBFr?TN*yopQ!R#=%6U)aLs$0^QM2~bB;^HUn zV>78B-F#la0~Q;+*!_udd9u+Rx6~lOF#q=6@P0d8eM#mbj$pkFxZf!PW5zsHYVf|> zzXLF4>|-D>su#yeI)p$g+1x2Jg}>d2jW#f^aX)6J`Sz|8l$oUn|DaI5 zrpV#J9ioGSJ49?a=&HG3b?#w-Xffjm(~Lh@$%6>hMl`x*stB)QdibeuNUc(W0-_;Tcp42;BISSgz`JMYAW##R5Ns$W@)bO zRTFR(V8>ju)Xe8NjC!V73bLbFE@qDtMW9f#Wp-~(JY_x+{&dEJbZqk4)q-pf5IJnj z@~@l(dX5s-jITWQV_Jl`qS7o}NTD{@AjMbSY?g|>z_vrxZ!DIWXDB>fWppJ*A4kbp zWf31>;2Eh;I(gIRKZXj#?=lD<-no0IctOf;!}icS3pY`ES1kD|exM3)oBn0b+D2EG zqg)k%@x-2Jj0c$lbTIjq(#VKq{!^wW5rIb4UH@sOJwE zI~0o32R+4K2((J*q)a7aJx||yv7+=cyT82^!ubmd{Xh+J0^2(q>-gLm@jfA7^Ls#oVH@K+YZ9o@0%RAk0o#vqd zWMc{ce?pe}24aL5%x1SP(`S;dhEc=Z&?Fb(zRUDntT5&)6|W8ZZGc$cUK@En6Blaneie*>d4TC z?Y$vZTYq-|e0g9QS|)Fl+Uo|Oe*kt4V!HQ*Nk?yDuxS{h9?4AvzG%l7|qIgl*2_Ko&k2=+@LGi9Kc%d|>w!u=l>#*;#Y9tWKS5 z2Rj~kI34?%OF6i-bCl_M^PdDpFW3ET@;c z)1XgQx%S?SYnKta=@Wq14{#}$N+7c z^9g!{cI+$GVxMBfi5@XtnNJSdO#ZGiM10?X0VIa%$tgkEFtpsc@o8}1-djw>TZQo~5C zM-8c`=-_1VjZ~|peU{*rcE8oV_hqqdggl(ajeyEF-K``e(cL!HZuTF53+mj!b3ap} z-P^5qKWHrQV|#jHJUlux_Y-ql4`ktnT?;$Pr0$7kek+hN*%$aXy&T;JI*q%Rq0qRy zrEHb-U*jT)VI{GFyze?t>J5`UprW&LrzCj-I#~NO&owU|O2aVPtfqF#_dPwrK+!xY znktG(agk4ozoLS!mK5sRX!k%mDO*%)LBZc*3kum!XbZwpG6IeN=QqRy(#i}>y%9U# zht+KMbiqWYfd0b#YfW^cckK5&zIL?P)8(5>wM{fkaK=e0nP)u57>3c|ue4TYE|V^;^)uwc)jeUS9h*B!M?1t zfqChp?hPu?3a8noiUw7`5p<*=aQF>Zso{lh8Y#?j4D>UU(x0^p^A2*2CLJy&d87pMl?&O{UxcvUhKCmJWcK-UnELrG07^}I2minXjJft zEeNk#)O89C+-6NZfK1*Lc!>K;8o&9D*rDcrNBsC;Hqf3Ks_ImJHr!6`B9YOj$9p`QJskRL z?@f9aStzBXa*_<48f5)b%gnhTE7PnKuWSV6LJ#LgIR`VRHREYlde8|(U@0u!<4MzO z)WgEFbc*dwEi|P6x=oVq%WeXHnw{QlfW>IWCNPpSQu&dDjp*5R@f{tc#ZSvTWG?9D z{elbG_dhfkFxdCB;Xs7d+q}7qHP~ubXL!t1-?P@vIlOLC5yF-|M#-ai0$ez;`F4(} zSjTVL`)}Cr1tN!yg5GVWVJJS}Wa&hms9MZ$2+*kFHeTqp5l*xMKYb&`;=QDQy z5sIIbujPlnedQ*%eSt2pyidEvzH-03<5|$?{$DarR$*XN)RWh1G$73hvjX|&1G=!{ zbvsD1WLnJLPr_e}7s$+k{d%|hdX+9{V26X&kz%CaBr+nq%IMruV3> zHV!M>l;@-eftoI4#eSp4dmTzKgB2usw^EA`b{1<<5Lv{l5kme*nd+9{knz@*NbA~O znOk?#=DV=iyxgeyje^5&2lQNlS7mYU+wWo-OJttieF&E{yunxfUr(Z8=-w9L2K-%W zb`l>E`nH_}ydv01OoK&8a*|=a&$$0es`nRFdbqXetWUpXE`Jpo0arU{q=r4X)@s5sn zqiNR}VvTTdnm?2VyIh9O*ZTVQYh?$jS}&qjd*xenc?I%_Skn6%8;+CmNRDT>U(-Na z)9?n_3;Z}1in20oFZ_aNV# zfRW3H-Tb|im;%Hz2yGwYLoCE+-oWtGcj@Vmc35tREjLW%WN5!wutdjy~!8bZP&v~=6^L~EID1Qc8m^i(E?&AJOiI z{Jn{juE+Q-kMzf@>m;#$;VD>%Hifv1yad!{IZ^;1%->84jCK&Ud_TaHFIz z<|*6@;C=1F>GL-3`wxxs+Gv`)5#0KpZq3CL^Bb6E=Dp;_Q}yK}5$vJ*2TXcY4!x?M zt$vwv(~)e{?!Rnx10tt6C>PBrSc0ttM?_@NV zx?`xxtZtJ=fLp}t@zYiHQWd7#g1s1Dg`5T#2RdHD^=@myF`)Z~q<>jk53v8~)8Q zS>dG-;NpY)D_7N>xxMZ43!$ay+tf;RXTxG+Vj6SOn}u1k>goEZec_;HjWcQuT^%yW z5Yijn@Aq!J5)?pT5#8@aVRB`w>NM7q(6He^Ge8R6`t&fI%n%OKmfj>B65OKt~-`NA_2;AFMa`j&5Vz1{Pk10!y+g2f(gg= zkDMUC__3WAYuzI`US8di>uW-}UW=878yAgF3m|(5%KFD2Qr!_SzzYG;Yycw(^YTqe zJc=ztnTR@mGG7(uYiJ~U=1_MQ+(y&QeUG5ig7b}{6X#`}3;b+){^$jvlk0Rj85t`T8U$9honJgA#PV?WDF>O4AY`WZF6P+1xc0bA_m4fCMe;izbjpQ3<^D0xAHk&mDHrnf^ zS;j1iIgxYS%x!fHGAHY2zAD+ef-%8!mo`dOOtHGDSB$ef!#yZ&DCh|7d<};jO**yH zs2it&-0mi@#=Vq)y)YhJ0`Ka$q_DzFm{okAdqn!hIxR0;jeS0neMCsG+iw_Mso#T> z>46~E1NVSYhtu@5tDW~N96Yk`6EG8F22k#@lfzwO62!mUmwpA5eYORfCY|Bu-Nr96 zGW`PA%RXqYsjIAYnUu0-vN}b} z+#MsTKD{1WTRS^g6Qk)@jSj}1Z+5PTjQ_nkansAaqgMHED@JOT@s6)Tsv!t*emi5T z0p!&3$l*NcTC?oh{UX_!=RvHI>^VET9e*&CyvxYU6=n5_XUgi+Z$~nBn$to(r$bS^ z{*4(_HZn7UW77PLt%?YuNY*(0Gb`v8y)%0br#5YoY=d56(e1D62G2jJq}1GtxMrX9 zMmVaOp4@frBDUMuRL8{kxd(Rj+WO4Ma^3H!PoHbvpRG@iEDy6e?^nWxuud-m?bUWl z{}4|F#dn={PI<$-p;+&5Lv&C-qDo^p*jq9VWS7Kdx1BN|RG&U(P(58KS63q02X*>g zU-MDDbMi-#nvbp-9nH*+XlT+KM>6f|3Z`7<=71aSM6cXhKdf|6;mzcwks1$NFEy)7 zgt@5kbEXf5`Q`ScqHgj1h({4ykBXsOU6W+-P?L7BM4*;CV}LJ5>~p8a!b!c!LL7D-=qW$r^GPYrQXNw}_cCDnpw=X84jPGw?=UEnK(y2THgm2vk+&AH-6 zm}7N^-H(sjm}kw!JqGoSW|Q8taiGBN*%;wZ5mI!2*4>HLp^teCvCL|5pX^`p-7_)Y zw%#w3ZZSQ;=(fJqBG%y3ly6UTEk7_Q?*!$0XBuCi{8l4E4DB~}D}P8(exIOxe_Ou# z<-;2VhZ9+9tD2Qb>!1i1)q-mo_ca@J^<`Q9{;Lfi-l$x9U%<4tSGV@I*GJqxOOX&7O$o=!3|0TS3ey|w1M}t~j2Z$e%zZZRGBSZA8KVdlrT0WsM{Vv%` zO7oK;zuq=}csmIr(=TCo6w%y&v0=U@bxCaZMY?T{PZouonO8DFas&LhD&jcozCd$l ze%>sb&C%!UA}iNN67PP4VfNY930w{LAAUeaUu=zXrMM!J#rcLFSgPg4B*_@VS)I-8 z0dp(E7ms2iVC@yO4r`w@=)Ca5rFkLJeSg&=#F=rO~j{9KRyUQ|Z zsIEZN>KJj8yH=-CYqzR)BH}2M#*4~*IJk(+jua~^fkRJ945sZp zb3O3o{L)CJvC07M@A*T4eDY^1ou@MT;a64I%nderg&!LJ1Fdv%EMlg& zZ%<_S%ah&8?-!KcEhxXUUp^?E=T}A^8{_ZLkWbj5-S{*Bn;lw|15mR=3w%4pFZnNa zXlHStVVN1ZS(QTSIbU4&fmo_a{ztOPZ17b>I{f#o9$`^Lbe(j+a z<*jkUJdex4$F-Pyg8tXLyC6Cd>e9HdV>9;biywp9-q53Y>yWv1->q+>P%U+Y`v}xU z-b1C4Sm*9Wf-g~&QA_$$?^@WHk!8Kh_^LD@R6Zo+ct0VcATM;;RS$6cU{%p&OI$o& zmcJk~oehuaQt(t{1kI53lLXJlB4YT2j zqUC=UbSN&E_oor~D;&B+(g-z2;g{i>@>m_T=)V0MJD$gJ*Apip@S!T>MY&E=G<-w& z`k$ZqBl?M+(Y$Ot0-b+IJ!-SR?U#ovb)gO#3bYZmX4|Lt-MG2H$hW6oqgnfC6wWq% zH0kw;O=cq*+a+8xSBzxRF1d^N6u+5#K75Xo_Twy=@zZ%15EzF>IAt-g0wZ&3i`#Y~ zFv8@9(3EjO*NeZ^8{l-N0`a;-E;hW*5S%mOEi(mbEqf})AFI0DOn9H2%Gz;YZ3*F7 zY#Y3bgK+vL?SS(5&HEqWY1;H?m|(;{CpazK7mJFT;h|U=FV&`cnUuTE(;rri+wL+l zb@Fq-MCCV5(UPgnm-iXLhF|mcY)WS$ZQ-jWg=zsfN+(WIE8b%2DR@uPIdfv65$&Ah zwFC<8+hl7RxCdXN@`vxpJ$R)m-l6-p6@c84c%Oeckp6-{nT)s%Qs#wu<$x4$)|u1L zm9deDmah|=L)VS+jKr8VNXT(aHp8HcZSCz3sr$Ft;1<_2gW05@{sUj$EBp<-L(yzP z(Y)>G=YRt}tL^dVuJzp8tsejB+#lbmCF^#-td~|@@{W5pI$NZXf_L0KVM5#Wj=P1~ zq>=pa9(b93nQ{`w#rZxxjbvZcr#-d}%Zr?-7hv%{&Y4v#STDP*A8-KQ%}rhAl)mmp zcFB>FuA#aINSvMb8CtoX`;8)Iim#rT08 zmU&PET$j18g+IKQk=JWT2sz@Xz@QZ&xc{s@3_3h;V-y?f+%F(H7{5#k?uL1o6#@IG z)ozGcO%+P$xBx7E?6F|@I=r9p)!w8A^`AGIpye-t{3wAB*G9Y)+Si?TuYq-+NXF@g z2ROC2o{67W{FLgsVSmk{U)t>boO|_Z1@OhXLzo6;`-f7V#fqx!Qp|RaB$tQ)5~wzFT%4_!WQhy zxN75>ZJy&amxkc~D1>kLUV4QywnY}-=vksNlShJ+SN>yzfqnAIPjw}mw z!4Viz1F^=xVA1;-=Sg{ob7Q0XSx&kX11A*1h_C z1iqc^_o002Yc$i00}R>aCzv>}qN!T1qq@40S9R_E6EdUa5~KQ?NwucPQa_1%h+(JD z8R*Qzi6kcTP+yr-K7u9QSZ8dPRL7J(&2Z%|G48N}CxqiaYIrXsk9>WFm^a57S{_-At|d9>9-%Aa zA5?K!XO=;q**riLvXrmTvR6g4rc!zhW;|N#^s&frecY zS_>OCf!th|VxRWc{;X|nYujJ#8=_W7h$I1D0jh%jT0yJ5%hn3gLK3w3f6v@|cQ*n1 z`2EX=&AoRXXJ*cvIdkUBnKSEg0LC&H8NWt0GmlwyO+vKw>r4edUY%{Ig`isI%GM{8 zD(s8fV%XK;0_8sIJlP<%_itKmm%3|>74Udx^YR_*QsU`o+248jX2#md#6+TZ$ihBx zfxOAMOo$HC-t)kA6STit- zP|bf(wY5W!H{0^cmNo)H@u+am5bZ9q>Jb2C%^z74U;$es$dn0U{iNg)l-Q!L(&Ne< zODMi+0bh2m>29uyvR4M>TlZnTp+ndxF3#qY9A80NWryi4+ZQO=t?7FV-l!u(+uDp- zlCev19^Q_g75$^|u6!r`dpT+6Ax1X3V;~Mg)~kNLKuuqu|ZD{6T3Ln)0IX z=k&O`pIwiCt&Olyd}FGWO|Pt-WNjY7Ap4ljwPs)bZE2dySMmPsY+d4r$@NNo6VK*VYnmN;cy*suh%Mp^FOC52B_7Klm@i8BiE52+kYeRol z1*@+M(Fdtfp?Y>g4T^#h$&0tkuB_4^4c-7JI&9(IP6QgU!Cp8YrLAls3Tt{^myLfM z?2`(E?r;GqAjcYdVG<^$L6 zu#hlE4b>W`-`bE)@IwkooXwD6z*#NLmu4mY&S)q*kvPfYAL6^%#djI}1+l?l=^`eS z;9oEZ{d2R-q1d4u%(Zh?k1N}U=uJ-tlZ$r^<%T?{;&yuVlLxlwIcM>jFDDox$7jZK z7by#c zrq+$rJa@QS!uxYb9yE9LvF6@MEfhuHdh zk#Bu2olP|GKs3K-m27iO2&!9~3(NK;ZAl3pfrzVohsvAy{hpsG5X*!*iI&SAy~xD_ zXvAcO*3oa9?#y_I&$;s; zKAlU$di;u&_2#S|RjKZ;jC@*Mq!=pM$u|Z~?=C1Fv(ReaO~l;O&I+SV}wZ_HWEW6(p(-HvUM zWJUvSt~AG1Hoda${D6550%X&^fTs6Umb_f=4;bg%(Gf5UDm^c^im&PVmD|BrG*I$~ z@{ioR*x%5>uv}kRUbr4Hp}=o?JlXv5mvAe(M-ZEw7BI*9G(A_JC)vaaLtXL0Ox9-*=^10HEyxCQ$NX z3exyW&;B!j33$#)<&8=;;0@>djc$LtHNo%c_V4X2Yx9@)Xb-j_bknI>@dhzZi}hYo zSBR_54OBhlzLo8|!rO|oI^qq@EFiJzS4q^dIM>4~Nq#6v*v93imthk?Jc8b^mn4km zzE9ZCC!FU)&a=*W>dteb^E~)*JN+-5=Vs^mN#}Wm^DJA;BQ|AAR(Ny}$DX0` zJ&~l^2ZQaAF!vX^BQh-L}d!=JC^ zXKMva)Y-bJ6EK^TQx%1}QN`L8)sr3ObHYknrjKc^nxuDCRmjlmstUZ&T1T69&ZiCvG+t`K!1rg-GFrhVbktj>*ddCk&_ zhi&;3e6wI<1)s@bN^-KLCeh%f>g&`;^o1eAe|mkGTdlj&^{M<9>f_et=l9ZW4JIRo&Pwb#w%yjXLl4`iF`NK1;O{*;@X`IP0i(ac1wKr0aP? zD_AoWZ(wJ`B88o9aHY2jN`=kK1(`gwf~}9pSA4c^?WtEUtE_fjmUeBlh#&;>SoMO0 zyYYy;k>>&X(aNK&jr}lLD`~}2cXThp{wq@YuVS$~!CddTkoj4n*Wy8bO4$JWRXE@_ zXXoplKK&Bt%N*COo3p%D(*lY#&$hn6Q^^G{Td%R>!qR}-W7iedlIna3cjcJGQ^bm> z=ZH0_{!YnH6wQvz _atblKp7F*+ZSERO4A;8@Hkc1AmQ#>H={YnpVBD^SMuA%1Z zsQL7=w7tcd>%U7fQU51-I`#j+KdgW5`_x~J9%7#rkA_skTw98k9+(-8&)@Jp}-z&oXZ= zR5Fq#Q!8u|cA%T<=&+acOV-h0Q}C#XIn*3@L)#(!@)?Et<$jyN7&jN1)uGs-^+7JJ z7Op!}FYgaumF8s%K2&brSRv7u6CHV57EZ}gss0PbbJ0A_sn89t-c?;et-$LXuXQIn z9rXLwZ9El%`>pnX1i{%RSCwj;X2AH9w?kj5{$XTjr|x%9_x<`McSzk2{)4((9;b-D zkEM#ZBcq7AhlS56DOwp@HcH*n`<*_&QZvLJ`y-(qZ4=@!eTMJ!d8KO#x;9Fv{L_uE z_1KSY^|+Z0*Q(-5G0N>(vqCrT@D0J&Y3&)(7avadMdhHru*ztMpsYlmwq@z&84_fp ztnOj1h*eFJy&`x2HW=%jTFd2VXUT*T^0d)C9r`8Hy+I}(-JHvmGLJb1W&o$_?g+LY z8o_Mz!`q9qX2!=*N&(AoAsc3Zd0uWh&Z=il>hw!gx6L20S5NIvH2k?4By1OdB+<1~ z*zbJCE2w{#X)$QLh->rcV>YjE{Dx303UQ%(e`jNn3KkoRfgtBNBs3`M6|5<=jlUMe z#(F2LF39sWqa3#_YZ47Axb3h$HOgD%B7k}d3TB!H3CItb~TdMX0(IQbnD^I#vZ#pg@OrLfjF3`djn^dZta({b!XRp4Di*-=;Uyk zfeODubiMUuCzKXT$M|Tj=mr+b(oj#%ld5o6Dk40S4@HMebX{@+Qm<%Mc2%X;SqiqO zwdRV(avg9JkMalhW}H+C#l)A$@92|4@oToC&XMU8BdXcvl#?^f+fJfGQyY%6KSVuu zvHc>d37l+*ZWp&yvG=BEU#t}dw|Ez4BO&2Ye?*Q8nD=<^Ri;g`_s-WEKS_evdlMpg zGr1YEaE!J=P5`Uu=_djweVCC=RVl8kyGR)>p}~91o0ad~FtI|}7Hb@QBPB*i=Kd5aTrv=KA%U{8Uz~k4p-m7`aUS0lb z>MMKDS5Dchf#q*YB&40IBMfgxYE!icUla25;imm6SJYDSG2jaTA6TBWGl|dko=76a z-&5#q`p(}`%FZt;(z&H0N_A20os>>o6)-TuViE~I#WVp07%FnyNtAMhvG)eTSH$iu zD#8lj&xCI&Ux7`@{m_GMu94)Cza(!8mB1|qaz)#T@L=r284Jv3Mu?tcI^~F;_8>W`03<6YMi4=Qk{=gM+~i@b|tQn{~+x2f8OZ>s9!=Sqp~Ghw@j!8UAnCUaJ9 zw{Ch921!H+$)dfH63WHj53!yVWi4IlC|%%f}zNDXQ;#nQkD3rN~ASb zQ;BqUi2l#1(bpY(3N|f~)ena8X&#C;#ScR>`S=28xcR)HZP&9XD{2FGi&ccv! z$QizuvSQWa;}A+Z*q8cKI#c=G6_F2dQM@-ad3Yor5e)(1s5M$uj~kI<$*3M1n4-tm zd+z<6yIbLOmGS~Sm#U?q!5`z*429nHGNKo*z9KK0o?+6wEb$RM$iS^s<6dBPONpMsGTEy0rJ>?~1cCDQViK7Xafja~w_$V&-Z*>c%PK z<>;PhbH3jGw!_a)$;?*wM#3PoOk`+p`&CDao0w%{)ha7N7H5|x#!^E$71MrL=J_2T z1Ir%d0Fo&u9M+R0oN3NK>7A|E9Ka??{^2UW*7OJ32jj1R?FZ;O*|Szt2%T78$&Sk( zu9SI1A|_cI$Rls1R=wmtVUMh)9|1xJOn8h!Ih&4B)m7H_E@IU;-`{>X#~(YE|9E~@ z1$%nC_j5!=T-{KI>1(77k&i3B5^JOH<=nnm5E4VHgVvYJRP^MG+7tQ(LfM2&%}Owo zYjt*c;7@f&;?b?@GPtB4=sOlM&TTX^d@gQI|JS8&DATxn< z56gO4w7m<__R0pj8T3hq_^hvfR&~H=eeqFSE3gp3vqO9iJ|s1Xqi9!pRnDFrwH`Sk zo1fCC2UiO{u`P7an!#(sz*&%QcqF?0$MnS~lfTxxIz?lg{7H%*zfbw!|98qSPL)4C zU494KQU5~uv*NiG=(C&hXqKo%?x-}{{g{tI-k!)=N+-KJGC5gYQ_`)+XI2o9#-17< zIezw&{0I2;>N#ZFnGNrpTf?ODN7=O+Ju9B~B|RswCtv;)cBJeXz~4)#)~!!WQYd?T z0WzfMCgfXL6)?|fjo%V%%cjaIUuT7AGAc4P8QgcFa_5j%G#N9}nv5B&$Y&IjJF9C3 zX#|SgD1;@qqsmx)&!s8l!G)bMdnsppzBD;T?I^JRy&j61V8@XAi3}A&ObNWkcx7lU zixOLc7ks4Kr_5cYiJ&#&wN?WT(s0^&Onv|B?W|O}|1a${@BSz4?7!~cZD*PSGWJVc zRReuK+g`Q*BYnepI@n;nK8mNaUazGdL-h^T?F6d$cT&2BM3AtI@x$=N*oWcwqU@GM z>1qshWXvPnunZE>RCu2COM;-2`fE>&$hQ4Bv-F$Cg6e#nU$TNmDI$E(4!fC|Uj-Jn zaHOhvwvXcFCQe(w_Aiw;{XbHk+AsQ;-?m`4*K2y$uJnp+?K#fIqij{t2kZ#-Qm`0} z9F+=~exLY+jjDHB9rF!TA3Ddj39{n6r`0iCEG7is9D2i#tB%T0M| z2(9O(LS7bd)bs&?9N+$sdQ`2F;8k30Bg+rwC|tHB%F)mHTP7F>qlXVg`+Qo{ngTi} z^);L5STBBJKS{8C3{@e9uiT9YuA>urrl@fkaFqKk4y5A)0h9v*XU9(ay`K zg^XPq><8B!#AsV{jIP+9)<163;NJa5%KNnqKO!bz?A`w-qfclMTz{Pqzvq;V>lxsB zCa8w6&k>-C1|yO}+d9eU1=R{1uy$%2ZYLa6?-UZ;uWg#G0CiL}4rtA9$`Z)HQiEF# z?3TqkTwI@Ws;b9Mf$!%an8dkc#k@wylN;S>Urjtu%!ybxe|cw(HvQR}l0I0iPq^m- zbvuY0ArBx~iir)Ac=O&-6zF+dFHwffTGRjV&Dv>UvLcE3ViC@^Zu z-_{yG4w)vt4<(&WL7-3gIfacJQ2|8@dEgu^$T#}cY+w*nmCuE_HJt7{S$P}WJd z%C{b%OTW0Xs0P`3WKkmDqnj&yDfz_JhqKQ#R39EPiw*|OaYdq#I-@qVIej)xd zbax5i8Qp!MB=e~5HlATY4YVAfou{B}NkKbKN1X}UD}-l2dq$Eu(AL?|uo;^<4rt*j zyIwyc3BBzN7|+8S?ODw#@6|SJ5m0|JdQbNFITX67fzN>F)k?1IX`Vnc{l=-p<$zR7 zO>s0ica#j34B}>uGo=O%r(`2e+cZ^RprEs71Le`)g4lwdSH(M}$S!hgp4ON}I(MFE zJix+Ju{n!{xHH&ga(0=Qt$W8x>ah5Mj}l{zn<5KIt?By$+{{JiH8)>$MgpeZns!Hu zEr~bI#AyD!Pp91nfHR>vOn3&Gmq;=P&9|Zad7n<3_CC-)I2hUm8PG=C(1v!}UqQeb zJ54;BW^~#!e7c?X6wE_9?TLThX#~j54xSk zNFLg0Eay|5cGnGdryZp`Bg_#MI_X;)1Ak|a}NqH$2Q=0=bcDgrw|+nj=S_xnJ* zX)v@v8k%WC12>@}kaL7HnX20++K@8DVOtg+DUe<_UUkIRemXwjK@irOe+UQm8?PkF z6>1P;l?*Ff=tzeA+V}->VAL|z*zHc{<-4^Fza%sz*RVv`DXBa!iTXpPXqj)mC`sb; z5Qe_iMuTNBpf!G*z)a~T&9)SA*3w;xC#e`Z*XrrlvAbV6%vMxHz@O~f2oig$> zAa9j#2l5eGCXjz}QXsccXPr7D?W&c#s`DlrvKQk>L;_dd4V1s8ZMa84{v*V9a-T@N zw<*Xhx|k%sp&)lBxcdgkJAoW30`w6a!z!?)HrR72jr~JWah?L}pn|z)m;(C>1EPLT z(0C?MgBx=yE!-^1?BKj!rWjkdjFuN*nnr>wglahBJktUr0n1WK{JNgKYnvFA65wZ3GhxlV$ zh`H%EP)$_xgi6q}?n?ZGuYYT;fvTa`I^Yw8*lUd?LY^6GjS8Vkb7M2DN#0Z=YYoTq zky>s9%kgIRR>q3s_XnX6LnS}+qC*Z63w&902*x^7;5pbEB>;zl56Q!*ER1bG#2Y(h zU*-|rF7(a9Jx~-R_m= z%ghwHQMO@pnblCvh|w8#*vcf}!AB@VHy-`D6m?6RUn|Hh!cRk6q&V?siLuuZNxWeF zJ~>qso!EYtS|6fO!ftj;lEqf?5=SzZ)ohLNw%cF7E$Ss8OKbcUe>2oO#TEw_a)6Xnln=;tIh-C9S#hXH51s=KT2FmM z+GVTV(6UW(35MIS=+QL6ynC*6E$89L^ALG#%Q*H_C?#lM@5c+LY%mG~Z3K9A!=a(= zLPHS3LpT_*h zijGO1s5G%vLVtd>kJ{iX{wS%XG4h?(pSP({bf62)v`=u*8b)f}kgFQ){cLQToV^09 z_v+Xys4fOVR#){Td0@TwyK=GK+tkfhruE*YLlRxEO%1d79No&BCxH8)%vDwv?@PNj zStKE_YtsSs!cf^{5B-8|GV00QD)Gj&vbU0F%eDl^7b2`^#fh+4iokJtvg5 z)@MCbwA0^ce6lqynpjQkZ zOL|v({c81?oaGqkOtrrUS?93->e}Z_was(7>)vXWv0-nAJ_tnF4owcXZA{n^Y{MN{ z1=gqgEq0c3YB_mkoI0`J$Cl3CX4yq6>09mf?w8l(^a^h;wCJ83*Dgc#*j87P4V1Z(kxK_IvFLhOg66QP4wppBH6S3N#b@40q zspx;H?c=JpN070kwj4FVKKNDzjMHU!L$A)4px=#AcgJIpg1yg`(DaPrUUy(re z+r=+vtX~X^_W0lcoX?RVkZ9r$oq=Idf0WnSC3bj__82{x?RD&nf(?CwaL&Qj{W*p3 zx{x57olf6JLkxTImj(b1#^*)-&Dnw?qzsRfweF9~Aj(N<_m97si*Tuwbslz;V$L~f zkojT&i6FyX4B7tbwh|*BZx{*Dg6`Hf$=z>$PokpnMExBh z<*N7M=lDoQ;W(c$xY9cK~5X{Hwr`} z+W}*TO(RT?-;I)W)`(C!`yb;aK*@)f@PxvM03-awYNpH;t3BB&m<+JrOMzYcBVe)onROnp zIP|Tm*Z4kgYFDIS)GfBFr5SjmkovIbnKe#eOcoe*0qXIEtV-kWe%iO4Bm?{Z62R-? z75@Ei(&&@;jyYC0q0;kQW#d475&kk07n6o2+Wk>e@&;ntU?D)QI%dhLBV4Y^IHYa8 z92Z6GE~iU)u6B=q|6#mQNeL(Fo~-m7t7v?yJ|D;larMoU!jj(z#yT!bep%VCVC@=f zn+kV~(rkA0_JuzZ;w%w6T`GbDJFAP}MpJ7ihVZAr)T?`X$bsD97c0s(-V5bG0RJ8H z$z|6RXW6Efb34e8>Emz<-=!I2Lcagw*d??tz1|Z>mRFanuxq8Y&|~g^YXSh zZwvMz1BavQJWI5uT!LDsf~4rQFgj1>*@XOQsmh+RL~HEH<MR#Giq zx$^F-hf`c`?AUTCZGwa{3#KYOJoj5uu*?}jxLx7f6=rf-EOieYYQ5nzOTqxyHaoZB z*s_&bSpwq~FEAL%DHtQBtk4=4J2j3u<^P6MwEwl6#KkrmCJ_IQ6$mMNwWbFIL`e!n zbe;De{NzZE)*DvUt_-hSyizY84jYnm(^KhMsz%!QT|l^9-H%i86n^#AyO%6kb>*Ua zmg}n3=!uW5(W!Ie9SZj9CE+UtCF$7Z65BLVieaDJX;F0DS+!b|sOt3A+9l!IwO1}$ zDp|I11fbzqcnRT>OKwPNy(X2brRwY{tGT`e)-FBv8_6CYRiWCiG-%TPSx);U>-dbU zd3HBM3AfudT`HV92-bSfqSfImKeO^qsv!qm8jdYrx_pVMMU8;EJOk7yp@vUMEtY9b zAGT}ZQ?+2%NA<$?nRYGCk*pVGWF0-_E^cOX8t_+?Sv0_-va+kCvc{aOFA>?ApOIA) z8u%G&WC8JKd4hvq*dYG*MxgM`3P@k#q}R4q72U02Qpj76 zfLN+Pg!eAhUfG!e>Nu3#`r#C)ma224jq98`yg;nfLEGlST(LL4X| zg%SzMpVjRS7gb#=OB^SM@UcaA3D&$4fe7YA0N^WgrO#Ztz0Uz~2rk%qRc5;1sdO%7 z-RY!jm2`?`6ki11Zk5g@qbW|hEs{eEk4s!6F*2V;FXTq%XAdsN1u zm}rE?T^J ziDE*q-c`baRDvb-t5Tthg^6sIY#&HxTfL-qjhk(WB#_(bTCYtd0F~dKoyk&qnVNvf=#0{&%i`+Efh+PTcXsr;%ayP=wEN<~y zFG*z<$zcgh%a$A#Daqj`NiuOzl6#iBNmi&NrIO@|K}nX@x=B{5B%>rr(V!$U(c1;B zR!NQ!+j{AsBx@GANorM+E=h7jDv2%~9bU2`d}V6F64^y{%(o=z#TiMLFTHZb$`wn} zNk6kFyqKhsNNaIMvc-!QFI&R&or1U`Tr0#AncaFpMly#SK9@?iD7;)H`%o*|KzDSg z;khb&WoF!sherB7Z##gKPMf-}f@!kT)&Ghf}N9)(V>)=m^-ia$$CeZ(`GlKuf*cfypePLR}_T!;aA6p!~J5^6eOF& z;jTT}#(4}blpUN=d?j*0;xz~$t*j7zo*l=5#$rjRY#ub-T*)Hr1^tqhlyL7*l8R-S}WFpcB*T(LB8(`1Mwxgxcn;j|}w+rQrytJE#? zL+LW_lhxDUGV8usb|P5*thVXX@NazNh!(i`@wwDo+y~8)45GFa{k?Mgdk+d*vx+4$ z7X{!OWw=uE2TfGCI)R}gIwtk~3r$lnJ{t@C_SGwtv5eB6Vc(2qeq^w`v-Ypx@NWV|s{IvN zbfI{@37u^SdcnVp)_Areo@&vQ0N08LVsyqj|(S#BFB2i zpuivVG&(&!9`WcCIR-K29sJHcO>-qEJ0mFH4$8?00wEm8itWk`awzLZV(MPXV0k*| z>CSX#KzSby#;@_JjQ9Kv^1WgY8F4GJ8-Giv6G7ElS@0PXg0W6^%|LcnwJbw~N)*!d zu69V00}r|}CqFpxx!Fe1aowoqtnVbuQjIy2{B*Uh_JaKMKATJQyrBL<6fL@(U*dh3 z&_jia3K>P+Af-pMCl4_@ypq&JH|O^ zHahy&uf9+(KdybLt?keVZ#xGkUH#_Iqy@3|21kvnZP-A7t5LQOPeuvJl2es^B#J@PK{Z#@L%wl^qJlR)spcV~ou$ z?{uZ^y^wchh6YfugXEKIB; ztvGAJ#f^BdIIpErxxjGrS@^FQH?rCs_j1tFA>M07di>@!J42p7sE_PQbKK6L=eYXF z@te8C9KfOgr#5>cPs#a>OF|y*O2aY6)qtfxwXN6SZ04F{x`*yY7tFbgKQoj^fcG5E z9IN|tQs;s3903fi@mi6TjTeH(vrG?+)>ZkT%UAjQzhwoFF~_I_fnx5-2tiRk{9WI6 zEj{$EH&Q9?+(re>O2$uxuM=EdEsn_(mZ8w8HRSL zxw^u8s`)}aR^j7ZO6P!G|5T>wl1WqpY4)J>=SONvFu*n53mAR-->UE?Gav-S%2qa! z!Xr6pnw3@3j;k;@%nQb;{jX!0sIUqvTs<)u8yH(#W4zpcghO%(>pEzLiZ?yL5W@1f zH#vy}BkF2gY&92VBBoX08GBo@7-OWGdsV)Hg4*c-7p7WTgx8N-2}WQPj&g z&~5>dDb}0^EqQJY6I$Q6zEiQ9@U)dYc6*~$ekblNb}gt zQk8~AOpygO%HiEsyBu#F$B>2efW#qR8(RM0%tHvkPc@VCtRslI^ypaq0SNLvzuOoo z-~maoU{Lu^*N}AIproIXq*vmVqok~j;V@$TL?K-B%AW^|v&>OH;BTPh@P78Kg^Ek` z*mNJq7;O)XDPN%?KP~OztZ#pc@Z?7PSgUB!uATzvdJfbfmT&^HS6{EH-X5jK)iRnhf92NBe(H4JAA%?8Sj9p1k7{= zhCP_^&7O+rpF9=KYvoiJ26KBj!3{Ap+~28Y?A4|11Aeeu(fQAPRAAM#x|2R}J~DAN+lP6r{0z)2RATH|`gX zmHEA8$oB(7z8@O${m78-pUXEt^^cvAd8p>n@J&yMISrA9J1Bw!hjjIwpZ+$wc}LvQ z2M*cm8Pdy1FbU(L!QjB*OoBp6lX&0z#wV`6W>EhpK0oAp|B&yWTrGNu)IVDuvwh6s znWIK|=3vK1oI8s*DRXY2^}w%{YrnZ%#un?nH0+g`=1V|Oi!9l%BA`(WmssKDv!flq z_~wYHBgLNT!XH;dE+~1jvX(JNyYvFP$@Ac6H`>t?J#|*?czJ#ORlCI6e1Ej>s=6uc03Qr$ z-#f6H^W{jEcmUg-9BJ+RmBP|^^S+`eK;0{Mu9GuWVtFoSs*)JSR8q?drDs321?BOJ1A?c;d8Y0;h&7+KO=Wn*!!8av9F)EQXY=qX=# zWc1WXt?BFNXIP8S)@N(qNbFOo>~^%|53bTy;?h-mgfF*BvG%@L-winO$pKdU;tm0l zQK_w}6(>4idJb&FY}W4BYyy^kmf(p zhPj=1bQy%Ub`@|s+PW237j54h3;NjYPD)C)zhs+w_R^ ziifc~=1U>&G3F$cB>a*J6=%I{aSNV1YPScCn=2SY6#fM0Pwe7Pil*|}#gjgD1H;%rX;WVaW>%`tiu@L@u_wB7N3{RK)j832U$l>XgPVwJVP!fv zg8j!ER7CcWh(%h{L=}-UBw{(cI4UA{NCZ2pZ$t1c`miApY>d6AB8Cr%pztRpqGE*6 z9&O(d?YnSwcCJr0H)Z4`#Nb?bF(h;cvIFD39pp7~& z+|mmhX}Xrz#3cSuz~)1Ad_&(e{MDK+g$X#+GL~o;$qfIq)F(*h2I7obmugK%>6@VA zHgLz+geUz$dP^zQ)=K|8uReqMEeQIl{^{^VPtiZWBCh3D&yWaE^j|6>dq@QR)1V@9 zhD6Xm%Tz?}kO=x`j*1vIB!d3APDKnK5<%e?OGI$QkdC8=ev3vlF#vw!^S-5R+ZXG< zQ`>Nq&xZC%G+f)ZJJz?jZZx+!2w%z4ntw-}gU{X4D`{E}FAc#v&p7fr`%d@q|e z-k?|d16tED-u(^F=Rzt=D-G3B2iPBoNgU=+z-WtgXS+qUoD=Q;u-0@CjQAV6vtg^` z%dEr?B;SwRd|o#njANMA__`7W`l&=cDOw7Q9;Rj);X8fN{$*N|?8Udt^9%}xux6>? z?4iNeNN_O6=yrezn^?s$845`h5*O>vcZ+u#HImRo9)Ct;McRt&Kcua4AWofxh&|^6n3~DxvK+1H5n{BhCB_lE!?jHmmz5?E)$K>> zS7=-9;Q~>dwR)i(qi-Y*q)!qhG@6Q@I-m9K{98+i;NnV%4pc$7bk1RqPk7<>f#1`_g|9*1uY(J@AsD zY5z<;Bs}xCi+!l?vA^|ae*MmK2JM&c|Mc&^e-Z9j_V@l%Ws6_qp|BPLU&1qgQz3)& zdSP3`Yfv@p@zQ7%NzrJZ$|EasJv$F)w+fraF4+_L98Pi-(`GsFxja@T{)R(hyRi0dm223ORY4UE zmBp>$(k_);j^}h3J(mvbkQAy7CwGcgBT`6%@2ousSZz~fJ3TyNs<4j8*#dzV);1VN zp4=H_Mh-_^u+II0+Sci#xOOYnHo%fP;8wKZb+T1N&OzU(WY6$$eeyg#g0Xi-<5YS* zXP%A@LOZgg5F4|FILD1Sl9A3ysLEz|R+3=5w>#S>YM zf?f6{OJ(a4XX581Zy|*364|MgkZ`r!=ZB?d*}m;!@t0aZBER;Ih;R{Dy%k+Q{LaWZ z=7h52+P3w%4JVZ~;Hwx4400)s~BQz*ygi2>R%`M`2^fm!$Y` zd6Dqp$g>W^iYD2JtT@^*Nv80~HbMnSo}`*01kLK7;~SPeS#e;)1px6IixKdx`J6>z z-5xH}4bGo(On}vvoDsS}t}IivGda_NaVy7Dja7wR=(vHG@(L{aC-GR7vi}DtH}$fi zLm^KG<8wogQMv3)JV=3QWr65dOuvuL4-aRdZuos2TcqzOz8jrNtZyLfWzWyh zePIuqh=_8!g0cW8E_^M2dcHdOB<@Y2NA!DZeFLJ>v+;}1X?D~EH}+8!8iQAC=+fD5 zarJq+S%5CXYyFwCKzi43NpI`$GOG)G_r4$7+YW~^Kn_d0^4>MWIOfF6CN5ihb9XRy zP*zs=;x}0wd57Y;qF~Rmo)P$DSp4#Q^J`WZd` z$pL+DQXQen1KOAa12_A~f4LoUfDrPIIiMR{zc*YrNMn@i#;dYF-;o@qPRMXd%TYCh z-`LuGMm%aO28h@|4{2X||Ia5of2enq;^9H+uC|!xcQXxhgwH^uPvto|!;DRwxKF}! zU@e|UcL=u8M<++heu`A;51fONx*zr1mCwN|UI>?eHIvunuf9M53iU$ZV-C0pLdGdJ z-NKitxV)nhMJtc$#zz#uJif-F>%K@FMg@UV`*nxn<;um3HmUtBXN;-#psAK7iN2pp ztK~>7w;MEdt0q+CC!V10s=;#erz-rPG?)z+Qf4%IOeR7r{{PyqHD2yk<6ptSmlN+w zJIwKH20slQ)IhBsOPD3yL6!&jf6SvNl_Yu=60S@CN=Dhrz6jrh+(bGHcRJhj8tB97)qe3@icHT8~9&0G$RVlUh>&Y2H_0#lt z9rXT}bXJ#UaFYSODKr2ngB19J;7^M0QMtrEzm@eVy{`v2lxxd|`jp)&R`5!Z=I?K4+Ta`Y1U(-r@Ih9?-@mqR~ZCr$0-b z(uF;3W5TsQ7*aoQ>Qv9Bcfp6fzb_OHPZzh|Oj(?#&25rNDqyZHoDt7kFaDf1%A&E- zGoY-0?C!t-!s-<_Ou{S96K-Ves$`=MgB}7JC4Kys0j}_H=F^~=TSSvEI(a3$5dN>5 zSLx2X~E;Y?MBDCg1T06Ahxi^xS}YTTVq~P z1p2TbXitoh0`tmtmhCb2wkLAS_HsV13x~>g!+ibkzz>-PbIiP*s?K7t z^bvpgJa1&woOtfeWTDf4HAZ)hIZ|TBsMxpJXbKvPVSm0XC=hAkpQ>ly~g9KuwGWYw9~-6Tl$Z)Scr(X3~PY_~`~f}=;x z)p;#dxy{w1^!V&y)-Q;<6b7~4sP=YNk5+sI5jWjgGTtD~V)j@A&HlVVb8r;WU#EX` zR(gL|nLx>T`BGy+z+)?aCEAVq?WpEP04r=nY@F;VxSH>3IVR$+c zUp*}BhW-T~lqZ{siC?@fx1Xu~L;3tJpX~2;dC=mrt?x&l1pujy->mTBnJg%<2F*r{ zmqE=D_+6e{Cx4EcpStF|^6Sv_v*NiU8QK-pl9uJtvMx5k`6mU3j3AP`KXXHw`WHI& zKlU2+*NO#!w!jR4VP{57A*dbFDaM|#SFz4^=Cc9Yf*fO;K zav5E5FwR{$hDVS#A}gc*?2Xg*F*F0K8oAqsOL#K7-|i2$JrkY!2>z&#H=`+3U)_pu zdii3$RiJJ4kHS8RbuJFvu{iCJW57M2yh8fJ#%5kt2E6xgk8O=-XKJ1YP5L3VpiOGh zjYI3N+Ars3OX+Un%@@cw<ef9`>~*hG|>5uqii+JxGgxRFSXE zBBV`)sQJ*9_kzanlv*K`Bov<#)y>Z`%&Q7RG|iBM<5h^t(~Cpq%u*KSYT?^v{pMQ( z15?Gh^ApN3L?uGjy24NiQp>tRrtF#i6M>>pzVHY9kTW3qtlw=x(G%pJTG$8_xAd-#o=d z2q$$zFBHCh4xlTVSN8{+SD#|D@m(Y)?m~U{i^v8d6MxdHmmlC-RkJixyxoF!fC+%a zau@FND)DuuEI!s1mh|iKIe?$7!2e3(;?<`*tNTYHy+%4avt;V9bE>ITIayAaq+=DE za=QFJ_)xkO=97C#t|ko(2SzjLj^J69%Y=*M+sCesLQP`pD{4xDe>iJJ5l`c53s3k* z`66dY|2<5KB)$mtLvz-LGJu}#0G*KrYTZR*<@lniI3=t(`m+>#ycHwheIDa0!NIIT zd-DA0W@qy3SCc1*?t0grJgqMgMFyYALXHZ>_~fviO-@*JD`L`PGkn9+MKYhb^r7$( z>muu3YZ+PpIZnR&vdmxqq`vRP-?zT65rxi5>TA6y@6;_fvuK6Gd`g$XuUa!>aQd-CSRY@dEr^+cxG^Niv2c=KNPNsGFT_UBHLh zUypST50<|gd08^UpVz}us)8_xRI`StA2R%7vv3m5d#zO6UOlPyQ6AlY(0cejDeolZ z&C0fZ$OqL$3)w+=Cn7J`cur8<8lhI(cSV|?8uOS7)AGQe{syP_018DfN*fnhAx&nm15Jf!VASU6D@qrv}=N0inQ@{K8;GMGA+AyDh>6DtFkQC zXCEc{@7AxK)VXg<-mQ{2@HVM2)&ME`x9RQ{mm;Q~sGNwaS8b>qyxvI-OKLf;%}aRu6{Vw+tQ+JrRd{yepAQ{K(bz%RZ42qkQv&M!Vi zl#D-_XWgasJJ!3xMT{9~iX9|?Am4Cvp-oP9eKYWymNlX+pb!?b!0d!)@! zBW;G79n?rWX#Jij^q)TSmV9fk^9~}xy@ZXio|Ldyl`mJ$*>Eg`PB>;Yvn`?~S21N1 zD^0GtQ$syX{;368s($MBWycA+AU6hNd$j;ZiO1NcA335!sIR-0@}HrD!{a2om>gpC!@LZ1-rvhGP2_iuZ^!(bcGlZtX@yOX=jQeje^r=T~CGG3yh=24ho-vcfk3 z(}xmlyDZSqg*p1g+lstQLRX94ZGxmVYZx2t*+GM+Isa;I#>u_f+66NS8kNMLG8Dmm z@|2?5j${ttI257Ur6knbhfIK{pD$6{P)vd$b2%t_QDzBae`VPpljm_we9-e0UJ&K9 zhR4xI$n7g72f|lBX)^%s3ApdaR9_~A`CV3LjvOlT%402jzU)ZxW)_mh&i= zalne(2!fcz*LdEQBVwoa+gIz}8P=_<350d1QV64!EfLwj^T z_flEbQ;g}L(SRkBB!7!uAG)9C-Y&aG zH%Er#(p!`N75Q>c_DJEWiH`tb^|{vNJPbCgJ!9KOc1r}af;AAj;9~xA?_8$ww8&?JJ5}T47^&`36*RcIgO;NWu za%xXnQa>>>o@*bpj2A^ip4Vh6w`i}>r|sZQ_Aj6q29p@%1}1O|<9MHXc_ceBp7T}{ zkb2v~HEaw_z*n_ZKa6=xLX%Urpv<4Z7J+ObO@O0?#^*nh8wQ(!2{5(5cyJk*zzh}` zk37^-EXS%M-%_HWIJ+%Ec^Vj>@9)gb1)u<#KR(|Yxq%TU;GNNJ*CaRcW2uSgk>zTs z`4bpyhpo4A?Wz<)-~han0;MbmBFP;XZsA(fMQ8+*BOJLjlhZ1~wePM^54bIg@RTjD z36}7a2*GU;f_prxP1ZYAY?t|C9r(dIHN5Uqa~6;LMvdob|G?|hWB0b_X4lS5E=U6t zdQ{=yysaxZ@tl(!Awjc6pTj%AB+-Y4(c+*>v@p^ov%2?67Y@`SaW&4B~UY|oR zdG7YZ!bHEzq)Tdm`B@k-eGI^6j@lFkRGjB=N zhc^bMr$aYB>E((t*}qD2ZhQTU#*9J5>IAKXsI;sl&(iKpGX$4jR1!ZBMQzKnk4-c_ z=J6p{85IOQJ!0{Y)_2?M=M;@-jV*LZP1+XZ`NvBM5DxO%GXn!@hnoLGC^Mw$rwX4| zP(fd*8Fjw&4Rh*I%OiD!?AFTlenLK>l6JYB4*HVr;C!pyRfrLH7l%rA=^oaBcNeqz z@P<4`dE_V0e)4Q|XvyiQ7!lCcv)N}m;N&>8U`v5A0ANJ93IWE=-7KC!PYNZVM^NOTD^u8633f;=R8yV8&SJ20H`qZ^`#jh=qT@dz z;F4XLTAo{niNTkU=o%4ZFem5QP^mke;M%lH0glkH2g4RqI9Q zdvteZ>yLmKWW>R(7b)~s**{QY=2bFfBXr4&?b;|Sv>Xx!op zn(K@8lDBmaw=u6T4uS#34G(zDG}#Y5H(4zM$NmaWcJ`wtfK(8>0(OwFE|&7Ts?`n< z-y&3=B|*lkva`&dt6gTum=-eDk*jKwQxm5OYQ5T3r4VVmtHsYkzt!122!UcK;K(m2 z`BU~%tChxuGus2x_$?xexH^g+n!@zFvS8LF*MVj?P=E* z;kgtK8!veodb9K{`a(u(J(N=qJ=DV?>%kvti+W0y(ud24lLq4M_hTOwcfVCWB_4?L zt+wOZ`l`~?J?edoG_N#-XWv?VlYSGQa_Xf=`Fgv5YnD3?W^S!iwzL)0D_jp$}j z%DbB(iKeaOS-t$dS`2jF<5(QFFm(155J{c`$+6CzR-ga8^!^N=a#H_xWJfZ`Z*;!D z3RA|DJ$EVjAk{eRGON60ZzY}wKEu}cq-;j%lTjo#{#FIufwE*xp~I;TTDiM2In_5L z$(cA6vlzotX7@|TAVX;>e3%xBa3g$4n5^(=n`bFrYkm?gm9zyM#ixUwPNpM=Pov!{ z#@3Lz4fRNh$JlU0SeWBWT#HOgsWSLK!wtz9^VS_5H_NapR#zLUu9oxt<$68`$3gC^ zw3)uYK!KN-SjNeJM=BjWVzUOp!zdN|Q@z~p!26;NFVBWo;cK?_vBjUr(BJ-}`pkL% z`gq6wAL=u}{s!$!)yI2!ebW3E*^%yAX6;WU=F+JqPOTvm!Ri-mim2``q|?zS(J_wc|}PG=!Ko~r>gQlDzo1kX&nfQ z`qSngHTC#Q5vDT%0#C{buh30IedE^RV9p(o<*l&CTOpsF0}*Uh%biVrnYa9zxrM*r zKPY4VdJ^9}L*}m^OOQK%nN_9i58;SuI1jJrABODTBrak(kS+s!%Mgd9?GCerFP6$! z(id_xSr&)%XL`P|c@lSJ1&j{k1-L^1+3X>b1d!fDMhlt0EqX*fe_ix*p4Op*)GR)m zRp5DV@GYbK_xl)ckIIpu<_G`CUt|0K^0#xN#Ak(!?GN$b4gdio{{qIN!d(K!59GuE z5p6u=U)RQN`-QwBL^^)|MTpc2Hb&K>YL(fj#7bkMh}&Ho5Aaw1E$!MUXC4HgeQ=Ja zF5g5P;(?9%#y91=Yvb?a!9R+YCdogh?S=g2D&)!@u{()4^3Zf0{;o$@uK5?}lcz7h zSrNtn9XP=8VHGN`Y4k(y*!v{@gfhh$Ki>NV73ujSW4!rSF`~Gmhj=v?M0pXe8j3UA z;_zSD33}Q3oG9_k%~D;i@%Eak4frB9HwzZvwAtmI|C=PO0hHPP(~>70?}qb43MD#YwpS|t+T!w?SZn+2II+b*^Dyed-& zdxyvMl9%MQS6{8uEs^v`L zvpu#YK&GN+i}o|sB%|jWCm)kWG_@&#O5BFn^SR^Qiizrep=zu>=teAe?QVQt>7$=c zQ$+L$g@njj-82=>r3+)Ko9IGQ(C2g^6lly?V0_u`!YZc=x!KZ~u}oK^?xuX}$>$YE zzqm6dVCmxH%r$gkr*z_%ljl-=ax_;*xC1UjHh{9#{liMmbgsvEPVZ`PlSaQI1NgWe z4;EU(p*bdl&p2HezEiv9gd^{mchKHf!Z+%1u|2SD30?w||9FV4VR${EN(zrW5tD-Q zs!zP2L9Ck`(InZkL;bG* zzt`_w88!d3e!dg?KA>vWtp1jrII%M?d{$aZBdQ?tR)x4DWhc_qv2;sxhfN>*b@PiU z`q<>s#}_l`V+Qn5y}EH`j`cMR6`%=Oyca3{x>=maCuSZCWk&=MQsOt;0_V` zNPHSe$>>Zh=HbrovB&Ig8CBMHqCs_xGg&zOor*VAY`c|>S(`E>Rs9oMY$$ng@xI{V zHilftvnRB8r)V4p#8;TtxL=}~dz|t}uUP;4rFv z0KSnlG9H7Vd3X3P*mXqSQ7edy9FD&-m!B#7t>?`K8R*6a`D-doj-f*6v3f{dYgFp^ zcpW>3i&r`0S!?`?6c)cp_?h(*Shq(cOz~CB=hHp>PrFryeY#sShrM*GOty4uC+ZmH zil(c!Du zJxfM@_ZDGFIEZI=Y_U7Y<8+Xp4r)WtF_haf-PjV9rW^C>Ie@kbnsDZ?w7zPRVk9`G zGaF=R8M{uhL$bC$6c;WIA~^obRP}|z#u83r;Kl51s1_gDy420Ru@Z_H%ji zPb*l>G_c*B2Go5{dEtvB>sL|13Na6!(7qdtSJns3uSUsi>-SBR9ypBoz62OQR`oVi zH0LtVPr?65Ouv^4>oZR+1-dBFDa^XMrr*_a=kz>i(l2JhouhflCLpUE><-oGr z_rCDL%hdV;rC0_$#~qb!v`C$kl|eIZSF**aQTQVyQE_b1+i`HK^O%PvQ2s%>)MDPM zBubg-^%COmYLf1df5EQGRq|B26TX@Rto%z)p6c?aln|Si_hsJqWpX^v893f&rD(c) zUwD`re@e8`p(r6G8EjhPTa=b20@+qJqjuxkA_%O%u-m&iO0pW5rlNZB24&ADA!F&P zlwi1pV4+>%p-yYpvPmFf^z3OUzpPX}5$w>>G4k)AWM;|Vr9-ogm3 zEPG3Fb&z1)Dm}L25k9jJ7dP2+mZnoP>mJCY z>=lZyv+XTi`DxidouB@tiS~B%M*uH$iG)ctQ@-X(S7nr^wgGMYr~TbJQwx$FD?3vS z@)Rf9#}GGCJYb^B0}9z#WmN4J#z&?!6Y!f#^ebtWfnQ_%JsA5-)bF&F!|1|^Pucv* zTn!nY5P3Y!h^y(jf1eR6c|1=kmyd&k@1w_6qz$h@+d4c`I9GdQs(gDtJhpaKR-}L< ze)UWoN61q9r{Y>S7C( z@@%=U+^vtf%wIqN4Ou8(jYC68ko-n#Qb@nJU;8C;x;;YZuRp~QWNuFQF= zni3Nvm6R=Oy-Q6$0#16HS<^nSq>h|*xb{BJnU7g8e?4v-;9(7$A*tKK=b3sb7q3;b zC)#dh*@2NH2kDKCk{s;<1ZFQr8>Ix-{y@1waDmBvOacu0>?*G-4TnXd`IQ9PoHD65 zbR3n!*|56LNjsa#rVMS`tWs;O9TX`@en8}xcB|e=b8h*n(#T(uIo~03V=E8Yc=Czv{M<1f0I(6M^0L^tJ)1=FVSg(s&Pr&!SK|HI*suC~ z<0F!@Yh#>5aYGb+L17hE`SyfPM zB1}7_sTVSGxH_8Dq8DwW)+poTw%`_^n;TWRc0L0wv7IeoEDNPy_0;Raxh`B|)k5$o zrAcGwQ~=f7Y~xkc#Mmgf79{Infjh(~pQfW#MAs84(mS(09zv6*liR7z6O+N>*Q7cE zG0qpy0EcBZxUa8Sb-Z?Mlr9G;S&0kTX0ShVq*?I?rC;>;quugAL&yWv!~@=84rZn3 zN%oc_r;SR5-|=_$}3kCa$`qIO}oY21)dN zm8yRyVvy5P5beKBYup03X#Xd;`9~TX>&@3Ti6W7F*^=)a@+I!J0kzvjaXRvLJ0OdI z$1#9F=ltLokBG>@u~mE-n+*~RbBo62_z5@Jcyup!)T)-0%vrBv7(|?j72F{t0*&qtzvMJz;PVJ7JY1M6nzVEfyT6^ua*IwI#>_)oGX=1YY+f)QriT zXsi@+V=lkde^{+sl!Ps2Rnn{%7C_YTYTjrg$mm=<-3vMYJlWvocHw1wg79*dqw5Fh zrP=-We<*l)uHe}eR3Y3m-A?P4Q`puO)?W_RMqe?h$3vD=7p&tLZXq=HGyeUGf4Sl8 z!=I}S*SVcK>%AB2u^~4nmmI`AMpWiNCUa0z^=$Xhwa=dd@vZi<`w_Gzl@b2O?c*yA zr-o0|dp@sV`djd81y_lcC+16g#k^r}xz*o+(g$kgghNbalYjAd4F&(zjHTypa-aUf zrQnkH3bWK-)|OXYd|uG8(`?5gNuDQ*A|m!XSXg)%w1)7NMr>ak>I?ftq zDVUh6I!)rIew$59EHrTSFXGcp*eVl2Gv;Y@EG5L~3Yrn{mJFbc(9(i}QaWm03t6;X zHnT?cj!e75f9z%p$iuqkYLKvsf^;M|*+yQrNu+3ab_@&%!ZoccUIstI)8T-t?SL## zge?8|$=d#5K(H-#d}6MdKVEB4vo%4pSb4LcZSsFSP4nlp+zqNxB4X6gZcm)d5>!q< zz%FZ&xP*NW_N%0J*Bu2YZVvCB>VZV(S# zxXHMcbkI|2mjXFY5(>DP{a_-#9ncu5<4~|hQb)_9G)jkCyUzz1;sxd-vuK`R>d9X;8$(M5(uih1IrId2?Y96<8L+sn zIVm$sYhhi&v>G7E6=Vr8=v0DTrstYeH}NAiNN&>!gCRuY#6k$Yv%dtR=n-ZCypl1R zm5&r=vZIvc;sN5^M8fu&0WkSy08|k)0@xYbwPn@L0kE}9{Zv8kuc8Xs`!qHHsmYBN zKF`p+;C(K|_Z2&zSgb;AM`+4IP4h6!qNBP%`_UF%rTHgso@kdo-JP>agxrJVGx}`Z z7vlWGoc>qBt97e`Lz7Z}=WAlbDQJ!O;V%Hk(bsR;qFnGaJ)0keIo@jvpsz z4%izkr~(UIn4q~4O=M@EMzD0kp~BKDnN;(LrcCn(n<-JTfa1zKRqsWmf!XV)j5Tpl zxw3W%#N%Bf^x{T2Ksbuhb`xc_Rr;p>~yEnv+X4*bIq`cs1iI|2GBtd-hM0IRt zW9kw5PmX^phtR~}igHwvgJvwXaVo8m4a-C%&#m;|5tHybb1aC-@yQQp7hZjc*gnU%H$xF*zorxIs!B#+`ppi2E8<}gp z@6-$BZ)WL09@#f%R>)fKe^6&~K16S{@yhf@L%QSZ>ZH*p=cN#17MfgMV&n}tFAt?{ zPmLtg_*EW{GWUU~<_y<+QOn!xm6E8sGWuP5um+0Ng~pHinx52J(T0Q=%LX90jV`8?+$w2*-v*A6F3=Mm<2bJ(eSztF_l8)1 zLm=4hq)V2i=(EUa#3)u+M8odb3Cfn3qao5lssGmWV1ZG**zo8kr8q5DQZ!%bkUen7 z5zAiV&&n4@kieXj11v$~aVD)!lJ0Yexm##haM{tJN$5-#ofvNi(i~$&l26`8VkG&C z1^hrKL{38I!B3-+Ff!)_*EA)@&N2eV^+3=F7=NOKR>OCQ(4s#bkwFYHBUK33f3X(! zmq;iYA*!2qCcJpF`N)VBJIzl88|7arjkua2wOOGZ! zS~bb<9%&>D#Y|I7qraJ$uCel(P1zr*{Yb)eRn$|;rf%J_Q9v&_F z^%bTO<&0g7`667@l5t2P%XcobNc{{Owe)F06{gnL(jzl9N)KUcyk;;m!=s_)hUE9N z6Oc8-{febGM-qGOpXPjI)+X=HGK+Q#%{UEJY&KNEg%VN4Af``L@&0nN*-I9k2G&QA zwKoc(MFE5#21KrBE#xA}--&%B>rSgs@+^{nX_CQxwgW^>v!v4mySevZP08bBilNk>5WJIfZ45ca+_WTf@m zj)uqr5fla=ZbFmZ@lS^80bi|B8L0$(RMdMfp)WCptRj^q zPnuQSO}1rd1blhG&`7c^Lkrc~pH}9`llmixsZEKtMYL|vTmhl^k!G^nH0R7z4?M2* zr~S?1F>(rbry=o52zUt%L;4$5^!fS{G00pa>7(7`d@&&e zO8@WFQq`W9m=%=v(o6Kb?{D=Hh952}Qomp1>V&5FIZg5FOC>v@d5B8@7VM{E8*)!w z*||nLQS8uv*QrM~vK&x^tMIhkgmYgU{w4`&gv9hOy4bpE>l?`UADZvg>BDj*LQf3_ zg5-$39eTQyU?Q#)48t6&pk0GCchi!v=4V8llPns=<_Jw2cg1^R&UF8THAd)ALUv=7 zRiMdVUax}oW+r{bLS!C7k^h8Df zATPSViM~M5SLQ_zFwqw(x*;!me-nL?qEF3>9%P~?Df-B~=)orXVnvtaMGrC2mneGc z>f9*xykT7#SAjSAZ{|f0GtrkSdSzbpp(gq=ML(JseYlB6m%YiqCog)qiDnbE$)8Ph zq);fq4AjCVwlEuh^HEwF^N>aZdf|X8lKh1x(G}Eo#L<=pE z$64zXnx@dcTSY2^clM*IeA%(lpL_;u-wM0k-MJxJ$N4XYib6U#-X%G~u_Cj%H_)I} zmb~3lqSu*aj>_rhWDR!skroP}{Ke`-*{j!`Z&}{+yI^@o_ZTLHcRQ?w9X>fwktyxEalEp&e z7eVcPGTPBs2n#xDr^A_T%Ktq_ie@lc zmU;0bHc>PoDJFWhLXEX|fUBn0xt>;SFxYw!9V}M|C7Y?T>4$5e#vrNZkyEZHMP5-S z803odi^w-C5VoG8d@D=$3;a{~|K{J{DU(|bgZ)g#o?64Wk}Iqj8SwJA_AZZ?H3LYk z)+7FGG#y^I*TeqZ%sSvTw;Q)hr~PJ5+maI)hf4R*ey(UR`utwPV%%PevUk+gg?{KW zn^NCy!U!ht-*0HG90gB&X|+($Y1QFF$a`by8lh3|2~GZIr9@xU&TXSw&8x(lkI0Ee zG<{B}dC%psqxt`2XJH4LZ0vwq{uaA66z}fFX-3U6Iy`Y$LBZ+cDq~aiLL{{eR5ntI{ToQ3$vsZ% zwM?4JrMkp9}Dh-&4r=8!>{qJiYcwjEjW4!uaw=HO$;4ADBoeePw-1du#|dgbMvL^m^OO60D$8 z&ya^WucKcI;|x9uS9gs=8l^#7uCq<0FGKdcfM0}g|B^$MIR9ckSt%oYb+xH2{sR)+ zugPdus=7l<`VnbH_@;jndT+4pC@3|?=4CoF#F;WGGH0i|{-Di^wU@)o=%@avP_6ob z2J+mjD2`t2P5;q|>E*h8Xu^6bL0|oBv?viO(~S+u_j|2BQvEtDfr|!&Yjb{!nz^NH z5rc8FHvz3b2k6S^iVq9@6qh7%n~HPk(^4A~NYRFIMO(4ZXT z*CA!&*-vX->OH2js2VZ@kEtqpbi_MLN1I1->Oxgq2^Eu7y28=`m~&D5^z^ae%{YS& z*g6*B(UJ_0*TPQ;WzyY{3>IeY^f8Br_YQcxHc5M>r;a$dC&e27kHJ|9kUS4XWp z_`R7W?IA~H?FraMAQ*YRIN6|J){f4fwIela+s-z#_DcF7D>FE(1p5JqQ8^8=Jp|}^ z`?wAUkh{;V{upMvTD;ciu2(#2x|HKN(DznvXV9PK9B0jK=nNK3&Ge_|HawnnHyRd7H!uqr!3-dhlGuE4o{V$!ZvbF)+v>F^jN3rk?s=E9_ZmeahG9guk zuN$rB=J+}=xXt?SqPi2ZqkjH(RJPn!wtwxs*%xBnlc~*wRGX$6L%zN6-)-=ok4Oe$ zEdYkx1%bSpD7;^+BryTo-$?op`>Pv;@?@GE@=aW3@zm5!b)n>d0TmrQ!^Pfonf~XD zf4Qs8l%_#^Lj}CD1esCWK|O3^)72p>Pixyb>z~4g+y3pXmQ+x}Cbm`Q#%}U1txo>M zVqhYqdcNv8Y@9!ufD8|GtWvc>>ek9S!e!E5fOpj@z!Hqg-YhBALt%YwS2C(F-ejD` z{aL4?r#A1noJSAoNX*%x9+7$X#!va7!0%lgE1rFb_i4^^zLulcCXONX2Z{}89>jl3v_08=(d zmOObWe57!4d0pWy7jdeZytkBUFo{Fd2S$QVb6ALuKD8ULfrLh$VB|`zHu_45pJ8uL zUCsN>ou44Av~F<8P#)c{V)CUGlOyhwmFdyVvo9!!4n`b534XA!dj!zJy>$8r9)IFE z@rXMnOl)~JCUI*nX@Tl)hhKOgAi57c+Dm7VwWY}N*Ub59skrZDs4eg`67pVyyC*`C zNX?oV-xLiD{Y{|1xV|Yzu$dKBTz@V0CF1%l@(l$Uh4o?DjVvA)@Q;CRSG!R|pNprh zCe`}PBf;9y!W0M(cGP+A8CBs{zdK+6rTGp8UCYT=DYsM&VTOyGDG{0 zb!j7~7A)g#$TLj(lAKWW0PIv8d5p1kHS>cgg7twBcn&hy`4bc>5_n47-ap_f{|}ht z^?pnR?XATZ(tVhz5>{vLOz6?DY;%{@o-bwY;~KUcw0v%pUuIi&T5dH!SjjPgmA|Ys zRp@_>W+fLniw{82QQo}s^4Qp#@s+VNjjUBnYR#5dReD@*YD{_ZMF%wRoE$qynGZ-G ztDpYOw_VsPiUW~aI=$Xsa!|JO3(^B=IgKm98KsetGdSJel0N{u9tSc}wed&8zVC*n z@SGh_K}=8Te_?0L`h+(P>ILHGGv9B+6nQGkY5hGz!>*~Bq)76aYx!YgHBUb>veXg{ z_cw~-t^Sq1!I-m!Pu~KwPuU${wrIeV)zM95^KG>S(fvvP@t36ki(b2aD$+f?>fmHq;@b;tr{ z_gRUo*UWboBLAg26634Ix%;}F0JI`8esun)t>tV==?tN=p<;W)GtjkzqC8JM!&0=I zGrAXcjVMT!0*bveq|tkM-K9Re-S|bl$t$I z4PcHhzh5X98_?CJfWq9zW$B8!;xc3YVPRN`g+f6=J^ZR(!NYb{z0GSOzjE}1evPR=dW;dr zVkc1Z`P)b2sh~9LpZA9sIDpI6sLhIYK`I&T+Mc=2jaGIFaOpX*3C1;4ZU!ZEh~Tb*&qo zWLO1`H-ci`%9I|gX1{7~aIq9+>}4h_GKiaJFC%+ru_<<|IX1;UW2e9841;<9gS|{f zM_@>VwE<`v=Jd}8jlhJV%xH!m$j=apn@ku%xl)S^gW?N#6wI!AUarT*m!wAW5+eTXyK2uEWP|GkNM$<0M<+HM!7RB(#ec}J&1AD`N z4Rrj~@Sknk{qO9RB(d&q?*Ar2CwsjTp=xOk=u`0LCX27`D9hbvi|_0eJv6?PyK`o<4E!O~8qa_L%vE0uDO4Hn3~tEH@&`t&D8 zH%kG2r)MIj1rbe|h)F?2VpMCZgN~lGb*mo&{$PHXy8mC@fn7dzL;% z*EMIAU}2Skx%VLLuE^+{Udlq~gz6lGG%1EHt&{BYS_u}P9mcN+#tpdUGtw7k(g8vB+S)dN)@ZI*$p8Xhi%XH8@ z8vxLR)sY0omfW`TU&V}El~%WIo_&f-_a7tG`KhJNz&yJqw&Lq@N$ZB7~MPoWNj?y|?Wx-?Yh zne*SSxk}WZROjLN2Zd42ZP)u1zeLdvX6wx(%sf1Eaf(iYCor83!|Z(jNpjg5w1LI{ z3O9{a~T1n9O>wM_Gr>E7Z@Rd7;92 zH}sl!UhljD7rKcmo2QS>Gp=ynO}*w_*xQX47Reu*w&AFSxJZEZxzJnRks3CyL_dS( zxrOs)^_n-Sx0~QuWW9N`zcg+8NnKj}Fmqct+$?_i8%)c8v-(FKreO)>EH>;tADqP| z2i(+=>Xmm)!?I@RM<=3TZw1GWM(meQJ8X;#ylrmbo_e&*$>Q3rQUnYN;C>ezi`$L8UMZ^b|O(tERFQ+#LdnG?fPhTM%;u2TPl>JmVzOpb>GGH)2<|Ub$ zFPz)I&)fsA9Y=Pgh8M1nzx!pybMak;u`o-0a1u34j;|~M@%YW1Wx~Zw(vr6+9>#1| z7>jUw>8B%rLW{{`($b-NZ+Lq2e^-SJ2J))-*C%;Z7^~@c4_)elFW5-+rpyuilPj4V zHSA>{9RFyNnL&)>MQmZ+UDrVvhehaxeD@)py{%@+lO_;>IP>+W?gk+TmLPqWLS--}uU+aC}wohMEtY)*Ap- z`WC|}dzw3lnSs+m^RzLbhKh@-skoHd?%RT1fIXq2it*I;{8)nr*tbeYzhL?9Zs(%^%WVm~y_DcEbdw*Mh8aaN1_b3#A;4;92Re5>{ z7ysA%#5;rsu2a8;nCyN<{x|Yk5P!@2l)i7DbT`2}#>Ue|f;S`LD`swmZ(;B_$$m>`z{=+KlN`yY!P&hG04c2MWb^u#?m)5NJ9PRMf+XUwkD zQ519&f0#xWZAZ0ZrPj>hPzn{oUtnCRTDlC;7TR3&w}4&m*efOf)P;;+8Y#5a{S0U# zvzC$$kDFLFHc#cX)eo;lHS~R&Kq|+Pzkr^5^?&N0MBB>=`rpxhIW}c)slbn{br-ma;U+;t$v5e+S_S8j#`53kC^OI7y4)0 z?5zVxMNPSm$(HS&cH;g)q}eeDOWec*<*!KXp*%4EYpATm|2EZoZG%YQbAW%o`5a*`aT{-_>PpjAzup8f z+1u)W!vq@@JdvPXF2=sf=uuuhY#A2d%FA{KD? z*o0FZO+;N{zCdr(R$8&otF^6AE2x;-2wH-HaGFN}oiNG23c(jUP_d#*2m%ET*_xgR zVBSi$!b#PsTlozw7Yc=I_RRdQ$v!fhy~<|Cb(puhc^Ae2&oHXyTQ4j`-9#u$?upAH zi3Uu5c19{bg^haaD%R-zotigYXYBS+#hy^%+jU+ng3*~6R_bhoaX7@Io8S<-V5k}D z{0vU&C@dt!VXCC->rtc3g4*LEqX`Qtf6sFp<*%xQBU!Tn$%VhrvX;ZsuCl(f_ z?jmRi7eGB>SZ@qlq^*7pr9!L-g4^+glWxDi6v8=X6o>A(bf7IV ztMab53jsEFBBFiC>e9r$B3gTQ7$y5QYGP@JHa=1)IrIVpL(b?ydhT5)5}B&H>J|TY z3TGB8`;1?PvflI`c(%aa@HfQDz$ z`NXY_yyB9$AX1m8zqGDqh0}HeMA=z?fqFtgq-l_2?M=E=K3j$Tpl~l0Zm`8FI>O1( z`_~nAcnz0Eyw5F2L4bm#m1anWw~4PkCNO)`;JA83W*T?j=j*5fvB&?WVI~qo=y!ox ztebZYi5+mF_uv_eFdYD;w)@NR2$5R=V;83uGKf5!QSbD(MAM&|Nn$?wmH*$M zU#2S7^ApubviOsK1<*~chh-or^oawgvXq;nut~f`Hs)cOL664FU zax67$;SzP|C_~osrvp_pD?rvCNlrU^1Na0#bh*O6%5b`si8kdmmy1p$nwDD^k&EFD z@xP5bJ=}$n&gU@yeDnFZ{XE>SGoMTBXQ_XR`CMf`%UJ&x5%kcOjye(j5D_VVu*vci z@xYAOj&i^IV>PiR7d48KkEmoj609VL5`Tlq(@tcU>8!9TwA|nr%xQXJZ29SJsx-z8 z^m9u6g+F9PpRbO%HEUwJXHklQv3jHTGEe=HI4x&MU2SWL(q9Gy_=!O`E&0P~*^fZ> zym7tn!oUJ!p#`=RB1Jv#ZMuBAQ+m8V9 zYAb~9-VnvoJrJ{VG;O>>^x)07=~%2W82=85v31ni@AR>?&iwyk$XOxmF7Z;K>jYx8 z0p{fl0|O(ANoZXao4e%3^o^ zfzi|>iwP6GdSo#hKo%1+diA4&p6@#!-%4D7EN1SH@99qWqJq*t(9S6P{D6m%@$Z- z$l1^2#CeS|>mP=DXY2IYn(}2V>jQqg*Z81X#>eiDLs;B_zRWpGS;10`4YoA@H8V7h zA?<-=;{LLBGp@(YQK&}D4e6v6n9#UIrr1-^hGf~1oD_(Y)0r`Mu!cz?=T~kvAd7~u zjn3%jWjb72T@gE?p=PQ9$hK&;c>?oOsnI*>4FKWx!B)Q)r2}tnf8$KBFmgKU!YvP( z&ZdvICdlYeQ2Sxd%%X*w(Dlp)!-o}7gMlBHYO0<^wY8Tloz=JP1s`laUy}WKrLh2v zFthd$_+c}{kzj_y@!2H>PU~zUP_?cBMW z4u`wOu}Nligw=JY(h5OK_8On@rj&YvxIl3BBXloE8?;BKy9`i-9gFxrH+ga%0CMy& zlj&#t(F>UVVC-FYnCU-DSl-)=JD>+n@*502V0z8uNY%@NXy^g|bNNgiU+1S=;>qNL zZUWp;wa=T(*jLHpLe=KX3}*&yR`#BRln>y&_{E%$$^j`x*KmvYH!!^m@wkWfbp?1z zA>~N}xC$b8C2{bZBXH#h#u7d#2v-t5Gzixc9v*}n2_GGVn+P8pgr^fe&V*aan$=8s z@yOtFf&Cm6d@iz|#|NL{Ph>tJ_-wbICkCHu?Pq21xzT=B1)p2&=Sjh*w6xf>4B}_& zr=R_MDq&m?7ks|WUGl~D9Xoe@xtqg_ma>D0!%_Wken1w~?0&^O&F<{;8}Ml&9uk@2 zS8c1kA7=?mx}`FAy%@=WLk6kB@Iz7V7FF zsOP}nItQ5`+Yqix9{#f-1*hdt zccz=B4NCgirlJp}hSHY0X4A2>wT#(Wd?ckZU+H61MT4m#8wrtS(isB%Dd2>9&MIM5 z54!|&MK%3?a2}ua7guYom5tF3rIfF#V-s!iMnwNn=4|z+9b<6EIAmqI{59CX0{Xi1S2U*|Adz^|41NlVtoIJY>JOeGd1ZR?%PX7f4+b-%;eu)kae@ zoGiW*zRcMP=g=#<-|K3dClfXP>@C>^d;3hpe@OSIXk@BzfR6#%eRU5 z*2FjN!Rfx!x(P~4T}@O_ly0hqNYGn55YbC1Jz4dJdZPV-zxEj^A~wVZ0G2-!otjBS z2vb2hv!t+77C`i;7oXljSrkdOH51io{vY&H_37Td>3Wbsmw><~W6$VEapN!D{z=*@ zwccy0DQ;4uy=YWe`O49jqqUySDCyCzzmxa@8R^O_s7yEhpnkf~6qMPcILXI}`I@Epj^gOh_>MkKt5l+?4YZiq?+36;7WE0wX;=B| z5RO`7z~!`z0Muf*Bl&e&P8HzsAE-_wLnv}gf0~!8>_n%vUdfzg+{lU4{rfA@d$W1P z+UA}8Z#<}ZSE)01zG_+gs_XpX4JSUw=I(dn!Ogq+M=y2H(CXy0OeQ+8N47DypDYpP zJPWCLuLm2&)RWA^f11A3MN0H+N8=sc&f*r+ozVlMsnPwTA9S|tKZoAY+2tBbU#IQs zz>?jxVwaVYB9?IJ9K#54-Ab2Gkwq%D2zlp^=QF~AUc9TY(`uhMb}}VaG~;cz?LMju zD%s&5oT=pdrjpJ`#dcH4HTq-?%(nJ1Wesh}i6*om#VZ$z=hyJLS2N!-&D>8jJrEP* z0wOs?l%pB{Zx$Da8eHs8U7*_xq1#P_EslwI?}K=fBbVxbdm-KB>YYV8RMwi~^uPe0 zEWSyVQ%gAzuOvDkzN264!_)^rSLffBR=)z@{=_RQ>S4?iFM*B7IJkn{C1Ve_t&h1U$kP^!?Xl6K&C8V~oLa;Vb)BhS} zik-P{(>lPM^cui?*kb1cuM$4Opi=P@grRkBMd~i~f_d?ud)_SB!zi^8JWgF_OO+@r zZ*aP6mfCCr22!Z-r$LC?Ng1yofhs(Dp@b+4%&J$=^~tFBdS2T>L;7`f={lNT_D=>S zUUTnyBjH%7IaOktyj30j#13Gh!tdMgaFsL)YHbuE$>n(jvBN)Swn5QoEj_Y$Jo}VT zXCLrkBI~BC1)u`nX}eWape0Tce=SHIEp4tYh#sb{0j>1S1Wr}}Pn5-VG@1TR4^nua z3REhTC439x#SV ziRCh4l02a~`tT)#iP29zo9dZV$YT-X(VwLmh0uZwgnAS?ubK@QmXmjj=diiWTqGnBj?fOgvAD|BWbS31mR)M z69)cBE_G#nay^EYHH`F~3vNXw`!NUqF8@0C7eb(u{1w!On9HDv_W${P zCNEi3E3Y5BBK_WX?&)xiLw*T)OH@1~HK;#5fbtgWvgTLC`ext>Gz?F8M%z+u7V+%^SIgKOuR^; z(uw(|5?)iG2V!yS{3GFSW(^D2>-h{jwO!z`)dyv$!HftMIYl#q;FB+81;MVrntF^N z_#2{Ak5h+Xr>0y+5Y&hMbQ2A-ow$~q!|l?iuBAtaweH7#def(^Z-5a_djoG z$mWh)ILkHNnlq@{j&%D=*^%zhvm5;wX=KV8Bo7TW;u&T|M1E!)g5h zIN2O~%SW1pY7}5b@c0!aF>^l5X_0?QLEgAz1W4ba52>SxB>Z#G-Y)8g2>b!+*^Z|h zGTjQWI2eybW?}Jm|6(4b*HX}rx<*oOx+c?GY@1HX_H^H+WV=8ADO>aqivF5zWLJ^D zzKrxDH4xpuEP7@0S#%xXWKa(w;%n`eUFQoCc2bNWA&C(wLJm+XXaqe^QD@QVLM|&b z(BMZjm_CZY??Lf2>O5A;-Mk(r9(50Gk+MH2+2!>p`jl91m)8gE@>)xWC^gsaELdM{ zvS*T6Uqx2>vvZ}8SsHsP^m2(TWrh&{p{CV4E%8^Y53FRIuWN}#oJv1M^dSP5k!mCc zE{GDmopYTk{=LY*(VRDz?(XishJW=?$|?N&s`CXjHkoHxUKHQA{NJuqTAvn7)jFA5 zpN#M3%=(1NCRm?-Dc#9eu1`-6G5jQWJ!YqW7#!rkS)Z)6dk=e9f7mHmQ&{Zb>%8_z zvZxnV+In%N4MFmiaLvn3+qEFt9f$D6@qWwYLS$^%tG0!`SMwF71s$>B;(It~zMTZhIxTk)Q28I_ zm&c|;f~o6Llb07^l9zDzy`g61j4PbQ7k7u|9okUy+ziKA z%ySzZg))Zl!HwExU~vfl?-e^b9ABY+&8QL-(g$&=aYQC+I8n9};pEv=8>#7-(LdDL zizWD#I&bZ_dK%->%|P}FRD$M66^ZH(H)<`n@6sjaPtt60>+S$cn$V46^e6vLyj*#1 z@2nJI^R`FFNz-Dk+=}zCN$KL6Y6yWxicX|J~#n52(*hJ&&WI(_Fd{>hI=YOD_OL zZ@}>(UJ~vnM}t%UA-X!Q(dfh`?9{(4aag&v0Dr^4W;V8ulZWxD>>w0vU$DoT>N?l8 z6FyyCBfMs+bM2bXoZBW~Z7$7_*9W*Qq&|VpU%gS4ZDBm+Iqjb4Kh>M+^Tv}pXRq(X z4L#E1JNwKWhK+u5=$X{Z(s{dExVC#Es8gCg24iyqszi!Y87L=`qpp6_X8}#L-A9hZa(UWl?Ov)Vr~WzE{-9P~c7B1hnhxi# z)%;eqqk(v^-JSBRd-cn&Hhg=KaI+(QmfNxO*upn;(ctP=hQU1xU%vWTRm1F_T)VBS zF!r^oSNQFP?maPIBBYepwI~Lv1#!7?tWKYlO}ewpB@1T}wfrc9n_OtZsv`DukPqWM zaVeG@m-3a|e&!sP*~C_)duYQ|x}+4{?`HW{d18$gRsug%pi=3dH;FZO$co{@QDp_6 zIu{q8K;oy)sP@EsL8GGM)?+9UA#xd;8?$r16x|7Tv$mtv7l?%%lUFWL2UDA10}B#! z1i{>WfgbxA>yO^4c-(j~H!d7sbfwiWBUGQRpikz#inhAv1R=dFlx&lknZjJSY-={* z;0AEAZBCGc3;MR!AUvJ$^dO9D%s;eW6$vGV@ zuo!g@ZJu%pm%jI_Lir`|UUD#B=~+y(WmwNf zFZ7pwPkicLMWiP#d(}<|^YiU4WU(L9ivTI;Q$!Q8Z1&WmX5m!?e`quhF3dM_8fC_) z%vCCr9C}Koy{rn~A}$l#=GrXc#U-4`~B9kvM$cx%MU1(Iz`n1M^9&^Z0kRFTDX>)H>72+gOpXz zrer_&l>=Qyd)=w`O|noQ+LF3fp=ARIi(+Q^B`ApOb9nlOnui{#PTxSMZD-A<1vD?E z2qQay{|DA_3Hzji|N75N|B(n#HUgIPD*7MGwrjMziI%cvN{VWGK7{sX4z>&&cmplv z|MqPo(zhC?c=1~cie`QqpIULh6t9zLjOfn!Xe~W^yx&!w-1PwYV~G~)I}-oiwyjH zC6JnXwY9lm60^lKJ5tr9zq~Q*PnXi)%2{w5gYERG|9J+}hkkXMrr#2bM+*XCviMka z=vb?$h*iaxOT;M9!-6^~_8U;MX}{FU_9K0u9rSA;3EqU;jme@@ZWjyI8*MFmoFZo+ zv-i*}lBgX-&*f7WoK5BI;ktjp?*jHV$}1_C%}7sqf-AJH z^%2v4u@)$F&kw9)(%GKNoR)haFKRk^M;p<+M-O8}W=qgz;)N4=`nmPK&vs9=jS~Uh z8((O*u>VSP4X+ktP*viWR({kW`;s94Ny`7z9|rjYP&zHM#l{6r{9$7SCU9OOGP{&` zTb+m-vu}1DMnQtYlL+--sGF#*RREu6_X@t$)4di^ce(}_WROL&$uLWiL5BN+42M#K z$#4Ltev63An17pUn)9kD%~Z1>uNu>zz1xvKKGTj&2UPIjOglJ_YpW#EFe}r@pdgC| zlWn9lSI7K$X0+Kyzd##tMC}+LblJ@iGs#qv7c*f}j|>xG6SHNXzE$s&r*@whcb}NXePSkwjr16`VJtmj+?V#wGi{%k=6zxw+b5=dpO{7a z#Q6KfY~LrQ1SL+-K3DG(s%3netwxy<4)F&FJ0tlqqVxNgd+N^F)@E+h8T@ZRoJ#|{OA?C(-Xt_S+`hPzirv35Tx|q(kcw5w5RDaNXuL{lCQvm#K8lG{I z#q#sxr&)e}{j}kk(OBvssu`OsIyT-ukOxyLg>I~$)oPyyqSPZcn<)gXll`ABNArcZ z6&^j~SmbfO2;%G1_Xu{y)lGpnk}%cOc^g$psZkJOf5ZEb=m4eGJSP66UGwlzhVqd2 zk1>}PlRiK|JJ7;zfUQuY{EEY`+yb>g`mOlRelw3`E5B>mhyw2w26-FBaD%WQB10NC z8Jd+ohuF7BHjqeP=qBeZB2W5c0@DFedL#kCO0Ve5X;$D60^+1>z>{;tb>*jHj$!i& zaHBn1>?R7*x?1oj)yrj$ZvR|XRny(_m3Q#{0RMi?zsLBulz%Jur~SJ2?JT?IAJ?+; z5Zd}9$oON!BZ+aSBo{UDrKJXWzok1sGu?!JO+x$JQ;KNcb?UdUMEJjK5+-zEb~zQq zkc<@gA@SrJ+#HsIu5$MH^(!PaTesly1U?cEqf|YXqNf-Wl^z90bpn79+=7!$RPTB` z!qa7nx-@xL{kVVEbJ^NveBX2)!+DgUPCR+Pe{F@Cj z+f6w+a~Q$3M(r`Z&O<%6lJY_x?{58HI*=fgl_zX^u72-s?c8(Ui8(#Lr5`b#lS)PJ zGmP`9z)9sfP5uOw;`oyl=%%7~qP@g5l`baEM*3`gvb(!xb!-%5I3(VULc>jr!+B+a zb+#)b?{UMLt0zZ~$;VeFsl=$-%{$hQrS}iswF_>~^z{C+mwyW0XF_z5{qiI!ODYlh zXE8ddMVf^j{I$LUZ<*+{{0NZ=R1_WK(uR!XO0C+AXOa4GX@d~>JsuJm*41JhVZX&u4+ufTG zA&fr2t$C`fnF4j*$80poWpu51@bEsZtND0_5J$Th&HRw;9A6WMt~J@pPY`&3h4N{CnUsx-VQnZAtxr{+PLD ziOjXLGj=>rTbwl$myu%`%Ky~P>o(h0G*Rz;qL~_MS^=*%uT_Cj!SmbW^@KD6djI{Rt8_bR|JAX&?d7R3fOc>j(hK**GqIb0fI3C|-v|E}XK zAE(!897)=t+@d*ts%)O-ftXq>PE;&$E&j)=4W{Xdz1kcKOZlh zG84HiedwGQ7XTSAX0a_*PI{oPn~*H~9!Uiag&&Pg)O|Q;Y$E#MkeV${OA&d_NsjuE z>xV`8y{$gwz#-9)YGlSM^)t?{YU?^nOm_mJdrTKt&A_ zM)aU8usXMCiILF?JN%_iAu}}YPw{ou5ilRqo{6(>Y&S6SRaIQHEU)}d~biCWE--`_0#5T{uWon=1S+%_B zGUrA0+W@7uDS(L6(#7_kdbSsa;%|5B#!a|px6}F@vErWF3{FPy@Ly{XGFHsOht12B zE$-EwR;@3uKdANn(vIzY3fF-3)30tf8vU&m9andlP+eJ+jVLPKY5sdd5iroUPB(HO z3r(Hg6oq|7l6JZ39{Oa%DVSB*0!{v(C;$~Vq2s!8B+Bip+s(1TmXVRNYt89G>i9qZ z>=Rw@Gu_x++OfM&;R}VUVf^!ThtiPB2?VP0UOd7L;Z31CiryLBI~pC$+zNF^gVj6u z=AkgxaDqS()8gWqyOxlvN6a`jaXXMuB{W_>+3nug>b{G zED-M{2d_rvPJKy7wZ%GoytY^?Ir5mKeJ6Iiia;LQ5B+5S1L6X;A{rsYg_YCBEX#(*B2a=v8yc#OlxXlv$E$vrodr2Yq($ zi&!IKP5Lr{sbWQB%HJ?`+5R(nBM2RvH;`Y_X@5SqsWW=S*30N*Y6<_-qBiechSJ;A z@0tH&yd;m+!Un0|!`P8T60@4Z$;$?5SsU^=Z7>r!OJ1E%ACW|?G}L@%AV=#0;Lg7Y zHs%80d!eUvqbz-Pu7v7!6VsYhXS;GzCs(Ml{>sS7 zb5sY?v9n|Mf9nc=Z~m1$EyTZk12;4(*owo!Grsu!2v!eWtu!i)W$$LEbkiSz&h+2Y zz8-#oT<#z%Rsx|!-54Q`Daihg;!q2a2YD<0S!PAUXB?MzqX9o6ij zKm>3&OyFG5KFQk3Yu9%G#aDx#bK z8ynU2zdoAl`b&?Rt`9LIIHR{6f!XsPopBjMvBku*-}8S!$=q}-2$0Kv?N+No`2+$N z4(pG!jAAQideM{ml`W(5XHK{JAL%YUsCYgfy0I1EAYU@nLNVhr^YC*F{qaBkU2Yg9 zb{Gxj=Zw+(FcC|0^~V+=Ek-=wDHq3#ubS3_XNQv$3jMnn8_a8|sLL6{cA;SaVD58E zRiyB( zv0S2J^cPMf*YVRcQ8D@>(dVaUqGI$%Vu1*wN41Ix5~Y0VnW&f`v2>qA#RQ3!`y?tR zNUYr_Q87Vc<35Rs2@)USw`YeGqd&`}CN)X6Jq-Sgszj^QAQOZWZHu0oIX@E4mza3Y zjko$oD43W~YJqNPfa&7RQ*2UWugG4hDo1_bh){A3T$&~ne9Hu35t=jC`$7*z|AR>` z@W1|jOIRn`&biqqIS$bZ`@ugfnZ1DYyU$a8rlx| z)b3ywUa^Fxi&>X=niEAY_slf~LfE^`G!`9Lj7Weso~5`{tRoGH^dVPdYu4 zxV}k!Y*w{_t%-}uXc6D~llF)oE%%AB)8%H)+^K;Jwcbv*yx%F+?TXLiM}M$!c`G!J z+K!#2R$Z--E&G$X&U>otKJp}f)Xe|mE54LVXIC>l`t*4Gcn&}!l z9WKH6O}`_Fv9rR3?R5!M9pGz4hmOm3_#fXxOJcvn45yWDJ6U|mZ&-(PXs zPK0;Wi;0{GCE}_EpI5OacDJ)EIC%GV>@1=SXj&XK-Dnm!Tj`odsPrXb`7|f+<+S1t z|CNC9RTZe7)WiJGObOaHLA5RsH!xyXRV%oc>K>JJ(|~O~W&xXNMD{h+ek)*zZ+|0t zkOp^Z-r$}mOZsdVl?ofh0TQWjiDBNqHLJbt?2F2D48x#i$-3XobXudxN3Yrf|69K_ zDpEAQPU{*Vj!xN4xJ_0ME426vk$y4P^684x`tw{Cop)ch-qPU((4oCur5-icT;;S* zVO*x4B{PTQ^=%qmNDWsldZYCPTKC4*3RgENf8KcN5`QtkQh%m1O}rQ2&;Bj&Wj}wpho5Dnv7e{kT0F*p+4G9e_gED&>sgQeDf)S3X9>_@ zxzqA8JA(#qHQpn{`R}RLHqIpNhjGX|k+NZtL=8G7gP*Jd?2;_?>B>yY21rF4)Ru1&5S@I#NDFpL z*(915EnE|+@!5Zbo$;H)ma8( zcLrIp^#o7DEGR0fKNp_?PRnuRO06$u1#5n)tVu~u>$`l0Sr@hPg-6=;QOb$wZp{~A zZyO5KFLX}PE}7zs`9=n<>ALAiqvv%KCDt{sSp*K5Yj{ZO6ENLy1u8@!`+#fXkCQqY6K#+`!Lx~Q*dLHL|3RL0~--gQP zh2$FFehixzDzYJ*<`>VqxzD_d5#{MjiKbM;Q71q3moHK$fuGhBPI-sJUc)sXhn;aB zhbumgpqFiOT9?8#vicA+A6?DnL|5|-OFM)@LaZw#qa|mL&YuAG$P+5{4E1Rd-Y5+h zZm)Vp6Fij(wtHY_p0TPcysq4>xUMp4_R?!$EN)F_bY=R01(FZUw~o8pV-J2s`#)B8 zF{=e;n$SacNwt3qL>d1VeEF@FI=4p zj8LL{^68_J4{caJbu0cBE?j8mIyvA3p2Ce(Y`W>>Fh>reT299*J~r%AF(Ng2!#9Lm z_<8!M9`F`1Dn);mx2uxhE|#YJ5ig74147@)jxnW!zdTfs_@xS?f3bI_Ss160 z9xbcHK*Ee|Zw1GO2VwowSv1uZty>nSVNwAPn@XBF<{FJ`Vs$O+{mI5<1+dUDjvo9N zrhU(v!Rm}4C=um2#;0l5x5=WLF0DE$4Bw=;*v#b;V;DZfKk;VI`#&D>=8R! zu^nF-`#Z$~6A0Nt`4NWZKmJoQG(*C+xqHZ$9^a$ZgH)>=@fiqs(`#)i+C>aU1fX-3 z*0ma;ja?Ig4GQ!Y$T%rLGfd}utdjVB`5-sXU_O$+Cx zRa!VvdDV$eU75Sj%eK#Yp7HC+DpA**x%b2!jQZeY|9(*@6K&sTvu9qH$~aZq_q<(Q z;U+IjdLzrYdbOP>-R#|BelG@7N21hgs!J>t!wx0K4@@K;Crtu?x$_Bw!F0Y?Y-WW0 zDTji!k>u|rq~XuL0d0kLA}QU@zrr)X6->1!!RaYz3=h?IRySb{@?;)ikJKP<{{)87 z6<1?I_*~~`Bh$mM_c6PMc9O;In)c#$$)T4$5HLEC_PI5NskLlmAf^X{X+Z3*b*T6h zRMeE)G<+IDHLF!BD>u#{5!EM zL6xA=n+!W#^NtJ=COPq6s>3WqjdTl!D1(*T&nzpzdBN#&mwKlE8oFq2<%HzPXW|v0 zNToPu)VN_mM_?4+3uk;ayJj$88G`B-=NQU&77d5py=}6~H`yRv6e_1Jt-A-1fk^Ex zo47>uLTE{;N%_?8`wexlTsUB=GmBN&Kqn77;$3*g*08KI-mfuWk!58@eyHp$7?8JlZa1}U z^>=Z>I?OR!X-0(5irI(47Ezd=f>f(SVKF2&TCo|1OSMoe;8MU#Q)}4NyJWWo3CK;S z6pR7kr*!i!mk28S<|iPNac7~6d_9uN?*~hE2(`Ub`ubdwX}m9uYr&TCHw0{jJsNAZ z0BwY=czeGb&^g}Mad|1cR;y5>_8G2B%;ZuSF(Q31eQEnC4H`Cxe6jdm68~IrWsd`%PDFGS%^%2`!2?=iT)!A4#)Z@#PR^ZW<`)tS zC&!m&wgJYGUIQ-3!ihd^qOmE&8??Xxscm9et<&;OP=+JrxdKCYJ1xfIo_PFc;7<8;`bg5d;W@h{;69`Ov1IQKCmt+SD}}p~ zGcb9ZP@55VFEz{uB^{2myJ|%v3}t#Hr=D5qR_Mu^#)HXzs{pJS%U~zcZJ$u$LP@rG z#wzhHP)2_;*%~k%Q;SmY1nc>Ch^8ZEroI0!W!qV(1&TA$2Sw_vYHZ1OjV&P5DAH$cLT{0tcJ$Bll zMb!;=t@=#Md5;5U7#fJl@sp|ete|4l8lA!Ub|i6KP(K=v*~6k|X{;km-Da%s7@lQq z5D>k0GblKOf6NJ5X>NYVT#dKB&fkY-J*IoF544ydo5BGjhBSnFZf?pL_-`XF1{Cz^ANEtwx+&lxz=BE4?4gQt?=e_%uJScwv$Xwt;#L~ zV&$;1?If!V3Pd-Z$L^r^^f;4So2`lxpp>wjWTfFFVb6YfmdkXRNZJb|QKJ=oiAor+ ze+?(hktrKBn%GHb9rlvcqo-&}X8A3vElWR=vmCOg`+{EUL9YmQ!CxULl4@khjaVb5 zH{>9^kN-TwV$TK`fl{S*gk`a{SrrL;Xhg(}ekKe8(8bG`lo?GSq!96*zCx#=OvUw2#t3R*QOpv+1fA92N-)V%4-rAnEiZxiFc2* zM-nZjlF#1D5>6(EuD%D6{01U3i?l&i^kM#`M0T~RZ(6Cj_nUb75dw5dOlCb?tbr*! z^)}iy652;3LX8ow8s5IqgoCc5jc!#*{Rw&J-NFED%|a#lJvR0#JHw=j zMZd$HAM%JdzLPnyM$Hf4c2^ia@tc%vvW!07Gw|T)Is0u#q(Lqb_Y&!q8xaJ&PcDS2 zbnI)<_FJwew+D!cj`kR{TsgZ+hcMed}Ik_Ylf9n~H!*H=JQhSMu1yv&2PWNJV zQ)Y{=rFf251Rwvoq&@dKiiEoEOEXgo5TV3IqYI%c+WX;Prvt=Ritw* z?6p6Ne>BS!HbiOs{$Z=C`{BodVs#*gz2b2H*DQ@r2Muv&#G`+78!EU#KTiExNjpsi z&o)0>GLIu6&a_I+f+rcT5y3u^-+m-91z~Aa8S7e8B=HwfGaG<`faaJ)U#|m;MQ=s? zy~dp)OlBHKUI^&Z7q@Y-WRDq@oUcq z_%htUoOekCRTg!x+APxFpe-%1T10Zq}N* zw)*2K!M%wcR&YzXy^Mj~brN%Rf&k~{pN zKM+OPR}SoUpL;ssJWn*5!=AwFYPjYTr*$4FnR=MFf_k81dd7y4#Ux)nCW$*a^gDOk zJ!7pue58<{3kjltW3&`a3O0zf`<^QOf?{bm(-I8{{@(|^&3V}O=979{eriA_DT((@ zJrw-@0@&w!cNj#Mkk;s!!+L86%_#HqMn9z)0du2izo%Mk2So{2`y(_DR(n`|tO zvCVqfzbyg5VU>gqFz7ye#0x^KwHcz*`QW{G(bH!2Y7&PVyOh1r|0j^>Sroqrn;q{G zh&f;dD*GfoPlbr%S(dZ-$q?PF9%_>u!Y{DzKcg_6>Y|3Ixm%)2te;zRuO!>(d9G&y z{8$-gtACD07GFMzFrM*jW}Yi|NyWpVxg=RyKu zy`Z4cY7K&tRH{T#6GhFH0MFF~u`a~cB`s>xs+F(a2wIomO_1yLBCSiUwaV9ScC*?= zaRC#y;8OPm#46TmpX(I`wJf6K_x_xD?ven0f8YP_pVtfS^UO1I=FH4FXU;iuW@gpA zCOshlxK=ukKo5H-{z0{8mnDiOk`Nq<;oQzSl=H{j48cil{hq)g%juqSi~)34=~yXt zB0@>y7fRfhk{4%UUGlqtbD*+1W`(~_u3!kGk^ousjVSR=t;eIiPOkYbv(L{#Q98^@ za*;tZ#y^th<-ll0Go{YIH2~8){>mf%s`dEqwv^PIQx>~GQ_NM$=@j9AdhzQjP~vW& zmIA1n&mJjP=g4cQ)qq$u(MZ4IU-J^n{H?HQ=1eCqgq#ONex2HxA<8-JA8C~!$lY`z zr-bog=77LP)!ftx3;2WP_l!3Jp5W7OK@l7Yw%Gb-nJe)XJ3$X)v%VeIlf1uBKsVRsh{cK7p27yT8i?nDd&rS&@%vy>FydIL<5=7hlfXhQY@%XSQE{PRefz}*VVmEFoZN5cCK2bJ_lJ_^y3S1y zR-Gx5+R48$W(KPZp3|~Rbmj^c16u~WBAN>_qY8R{8`x$;DJ-ksAc71p48CnoD8$X(CT};AQ1W z7{k92L`iyXJrDcTS-;GXYyGqT`z@cg2E14nEtcsp0RWwqbbxbb4cGybIY<<|xxT{e!L5;0$kIMw)qNvAZ>}iW=Z*{Y`y@&pRgU^J7ovbK@ zvOck@d!)CI3!~a7=BZ6xJ0u$lRUKb7Kt5$0u9yPmC(N^-+KadTnxqnYXgm zkCD=4NI1^4s!V;;5qoF;m+3a)w*Gw87K~(4sALDH%W{)I2oh2JAM@Z~iDd~^sb|8f zOa6Yny`eh#^CU$yJI_^8VaN&_bjq{tA@Q45EW{t@t3<$Wg)Sk3-ei+(wSSlc8)Jo% zxw@62)ZP=GluN-IQ2-Awr#9&nwJN z>OH>aa|Vi{c&}MsHH-z*#2BS%k%YS*Bvt+Um@@dqDH!QKeN35*KKJ3~><4pzd+{B+ zF!~G`>AaUp=PlQI14pxF`LsX`bl-rQh+|oVrauwb(U83-2i3^AGVSu^fO0Nw=z`+o z+nv8<`*lVNTG_I|s`w+f3R-L*g-?C;ua3hGMyl;($TjxRDP_p@_Fvn5=Zc<_yV;oR z3n&P~4L>p~TpiS-Ir)u|nv++iijR+X5CMxPnH$WJ+{{YRRQpD9>A9Rx3Vy0xWaIdN z9vYGt6g6Pc;Cne^FsE~URvi9GCtG`G?-jIFiqBBG%9f5UTsVKV>C>r+b0f+2e*xNf zRQ8x$G<0DJOqg@eL=){kpZGB>MB%UTJvHNVImF5(3^Vj!H0i!Gg+>!8WnERY2M9T1 zY%;dkZCgoH_Q%N{aB8ho{A&NHe2S-(@%~~`BJpbmms~bn$d=>A7RmXoO7AkPMcxfb zL#`odH8v>bP^-gNT|y1!I(R_xB(aL~oLro6VCF}=tQ-&=d#8B_z>2>W&ni7PlKiUh>-V))Ovh8BlXB+$|+at(<4_$Q-n9W*siEF+nA&*f~>z z!-Bp6DW*Rm6?jZZesh^o^ZYvv+J_DyClf0CuLPKkfnu!wYpj0Lw@;BOJkaV6_B#Z- z6THNKV!ujX-JR<{;ZWcvnFt1%Sb-a7dm9NevzrQDyIz9^4?2e4$y)<>aV%HPvXrS1 zHk-Un1Q@3mkm9ER&UfI23;iF0RbrLK%V?-qG;z31vHx05xP?G=(cd7Mmomw-o}^<8 zx!rn_4Dw7`p7~`#|BKSEk?NB=rNs9Qg*>_uoIvp%rLjZeI|jv$L3DhxpaEN38LTP5 zGr$9RNPGNOkmC}Xm>$zJZC|AgBWYbFmKyF<{3g#rn~UPBM(IwNTILv>GXIi81n#ZP>e02UidGls(UHXMrAE$c z{YS_eSv*2RXi>E@;;2_ENUYDUT&>mY-{?P}j9v4Dn)qFJ9KiJV7XioowQxJvE686v z?|am)0cq2U9Xx9O+J!vBPtHz^cFj{k{h7P=Gadrq;`+(Sd4?Z88N{`WW`+JLWC?v0 zpUeZ-X9JdQ+(+CQJD=)e$K@&BmI-pvFIv?wk`UXZN_Na;_~jv5*pM*%%`agHKS^r( zJunLlRb_wqTC(5E2Z=vhM83$@aZk8Pyb@r|XZPK;Ps=X_HJ%EH%y$a227aJ5`VcMn zU}C_b`OY5dqB+3rpS=U}5dM^hyztMI|s7%O@A_9O9p)R07zuDI@)-h9K}1& z@E5x*)8p^4uzb1aa@xWg6S9c%T_jB==K$`xQ7F%w)}OuX_h$3m=9&IJXjSL8PAA5X zXlmZ)Qi~*)bcVbvdMpre38X_8elQeeb>S1udA@r)tk)8 z=dUKE%Mda)-!qS}?1|qG1Dd9GZg}>ky#Mq909e1?V~|(r9LVc$v1jI}!2cRoG5zJZ z-BlrGCt}A?+?m;(MA`w5xH$ixk2Gfgu9&^nnEeicbj-fH@cw^yAg8l`1^j8mLe{_UKaEpEo!@S|U3=)vgxJw8j41y-0?Wne z3&iQ4f_WaUHEdps23v;F0jF=GWz=54>2Fy|0jEFfvN%p}ahx9XT)^r&ly-Nl-ZMUrQ*nBpPn$Qz z=Rl;kwo|9uM!UL4K03gx@zkXwvu1eX+-Hkw(bQvOCOU(lHr|Epz+kdNNhd?Ff{J|( z{~S@Dyn_8nm{v@Seq&5=qk!cRLGv!z3)-f-uSnj9Y=hxL;KHULVjS}XU&;1 zuja#WyR-lYLZX0uS8AmG%=B)?u>XZ{vO^lAPybHxioVg3t>P!H#easvA1v3p_2Eta zttQn>vv!M1ptn7+MpEdTd5N!XAD?N=BdDqA5ESRA zH1*^0+i1l$3kcnOc3u$5)IEzv{b}ZuhIb0_H-FkC%-7=><^q4(hw2wu#YWx1lpU8VQZx5> z7KAuDW<1_Hqo+SDT)>QSU}|*tQobJkv@xV~84_YV9YROeoIkDKxo%P@@Tci} zelpgZ{tEnQYLIbY)}QtZt6fu^f0X2`CXl%*vpav9_{IDZkm(4M%#L4r@n3e)s@i`` z5(QS?jXzEB=39l_*RHHte|Qgn+Eb+g|H;&V|I`ls1^lN$bpA9q1Ghksfj=#qvtSY) zGn=m(#sY2N?JG$8D`{D`S)<_s&6_7Y?@p`Drti+3mc>Pk$i~wi?le=A0;^S%{A1Lb ziR7Cj`l^QS%$>FhpGx3PvvTm=d3nB5@wfj=Is)+#zrWbY;a&LCKJ%Yt|BHt8|GPge zKS}n3c$gpE24K0-ZtLS*)?38^?3~A3tc6mKZD4<{JJ6BKEm{urSbp!Icaudu!WoEW zs7p;)O|U_6B(x(LpUAKpzr9Xgb;f8C6cu6$CbM6>mV_*`#SV$2&Lm2K6-$4udVt$0 z#;Lkvdb_U&WU33sdZwu3906jAEc9~s&*1y&nKZnBQ9Tt=oRns$W-8=2H+6dc6^25e z7EZARBgKKL#r~hLXElY6@3Q6voUC@(HX#McPh>&eE{TrEz=DbLP&(_eiJ zXG&|zasb87=++K7nFl=#X{TFX8q4a|k%3y$7j0e`{~`!)sLjW}_a@LEQ806)t4MV- zr8G&+eIM#uc!`_UG-&!O;IQ!&^Y{8b^t)2KK-%Bpb5B=qxNR9}a`zr~wlq z(nvwvhnd>?gn=p4!a*XIxG3va79*_r0jMmf+K`KUCnm1L;BWH7VQs`@l~jjk%l6Uk z&FxwcD;Xr8hSM~IZq}JWiD=%9B;apc3b`CgTGa;I(sBfknPE%T>SurrTc%H9C3{77 z@+oEY_g?np9PyKjtNxAg69LIjn}Jz}gW3mg&|l9_73ZvXk3774f?PkTDaAUqZ*o`a z>XIR;x{?8mGbdqaxSQRq*2KA)UtBh}2>p}wpbH4R?(P#iE&jv7eP%ZVLg#JmkGiHg zH!w$2fA4|Wmo&P=zx^%^Ozh9;VI<_IN9NyTyq+;PMtv7F#i(u)L|mG;Qk*)SEJ98( zMYwRagPT#P_YcEu6y?zW#1@(p(}{fn!xn~F56dy^+l;{JG%7ur{uXx@W*gxcwlHbW z0)}lA3e3gTnqD8K)xq>SOJvaOuOtN=T1FUhIZkf!|G z&kT6hS;hBbf@m*UGO1iSr)`%N0!UF*i&}DyIly$OxYl8aw{TZndl=$f7ICegWY4W} zZMbbR6^U~zgTN%))>fOXFgwh2+B{09hmqS=C>&s%!|>l3_b!8b)0^PA{O5py)#Ia7 z_$9uI?`rG94^1>j6)U3o z(B8S?Ci~t?9#n7?u9vKm$>>gUA!q~ zMxIerv+RmU=tZ}CSjlgkL=Qe0d14)Xpeg0n&Qvks&;rv^mVOqZ?gf)&{~snVZN!t< z9h{cH&a=FwhY&SWo0O}@565+gWqqo+uUEM;FbLEByVIZ-o5CJ5-q&)-mF!eq z8(1LhC!S6*%9T`H2x+qt^M3kbumQdYu>J_iiqehX|%N9yb^DHhjHpEx=5L$$*cab-98VJp_3yI91!P~i>jEYt- zM5j*uWo3D_I0=tSr~e3&NYdQ)4}uMoZ_g8MK;ycZXa%|*?`J$@&GFtD)0g7IDD2+4 z?0saYdC$5)KW-#D)l0mV+#~)^&Q8?QUT6cIb(#dx<`-wLEjD?OU@{BEu8O?xp`iyPr8o(a{iOv^6Lrd zLgpO54qEksU9R{a!fm?g*{+XW;V$a(;#W2owG5VC^Uci@m|Lebd&zzZx{L%47b1hZ zrZkHHp7=yH%YgHO{X*rD8^5a2Ps$q&=~Q7Y%HPY*m+G>XJzKZaR8e%D#Z^Acle{UH zD7P~!U-1%|$c;bX5KOC6vcB9uE`UZ@CD0gu!KcB=Zvb^EJ;0(IHcs<69?&Q*k~iPg_Dr^=z?dqCDJI zuGSXu9{{}MUAAL5nm{;Ag$VH2QvY&94!=2@!1WW%QFBhw6Ov=$Nn3Zp3)v3Mypw%; zVhfowFWU@}`Mbt5dp>)_;6!zw@AWId6<4T@+|yaz+F#mt45^#^gU_S!eWR%>is9bR zInZ`A9;wps^$XNOzVF3%7J5p_!3k_#pW?Pod~shNBI3w)*+t6o4s@B|w5QaxV*fRJ z9>Mn6QjYW8n(TXDF`@nOFN!a#Ro2D!8TrNT+W5-P`CJ+sWspYc^H1$FYzL&2J(mko zUFBwEd7*qbH*((cUi3T19JO^Ux1g7!iP?hgb>6x1k%yu7yN#MRf4um z>?o%CpDc4H`V0qOps1`WLV=cU;tWnUNfEE&m(b40;-QvT8*ol*#_HO54(sB@F3n%g z3mc!P3oIbJpQsvEd{w*FTFYHVf{ccQzfa-#1Yy4}c8#LGZ+1B8006Jc5Cn#F$b(E# z6diK^!1qwVv}e}jt4q6sv`p01D?L|{YdtStA|Lo(LO$E-p7vj7nGk;d3YE8<85|HO z@V`@&{{Ag!^;=OC9rj_wj*ce7tu+%`W=Mc4&rbm3|CT(vL%H>o=3)$mAl7QSvR_4Z zhoIWT$v8UY;aay5m~fui2f2x*pxwb$N~-WMAf(YUQFb^G`GB*b;guFbp}_eX|BCN` zp_e+fMAvxzw1~4PlKpjsSALSo*Ib``SiMZ`Ew#xTOn!94jsjKxzI#k}L(i8V_;rgf z7ilbHLd=YKRLt(0znCscui2r=mcxBwW15&rda9)hlac05pY0p}lL*F$86 zHgnl`zzQhMca157rjh9)ZHcveH;OZ|m-8)c7D;jco=7S+Z=rsm<0hV4?b)q-@H#*E zG$)d(JCyBHoPnm3YWSUw1E|7ItkqHq_T{`L@){dG#_))Zw(*-|Bcyhde{}a~IOrkO zyK3Gn{$Gwz3WC`a^MsW^JAS$b)R{L5`6*cT2w3S+JTQ)xl%5({imK@U$`Zx6F7dwa zlDLpW32aVh3yyqSW#4i4sDu3JeD5;+jpZcDZ?`T=&J(JbB+4e#%8^_3G^N=eTxD$6 z^4)@?G3%%-tsUp|N6Pym&dKK2OE>e9d$X&mfU0D-Q-kpt%6lwj8L}QP};uMiE^`Dt`MrfX$vN+xB~2XpMYc^FhJ? z)=kc*a|C3W)=8X!bP!Ts15*0?q`7){C|a!l3~*m;mCc=;)vhi1nNdN!T|Vc7AcQew;zHy@l+DVBt|@bPgruGwG?M+J1h#2y(j9j&{^ z>ej`2i3P@*ZkI=I#*k(7rHt|4GkP+{N8g4HZnDHYW893s@6RT&H)C+mjx8=W*9CO% zpGvOe?dnuM`J;JrgIfaDJvoI7?M;Bp%n6QiP4w%(ZoHB`S7F8OD4BF8e*y}(exVXO zOZWG5U@(b^B>xTmwtupK^mX5?7&KKb|#s8ErkMr?8py4dAf51w4EeZ#vv9M zks+9IXE3ePnv3(Gsye=GHE!4Tz}yeE(sG^2xt`zp#B;W1(jAI`pR*3%=6tA*31tpH znov%CUk=VLu3<|3ehpparIH=`VJe!%^XlNaS$sZ+lgLpc>qAT&*(vC;=gCo@`o$uC zm_^b$<2vaM-c0>@s50`#LZT3KW>c5^w1W=p0Urk@G*W{F1 znMcHMTWw9cLQnp#qyh1c#hG@+MAJ0w=#%6v*2jI5i&bCfDV$`3kqR6z(|y`7%l44) zNx0Gmsc+o!CgSS*WL)J_BSP_I=(5}V`qLx|Zc#&Uo4WBM{@+q}*VgQjCn`VAauRUm z+TInv14s;N(E}l_b8S}yR=U;N>40Yu*8~sZ^kb>8ZpRG<9yvI>@6cT%74Y3!WIzP5 zmmWgBHh(4!A!%b8Z`1oL`6h*>{dx6N@)nI8ZCCF^E1x%An-6H3Ps-;0N@XC#MpMkZ z#=9J8k(ci1a2=rXfzT34A2or}Wt1o00#$yxKI@@2`{3yzt24>HRI+(AB)cJYmO@q7 zdzD)(f=cj>I-BX58|V`p(%r`kErTq%VD1)2q#EnmV5|eebi`=% zI^OCH6uzWJK_-+YBPWP#%Jf%E&rWXolp49mx0uKNWQi==LGVhPcpiy&lDIQPw^=GS zqrid8Hvck9p$CKRay8BZ8_j?cc>XEM5?~UfOCI`1lV0ycLBKP~n}W`?<;0tU&a59( z;gm;M`&JV}k|j-k|F2jlw)NRgql~8hS5hT&-0tO2t~~`DvF0qgV;5Yo;Lp1q;T<03LC8%Iptg#gzM{5PHg%sE^;=|@L+Bgt=&Mq znQQYLft&SQQQ9KlGW4-iMXcC|aKC9uy{NYJu{s|5^c|-v^;}>LXIVKQ0VRGXTOD<5xoGqaj{jti}K2Kt2p0Hu*sfY`> zr%}~BU)i}1*M8#$v)idWRaI}c!TZZLqGa7!(M=*Z55r6DD z#7FvAp)C~w-^)v0YJoszMV5cYCgc@iAfy$=kWLQ`vkJHQf2hag?ugc`YMGT@r266~ z6vb+2j_|v2pIn3Vs=wClX!cj-TBIbf_!(HF|Hd@p+8Lytqttsexq$p6Rn&sT;e24lwgzUy;_M*Y|Sed{((6QP*ISY6tqIQ?{}#I*eS9T=&4x%@jOlKM1x9$~ zv|w2!9Rm$WTy(UmDCD5QAVtXq3;CbxHN3tHj5q=-G)vH0k(6g1V?d)VXVYr?z1>N_ zc`7b_y4EivD#Mm$1MwD+n_s&DA>nieM}G*UTCZ}e({XI3gtr@2-=jyMit8;oCaA#2?1A(pIgL-PT#&Ilq3)RNSOa2;v;&*-awEs(2hf zS`J9A)98?ED9AsBJ*$13S!_}0fqo?!Je|xYj2rDC)n@BSIioq@)|curh!>F|zSKlh z>;gF?r^8N-9!i*)P`2xM^pE?7yXQdpw5@-fK3KIy-fw4QX?M&hi8UKC3!T`TSGxis z?;JyaYQ1{Q)S}p^X#9)N?5iH#Xm*4=Emt6U{I@0vV){v1OTH;Z;kHU1?Jig8dFlnV z7$=BUSYc~O#5q%Y8Zp!T$=`4qaRn6=)Ur*2^ItR#o5)SH^@)#+iIqsCm8RIhPS631 zZ~Brj7vp+J9(Tp-6J&42zhI$pEx99{g7oz-x?f{SifN?fz53MT?nlcVZ2xa6D0X|2 z1c|v+V~D+T(aJT^kZ-wU3*PKR<6mmra-$tUsKhEticM}+YY?z<$`wo z0jZF=vLN9Eb?3qp)txpNl2Pex{8!*mdZ&Rr7h9gJt3R6fA`{K_O<4iFuc!hJgLb`E z_+=ly_y_lZl4k~d`dSIT7p4mQxnR>0%ib8pmN$s$pZ-{a+ts`i$d@@?k!@R^_d+b} zcd%Nk6F(D``o#;xdz zBV{WHA$jX5p*ns2im4BJaGEjodNK8nU(xidF-v9+$*`fQvtY@di&S|5QFtDk&eOJLUEcdVZH=NvdJ(@Gg~6}d zD42gnY&Gj&S{|~d;OwZQ@#TgToz|htp z@P3qD^TT{lvTZ+E%jR_X1MMWB3tzEV&id3t)y#MGsin2{^XrBDq$Xp3LKbdixe-rh zcK%7u8_##l!s74^{jtZOhD%EM$(n=crA=heACI%Lk8)=gAub`Cd2>kQ!jV>fvi6mN zb3T4Yvdy?^!F0Ykc_=iXl6k_>1lTAOx`8_dN20AqpRGLRIcm}*-srcSz$gdn(K6?k zN0ACmmN>$&P+}Q#uYWR$TE1QDkIFsm%~O{(lsSW;`vfJ!I*I!fg-0*DVhx)FHGW=! z-~A$0c+YW)#C%f@C4%P`r;kFRf1*2G3R_Y(JUTp0E)B`}{izU%$>=}yM<`YKf>1&jfR~c!&FKxXj1jJH}XHWmWH*CMPq)#!(2zWs1DpdC}QPA zbfX1vZ6q0_z_Z%T6GT@BB=t(wi%XPl@)=hTZB3p{Tf4f@x4XT{kGOF$eElZ+KfWAC z$UnTq{Q?zV7OGix8PTzYjLG$_e9Dq?FHvle()uav@5PaZvCYWx%F>0{us|sqes%;q#0fFuBM&(Bj6*y6n~slwnxa_vsd!; zoh1(HZOJzGVy+i*nnCt!mqB*l`&?H4*f8FgXtvP)Z#TlCuE6|q30=iyDz$UJ{Jlr} zC?7CF3^mV~Aa+q90`|2h0w?DYQ2lN^3hH-7{%`9yt_p%h&3{X% za>c^CF!XK#;HB8bQy|8Dc+To4J@g;WU&`uguX5y)$128Zs$}ZFVhXLRc*BgM7+%^g z3@yK!cL;S)@!Xhoqge(=v`-^v<~$CEPhC9bhzl3mP0f+TPL)Z^tGtYy=tH5F{lgE{ zjX7fCz}Se1L%3Kez8v|s&3}i_0Hp%v)7O=CduVo*-d^Af6%3{Vvuv<{O2fu2j|!Eeg-Q(v*!Q*1gt|$2u9Xxup>rPJqlpiqTVB=$ zps8zg*NjF(*Rds!JLs7SMGNa|J_)z|Q{(c`-~%GvuSMf4LgF!^Cb`poRS3)S4Hjdg zmCkD9CNWJ3XR2YEs}zgxrDlbyy176_K~P&>z%5)FGX0M$&~Q^wwj*0yW%s3QUFAC} zUbnn*Bl=!>ZdrN)eWHseHq$M1;*~%Q0#50;sgohBWe}x0vkfSu-E%_LouXYZ#3*Lt zQ_1pem*sIJTsmoA3xGYP)D}{ERPl^b&r@EsN;;E;M9io9M74gIm`o!H@jOAa)uF~G zLh0iuup4^B^m&#W>sVp1+isl4Lw4OAl*NQt$dBKAh*0nHx}>HRWpAX>xhnKQwKsDE zgHf704-SHOGIpRBpHo&83&S+>y>EWah>lfut|99Z$+W!6PAsjsg8kbpESZLv=9C&h z4yEJjXsJYRTUYv!4T`mLE=AWCif`(o(7Gr(1e@BNKIj{IYE&9A6_N?EK43NCp=ez98PLlmwe;|XPl(Ob{cM1+ zU@5gYb8b}qDvtz)9*ZRb)NB7KKMjz$+jKYo}yJyf}=c&I&FQGLw zhL9yyBKWw^%w3Q&6At^vg#);>! z8)HYElp0at&0Qu$>Ji+X@0CYq?l7BM&c!QVW_F;N6xLrfu|(i9dvH6b0nQhRnm8}2 zRV^DiTu%Wpz&^=%Tb%)XbBpBy&1Dj%$Bi zmP~+GUE;mKpOY>74a!!&S@Y)AV`U?R-U>#d7o_R%ZtSV_&43C9rT}q=U3Rb+Yfv>B z2$awKPhMm+X1);({agbA%6^31FOfuhEw7J#3VVq1j;2ibp_|6EQ8Y3?RmZpEYB`u7 ze8WU)jCXX`tPWql2bnnLr=Gpl43?G!l4q4>`c$n8EuXvHLBeX}rUKjaRuk+Sh8e zgW|NSI5#>u76EB^+5i3vqjAV=Y6vaSK=5NN=xaCzs7|g~qW%fDpG=fS`W=iWoGoo2 zA(~tN(=FZYFB->0!gVVkq{>%0trt8OoF^fNNNl2VN4AZn=wCOBBGIfIy(Uwt7s6J( z+)FUTv2Q?zj$TD&;dUKnTbJl{KY5PU?|uG%L9dUi#~kC?IAqyCGGOMaXvm3}kkLal zlpV52<)=Entx27Jvs5hjHQP1gWlFBbAVHE&Kq~4F5n4;5AX7+7qLL8~x3%)cgy}xdAE4WQQ|aUO8i-)Z=3o0mE^kt~YYxINJ9%)e#U- zJp?4h@s{Uoc;V7P0cH#eK4hyk#G*>On2NJTt!yO@TlbV~zXP<4MdXr<&nYbmx9!c7 z#B_1X!1$cOB=jR88ecM=AKtbGElag4fg#n>T+k%V2Kc(AQ)K5>PEum+E%Jz1l*S;H z63c_!fm*A`?D+tNK3O>?5}s$f#;IpEq`K%+eqA?$1RJ+rE;7MvR;opw4c%BvX7Wn0-MZ(-A#uy4Z zTvI5}G^vUzXr`|N4%#~?5*w3PjvFF2A;?FzBAOW+Q_!AFb-_oDY!z57qQ7D2F@ZMe z*u~f$lM`;zcGEbgEfgizd|7ldX3^JhiFoZVFvu*RQ$l|@#8j33 z(y#EP_179j?q+lG4#_i{0iPr3H_7Hm`emLT3~gRk+|u7j`nJx^%UE$-LUJ3-`Zs>r zs^&={Z~V&*ss~NR9#Xeo0%GjPSwwZx2cT@+b0TVHxJ{fk(mlP*^~F{821o|a+jgmkPtiyxTbB}fhaDz|eev*znb z`asu!6Zwroqh z68=*r^o2Kb<+KzhKF3#-L^gNyiA8j>O>$lF_7H`P7;F(s!+q1d z{Gf7=AXh|)<5^}|?H*RhUJo-@aIs8D-tfVVNg4IJ)Y@3ARM`IAd$@spfd zTD2}~zotgei$=orGr^Z(OLxz(>CEg0SHhb)wUqnhxby9@XXAze3$HBt)Q8^5vck;m z#sXCvU;@mE93Qj{cGt0pn=%*BeKO6Ot{k+)yqNK=|7n@tx%!g~gV-G`DTFGEpgsPweDjQET-)H%AQpzp=HUXbBQKZ(_( zRQs#yn7gen76I#OBdf=9eN%ns^6WSLo;ibMNEqq4N6L7E@N~@udTgL3KT-n-0I&+&5O&025y%Qesv|X)U#+}LchqC zm70&j?I#+vu$=-*NPr4f9TebX2R|@$)zna%y%jgyb`C}6f)0&oKUGx%Uoo@5yJzu1I4i5tRwkPb7376%3|7c@$)}JiQ-u z%O}Zxvy&xTxyF30zw$tRr}6Fg8YT|eGLYu;l=5iu1TDF~wvvEQ#xY-(o@?O4yj<~_ z1;xj+#xP-VHBCx)pxil}mI^(b+OcHC;kYxU{S*&SQMmy56Xz zH>?B0ZBi{5BEK6%q&9!{Pk$8(aU0b8|gr4`UT9>)fz4xJ4G6UW7 z{<)F-;Q<;c1|*uC2JTPB`WaKBv`&Lo3Sa50!dG_r6uv_0xmP(}?KBDwY>4;1aPGxu z;>{A+ zr%DT82UID1P#1pqLrEpkXOT{Q!F!|FsQpl&SOxHy+T{l6m{V7u`sJ8bzN=Q$g_4IR zK*B>Q0j26F(b8d@Tmrv!7(E_H5ru(r!vS9T#M(@Wy~#aBKn;_dx^(V)5+0NBox{+LZoQs9Vc8Ou z$3GC^ZLk_Z3SM&G!w*j#Ct)}?{BQ^IFm{5;!oA2s>qD`9dtCs#kW|j{*-Ya+&esrY ze%y%<ateZ6d-H`YolK6*)v+wak)xZ8ssKP*1f1M<` zJ1#qsUvSJF74Q2Lt$Grnc55fJekA^(z2@#vm&GcRQ^!4`r%|hk#OD^q8MW|$zc&S# z8!u}>wG7wcldlExHs42h%D*o0_&9P!mrbgV>*AgGeQzX%0&c0?=t!c*w&==JtCKvU zsi}yCsexFy4zX~G!~#O0<+>;+XMU&vFjr(<>>wN_jB#^Nz)M^=%jGvQ!nJ-XF$y_x zo+Gs1R%NC9d0*-7ehl*Egj5ttR96h$8N~k0sPz&*X(c^zvt!+UnTp3mu$ld;VDA~Q z_YBzEvP80ZCexdOKtrn~EBbq!V!*{*$cVWs#78{>(X#eWI*Cgo&%g`MoS`_Va#+bO zqWlq+GP%z^MiMgIe!X6kmqX5*{ClB&#rITLmbLyK9Sl5UHp5Gv;PsSsycWtjUJGR% zuZ6OX*FsrGRZiB~vPHQ&w?_Or{4l!lP52cVqU7}OeGy1HT|_OYh$0eF(Nh0uC{A_C%48S%%jr%|%m%MnJcHLPp22GtPkYUVd3%Ys7%_fTY%ZN)M%n-ck?EU7?B! z2_XGW8R?HIn4?q!82-gm;p<297EMh@KCSn*tkK@r%6FqnLIDP?+sbEuHT=+%QPn## zv#-e$@afOuVMmCsSNzkfS=O>4!@b@k`ZuryR+(8CUOJ+G{IdbElGe}4TLvj(w5Fpa zohfd6u_f%#{PEY(CfG5{m;_PEslokadf*?KsI?p-Svz$~*M`JPZR=utw{9QE!9A({ z4huhYb{TcA1Z2A9-Kq_Is14t`lAiD?(_SUo!P5dmMDw;iX9tzNOrNCxjR;7*5bu0G zzHQ*;$1tayUsO~qP1pPz*}!FIUd^dmrw6AoN8{W3hU0QKrXQqNyeNoE%!K(b8cLIaZZ}BS z>}L}JT=@^yvCjluv?;Cm^?6*vPJN^~o1<+~BWv?t|Mi%@F4kz8pbXco2HN?VQrEh{ zOp%{R#+*H7mU+P)x)~yXmK*tiXz|_?2gE*_SRTuOaQU8@vS_L}%wqX42B$MLQLV07-SU3ssA%Z5X{o_AQALnd zK21&gP~*t7E*uda;1JTciRCT-)-t-z8DsdW)>*e-e}b}c^bF(@amP5YCfiD1SidzS zUZE%bU(ydWRc_N+vJG^+Sp#mg1(SK0OOJ$LC~wPaEQv=`mvo<$Dn3lh-u0pN_y=3B z*)a}}3?QR(cgSW7$4{qNJr2hXs|P>$``VRs6t$eVs%?T&i%@mWXL={<=`ERowIU*< z4VsFcn)QTK4t9|9QlS@(p}v$$rI{`;HcfJtggeVs4VdFEAaYc*n8K-}@s&HgV;zSu z&Y%^Zx{)RK4fTob+{#N_SMV`>1KNFe<}A7rmZAe4)pkPk(y&`8iV@W}8ejeel2z7` zkjZe?QCBGZQ2#b=V4Qe$3sUzBuksb*&kwkaGj%0T_85nPI~@YpS)43yAp9cb_EJKu z8i_p~)kthy)i!Ps;OX;M2t|+1-Ku`Q4ACfv$wLAO<)1zRlz(l;9qT0>Dqx;%qR0Hz zkBlx_)izOy*4ab)FoyJrrS>=baUC{>1AC(xD#`73oh$a#3C9D{>TfzLQ znX`5=t|U`1nT>2kzr+6*?g|!GClOU*pvWgeyTsMgvO2?@s#$MBMbKjz1e&R>O3=Or zfB2rVG%{ax>E|i^MWt`sL+R3&P5_#z18SYkNXwZjtKID0GD_4coxRCRexp=`D&4)@ zucR4HQTLJqK;e$DKn^C}>h#ZmUeLZC^BcAXZdCS@tOi7g`xFu{LAm=CjXrT)Nm0?~ z-53G!t^L9`$Z5pMZ7fb_ZFW2;cu0OG8S5gCt2T76uTOn_8bhE1vPC?V;E|S4ApKC% zm&i?#8D5{f$kVQuwte~JB`?C6cyg`(%tMMFxgf-9e0{j?-Dqe9w;eP0vn;^(rfBFH zMZ$z1K6xCsB-yHVxcw&@zvNIad0JV0a#FdATpu)2Y&6sc*bd2&7w@$3WT;jK&wn3E zwy*C~JR16(^}urIx_^C5clZX+a5@fxubEr+{l0#c(BH`>|KTP0Q zb(Tyc&9rS5;9MR}P1Ip$eGRbgbFWXHT&BhXE_Q~RHr>e{z%Y~-n=Ld&5U@kkF#7Py zEIFa0^aw~wFCS*%2-hfs`TylI7SJgIS|Qx%k&?cGXV$pX9ik|76|8~2Dp&HCu4M!% z$-ShK6&Z_FIm4c_s4b>IW}5Ydan4Syzl02sv9?Xim+KYQXq9_Zo?+&4s9l!NzL&D6 zrZRAHE+;}&9dz0iBOIdl9842s`1#L;1CzE;Q(^<3{9%&Sw0E0`ZnnvbqTk@yo5jER z{9A%_&HlTc_pE+x{E*f5YE7s-?S#rb>XlT<2V-(VWzOGBs5sxOf?!f7m-?bNCM%<; zKdOklz2`$5sf)+dVsB?HViR?|R6qzw7l|Vj2L!xyhYL~ikuI0W7gHSsl@WMlLEy{& zO06{;TP8|1{-cQ3OsAG#Wg=d35KZnJP5-<_lO=MLa1bavk#qM@Em^P19N<12nETM~ zKFAmS6!3NU*4!0pe$cZD@G$)`XK%bDr~CfVB&&8j;O^}7%N-}Rj5Jx9ImtYq+mUk0 zk>T3$=B`?^(Y!?MtmG_Av>jDX#=Ao;{W#^cj0JF-G6!>NPOX<%+)B439++=ExF@H3 z#?5Gu{4>V{hr+^*=A!VcFCT3JuL94kyFXmE#E==#iI;e)d*ok#&HfKi7{(EYG|3$C zfYX7R;;ExWPp{Hns^i@BRYM8|WR@OeqckHNb<7+AiLYTQpo?`Bd&h;!nI8kvEEXt< z+Vu5Q0}d}86yPvEz~Nl>_;ru`{vt3+jr>$!v9lrZwd_6d_x>|Oi%L=fU6dCA*X!y8 zn3-*;`qFs2N8W#r9f`vgoP*uOeAvcEJGgr9dX@+@ZI1WNWtwq zM;c`y>H(472;*Dw?b+lbbC6#VKbY`bPA;Q&uPah&L!jfD>k9n+k2caiKQ-J@_kMEs zchy?foZH{?mm-wS?f-M}q#%oF%Lesy`{$=)KTU`XJC;PTm4`Oz(QM#X&WzP0eeCNbg_Q6jnmqhEDQmr2^ImHI2 z%G?64cTeZ;Q4ai#O|{CWS>;_*D##fOdIE5DiH{|^#G4nY-`3J^{yPJltnYc0FV&T~ z!q<+EEHx%>@4oh4FWy~p^<;L;jBknr_~vs4+I2VZf9y8*h(p`3Jd+ z!#8mlg(&KgTE2^{!~wtOS%N*@^|?s>6hP?gqf^FvmCunkJpW#oIhvSSVFiA}JCKVT zl2e&Dq4L-LNAG7ifz1%%+UfcGyTn+gtG4XL9d90sWG_cDK|cMkJ50## zj(%V}h2xZqV zlgH9pKlKNAAUSOqz9~(#PAik10sql|61G2n)a~-qT$sINc&MDjj~pvPiTy2qZP;$N z_wCG&JpwlG5H%1+o4T|tejTiHzK#NItsW9?cN(1uE*IWyc)bsQi0n$}VNqyTMKsv} z%gSGs4?9*+vG%=pNq>gZOXinrlF^CjB0p_E4{St5Z=yDj$3K9z*g3=svJQvqQR)$+ z8E$iqLYw-6$O0Kn214cgu zd))X4*+q5j7vxHguG88=*f$#?aI>bSh3gLG>oeOa`9?8 z|EL7LWkE7JnF?4UHip%wu0YgpGWjM*$Kfi?^PGlnKC&h&?@!Lj`;&9>p2a_Ud3zx5 zH~FQ?ugT#=l6!bVk(`D8P}9Ypw*AnGQP!SYk-X0FlZ(Q?C($2D+m^sDL@&wOzU1cq zMgDw}B~=q^k@QNPL8_U6ouXe#FXlH`t(CL?KE2*GW)VOB$yRs;fk~2!9sXAY@hGbZ z%|9*uxx??L#8H;mMc=S))u>0n7v3(W|*C;fU*Np#wxUHg+Q zUpH-%MJ!L3))f+0p*N zMN2gYh}!C)HuT)G{l>DN_n9Fy6fv>P{||Zi`c)!uEafx*mek;)s?Fv!TPrF13*JSX zKO?6FK$M%QQCRz~^c~_C>U2iSD^XTFAQ4AzZm)Na?#AAr5hBVVpph*%F>HH~C}b7- zW>ojKQa_*P#yYXBF7dtsB07SxT&}Ng+E=_BH#r)-)ddhhN5ACrWbF3xEV=rBw!9)Y zAc@rGl0`<1KWD@M(7{Cx0kF!pMr)db6gBQ-#BX@*zQkQm2ftZ~Cw$$%o5^450mxjkFSJ6r+X?VD^xR6w06Z z!x2bJ5xcTHp%(;Y0Dy(VP5xo(aq8g-ze4&L=P>HFL?{kW~DtOVoJ{DB}l6xH-)c3MM*w|a;3hKKtUthWEyZ!oIv@hZy zUKP~$9rt>2P~S}VdRNfg^S`vd-u-#7>T`3`s-QnR{TGy&8aXhi?_>A6E_nUKy^ag& z`;^z6y6w5Sy8wHYEBKcouG@a*UfTk&ce&SBf>!-pV0-t@oB-^JkU$RG(XQax0oXeC z`t<r^sT-Yjn;eSg5*wv3wVU*XxhF6`4M53?8!6tG! zHlY$-2wbULo&GZm!{lQ!+2)Vh(XYshA0OJM15H(YtGas2@15$)s6&JLQX^;WHCEO7 z|2f)K`ZXjZ^=+nER-bk;o|Ua~t$+U)yQ?zmKijFk9~RVS?YlFwbNl9H>+>(ZCD*>l zZY#?juz|he*1z-pIjEq%)X0S+UHeA%Y~Nnl`qaK{KMtx~>p%PX|J1%hd7PDRwm*v) zy7iUJr$lr~!b%NXVuQj^;@@H3364$SoKj@2O~vQ~lM@>iANH#s54ZVJOHG>6G~+BZ zlGq0lph#)ehRgt)N~H~3L}Om+=E4JdjnKrGz$nAO3O zh~fyD3(%>#kElO01=WuC-@K+jhe6_qJ#G;h!*O|p^rgaI!IzZRJ$IWvTz+Zll>VLD z4(LqpUzeH~j^I6ybawYuP;HQ$8dn-$*}wCPzGy~441#pl1^39VqoyY`jV;!Hb(LGa zna|gUKK37!8m7uHl4o{B6zJ33^cIWmTr)saXYOVi<3Rutnds@Z5q%k-#XbQUoZ zG9!%k;Q`}?)W|1?Q}3xqnBZ_HD{Ev^L;4G!-*(as=q!Wnda$Y&{W*sYbsGqsXH&AW zeQ19KnrWY?N^AXtmWt~TQpuWi|Z^@US+XF%uSe$9*k(Bgvf{~hz&{s~}XV^s*SU@{5x!(4od?XPE94$T+aAh*BXf9*Nzp>SJ&D4m{rM4khz`R+5E zo9h)`qX~9F>&yy70Uisyxj2Q@KkpwVLxq(h|M@G$^EpPJP|DpLF#3+Z`dsZlSok?L zp_Gq&i=+l074ICGt1Z@|DaQF^ID6w!hf1fvr@AS1G8YDo>_cxv7VCq5&Cd`JsY!z* zGqL-@qCWM*@Ty6SUh1M@0QHk?{fkYH1d= zprzPG$+UmcKxPk;ryI9jtSKe!|3`@oU$dW_-Ghk6KtwAbqR)+pn*57w6s7M}e-hqPkv^0sIw3@EXn<2h{r*(T z-jhRBLDNa8afgc9B3wgR%=VD|c*Au~O$)82tB(}5MQ0*p*n>z_Tm2JMReyR8m@Ia@ zE$i+tpTJ-0LoYRf+jF^9c~#xSQbuY&-jY1w#bFf+2^k#lYiv!p<2Czwo zPxMK>1NLyqX6_R7LLb#va`Xw~qrgeXf31Iap8>icDORT=8#Y464Al0)*@1Ff0T{-k z0qrGPjEm-YT}6(C+Qzg}f7O~5mj7+w?q{>JSwGtim>+EijApa< z3(EV4P(V(Lwf=vB%a_k)tWQ~gvi`2#tjIdkpYta#!ZU#Pp*%J+zO^j2cYN!xaJ#}7 z{B?gDT$CB?-}*2=CH@~D8Z6JxBg5b+zwtJP9j)lUm~s41u9C78m#|aX8PbiI-{g{! zfF9At=VVf!xVmCggfbwqmRXly>?wu?G^C{T{6 zW1`kn_jo6Aqsg<}u7|G6%HM8f~8M z7pA?5r&^bV=HF`1OL)i9-MT3@fF<|t)@|LfHD&=#-${ja{tkc2&y9s*wk(^R?*{$J zScyO6N{#6z|F&D$bmYM9#y)>m$8K=-_LF|($D@l>Tk8X_-FiN(Dn7O- z!AYdf@|Gaq8d{86$MLU|I}&rBXS-%qNBfI-of30j=B0=BCVCIzpBqux;*ThMQH;or zr``SD-{96gb2Z1;@Wq>%R0bUpUtja_wX8UD35bH8>MA#eRww$UwU(nZM@Vkv(P`nC zIpJX?p;B%qU|-0@a79VFKhKqr$Bl7eG{0`lNs3A-r-Y-X$l|Z?Xza1pPp+_KvRFS| zX4%4O+FuM6gl;K!m{1=3%CY?)ft$UA#Gmj1Y_EQ4lrDVkask($`P*;@mUNd*D2l%w z8qnD?>XE^GfZ;k09LoJ*+Xof-XNCtC`44X3KB$t{l#lR&l4p4saO5-mZ>kPn75Rsg zB@dATLl1y55+%RorJ##hUqOt-kNXkHMJ)$rE1IE-KK_h~HVmaAkBZ_Ymym~uiWQ0? z$^Yf$yX|jT%ojo&u~w4N=EUmw>QZhgjU+*!B^rNnKw?@m@gWmfm7XIIUUJ?d{ea#` zFIiiwhrwRzcFhV65?3f|l2eMn<@`VaD?1^W&L`fn^ir{WmcsaSQb5R(5i3C_s7 zX8^B{+v{>Kw4Dr}Ddl%ThR|E2lxX6-gA}$ASF(PH#F2ZKae&nw)<*IIpP8KUu{>s}yWpaB972uUzaG(0p>iDYRvN99( zpP8;STZPNkak%Q>j7JxL;m$)U^D`;h7h;ijWe@ngce7})0q|N!1-v#UHPenqRe*TW z$$oQCM@_yR(z@8htMx?G^(SLxe$wC*FU7HE`BSIX^Dg-7fd4=a{qqd;%FIcA!&Ha< z@p;fkIP`Pt>jC^j{zv?4v-lI>1pc4hl*Qkl;wt%4{GV3#(3jya`5p96E%5I&_$xC6 zDQ@ytp6sfal5fYc!7${UhdsyRTUOtfjfcg8YCO&!(@1?^3)*A#ow2+6*5#-Ep7mvt z|5N)qa^v%a@+P`0LXHzIbLqb!orP4zIvUTBS% zaO-6polPvNP9kHN(PQMR^q|@AX+s&ZXO5cKq})<>b^FJvq7mi@_piBg7zqt{%B}^n z^HH+g<)6V8jqG-iXyPMwM~sxu?GP_{W+OHNN1OY92HA$tNA7s_RLO=ufqKnwrT0c7 z=jiMk`YK@bZU4C&Y46Of6to4it^O5iXlmRE4XH6FDDF41s`!L)^{M09kSpZ!@6Hxb zaEvUV$rQlsV6VW65C`5J)(3+mG|o$X{Rv9Q2D><0g7&jox7FX15|~;t>_gL1SC8#; zBG!F~N)GyMKZjLKt_WC}*j2f8q&nc(;tT1oX&i(^`w`6WEmFJ*DJM&r*V=HK_V0qR z91Ek~lW}=UF@4me*zq3$sUfsQWs&+4E=62foz4HgzvJ|e-()4;3Q!ZvQQ`tuLM>{dBL82xj!*_w zbVk0S^aJGf|GG{D$!e^1^+S{pJ)S2~2&K@^Js``H)=ll&xNJxHr>> z2-WIt5+Sv5WLdwQxf3RJyTat(B<=v{H_pr ziNr7Ilg3>m;#i`61M%LPwuVm5^~mdfC_v=&U~uYp8l2y>@1jRe`f@}(A=0BW9Fw*G zEWqJLtP)47>W?P>D$|;}W4lMAd{<~JC-F=Aqp24f$)%d^Ol-N$?TCjWYBoUt=b}H~ z9^{aixB%!;G{59h&4yNtJ$RIPW_`~x!Dp4Ja%Cc`2oAw}RrMmp{JY4{(bQ&hKmY~w^!YCjYpSI3-ODfFJ^d_^4F zL`5H~H>jvt{y`kx`w{o=%GIhI4y27vUlM{(Ww&8^I_OV()1^j9Ef9z%E$cd+Y9de^ z&Y%4w2PJT`=)LRUm^hTFH8Y+c3xVcb9P>hYMQr z0)L~IDjqJT!ShGaWbJ-*9Qj2dceNriA^$-ZAGX}9+@2X~kHk6Xlhy>& z_{(9I2;_GO_N#jJ0Toxc><4;C4f)5`gE_BS1!~r`j3VI~5^VF%8h?P2Q$s%9d~lIU z{MeOP`xzxRU*}5f&-c|N1SMWmGAUMq`{jtIgZ=&01-bj1JOHgV{%>9GdtL6M$ld>Q za^LB4hub4)93+06FEQJdnBy>NFDFBNvI@s}xNQW_ktA1;Y5$_Hc#~S+qtU{AJUtjq zT|FkmnNi{P2gsRzml+e4_{}W`BXr;P4;EnSF9L%jgbo}hF9F?K&J1FkOA6s`!Cjn z|K>psh{P1~e$+DZ#(Ax@CeaBu#!AQRm~XG*+dD|so)*sQatxAI{Ai>99^${fLpdZ` z!tK+9g7&_o9eW|1Lc>AIH&TQUnz*v>!tLJaTlccZ1g0IZUfKXYt`PqLi z$nX*Tuf$d=i)z!87KDNgx!Va{5|F2ZJSK`<9-QU%2%$xk@?Q?J{gP~HHizc+@8;qG z@UP*kBf!z(8#xrfUwt(@i@FEQJ_xSFmzWxInC7SK%{DB&H8Ot5PYy0h$Ekuz^EW)Z z?N=KhT{1NJe|QdkAh9BIenaa1`$)|6=b@Sh|G*Py3|~$n;eqUzT7B`3a$m;tMGBgg z(L}2y!HbS{ANS;ANA{y;U&4O5x}w~B0$hrC$9wUX*VzpxV8wnMaW;0iZ3AB{_*p?h zGF|SZm13~AkN6U~k^S7^wtw+hpV-0rejvCu`S1KtT(aC`mxl)3;eV)v#G5)puI|Qux^Vk!glncc@8s~}*WgBcL}1tj5LstvZ0GT*rx?|5}6{*P|LW0S?pwP%At z%Mgd$gcjNPcHe-~f(-~4dC5H${Pbe%P=loM$vyPW!NW(RzH)zBV#JOb|MHh~w|z>z0so}^U(6BdT1YR^BwN^dW#@Iv7t~~*@D*sG97|ha#4(%*>f4!K z>IZc4=9XWle+4*($JJnibc<5r%S-bJ<9{8mLv^keUzP$l3v{Dq#{&YOr~M!1-ULpn z;@ab%W*r2)gMy;sbI?&|q9#n-7`IHz4Bplr9K{9WMuI^!MtQLZF}MtN571s4QCwf5 zlBf|A_XP$Jonaf$sEAR)B|%N}wqq1DVO8h<{Z-xD-7}ys@4f%$|M}1716@_OmQ$xr zojP^u)G3WJ<T-ElhJ%i9L-$ymtFti)s%X@?dVux+g(d=6j`!*i;ABQIP%+)+jHJkBiSd{bGY0sazpHTIA;!_oH zn*I~^)4o1;p44T&afjniyf>n*yyTZ~QB9(NHw6k|$MT8L&lYqTD*Hp9H+)R{7fF5r z7+d{!x$7Q?0Rwq>j!j?to_Y2I|A2SRA`d5CY_>5bLd2+r7d-%96=JU9xeb1uR5xmk zr}14>?2jdX9FGEd`M^Bo9VM9(yLFNevM&lq$q}k#F%k6IhgNS|9>IZGax#}32NA)| z-)+j5oLpYyG#T#@nJKVQG!A9-E8E0J(?R3dP1iRqScxmRE-6Lr#p=h(Uy441PKba0 zm4#fLC^hZjx-n?7L`^34vhnhwhTUS^S4YQV80@3%d+S3wIfrK2`)LKta6hv z)UXD`JA1ydx+}k&z%jk2<2m!-;)m=2bPtLB;6QpCN~Zopr(@Y;6(#HHKPj`2)cVVs_`_G#yOwwqC49tjzNUQ)xUivz#9{Gm&Z0yQ8 zx9x}RS!+*!GmkF^kv?P+uE-Q6lQ(iOsK(_?qJ-+a=T$y#D~~>>84~aQdkc2|%XcS7 zf%6$A5yvY30ucT^kk`@>koi z*_35wt|v*h>;P8eFQ3S?;i8!I!|eg~{Jq*SlzLZ<~{|D6(2ulS_JL51}-o z+wQ)0t^|%I039$oqhDlLmuJ@_-O&Y^O$ysWvtZ1A!`9KwoHZs#i_vCAK}IDM_mBEr zK#uoNKTtN!A$!}%!Ne$a0rpIzCc2qv>jOOPsLvckE#lh!IW;iEct%jsVN?`tJas}h zc{nkc7#vH!prI^ks9I3UPYyrRm1=O*LtFjKS;M2v%AhL{J+I*8r)|21T}d&|_&jpG z3FTVLcaLT6oGhZ^Ui};4H$C{|q%P3B3T(OfJ&(drrHkXA*3zJ5)8s_vH1-ZW<`$H< z?-Lk}VdnDTY$oHGL|L`A4(V65c}FpW3S5K>0j=c6kDh_0z0yOlKk>gGCh_7!q6GD< zxlp>+--Gn_L+ub?A{k{A{cd62n0KczQR|uR`k##E;sEvmR2+}A8zbJg{eO{YlKl2j z{ba3L8h~AM?AU(J4QE2<^s=ODFK;u{v78nrg0AGRc&sS(jJlASq%P``VYUD8D?9Js zPr^2B|5&H}QDIWpzd$2@6zK*18}~8&+ds_PrGLAS9`uisw4i^3!pwf(T>lKrHOKz6 z#JOQK{flL$Ys?LEbTbUCLghMMH{RCyM7MY%1)@Nc#+7Q(^-Yk2dFq8nFcbR)IOC~{ zemZ@~`ZF&xD_lURWIV5^FjtB0U}gOY)Qkb{PSY1H+4zzelnAyKD zo})#9{oS-!ERK{GEt)RwoEG=}mj1m_->HA1#U)`<*uQ`l|3G>{|K9l<{ktQ~+ogZk zk-h^hro+ts^{0gWGcb3eMUDBl(ITX{BQ2&b2LTXWKt>Q$b_?r2OuhX>Hs(i)hB7^; zeh}>8p(p=}W#aL5>CdtU*ss4+&c15d8(F%dx+lMd>qRgBYos0cI8+bM+#}AG6#^_3 zJOSrF?l*?>Q>W}B#yY8A^G!45F@D|j=M4b0goB*Bl)jmCYH06A!o?&IW;v``Dpav_3LO8AlUSD9%sNjLESVM6zuqQ` z+v<;GEinEBo2;<@NS27CJ@QFN9a##g#O$NUt+6wBNrWWycW8vw_9v(7c*R!ZM2L?8no@PnF zOaeq6+eBx%SrYRH$Cx_rq89(C5j&Tddm=HXjkFX_s($1oypmGL%y?aq%xt0o<&ggg z0VdhG1fJsEp}ff@Ur8*yyv2ykrp+bX)0Wu0xx2a%LTk!$jFSDDV*IC&Hv)Mf`hkv*#|-3s%IJ-eW~fg?YQIh?kKr z>sRIs&-fYX>=Xa0Fth)Qns7xlVAmY`vq1W+%iL^mfnX*HjFvmjEU}O5N$gS|E%Iel zu;)0T6*nY?b3py%C?N+jRSvVIDiL7TeEat>`?{(LF{^Ulj@c)d?i{n1xI19>tT3qy zW=|l!0JB%V3ueC;=Iw&n-ALa7v-^gb{oP08Fe|V-VbB~SPH3b>8$MZ9z{x6!sK5ayk?L&G@V?&J^OvWx6F_tJb{QQc!l4$#xz7=zWwk`}Xsh*p7mIL%t}`}6VY81rr(BgAB` zL*cb5F~WcQLav$AW5co4@69U+ngaDvW3z^pfPcnF5e1giOjuKneZgEx#52_tS%>V| z{=8?jSTr%Itq#%Y7;DW?$iRsE*RG>*+g||1%k7!bfqC z1KB94-2Mr+WOGpR)rC9sdq_b^ja9gY_aNP<-URENDwi2`+`=NX2!7hes*PV~e@ed2 zex{ji{z{mT8J^nodNwtFa~PL29QV-9;NPEf@(%xAzF@Z&fHy2(m4sCd>$Ul!=2i$x zs&e~3D@YgE;hw)POgEfyn}2>7_ecLoBWXkfIJGcBnbrIV(y_88vTsC{>Wc(m9s?_9 z@<_g#`xa~cza%Cc!2d34n-wF+3_>Dg$5525`V2>HhqiZge8tCm`F)#z2Y=epaS#7? zBdwSW=l-*!<5vEa5X}cFS~`j?)2x!Yt|S=p?{$b7m1|4 zU3a>!S)*5=J6&lL^19RcO88&vPSZEbRin`|iE8ov+@#Id|4w^)-fHa=Ol5jiN|h}G z$vfyz?;UJ9jo-?*=bN2H=9B{c=|RXI>CaJ_a;X9R>3p&Tkplf`giO$YnO5E%28rG@ zQ!VGdp3(M7`pH}{SX`=Fm!q|z9EPjU@}c}!S_+*+;WKvupm|SCo3F7tat(I|>G#@) zKtH8#214WU1SrIuIAWfl?!0qol*G2<&fyZ9EI9RNb`EatWQ8;9PZ2;DLY)^N{Qri3 z?ffgGuR{L^=1%(~W$UR(hZIJ4d;{KdIKHpB@qw}y(oxsnuv?DgD&Of?&s&&s>6VFxj7H0!@wNcQY9Yj5*ElAAby2 z_39>M25N#8sD(ecmFm2@i5#YkjeE76EEt6_M=x9bUc>A+|NP-Q7i^6xSPt52xmZv) z(La)W1l+tHm?6?l=3+N(4GO+wF4xQ`B@^e%=z-6KNp1JCq z2D0_Q5ZBr?L}(JbqM)!)hOTf*be~ns?s6#^XEnPfE34gh{r4Mzq-ApG|6kn45YHF?U3mvr8WjAwB4$8~IDn z$D_i`{-MKzJ{rJ}{T0gHbLb<_zH8WX3biv7Di>euq}=7wb{0#=K)HJZ3m03AdZV*7 zq!RA$-uIt5OZz*nBN=xBO_l2trpkb=(o(<`8cgTw$nI?4wr{Xo#^m!QVZ$uzA#sp zF`7>L4s>{HnAx9kR7i({`a9|HUIZyiho*x@sryuCIur$d^z6=i_RTS!dL{~N50g4k z;2WeCP++fDp}^KKXP4eRO!^KK_)M7D|HF|X1)AO!P@o3;+bEDeF}aYP3n?(Qh3@C6 z3`)w*VrS2aJopv1C}kp^OwY&u6l!wh{)dEjU*@B61%&0F)#BzDelPzRgf3V%v<+9> zJ&yOHMX=~>paNd<;>7p_bh-Z` zMrV7d_ePg1h3%U!5wjZHtkK{;NCGuM(lbSxtObikx z`_I~h$u=R=$glrflV*A!K>2 z^Vc1=a~aeqS1pOyn*7JfNv#^gymHk`(#H>>{> zPYqYzok@TD3Sd2~`>YBjuajC;D=u#tmFi^-o#|(eU%Aq*xT7B5`MNazh%W2W2ma_V z3HTfyu#~0h2LE_c3s>C3!dzX}q(P+T)}(I&si-u}?C^Fxn0eD8%SH#Erz<1*1zz-vOhqgqi(ihlLmw)P)!| zX!sV4DsLX66XRVldY4cEzd@5~MMN~IO>;;LG^uva66Pw@q;}4=+OQ&NQv2ijiJ>YF zDn^q!8BJ=3G^tI)NR+!yjoDlIOipSoYEWrX7eUvS^{*f$EMfBJG^s<<$)($~zvp}9 zJK6jAv0P9ZTsYs>WpKW+tjDfr7=zWM25c#u?mhj7j)1SE?`ctUF!;fb2r48s#jVQj=KUt+Sb!AqWdYp}wTV?9^^EHRc)G5?}6{s%wGGaAe$~;N0 zUF=W7Hl>e1L*l~vty=XYzIbMF6pGei+uCKg56Tz4U8^NKYAvPyt_A6L*>o*d{-*B- z-7}nVo8K$U=YLfpwQAEGav|I3hq{C)y$NkKs#f)YFj}BdJ!=WlfD}I2+5C?NqIyMb z^&n(6lo&)$~^--ae$Te}^ume~nb-@AiM{pQ=#*9znMq^p7r>o~@EBv}4bnvdLl3 zEH-leqdN1)ZNGJB0CV>*V(9_VHuHs7KG1FE?Zb`#z=obA%k|r3;1g01+fqOmuyLY+zLGMwXpf<tJoY0Grb_8%9)o%_G6 zQ~!y5NB{X+(0^Of9|sLh@&7CQU3}vI`}muE5BS@4We$H=j_HKI&h)op zaTomEE+5=Eelnfdx8v^;zUJ{a#g_DU2ah}AuPAx-M1;KlJ*6nk^!&@2{5UnOh3|oc z_lDcd{UG}+-zJ!&1m#oF4Z7)x)f9bQr;O{IlE{{{H%_x7e=V73(8GL-Hiwl|eyBCq+WDT9M|K-c+qJ!PQV z7idlpG#>&D`db5yoGoVO|JOGi-Utkk6Yo~wtMG)NdE zdf`(BPWmMJg4xXn(T+3ZspO=R^o4^Nr-r@g%KguChPZ^HZT zx%Vno#5}tGPGUaiyH78W zU&Nnn9|GU~Ry18Om=XqHRGck|5zISC$jUG`l{NB_V@U5TR)^6d0o0QvI_?y+eeq7C zuG=%$<7UXYqrIY8lZX=HG;t(U~fwut`E^9;QcG)q1NV(B$89tHAFEB3Iv ziIv3F6!J_RZ*)9IYh=R9r#+tv-a7#O2dgJuH-V4O2p*SmOZ;8;hpp+6uC60dZbaA` z^w*j{fxlusxWPHIdClOZ03&aA&|#{qK}?}1bAVVr5rmm^?-(u_K*`ylWNRTx=HC&b zWGg$yAmCRc{8fZhc&Pv4FCs7H%+IOZMsJsD)(RA$)1KuG4cv;@I*$Bnn|FdlE+(Pcc28lNAJPiEQi=~rD zE@RHxcZy+l*a1q--_^Dn@juV)g$V&}FlHdFyv1f4ic-Xo5 z*(CfXzq#I-{t%N6p?Bp1=->-X<8E;yD?8R(dCi+t+`c@If~YsC-_)-=KDF;ihUDA&wj)1hn1S8HXpK zUsU?%q)Tgj7j;`azSnH=`1fsArq2v|i4@Bre+zCchvb$IB`gM~sBX(8>j~z#MQL+Rf4aW*|Xa^zSn@twVeBAfc@M(j>n=*7)*f z90xn2{K{1f;^2-!=N!n)OphFreTzJL1vh|S*S)jHGHBua0ZTkFy2mYmD578LpK_Xk z(!Y|S$FY}$4@|%iyNLAD+l}ebIDe7DuhAtW4Ni|9%+HYY=poskt1W0=i-~^#Fc&o3 zS7|?bP?%Up|Cc`r{KuO7=!?&WgRKx@R9I+Bxag4W3!Gu zB@lKRlWBai>vz2BL#L^VYN=1dvDKFCNiVaDC~KaL-HY$>sw+yIluNeyN)slb089}%^uPPfe@Mh9ac zCPo|CXJ`xgBc!eL7unyDg8y}=X(&Z63oS!%@6 zsOrz2O;yUT@z8qgKTRzmee)hRRX#`g9P7PJjr>71GJ_7j*)XsRRTx_7@Xz9_CFZYY zlCPS^)Wgq#B|Cr&-yxE0e+H4{&CmN5W#gvyt$r2(BKwY+SG)S}j)D!|nIB*F3l;MZ z%IiC=;8Kb}?YFjwdRqOho_;l{oz%5-4NkXd9*w+j(&Y*%ahjm}30z;wJ>pd=7X{jd zzfb{j)veat&Hv-?RGX2y=FBBX?%koLQf9dHt3tEDU>=@Q?I!}!AQ z6&xiO#;aCzj>ndFj-SJMU}64CIFcxgU(FFrVLaX1IevFb=eV>;h4~ktS}2UKLR>G5 zuY0a@Jd5~P_Y52@VB5#|I=N@W3R6G?Sh|mUHjjqzjt?mKivg?>$>Ex5I$xF zfBC&zoEe>dnPqH2qv2t1vZFi!((~7Cl$^9q`kC}H-&@3GqV!VZ5%6ZML}HWE6!4nr z_Yk*SjAj-g=40G_;qK3C8bfLf6-V)x&J|7N#Zrkx_0~%X@yu}I#Nw#qy^KpFhMoT~ zzT94~S~3~)Q?Zpiy!%J`J)ENy@x&1Oves;OlCi2H`N4@K6T7Hv46#QWZ43|h9EZ*# zQU?H&26?{R^4J!N6{i8OuPu820s>8Tf zjO6pSUGt9<`h+r>B(nd_$rXXVCx)sE@ucN>t&5Dna}c9{@P<%&eUzvK&q1V!*Zg8( zkIuDFlv2}dHdBe8{oLk_l9%amDc=?Xn#_dC4dh1sv;buh%HhrYFW`?@*R6BK!FmwF zM})RRUJPJR= z8|$cYE|m?}j7Np)1_!Bb#a1r-j}bPLtz((0%!+uLtZA~Q$ri`}1=OMSK3s48r;PxY z6#Bqax&P&Sp(KnC_do0ucm3B*+*5u#xHquO`TzKo{r;wc|ydbnymR8WAZsL zPs``%+#5tW}Y^P z$sB(;pnxU|=*i{&?qO~JWok>BmekBHd|;teOV(+KXIk>So9Lr6zgs->(;g`Mt6H5@ z4a+8ER@K_D*Z7)aPb^LB<|WS{SJLMd!H5(1OzYWfI#<*} z2)(`}PzM!^D&Z?6FtSuBXXXfi$oV-6Ao8;u2@v^3NCPoh_*xoJd!30Oy)7UBtvtp4 zkgQp6{KV6&E}WureDG5aP(Ba_s-X(xZv2gy==;Ca`m6U3*784Ku%t1x=Ey{)d zhue}8SM&#;5Rsdp#adP#dE?&w8e26#++X~Rorzbyr#HoTnbTM8^RcULYPot9y7_A; zQ8>RtdjT^Kr+(V3c9IK3Q=-fCn>bsH^G=cW^iJvptgn*a?3o$)iE}#|@W`ZMCTY`C z9I(}Jlu}NfS{A$F)EcMh9un2`5YsUy_2(WciUZ&K4ZX5VRjVWM%#puBJg;_cTP{t+ z?JYx>w~bImrtn{RtpTj;3e6iNI4M*L=F5>c3YFKtt|sn&O}U(=-_k@r=ThpJx@aIB z*+|IBGu~`Nz1s#Qc4bt-QvrQO4`z&R8sRY>zU-Un7`^)~Wd9~Fa@&xm0n^EpG3MthoZUA=^UE=$FbVxh-Nz;~`!SoS!vK%5y z-?Yeb!c$#;)|0_x*~iVCT^-LP4fBMerhlpV;>i`huMJNIL(_NCL$2p(v2mHF_5K@Yb}wqgFr0Tr);Xz4MCu{(Z%VEN3q72s=cJs_axXv$ z(Ax5TK6K;;LR6MU-r~I{@tV>aZ>$A zhf7UA5iPeJBJq`^`dIKfC3qSL24Bwho;<{-9o&EOM-E04_vuQhEJ|c zpkUU#UTh4w7=$8k_m0&yxNnHpaP;Ixoq26>Z_!vfY#g9!Q!qZ-x}@0DwXjFE=_~~4 z0>+YP$6I=pt=g2A<9-9t85%CnPW|*<|5O`>CFBW)#VBo(^iE@{C;4l2SL-~~c*#?0 zx@BYZ$>>|k|71sMh*clv2B(}1PE#*Z^ZGqA0@+>pV)5&HDRHvNAB%KeJ-xe`-NoNV zci|wX_JNkOYY?SC;w;b*_ZAjI1j0rWZ#_c*bQrED^zpAr1>w*as`HN089Hi+8 z3TH3pa{+-@cI0~>Or`8N+bMst1PWWYh|AJ{MJuG{VP{o94x=r2wSbfU$ECTRvms`ZAb5myd zi`|N{V8rHdnJ`%VG zHssdUsBEI@>}Sjy0J#bcNFIZ_cxN&ADz^(%!F*a5llIA;UC4iVda|g^UaWy6=RK={ zQzr%ie%;8^28k6LBq9r)LV|9mwI#JSYRQ8Dlt+Kr1uB~9`4K9rJV3C40H6~DP^M>F zr_XmAM8W;D`|%n5J&xB||HuBQRrUIIv0bB`h|2z zozT)8kYa7d^O=Np1+7WnwMAfMdLBbVrq-|te=zmovl%gQVF`IS5#EzL{?IcxMNDs4 zAj~7X_fp!voB9@MGBb^2T3$#&UNx75{Xcz)vi?F~3*@n#$V-@=rQeK8PI@Ueb!$;I z{C@iF%nsLEFcB2DMXfxesd<87I#bmtqUz@>L*9j%bHrQW3T-;^u-N( z)}+_(OeWAx<4uopV$|YREp?`QR2fS?Zw%uT|4C@9CT8N|m^X7WA^)9&*pkr5Sz*G9 zN`UL%TE>bxZap56u09?#eu>sG#9(y666y$sO5|wddNsVbty__G9GpF$0g}DP-|Bco zjDALE93AsU7Gu_b(bVA`oTxgf`#^Qn>*dT_7M*cYgb+X7fI}e0GAH#{3uDaj&DrGi z=g3+J$eQ`ZINV`!;Rt&lI+*l(iD^$CMm7o#0?;^37QLYVR75`;-n6vf;d*-W9f|SxDOj)xM3V8pCQ7AMae&61KqP@99RaDVq?rF6_)shK6XagPV@d%qP_Y zZ<;8;E84WIN8)If{pzB`Fg05TPL!EK;Z>6Aa;%~ctq1D^^7|6r#(h^JQ0k#^bl98&kN)y@#KNpnQ;>5nbv0A~w7}nJsH8M2Ksi%q$l37(KUAve7;$4xH@ znP+CG<)&l8glm)l&#D3a0XO{-IDYW)LiC6h0`zv`rdKTKR%CblCo^D%z6<&3j|@M( zCeKf=(AfN2{Ir6ce*L}{wh8>^`RVuQV#rUsk*$!QKCj7Y$mQSUr=zH#ke|MHyyd4u z|3~~(+&|!_IDqcNPccDqBZ-h5Mt9(+Y4za$z)#On2mb%YPZ{!npY}h3b>g-_KxXzg zt#MK}YK*u(BC*0v_ckcW_JI``dk5?X9xbFjc;-%N@5>jYj?3!twH-O+H#vURi9a@y z9K{zHbGSBrQY4Gv6uwUlOSk-9rv@nlSisuF^Yd#!j?q8A1EXIC>_L|zefW5vXDS6xm z%U+SJ#a>?mb}^H_;8lFGOnu4p{LLQ=fy)g>_6y4=ukG|X&nI8!vuQu>rM1l0c&8u7 zLLLe3zD3hZqg6{1`}4Fohm}2Bt3^OLUEIf6hKpRDc{aod>Kd`)5?K?BtgVtvW@ zWD$1ach51ac6|@8elRY$gHmo=wPf(3w(7z9@ejQmol9XQ;X!Zk>!t^|Q(Ilh;x{}& zg@SouDgR~nKN=Wjne&(N&gU&{(SBz0!s?KTmAY+H%Mlgy*EY2}2$AUKgJW{v$L13! zu)=f-?kB^7X}hH;|V_hmZOA-MLM3*9_p@KRmnL)P<}sT znpJvkHubk)ej3c>_iy$*DS34%lk_Ey1-(B0RyCNM!X1r0f~IV=|qQ%>pc+opycxAf3v4vRDpCSKVxbwQ|v zO$_JkN!m=k3U_F7ft0a(HXHzS+L>a!+zxzDwI_Y&wzAtj5*K{=^DW)K$YYQE z>08!9Bea!Ln_%&lVYHBsXL_DJ_n;#076CDJn{>h4RLJxkPU6&UUnn|w>NZ13Y!gXj zXIQKsr*;XINZvenXXTxpmEZi3DZf%bLHSPmMNXDEPqy~wpwvk<(moT;sKgcjOsiSj zawb1w;k_;($12{4CjZ_WwaFavMo!Kg`aS11NjZt1x!xU8&c?mpkKxCyLMh)mbfq2@ zl)Q+C`A|;us>deR7dt6QNC-VBv-wUHPU>X^Dm!Y-wcFgeOjOqvLU{=xX^PwZ4jC6n zm*cp}?L8*-X*_06Cv_dr(k$Mr1qa8|fKh{Jn;=guBS$ zzq<=uJ^h#pN_bORJpGtj$)2e7B^=KnG00lbhWbY%fhcUdnBZ|-1F1y26Dn7^Rezmy zv>SO_i_%ypB@~IJzfSatS8aBt9ZXu>JF;x+;YAprc5n@5l(kB{l}6h}8trQ=GjK>P$1#yl zq7`fXXD9SxU(@E^Rf}3+=0gTH91rD&Y*Y2vVr~Hezb>Dprx{3tUIgGr?lo}RF3|`u zm|pyVUgT$px-s2qhuFhx=QYaqC!p!G9@HL13ap*&QEoR?ZH&IaNObtC=691ZX*jt$lR*oP( zJj6WZ_k!d+?juJ_wlW*#p9D(uXm z)(e8Fw6?j<^lKQSO;d$A^cp`UQgyooA*X2^Vca8V+v9r2zq{#hZDGy&e@dpu18(d3 z?!24bOI-NE%2ge2;h_qayejd_8gE1?Hem28+-rnuAKpfq+R9|9*;KB++dW~02y-O%g-J;2z>3RO|1iT*V`!3+$d?wtO zovmKyhj&)=?B=-~o#d}A_{X$z+puDp>pfCdf{>t7)7#3nkf$#Fa-65Hi+?-rXbAmx_&`)a;ST_zNSr}$>I z$nytp_FO8f@fO-0x^YaRE4b@WaI))Of=<@}P_^8d{M@>f5Uk@nYc}BAt+0E?5?cJ#`@zViz&-;vnyxs=PX8^ydhR>$2Q)!;V znDbq;eS$KfN?-F-NCVnPg!E+WPFV8R`MZ^iVI|%*hAPLBC9C^V0mx`vQL&ssRYfe< z$VzT~k|68FCf$WF#PS0!54f4&@?+*{u@twh z%?JtFdT=h%{(}Pe@ckm5`@yxw+Mr4^IF?*d&h5lu@v6T&Dec*LTqc(8sPjhZssXuU z6>mk8ANQ_HUpLsVN~&PPvta56_x(GVnu}7?*jv8L96Kd*1P`$Prfd$~a9cm>ffG@% z#gnYV{5iKE`&WJ0@VV7_82kTV;AQO7p&9DUw%uDHS8#$Y>^G#KesjH&36u2?JC~tU)|S| z_$~bA)jCH2mQm|;b8Z#Ev1ULVZnlytDmP_&nC+;QA_FAHElLdm;BS7a#n-#a2nT2c z9AUHjY#~_~y=98Y(exN_XP+e-H%c~TZ-fr>MDL{TWrJwYQixfnX?M+y&R7jQo5QZo zDfPbHMY_I^&IidKJH8Ej42Sfxv56!Ir3G9!qL$-V<}^9)-<)^sokJk_iD z8o+L|%nYWWYU7a)>LSZvH|D?q(?3RYWGUunzCR^z1Z)R!sO zbZZESW)Suzqy>!FYP~cB-=ASyGzY}Vk-8kZ&d+kMBhIxpRHaq_nly^R*usiuhqG8t> z52nV}(P?unDp=47YJom#Z8)moZAbFk>q_M~V2%PqtwW&^8QC*5Z%lOT-V!-M?;r^xJjVp2ErrObs(-Htr-LsE!2PMk$8|?hk-)1KlG7q zx`)7Dc)sYGxYA%YVfW$#HoISW^pLUd%-Emkx1eDi{1yG~#AEd`U=1cZe&ZfQHrfw6>IjP5(l;QN6 zx=rYDX8spx*#k6N3#Vb2%W|@S&1oWLe`z>|m0L{L={LCpiL0h;SST69GdCG#X-hM2sXVs+eFNKukn68 zhI3hCiE$H&ngBjmR5cK-TZ%Qgni4_!>LC62h(W;lB-ePe#Z8-)Qp=9J#;>euiD(;R>rKQdZJ|7x?Dj~R0Yij5{sWNg@VY4q)Y zXNof^{^RTIm|UPN$wkdn#Eg+?t-iiXZZOK0aV%d)Ta)>i+ifFrH37kp!F1yllrk{~2+NjPxD+hkK z%P_OTC6Bom!7THuP2R*>gRjh4TOc({J3E^ii6>n%H6y*U2dM7!1}@iD7g;a)QKCiu~IIHd*WteC|QKum)%GFS0@RDwC%62 zH!6#p57SrpP{~79^}hjMgxTl$Pp33R;9rolAm;W`0bg^|i?lZ-lihA1+9staNH3CB zK!r_FUpP03a7IjNgiD99hLX!n=jh>Vophy__YA=#2K zBAgp;VHPV~&qln|nf?MLWI9(57{3!xpsF758H_k12)b{BxvpYMSG>e&x<$FGUU6=i zp@uToAhyD~W|5su`jIEz%H06xisMh#Z;f+B&(nfH|1m*e(1k%@-|+;bnN2-LW6*VG zM2EXML5m#lhmAEd0dDOf{37^JMXDZTKQ5TtCdDfphA z8l)7_Ct5E~T&b2zY^+b>XNr~D*e;2)6&q$_eG@Uos%@-a;#kEr4Ajy;ahPIbZEV-X zeu_=Bv66-XiZv2jP)g(Nd+2;%rL-jA55-gZnPmnQaO~1pI(urS$D!hGc-@0G80vBg z75RJNJ`~|<=I){mCjDf$>TM^r3o*!x!<35GW05zE9{qGUjlHUGIQ6LXO{V_#d-MB` zsMVB45-X+dMUq*`WaDg1^E@8$<5er2Y36~*OwT1Z7akQl>JyY%8g0H8sLb*#;y)I; z3^b40)&%F1Mj99eAM(%r8dt0sBwWew!$n1ntZkAW3(Q6kiy@eyBxVofKMsLEH2r9? z%#G_hY9~3wFt?^g#EABpIsJ}4xqu+)Q=fu~3IRx7j-A)J|hnsr6-iqF*DYRL=C=MBzu zlM$gOX?mk2f`}zhBp!n)l^EMTsV;qoxEwT#$1jj!sR>UI9-71)fGyTtWGQ^xQwn6v2n}~?k zjV8~TiDe`;V0PCm1i0)ycTu#O%V6|YVocf|yDXGbJL^(aRRUE&wJTC(9-sCs+_b5X z5W;CUo=>eLIKH)|cs%Jk*Q#t$XeJ>+&#G#LM!)+;TuF~xt%}_KY z+t^m7DmjI{NLDX;F;x;nW8Nrp60qw+je-AsopD^Ti)QJG4E^|7b?L{nbUNjB&E}-f zDG!(J@^INM50~xoaM>=m%QmWBt@xc(y|ml@F#oX@1s0QSH%O84K27 zZ{bN>@9Y$W=ztfNBnEWmM#Z>AK&Dg~TOgh;Hyk5Z;1N8opo+*HA~gJ3JygdG3Af** z=xIdT=b^Q{`o=;=S_52$&t#uslc|j5WXyhu*K|epA%bTc*!V&?UPvSUGoOi^THH(z zGkFcCd0R6ay_&g=p|Z|ymPg8*KYKB?$2doqg#CSxX7`hIQpl%YGDYetmd2`Hj5#A; zk0rOmcK*a3j09);Qf8|>nZ|GkqlHOq@)uYF?mAaI#&O^n5QhKy@~U8paapok$RxNT@h*sWYIlkxWGTB+e(ISwLi$ zL_Lu?HqtjSg2)p#(l2ookro^2pQs?R+D3Lw3?Z`KMx2C0WCM{q+P<2b9YORtWz6$)|mny;8!DB{GD*gmFC zCBMXgIR*q-5W7K&gAZ5MH!wOd$q^Li%g@|)}kW$1i zDd=*C2PqPBNa^FG4i8dFZOSfAO4K0;CGL=?ual|>QmSoAKPRPkGL%PR4|)1Ksr`bK zu{OnVn)VJ-B>o_2_M9{QAk=)XJG-rnB|rRTe9XCSWnISH(F$~RV-!odcH~9;qzx?BsR}Wn~qo(X!H#2Pll_5#N zed?oa)`~!O9zP1s+hdt~>-$U98;oy_ckb|5`d#VYQjJt*b-GL4x~i`mK12#p!}=3@ zEGidkUBao~iFFnvYHoNm4qTa@e@=bZ(b8>Hp`O*i`I_|o?PE)+QgMNTzAz((`%y154htg z8KG*0lj^Q<*}@&q*_6iFXVlz7(CJ>xyBzPIbwyF`c`)alls1X9$Hq;84_LLoU^1%u z)XUm1sFsbA2a{XT`VU6RQqoN~n{Qkpy2u2OajzvHoLyswvS}ZHQ@kGtV5n2)^IbYx z)~RUogaE;REivm)ssq5=Mu_$BB!wCK>@bMlfN>J3T0P@dKOU7*+-X|N=e)XDmKdR$ z_<6z%&yh(v^4Jt^ilPe+q#nDBuAr;A{eT9k{B{eY%t48p4FIF=%y6m8X}VNw zeStQ&GevVE$MpbQB$Zdn1lxP+RN_)hz#`7PXvd5mdxpd=Q!tKBFoe-y$EsF0umNjH z{HVs67pa+HXjuE(N#7?Ss+3Di3tUASqLgl=TxwIgCw3vB`;2Kn4`47;LRWC?ByKAr z-7p9dORyxROS0FhZ-%B)D+wZ9hxdoGzaef2s#Lpiuc?KC!g51@$i(R0Z*CO{w2c4< zxq%8~8!l`%NqRUQ(lGdWN6bPanUxKw(7TFan(eO<&km#wZj77@?fsN?A(0xfTK@rP zH94inKyyEmHz!<({~4;uq63G@M-A8P(5sW8)~0<8q?}k$@62^HX0LI+N+|A~GC1D- zlv1u~UJ~K@Tf?I}*G$SK%$r%HY0;pg1qQ#cAL6AZ3^sP$~2R2z%%T zCz)d2V`D|k(g9zMUmX0@MgkEh5MUx#Y?SBJ}R1ue{T$*q+ z`Sp*T)G=o2Y^qIvRxAF=J;kErDDG#z2)<;ma%p21QhphD3@JyO#b<)c*c<)zw}#9n zJCm{jZqM^w(z*6%0C8>uw_uHnK`vaobY;U4Tx)NL3il1iN*g8mNmSDA7uR=bw<&D5 zeHs~u(RW616wt$p!EnHy6aB@^u!$38rlI>_o;ayD$SRvCpAVJ)Fb6}^2;$2vy;)CO ztS8cbSQL~SRv^|KOD=QW$a`+pXBc;;XvRr>Law^1&z^N|vSP$t{U6lkM*iw&KcGUj8;hJr){3<;79Wvf!+}hz@K$07eT?pyIjVkb(8MtP zu}>6-ooZ@;Ih&*231Btkfrlbi>y6h}+yBOJjJvMOaMY+Snl8=$QGuk!Bzj8U& zkYlk13?2-~FS}JgFXpBy|8>`HzWZoU<@*jjb0a?|!_VpQV}@6y&5vOn4ZQ;0jw4M37yreSy7|26(@_mTiq)p)KLU99*=HV>NxMYtm0` z0lpeN(qtA)(=~8bPHItYW~S~=`d{B{u11E(wp@*@qgKDyKDrvYCA=DWoYJ~2=4vGK z2moY^6N2u|H1{H(L0H#>sLqZvM?$&jw}{r5t%%*S;{@#XYqZdBB6(*QLBoaqA^?jf zUxdL?U7&cVNzeVKYV!=Q4FJGoIhr;J=34d@LKPg7DVb^_Y*<3mKg25k1y*NKmF`Eo z-rQoo8WQpN7~YS5Kw&8@vJHfwXAAmt7A|VK$Z0y(cH$t@iP2QCQ1}edTEIobsqdQ^ zbmCMtmv;Xba{XE!vLtPisl#3zT~p|faG?z2>YmWR+-3} zA&;H#5SOI^M&Fm1YG;Iv&@lZQ;6z;od7BIVce1+VF8Kd}h!v@_bCK->T(>m})j#In zccHuKx2#o+>7G-%%%!`9Tr-#EB1(%7oBfK#;bjy;mdHM1MT@t81sz*yMLk|{fXW7o zW5AI?y3Vf+>6&W&noN#2f5CxL4(bvLoAt%eeD+NpHgTbvCOSzk7a3$|t``FzInL~w zCA*o#4r~l1Yzk`FtTuOp8xT!(fTQyW3GJN$i5CZ$>C_ zq{NH7KoRFg`k_E7q@1SKtgyNlNdaQA{nZgj>Qjify*0nzYK-=dG#uO*?G{kyG0uMG)5zlhVG4#i1C-1T%g+u-Pi#bdvse}>8GpeiOH%dE-+pv=%(Diiu09B%2`l`+xK;NJQx(n#^J^?9 z*7*D=|gesAV*`zHnq9sWQz^>{4Xj6W7kW_HbtsrQGf zXOZo0W=eMup-qbE;C46iO>|SLY&pZqnpE>m4C^~>W#XB`uA6+29$92R#{e_}IE>IZ z8y)OcO({v#m_yr7{EO%0hRdd?e>W%*OrH?W%^Wp^_PgosZhA@yKqI6qEk^;|@Y`@W za(4-qg3m2ih4`d5vGg+r7Xj^g zg&WztDH$SpGrP@1rR{Ci)6z6I^a(*;YNtatdhPeWPnb=rLjBn<{v=J5jee;<3ebK5 zpyaYu;&Ub_A?FPF;KVSPHf`ow%;Tr9|KeI<|Hlws421}qu>aZZFyt3B)1Eie3Un+! z0vu!pjRZnNT$|mhr-#ufv&a0Z13*6h-T?ABs?iuh8mDWRWNH=#np*Glu|e|%jV3=R zM%Cf&1=IT&f^YkYiT%S({+-zJU9%V4MPgY)NHc~yf(mGj9>K<=&1TiG7D-C=514N5 zGhU@Gx$2S|W%pBVm+wiPYYS;DsLIahb^iKkrivq|BFC?C{^`7_LYs{GnG;p$g&WkC%l-cMX#7W%8^Ei!IwT34OZ(nJ@8u|mI*~8t;Im2wz$1&}X918s0 zzs#Xysq269YlDtvQ>8(NIsoU+;ae}rq@&faa*0I(8l#OU7su|F5DMx~OD^!)D|f5$ zZuu1cZ?D6m)M+>`%0W2X<_}jEYX2Xgj=k0d13ge%!w(iFm(=_JOa)xVU0UnS9>WLK zF*xqsQcOE_bmz=k@75qa5%Z>Qpt0J>>KGDLWOcl%<*HfH$m?bZYtnb?BV*w%H265h$^%%3Gc_fj@LDm-e?@&WBANQ_hZol zMkH!W(xr*Z-smqJ*9I5%mhFdY^XH%1Z_?n|Os1 zIeS0)ucp9^N)@<^Hf)1Wkk$0Ry>D(jL-dAE!f^ABZb~;`_9}ZpJL(n?mE-rc6nFgo zZ(m0`Gbjzv+5TLf|C@f)r9YOFRCTBODdpJqSFYjQxGwUwf4(hS9*;~ZjwU~kjGS>z zc}KP%tpxOmH9(wL4nELOjOiHHFk77Ir}9O(!O{MSXh6ClCJ*F5xJ4Q}>sPLh zS1xh;ERnrY#Y%-MSH}AgSnu{(?Y3_Dk-K@dJG50tKou)DbD}e%IJ*so+f3CR*$tNY ze|&|QKh&{Pt3;g>Y7wf$7fNzvM|M#mzwSg&Q$IB{;4PS|LDJ33H}Gd@=xG^46Zd|r zizEmo{^`)SE z%R4F2hgaLfxOd!$PUm8tg)g?wR%#isTAZ%bM*JHW^<_#rGxs+T)acmR+}C(&zD?hS zbU7T!45|hV>gZj;7jfihb20zp98Vvv4?esl7&B*-T^zO3i%%B?pPn;iz!+sPYTf9c z5`4H{WxO+SjVrgA`1c6Xbs!Hj2y!nrsn=a?`{ci}P%vJ1sSI30xVOzSX=hoOAniQc02-r>{^}?D0_8@3Fz)w)d4l~8_FkkjPo^%@Xm&aP z7(a_K)O^$!Ze;8^pPcD8Tx-r4|EpIuS*NK< zSsUPq_kDFA@r*NuT+PUo7^iiy2(Po&mK&Elpp4Z) zr@oHxPEq;51e0lcgujAxxg!HnhWVy%yd|;L~ntn zL-NCJZsuV_a}neok9 zQ#LLNwb0SBpJUQtO*v}HF2lY9tzQ_uoO@plJYhXeGu0bB^+O5h!EFKvdt9`cLny%B z>U+=FY0{kx(pr|+Q9J14y^-KcmYl+Iy&|6X^E+j8`oGIJ+s%^vf8*ABD zmp9h3uin40mVNb*##;8(do$v##u;Vjg0}OW`L(^q6JRf>LpVa?0-vwEZ}M1QXvsR|>?YKT zJGA;2J!`t1`kXrB>5lA;W{j)VA>O07gF@NM;GnaTA0h)iY$)7YpqY_9ik$iNfmh`1 zQEMPy$*(j3W`9g!d;inS34h>QcH9r;H$NdJQkPKu`ybc|F;;OqXrfGD1M~5+apW;0 zfOiP39wqAHaOr#rp))iCg9Wp?UmwHU72}7tM;QWoZlVFvbDRb=X3suK2R$NiCNEYT zV@0Z~YW?MD$cCjOoq1;z1J>#~#4}Ec;uWho1&>#<9=#s#v(~L-FixT}0yaGy7?vT)OH#xj?noH)H0a_3+|Lcpj@yeDibR`r@Q zT`PTDT`~q8~k)>HQbnT^CNTk9&92?>>3;(gx7>d38Jr-ik3>yO+%E9p|a zYWY>%q*_fPUt?2WEMk1wrJG~4_)xnN4_#`O;dj*Y3mB)|bzB;*dgCf~!hq|g#Uq`0 z=aqE$9e);4{8jWg@C{=gS6b8%je8W1yccIaRQPVCAFq7R?Zf|TwcN*em0|Om*wpPE zpv0NJFJQ#e@72i*!5)OO7YMG+ue*^8itXB!hhj(haO$UnfyF%dd0Uy$^oxW23AG9q zsVG0i%9@Umc;Katl=c@Q5~a`39MuLY;2% z1#LXwMPDeZwGB>vq%he&d)>~G-|H6rHP4 zfPgW~xXoJE!fD6MNR|DkIFd~Jyc4^nqureOC&I|0y#%7HP~3EPuNR~nvg_=O5yf8b z8RPoQ7=dk|u1+nPF`}PYhNGnDDDXaPc`*K>JDfuaeYj>VlJ0~`d?wrN#QFdHB z3$()JJO~n9+TT6)yt3h3<1~<}M(+Ff_J6j<4#c(mK3r5(ic)+xD2tQQ@dS@1GqpC% zr*@G;KN(Rc%Br<_y1()tS?Tq2`mwYYLH_{=B%~aZFk1-_{<#dbDCds=?|P5tHYD<; zAd-0JHRTiKfO0?2k6r)wDFmlGKs;!<67PD z{fn$ii|}?ab(v;DCz%aMdKW-qcEOc6WDqDu=C=U(rvpg)b9V9u6ls=HOOQyw*~{p1 z45yNfBYR^Sz{M})pQ>?WFE)-1eB(n;g0ep#*n{AOHrSou88+CBV9W+11Wz!*UXkpP z1l0eS=g54j8j4A;jBWlRR(iAF`v*&kA^sN~sKEj7K&FZ9|7k-n^>D2~g1S~yB~(27A#_DotrpQF=w zv>}#>7+zy+@k1V=J5!p7@$_~sVt?*t>PzD|ckwuiXkq#+aox1L#jRS=@F~6>aYwRn z|A1_lEw@6_uf&f-hLdbz(}{w2sTOgHj;82eazzgail&32Kcc8)+zG0;Eckd?@Nxfw zdUdZ6={bvZP|E8R<^G+o2pd`C@Ow>@KOR^w7FrqxNT{QHA6NJhGVT#{oZsV zF5*X%p-T(30h|9wlTZvTQIPnWnVGHr-QZj^SYAckacfoGZ7pz$i(&G&f;&n2H}Y%9 z-4Jq|LsfP%4;VHa%N((+y&{yac?ovIH#%icei2E25*fOrb=!WM*Yx>+sC)PLsEh0W ze*+1Gn;UK#6)`AkP^<*C5&_MI1UI@-RH}HXA1an&YZY}@u~kUe4P^UvF$yZ)wYG}Z zw%&>XFHHamXjQ~3QWdq@_qtxd3lJ3fJzq2L_hu8ZpMHPeKYouNj|bU#&*jXSGc#w- zoH=vmwMh9#!Nh|g2{+{Gt=T`dyMN(K52ea;@SJz4y*0Cc`d~vCafQ|wvRt7D#v7)A zcJiH+n*6CO{Q8~uGj><%$<&~AumI*TazzF6u+;RBN_{ z&#tosYIs*N)yDKTevrP#K$ja^L;&-|oi`3l^^s}O;bXFOXWt`?j2LCc1~q<_?jwpC z4)^sxvTflpM?G@t52|ciZkXE9mLG0K`e@3skd6tMo-np+#)i=2*PZq^^`B@wgq>e9 zW_MPw!&zRTZ&~SK(=hQhNoVV>7y?&PzD``p@6Rv`Y)N(5r?Pn1wjmUM@A#U$)|ynE zrn|go;Ir11ESXv&iHiLn`#uy$YzhnAzzSn25h?#PI8VCwT82$YO)_KdyzS({nVJ#b z=oQAAyzh)`_jYaat4QjoU`>+hcGZ@BT~qc_ZSv!q_@{ZuOtr&MR(y<;Atki#IKH;m z&e~q`4?LBC^^IK$S}ly8o$Fd|#}A;X#yv{>f(nR{|h#J+cbj4W2pa~?2vuNpq( z$jS{n^^&s6crD`|nH%cO?HM{tlmt_o{4kRIsN*e%n&h^ac@hHoAwM{OEQ>n=YXhAT z9bUTJ2y2VjCB$_SVVoOm(Awf&_PD+Huubd{l`o~+j1TNB;Do|A*jR#I8LMX;vP=YK z#JNoejLw8H(BkxNEJT;{ybm#iE@b!G-Rxa?R^!~d9eJ@c588!OnYM}fWMIT;JG@W` zwDkZKbN1tI;qrCC`P#f=OU2vKjfAA1=Y73%b2xFRaS!itc7VRw7#LS{HFh(;_y7hV-e4f83o$@_Gx8{$a-T z#02{Ki3#14C+8c>E47M?bm?exkT zMXHg$>Dz*_e4x~jDR;x!ebjpEIzBoo-o96K|9Ct0F9G7??bxO5qrj7OfQF&><70ZL zetUOH7BeU~m@|h7F?!mvpNsXXS|I>j)b8lELj3{@Qm%#B~M|I!$~Q zZ2Af}9**$@vNfa@NmbBc9=Vb)-#qdO!r}3O5S=&g1%*=u<(-hYNs$_G=__CmvOn9q zQ#w4m6Ot%y_~t$8i+p!8XHYIH-+5PCqkXHKJ|VW24c9;wpPs$(`61jR7Wa@rKCxCk zW=9|6uE2~tsf3{Xlzb=~<~*eS{eXCN{R-*)Wr;ucNb%X@IDAvwS6GI}%lN zXhvT&6KLfxw23Oc5_FW<&UsMup$FMmX0{_k zM4ZQr6aNliMdsn)#A;@lHmBhLdtHBq;kVp0+iPqB*r=r%(`s$%F?nB9lR{6)fF_(8 zxf+9kUr*ujHPLkz-NeF9cX~lxk9`^jq`jD0o7hXJI*x`E&#TG&I$B**zdcYTxfu6$ zB%U!+qbMPU&ns+0s*H?p&Zyi~i*+z%^@+M?<4hch`xUlx6WOb4I5f4;7sjN%43m0u zeZF)&qc?z)E3bi04_R`#F>R*tic9A+KP8E_*aMbGCOhIFWt@yYkmc&(6K2LpM%9@!#Fe5x^V5w=vr}YV{^UW z0=|5IC_0i2$D0?cy?Rcn+1MmQU_jQy=M+NWdMH}soKR9XhL5Nruj%|y+X;3}?>ZUY zCl85Z1XCki^e%?T3Z`#>fJQ#oSZdHl6+#vLBzNHCT<|rk6->r-@!8XTLe&DqUxlK5 zy>?yqq;5-fS_*^nhC!qBCnPlS9!ap_73PB(#Lp3cc0+2+D?Qiqb#e-IOI>-uK4PgU zM~CO}CVLP32G=3`%)g0T$VZYoBo!s@HKdNW@a+sVA_m8N>LoRl11Eme)uTeY&{TDr zxxt1{nRt$24`%9OvkowOF=oM;1f3qn2Z2RT3bx9+aTdp5!&D|*=0nJ~;dG6!y{Tup zrsofguLFPXlWkAvkR4wddb3DUH{53y!CiT=2NnCMiH+Wwoj>MKZG-!}cg?tKcpCiD zm#YZwGC{$wH?-^qu&_(~LiTgkql_qZzvl3b^mW`g^TKHJPlh;8YFL;dlKu?^yamS% zt+acvgl-P{ks}q!;`3FD4z0J>#CNd(ovCir>XTYD+^UxG4N#l>OskL->fuQ00_~_- zE^3m`W@gs#WMX6lw-IM!hCI8Zg4fl&Wu!K_$u={0F^cZPD_XI^oMf3Jt@qqxp3-U* zErj1aLoeVUe7@LvP5Hz^b50vPVKaIs?);#4I-Dlfmd`E<&XpWZGqh^EuRUX%@hQK) zrYp7w4zu$BLf&U{@;>0@ZOzFWY#2kmS^yFMS^12kq#~SJ(2t2Q1EqGv>_T?Y2Ps#o zVCkv3{iAEbwtv2q6{TGS)4doLWOX`aJ=7b$NNaR={7K`IIM|?zD+m-Gd(~!*0dwiw zc3>PvVp_M_jeZRN2gJ~_yQy@!ggJklbmf2N<37hY1=p%Bjlz`l#h}DSGaUmM)h!X; z@#Tg~1rvF~J-*y>s>GM_@{uZdVNz~G4VO2vW;2Y;am?-nd8tmVa?GoUyoX9SHU35l zhLfwmyf1k3in_M~Jkgiv1{s$zL6!X5?qrF0h z+CobyH{)-7*()QB6U3TAamw$^YECv8sqaF^LBxra}?bQSE*NPbob zOz({~xxUla5b*UWUGy_%FN+DXq)X=kBbUWn`k|@83$~SPap%5FDga)cou!}p9onJ< z=f7g=t=C&%Xba3#NnSsdFHgGF`I&d@V?_Bl-|jn4TQ+pxll)HG9FBhnH@!vN6r)Yb z2IqdO50)*tZyCi>AP(sKNvI%et1`nCec8Qc#MhCeN%f@orYi)FLR?^;=s^A@U zplXEe&-pfjHh%wvzqJW-C#S5uT|u&ux8o`i@g4(f3?d%Ek`Z8He|WCy`v z`tVk+eVc8eBl*p)T=>4P##4UW8#5Y;UiMF(u-Wr-vIi4a7=UK|2#>(*#)kZt>|P56 z7qM&9po{9E!ySw}vs>ipv!}Jt<}S{`#B!Qco!}znBLvtoB9d#%c*Em%tlg#-mzxJt zgY%w4`bZ~<@#i1(z2(GQ`gSaiD%g}GSkY^8!d7r$ZvL!%SK_vw0|)Fwp&Vh~FLU${ zlu4<~8z7Z~Pp{m(Il`1cgHM(b`>;3Eeaf0ky?u%q<7QaY zu%4h2G%UtrS8uTBa=*J{;r8ph@CWK^JzMRkzTK2L`UlFSR7N%Jrd@eIQ06R^k<=Yp zCRS}0B_FpJ!n>!%K`L_zW%L*iN(t9Ua%uN%S29bqK0Ly3E$nvEaaz!E9-MPuVM;jp zyr+K+1EngGdZ0;M1S&aZZ+H>ZdbO)I#gvw9ESEI%$^Bn+E!ufZJrExtGmrUrxsj_ zgH@w&<Xo$F?8T12#J%v>~@qx)uA;R)=6tJ5c`wn z0Nwk_Ce9Iq^L14YSyRN|60zyXxyKOKmVIB+u&nnraE`czyvA5E%3#yMgFEtA>y5EO zV7!++qrc)PstVFwrX0_mVRmnc`Cv*#%~XUHEGZ1Q68EBdGvJZ|%BLln=L`ZPpLg_q zTK+7m%38Lr;$EE|Mom9YM8_~mm+E43GF^nz{m8Xb@V zodu^Q^=6_1O1+S@U-lwQB$*TfL>ie3VT<5Q#n@MU%&a}6&Jgjg7FiO-SC!`6DA=9+ zrgNFsupG1|+AlKx&6w)XpolojwEu&RjNym(4`lmd-sl}jYW$jfhFmY@Ls%+%gr#%Z zcHc2_ciBD6lM4%P$Hpo+MqgUib&K7p7@llJ@^0ZRV%@%Oc#p^j0$fi)V@wcc5h;Qq zp(o8>bH`P7c!^s;MK1$a=C*NG&AL2lGQGx5in9;Z|{;@B& zcnKLB2MB%LtC~XGPne)xNOmdq_ZFUD#_meI(Smm$IK3O>m92+(pwCO~vjEuVF4GQ) z0bxy;9+7cV`s0rIf(bIuS(JplgZAn|xAhM)CaEq7C#y>{_Z<`nbk|M5z1QpJ&9O&0<)B-1n0mX7mqh9>97 zEs(ryeU(lmp?JsObFcm#dL0cdGlZb{f-?ap>(`?qPHiFG6zN`DvYW0t@DE+OYJsei zwKz|sE>lA|_4x2Qx**gH;&hPA%FU2>ryrQ#xz@xiVgHl-kY#T2BH_;ucP%b!H0R_J z$@vM;pa{^mxDR^?atlinJTKPWf5I8Z7I&eSC^tp2MW3O_i1!APc@(lnLp0iX;HFM&8NW?Jg?^)z8pob`%pe^$wn~r*?kA(YrQfkhRnl z(Wb(Z;|Yo>v+;G0!{#Y6Ry{Y|{U@ZiyARxLQ=dVclBvqMRowBPQaf#JWNa;GgZC3n zf7tkYo+pq1?>g!%-D40jZo1DDHZu~z#&&g|biyABWXmyJlE4w?P{Km?B{XM@R z_(Z5jVZLI98zvuTOWskQ zRtB^8vn+U13$;;euUW_4Y70^t8YcU{qBvQ*UpBLmvygudS+|sdo>9 zLy(k#jg>{D3}~$E?}UmP&mW+_l><8)><0cn#|KRJYOEXtrh7J44t7F=8qeQTe=GMQ zW#7iiVp8^LtlZlP6*r#0kN#HfOUnL@l|x7w+E}@t6B^QZ{!sm`+#gfBJZ_MTX~YeK z0;8a@4VBWjHdF$&Z3tL+4pBZRQ(!~%E#{f@i0Dq&iSBeHF9C;iHw7>dpKj(gU=slh z-tIF&fb{c%K*2?h28z0Z2C6G)Aa}b$MHUSGK`RG(5r7%w1p$L)zsW{<+()b5L=D<3 zYS8Ari7d8YAPEiM*NXrQ=Yb}TLLBm%AYkCnBHjLgIi#_&1TY6TRt_Vw#DY1%2@P+o zJkX0ECnl>V4KN3JLBJfWU}NPWfH|VEvJ@~sYOLh^GgNB99O{HdHdY?yMF0i|*d`4y zhkHT5{7AvZ$|C@COk?FJ!2GzevW&=47R+cTbW~&IkzNE~j`D(l!8d@(2ACf!*jRZC zV2*FB90Qo+8Y|0*9Am*8>x9NNR*v-|05i@D0)|KEO*X(Br(k2{@wyMsb-hyejR&og zV$KqCq8;6DPM`SpeB%=gVejy}VetCCp~VP)W=Y8W%gVD|n{hu3IL#y-}KG=(SAd8Oq|(Q1g*f1guwUk8gWy9v-*5#*6*WlUDUq=t!82MJ=|_a z?fid+n-0o+-0Ge(9RML`_afGL+_XntI!oxjvh`@8j$`&Cs_49BR3z`qNb>9OVR+vS zcYkPjp}JUx{mwsmD2hbd*4lbR5U(5=xy`+)S!3xZA=V$mmg~VT+o>l_ zR49_S!wuXjL6#S1M8Z_xW7r70pWH$ml9^yqPB&n}x_G(`>wY%C-{tXOAyhX-Ao(Qk zsltq$)XX&VStd4bVJ#cU`$hoDx5Y>#rv~a~nx}u}`5Z-Tx8Km3SG>Sh{}e9F2^Zyr zi*v$8^Wx<%_2aE~;2%pe7O@PyBdKXzb9id_C^P%Ea}!iuzeGjVyvT^ndR@RaiEl;D zk{Tes2{lh*c#AS}d8GBTeBEJTM%`^<62rBhz|nvBFuyc2+$3R;xSc_XhgktwL!8e) zgjI!XO*JTGCoME0e4Bz?m*KV%7+h;$8zgWmx9#=tu+=KGSkPO)J3d^tJ;a$~Y7%!- zxURY`d={#gAyF@Ae`sy#Kl3}{&F+onBb z@6)ny*|XtZFGrHkVQm^NYYq4M*xW?o^6$2nWp`RN?B(#b_1j*q8n%AemSJyHmAyNx zeL`^QxM0~!6$ij_%GxJ1M*3lU*_vliD~GsO98z1p`Lepst(&Xvog~^CT+)|lD@W8+ z4S43Ld45{BBVzN$5q;6fhkX!j7Z%eOSK%?5*t?0vp88rdWTywGwoDKHjQ=xRh~2nm zdN6aXnM%PC_7|09Ui5rZpn@@;&7&EmJo+V1x9D*u&!pTunqA7HU-IO~_Mv#fI6J1E zgwbyXN7!Grj@zJ*+bIDbO8i-+;1yGXOA|+Fehphwm^ez)Je-=yi9}m)o=nw)OBWqg zrqt&O7v+1Y7@U%Nk(WBUOKNwMda{>#WS7)@lRC;vJ*rD87E3@L;H4hjCAEi1{R$L? zmEI-D#j2-Cecemd#hlz!?C5~3X|J+lx}^3pskeHmJj~Rb5u7&_5yO2xste;Qjb1^1-o%R}KDnds>8m3QDK?WU+~HT+Yp%L)n_Z+D zPUDLqRxq!O(|oZYJBS6Q)y>B@(;5vm^_v~6CSW5g{K!c;kv7acn3@x*utusk;%DY0 zDNIs9^aKOHE+DMyZzRm-q1ua%N&> z5%EPL^d|<7=5xJ&S~yCyddtBgZ|M-^=q=ou?ylDW0kqR})9k&?@f{lW4Q|GE+;zvp znlv7W+J2etucr%)F$!W9vJ&HCMmSY9v~QU8XjJ$xH5A#25j;;?O`{xV%*afnG(2Jl z-Ua}U+D=b=gr(;Zo}j{b0U4oJZ^gMfS`BW&`8Q(tkVW6aU5bZaU4MWXLPs9KP4(pF z|Gy8QaB2d3RAw9g^`2oD0O?o;)$2xZO@;e~4~t0LSi_mt3xP0#77{~~GBUat46o1| zd25V3W)h*ZCkFtdj(oe;rO%<~^z>b>5K4XVP1}<%qh+j3vUpYT8qyYD{2ZiLRV04C zWqzL;Bp<7YpKtP$zFOme?M0Xm*5wW-&E{bvp*4e(ly3C-W;Mq4dHN0dQ{ySsWta0S z4g#dh`lEUA=jd-w!%NUH0JfV5={!63IPZSy?IW_=pzm#SMp0Ce9ow8D#rWHthh_$co*gy}-H*M4rXxI|c-qH?LD>wo>9u(f#l^|82ecUW9kG>SM8m=BmH! zw&rnfXM$0ocuwj!MPY}$kV>CkHm9PH80iH3nBdZizKx0D#uJ3IM>vI&2x&Zd?Qp5^ ztE6zP+JhsNs@`azY!#tY-=1PqBUXPI{-fPaIe!>l2WI{j$n3oAJ_v()#I4}Gks4|s zp`O?7bCR(|IWcw7m@mU@7_<8!ZZ37&4}BNQq%%-ElzdKe^nE1xbxhJzl92)?>H5ny zNAf;SuZ0lCZB|)}b6Rovsm0NPy<6gI@>ZsAOR#u$j9+7al3vPrw$+Ddg-#7V_)x9C z$;~|(@B8evN6!6f6nSB^ikEu|1G`TQ~|joekIVxz$k?-5)uSRyb`VARI$P(YXU zF(cN4(Z%1V2jn+o^Y?oOK2VL#m${uDH{O2Gc1(lr?mvg;(^Iwzr%`KyJ7N{uFfXdD zPEq<7b{ZwyyL~!RZC@WNwA<>G=;f1q?;d#y4e+3(27g#KND!tfWyAZ-V4GqgY(GS! zrE!T8zdboyOqz^T!A6tV)IuV8bk^b)pPrLP!|e$Rz*XXtxd4=St4-Xj#5fQEU7wRpy#SHbH=_qEgy2B)PqTX8?S-IrD z$^tOdyCxTasCTYSG}N2gk?49m?@oS3~-zhf>1uRMg&83Jm}wEQN# zlpIO>C_bp1Nc~pnUcnaM)ot=^fwuhn&F$AioQwvEMeyLCZ~Q3$Yfsd=P&u| zXkv0^vB5j@c>FuA`+Y>7DwNpx)Q#Q^qct4Dxn3JW`D{pOns7O&q$-vGz$RN0Pmsam zWD5zvaI%{LnASA{ASez6h5OJLShhTzW&J&v`nB*mysVSVLr_25BquEO?9EiOT@wop zJ58k)3*L#~yC&J+sVgDIT%o4@@nt$phW&gf^{!71!+8vkdXZ@N$1;8JmwcI4bTS$`_g(2@0 zk#{jEl7DSi+8aZWX{$wm(!06`(z80H(@6F9XSb7b9w|BcIZIlDj)e`>>+H|8}vemusGPtGayqObSCy>tYWAleo*Ecel zYqkGKHW6}r#{l>o89e(}lOCD&qLOoH>`CQ)!hQRKa2JpnbxOrsR`~^#<=_I&n$A zf%e0+M=4A+=7!>plC@qg0Ou@cKJ5ygup<4Cj*6_m;z-h&j?BA#N30Dv7)b;OZr zN;cCaswZoYL3Sl&v!6<8@)7YMTRdcomu4eI5h1IQdmtu*VH63raidFU-1rmBR8g${ zaqB#KPTld$_Scm?xr6KPg^YtnokmDai^{j|*g)(P-BX!ko-i3N`-k9sS%_P>Z|$$? z)9$YCYvztXo1r9EL>9+8IR44umtuyDvH8S`p4Xf2x$+_0X8sDX^o6EO1x+xv@=l%7 z)29;~YOW;1^4IvYOvglQ5=!{NM5o^=pyD2SywO&a8US{n{gSfiquuL%Q)qFMF;|#z zKlIu{`5BF9=x^gXKsdEfquraGDN?w3*hGx`>P&|8t7I`FSC_fmOaG*W6eAVR>sGs` zV?Yg<1-f>khgK8sD}ch{mmFG3?NP#d^7!7?zj6qo6+<}8wG!Hf5oki^z+$okKe#nMr+7e;0YXunWHfvm2&$C(2B`e)Klc-R$^u?xx-|=P?(2L{TBgih2_rzcxHN?2|fu@e* z{SsZr%l@ik$2fz|b}S}C%~HSa7M-t#ko6^-^#xr!p_;qt@=$Z=hl;eS$nCbstp+;u z+dcG~l=V`Z^%Amn%>Vd~G0}eU9j8PO*5h~m%UV`yWvDMs1c6pBYA5i9MyrH=G%6D^ccWErZJ8x zFdT+{o`4Zf_AqlAp?MPL-z%BFNhMcn5`1A-dpFDk&AjccAGzr;4EHc4wq(a!m|gB# zclvQe{>jQ`w+LR%wCxDDbM`e>@%}nrSNX&1JQHpjJPL*uOq{I%cD1wv_ZmnucAYN+ znwhU#+=F{{Ug!5D6Fk3TogX4jF8?%M`+Pa(3-_EGVFWv2_nq2jIY#ZY7O3D(xtT0) zk;Sg}hCUK?zHo=CaEmRR5V?K$VCWUzSB3BBfSAt~StxpG~iw zruA9roaDNPTtt?$1fz+Lgv3NHQ*Atno)3uo4`-^D?>2p;(tk0M^u0|w?bmpqGj90t zpn&`Is{_1Mu`RB6{Y!stL>I3;+}GfZZ;W)egAAp^ECVp6Xwa?}5ADrJf1;wFw|Lya zr>4@4Jxqt#%vdGg49HM3?F%e#;7`|yJ6%vh|@xvHE9twk)XYj)P3N(g&|E{N=D-pSjCnK+9qBi)g=eACk0U>e6;@ zmIt(AVxJBbY^9GD+onEPV47++Koo3v2vNm61!%^bk8bi2?F!P@kw}vy8JT&PjuR11 zJ|Y>)M(EjMgZraIiIfjs?k#c%enhmoi#lTJ7OBnJGJV<4T)mULO}K46M#xoZ@fK2Kq}JLfU8 zRB4igle4_#?heU7-u$aqTYbKhj+0_=%BTtP?UQ&thEOCWpB@uO#dnP5RW2g%$W&j* zZ?HesW65G0(<|8j=gRW(8D0EKN# z4^{3>2(7hIgY*~fl`j}QXv2F(JP9$Hb~|bx-jiYH{Md}zCyjW*e#c5PyBp;7%6_iR zeyz#Qd|>|xI_azZZ}_!HSCy==8_@Lmq!4K~c^gK5vTN1Nt9 zMFG>lp0Kdn_ACFnHvhGfS~MTiiy5A7k7rS`Xvr~5NaAKg6n2%K!=F%d^$%figdp~| z5RU~SYv2%~Jefi`d|#&6c$8#{cK5M|J((hpf{c_O1^Yjs0oF0PE-ni8AMqv6g;o&2 zTrfMjPG(S@SVEaec4P(npEfGJ+=wPd-q>B^6N5nYf2f-#Uq@D>BuzIE5;6yaO!@|x zRa5-q9`PMDLE}h{=9~qSLEmw`x1?9tfs4Q}3ua*K>FjusykN%kO7oWt+aVhAga4`V zqx}ANiTCaCCqLR%beFizHme;!UDCEIO@fNQACS6jrf2Y-8hr9IXkt_64llt9eTm+B~M<+Q${;eI=;bmL1?ZdrMkyJi?v3PR#iXH$DjE=SL%2x7<`nK3R^6MYlTTc8j zwRdS}_Bxljf)LUBXD*_=w$-T8@?wy@_jL z7O?hjpMPT%>>t=1ZQU76p87UR?@sof@lU20PvNighLQUyM)T@Htf%H_bG5C4lY;Jn z*nZBuRRy|;6R2R}e~NiRup|&{SVOQ$2Xhrv!#tl@h*GD8p!FIyntt&f%MB(D;=}U` zvJXLCbeIK9v6FH90C$LDZN=d@hgy2!byg|0bT`>&;rM7EF_SuqG^8m=)J&T)D<|b8 zlhV9cprd=@4(4u!vXz;4E{SbXtVv&^P)GW8e39-d788Sb^Jazo^w{OZ6oHmaD^@6* zb|z_KvT54Ab)+$_o2M!!n7CB3N4$B4`C6nSAt*mCvp4JM7WYl0VEv9-)lrxUSoUez z#?aGpOdz7`43tg#U09Ay7RnOvt=sLA4&5suG+HSEBzw#Gm9Ace)t+mf%FBh=ZC|4k5`A{%b!NY0daJHEpDD^f`ZeHW@H&dAVpYo>XchTz(>Kvd zE02WbZDkvTO;<{eZ8At@<_V3LsaGQF2okUwCgvq#>Sqn--7%mKAX**sAd%Levs}!T zZOrt+?Ra@6nAn2!XZ!Bvj&ia0lOM~w*(!JaQ?`{A5=RoNBq}Cb@j^gp_Y4L{dFJX~ znGpt7^Z*OzlpHu88RE!vY6O`xZ47=|Wbgy(3PYHoqF&z1x|c@l|?TNBxnC3?CV4 z-UB5r$JFkhuOQJXmg>ivEsVY7=u`}uJ$Xq{u;Cv-q;E$q!8=_Y;UzqzDL!R$8^%5R zo~>jkjNNKC)ypeLR>l3dYF60;95Fma3fp{@TpHy}W3&876w2 ziH_Bo104^4FN?^cl7F@(-xiAIXvIr6D+%c-lOAlSrFu4hPatoosOQCDi~DO^{thpi z70!S?gJ>@bp+l``(6jHzZaUJ*Spu6(e@x+Qr~-YAj)#V}O{jt;1&nn7w!&skbjU~U zllyeTr#70HH=GGoqUtrO(>mL6ZunNUt&bj>J#wBE-@Yq)I$7h}yT=~(y2`0D`C4Lk zWnxRZ#b%h?Df}+6N7LpM%PfSQ4Q1;Y6Qw{j47fyrU6W?0+HSFjpP?bUjOSX+49HBm z;2m@0v6dLg~%KpN7s|8A;tM?{IqQ@ZEY=2fj@PUmQ;U z8BhjE?#mm>ZfL91QYuRMZ5frNvbM=k*y~O8+~BskX603Ot720Fl(OT*RG9AqIXV^M{W8eGcs|Jy-M+lQBJ+K8o&wf4=87n}pcE zRq?lb8A5JUcq+T+|Amn0&&8QLs%!dTdfqqX|AwB1!2j>*S#6r~gY?XW-a*eI3jGIq z4r6KEEj?$L1WV6{_Uxc%5w!h3rDr&P)u=#}Yi#D2#ExfSYuFa@v;V%Ge~e<)G|wkr zXEqEpjIu;}+^qbJ_aedb;B4^eF@s#%N1z<9L)aY?ME(5b9oH{AmEID*ZO?X|6Ph!M#8jW2-nFYnb0fuL%| z%JB*;mwceFW=83*4*U&&Wh1pZf;B+Az55ljo%%JD=2^7Kt!_blQyw)>7Qfkg=8=Ka z>EDJ^C+7#(Bzw5OkLjg>*(KrlH-%S7BhI+%Nj@0(6c_qX- zZOFD2qDL^H_YkXsPc*KBdJ$)de(-(VTF9;OV8e+do|L+%057Qbd?@JN%bwmxjR(6M8PNPZhc?7CfJ?NH9%h1>s=BdIK2*~)r zI!W2|k2G^!oSHNV*P^g~4);R4PAfLbM7a&(sSSWn2e=xt2Muu__)$OKw35yDP~%?z zLts&ctYd|TJ>9P(Bkr&n`M$3zYHs#wmIr|Ns&JP}eWK*y`Ec?obOAhkIQWxp0+)7& zABxE=(%3i%3R!V8NsZI1lY6j-7h$0n#Dl11>me%-ql}9rKXdQA-~c*q>Ez+#Ut*>?BCUk(nWOPC4nZHM;@ zq;)mVrUNc5OAdcM0}Dm1H&Ipgy-pm@`0GB3`k!Kdu~cV}#>gLI^kl2M8YL}r12D)8pSEQZ|rt*<$tnM&l%l`v}+(%r)gV zxO*9Ng9{{!DSvbn%I+fehRqTcje|ln?7UVxJw;x(o^~*(7U-lz4K)g=b8XAdRzm|` zLvg`j2MYYvDRj^3z@T9^U4Z6gbwKVXLaJ;Me|$RFZfrh+A*V4k3Xdb1`^bK?$!>7_ z583m`F5-@H54qhE*AOiIGwRIJ7icyA6|~2S@VKPM8*Kd zE;|{rUQg!Ohq|{pBuTZbR4^Ot40L~i>L|Iw6kr`e3~Y7(aBE*wvzfnV<(UeebPx<2{SeLtnUsAxQh;g#U`IM>|OK1Fm~gi=(&e%sTIT;-Z+AQecUHUn^i@m z=chWj;21v8$>p)sj8y#mHPi^(WJa{R`;g-A8`{;-5)#4mW@Xh@0tT_deRVNjZrHX2 z6FP>~O&AK}Nv<77c;sf2#_?Z7LvA|%Zk2S!IBuNDTPhkL$}7%k&CDt0w;tkHB9MiDea5f!^P zvpm!+cE5Z$xw;+%kH@Ol9kZ{FNlcfo%*wl=!lXnfAq0-b5qpvEh`py7+_3?^>!v(5 z%fb2gkhO}bz2W}up1LAd5Z^vAdNr+S`~!(RZMCagv=$jfl<<9$o4qxtabL!~Xi?Gl zuq@`?xx6+D{ugH(Rxt|{C2fayZR+6H&O%F@^-=ugI~C|9-QpkT1v0nT_4}DpAZO-h z^Ly_p1QVw*Cct*rX_L}=*4AI&jX3PpBmIrlH+Y@bW^e@{=Nom}lZtz0Ijh`BRhV5a z>Hy=N*351-O@Rt^xBC>9{F>Ku_VLJIVJefEIUHWl-zQ06lZJqc^8vT;1(ZkGcR-@Y zc>7(N+d{H&FBfVatf07w9aZMW{O^RLah>N3)OFbS)B-ZWln?VkBsU-j&sDbNg%w5$ zZYktVkd|HRaq3!98g@@D2@YvqSUdzpiwr`mG+06gq9a zGw6EC2NS;_d+@q@z|+8aTLBi^JEeCAVC-=p$n>WAOdi1F-*mh3R#S^{wM0eN{)v!DE-`Tz5?{&k$7r{7JikFys`tjMr@fo2BLZxQc z7rm~2_Q-s+TG4r1Cl2Z1sr0TC(X;hm@w@asMAUyHV>n!S#J@Wwc;|{?>*Aa9tQR-a z>L&M3>rrU7N#-#6f9o2`IkPbA+|WXmW?~;(&o)ik$T>{dyg5Vkndg0Wo6}F9-S`B4 z<`BauJc?G)E|nDd7OhZlC)SO@yIOlaCysDe3vX+F0Xi$p8_lME;Dam}rk4mOtIr#g z9VgPTGN(!up_z-lT!6a)+_{wG%z}TeKDiZH(y(#XnY{9Qdil!e*bys@u82&7|8M{d z?dJWoUqXzw3w)E};=~zFEyZTXdZVSKG%{_aq?##H4hSSyW**an(z`Mb8GO?xjTo4F zMaJ+0?ib=eXLJYFol$PyH82}_pb(DbNeDS_~&S_8RuWTGn)4umP>DsAXe}$pM?521<&5Yj*}(KZvQi1 zW%;AlEBqiExd6r(EowpU)TxLyGZNt zfER~(P@&in|J=u#rQVN=JqgY+cG+Yn<5>Xyo=ja=r#DKV!mWe)1TruC{NX?3en7b| zA~#|TEs!KW_(sJw?%OYrxz3J%Z@*NE&-1+g45if3myso$I;(_dbB$)7RrVLTzWUavQND+lUGKe7_Nq@(*Z)vp@o~9Ww{1 z%3@`87A(oe1{K@Q#)`q&yzQ7zx}WTA@(OVq`+;I#x3Qaubss!h(`Uh(3g4-4YJscp z7mwyCo-LJE@&T2+-Imlaa|2Hd@RAmgBqow2S~^NT$!p$t@U{ZeO}-cHs2`?o^S02{ zu)nst+_CQT2`fC~*s^UWP0Yr=(VoAS;UF>cgxe`pXBzJh*Y7O}FG~Qqc;uxDRrK%Q_c3 zn)72x4a><`zVhm|H3%HoP!4{uH+H_SE%EGpYp@$Ag695Nn-59X7$!qsY|ge|O>1cB z{*@>1jC|$i*8X|!7-h3KHgJ-}sb~&7D=*Wy7sJUnP?AI^Mc9HZJw*HgLovPbxED`U zdUo5N(UDp|n$@!&l$GGTwHFJ9IprGZ?gQ$m8%Ac6E%NC{DeKE?mWt8KJPL*#Sj@)g zS$^Z7oAfPpF-xfu)p1Sb#eA)RJIALP*!>M@^SjeZJU_w`hh%3_1*k|+;OzdOhG$x7D zPcTtx;6*i(^+`O%PphIN^{J6d;;hTb&ex~n{d zz5^?-#C}?jI_^%`Tt?p#pFJrM`xni(4Q>c3XMFaoK= z0a~FS&rNXrnKgU_Vhc&lrA5P6jD8kGBg1(Q+IFT)!$&qpF)ap~bPB-8rBlP3Hb;fc zp>5)`TNj2L29eL4%*b?vP7W+xq z>95$xi05#?)&0WtFZ|;l|ES{0*id{&;hbZZ7Xq+$+KQ?X>rYDM*G2L;qsnjPRpA?I zQj=fiAYx1)%KO!`3Ilp+wT1p!5&PKOj|qGC?)>w+aPs;!V21&$7QmJMePWcAI_)>( zwI2!Eyn>ZV`qC&-gMZdaY_EnT+nq^6c=nQQuKUCi;!}ewK35O) zd*Nj^NrV1uk&~$73|>l<6c2ilz!|)FkmN|-7Ope7({AOX=5vZs@vO(<7X(jML!E_Ie>2xi21yLfD&pL5x2*?V4{G;z z_taaJ*;yfhfj2pyy8KLGf9e*nw{K;}hXU;R8v;)m69QlJbz1CZ{i2H;~R z)-aB&K9ds$-eU1lTtkB}K z`ZM6S-lYaUW@2;UD{ET+4A#LzTTEMvAN}!Fn~1fdZMD7ilp1gzk#{`E}NWs zQ;ux=v0=700(^Ywm+|!r9qln_`T8m7g_Xrmx!teU2cqz|m)*c%4enNV`=|Ofg9YEb zj-e0S=bl@Q#8B2u`y^~x`305z6nEZ2NP#A23V1VfR3i3gv;HX)!-4~ek!}-kJxNT_ zX8d{jrw)A7J03nW2U&b(bjHVa^9r~B5971-hEDjX#BT5j{5SZB%pN|Q23maH{G=0o zY`1cM=9V9%&-BjtsKjpYnF-wgl|Jf551&aMKH<*zD2I;Rwk-ZZd|to46Ma--H~4JI zd>^0e{-c69=U%+AfT~*EAK%GuYVfX)%>uMI!w-yX449Jqtb700I(4$E;5ouh>!W=C z)o}m08RbG?`9=KEK_3UsuKRd_k){?Br^i(MydBx;WQfTz3*DcAwK&*?cl*Ina#>dJppoL?seBTX&!61$NuIqDINKD<#PM< zgGs&3)7}(zpZyr%slm_a2d{No-N%jCn|5y(B@8~7?NnO3`y12v+!ILS->Kc*ViJs% z(8Qb7Rlx>%kpTRZLU;5+n%W*OK7p=N`Kcoka^J47q}aD_4cfbGB-g#v)5pZqg@|zzk|y zZ$|UGR~1MDJN`SS;FZ|!a4wv7^_Gdo;zTNCMq=@X@NA^7nQPGB>w!GA*6LiEma#wu zgjd51joll|*8A07k;F`#mM(vT99<{V3%#hmX(xoeeb?ZB9&w~KcXl*jQo9B_haVZx zBjo`DJv)SxEsXAkDtQJakzn=mxik*96US&>tfYN8{IxfPOvQd-a-Bu8?a{p`Zmgre zZ*NzVe4!@!24{68t5V~P8=ibKjyo{t2v#%fyx?I&LBO0#W9nNeeujhQ zH~BS*?-3~5x^*QdW*flM4J{l9(&96`xgx}!p8h7F)t$V^-vP)vBm~eQShsod{TsJy z3~zCdpKrFA3$~GkZ`jV;*9j(eW$(G?8xgP7-LZXOApQZTat*3~W2P+mmXg1O#V{4| z9UMufeX1D!&jqr~&^cDaDoP*J+=-QVl!&nx8E2&HW&-0%&ZpgmE<`TZDT)3+kYHo52QCk`OP zmFNVVzwkuDDMe^mjshP>r`EOPp`t?cpg5lLNOXG%)zw#Xm0>TfA6wlSCPT2{cK|Hg zT5XmU_sF4^hWmo3;hkZP;Ly3DpPFlRzP#kg?^!f++Oaq7aR0fZx7KJZ5u%S|?w{Vo zJ-uM!1kkT>8YDPUnKPqAou1J9f9ZGmBYIvS+HutTEAM+U-^6o#>z?Ix+{?WO2ez&% z0i2g-Gn`LMv2+`Ih0#PZ-;?jeKPrr#wRI(TD>SMY2G3{;y04_nNJwvC`by!HZ9&=A zoHqQV2W=>(4fN^DTSbxg+;*x-%PQaQ_vQhuqjXN$y;b&~?Y&i}`_;9OvDJP1czP=} z_!yGRT-AWOWiOT&=>{yk$9#BnL?>L<7WngVK0woY&3bxMjdMv!dNn6;?qy(^mYyVM zcjN27N?4&dOxJyh30NqbDd!~hR!X>l6(L zvu$^h`pG<*QzOTRvca`_)h6kw_2kYdJ%BS)HlRF_(~3hz-5=uMbyw4N08m>P>9&rB z6E@|?5FK%TxI8`?3;+y~b3s(_s9ld}MSXh{j3zoE-X4uc>f09sEP7IX`(cVavA$i; zqepA%+h5ghxW4^(*j4ldc{Z$2XrT0_p8GI+y*IPDSqhU(T9!+J%=<SioZ0-3-2^F!yUqP~0i<+6dJ18U_Y`O@(Q!;9nFqtTh;4T3Yr8~kRD zH|WhAZ?Ky=-XJ#<&Y~WL#lOU~Fga zeP;e?Tk)E0#f!ETZMGFHwiU~4D;}l)d1c|szNj4@lO1p>e~oS*ThkBoSC7m%c$_+{ zo86yuvBxgvCYw<^IJesyZT#L1f$;Jcad;2qcH@^nlzapGf%tbls#qyzVjrN9GArU7 zR=A>Z@^Ic!Kf{b8-lcHOGhz6oZxWDy@6U~e{Onf=UwuV@IpT)Dsp4}69;aKv&ZMG< zQ&HT2WiT$@UY4djxvDl;y`~x~f@`YF&#sCc!_y1Fg#4k$zrz~iMic0c{T?;fT|K-H zD!oey8sphFN%ZL-E`KwUT*HH|EplwMXho=SUGzG+EtOCbNsdzRVH1>jZ*dnMTESCe z(H^1l6N_U@tK<{98Vl?`Ug$SNqW35`(?nJ~zbUC|;46BqB4;TwNF)y>@)b;6&djfZ z6m?Xlv;m}*RyEj&U}CbDEZN5-E3f$||INr?!_g)gVk&JPr8?pi=?;CedD0kqa%vVB&Ws&=qPHo5{lsSPz^JJw2IHHObeFZ^ImR?dfaW z*ZTJi80nDBgj=|aol~lx9GSR%<62YEs}|h)G-}dc570BxQEoAhPx2jz*4op?uXi03 zSf+NkC+*PQ)hI*C!pSM9`!}=&)PZh@vSFv+X_Paf^Ta}Tb`t1LzvBh^ivuMDH(zWgd4 z`dpD8JAdnnZm|=$uHd|m%LJ>d23271_;>c(wBmBJW5PdsqmeZd*8{0ps3Nkf1|9AM zm-g+^*tch9g||KhpXl3Tda^Id@s@5tjXs!p+v$OCFf9dC6}>U@HmV_zHcmVL2nxZ( zRZO1D27BHbYSvD3`Ni;(t}^~3vO|7oOK%+kb|8R2xR?abnUBi(B8Dk1(b~O|LK3oa ziuwF0bcVlUjmTrN9Lmq&|I`}i8bmPOE&oU_HP(Y@Xzb-x zv6HHtDGb7m(aM_gRZ$+Ano=Atf3`OHN=>lpWAR%?_UV+GQdG+aBl{fYTouQj*@--r z2=Be`a_%dx3ocq&+pr$4xw5KoW7Mfh{-`$jbF)RV0%pg3B*PyYP8t$j4U6azYB;?l z`jo_&9@PyKhDRUK!=s6xLf`6!lS+dPr;F0J=Z^2J{)I*O1Dq)sHtGz4hOZ3uN2N$^#}k6*e2F>5S{LjpCn%pWr^hDRNG$Dt{#yc}t#8 z$rSq_by8k<+S+jId)@4`+aF75cc1Ojqp$}n14P)_Q@r|62D7DCm2)CPgHHGo;)Naj zcAi!go>o&8&u`2lXYAd`wC6L$9r~6Uo(~Si+hLKnP++2y-$-xHPDh+WBF@m-tzJ{%i@~ySKtEh*EcnO8HFq!&e^nu zQ5a7Cia`f5ZI#|?avI<3Ys%^W6=wXk1Q)dyJ|De9C`FP(BgwrCVhz7w5V4K0BpC7y zBsc+8lI??zgM43JReRyj4Z1Rv*5Ttav4XOV>19O7-%5zj<^SeS*ZJPM1JF->s`;L| z&!=Z6`KkUBtP^Tu{K3Iv88or*%6Hi{UF}Wu6i9Bs-~z5oZif2(xpU#@29aBsCSe;X9B1 zHO?F^er;xc>0J56!w+C`#`;v&jXNd~Oe~;qO?*{hEdtYaK*U}SF72LZiB23h_R2wF zG2#H%n)-%=_qGP-=BwMO+GaVBEL+0Q?T67y|byMw2%~vt||qAJ&SrJ0qBor()7eOnP+qMRI~UUg@i` zA-M>vGMhf!D?d}^5BAG*)UWGnlrQzlM^!%PmyZS$0h>N9xg!4l{?P-p3RG-ey?-#F z8|Oqmw`thx)HF5z5pfdNl(8hbKe$fa+FBA!d_cbVns*JpQ{(Ru^Jmi}ES%-r;}it! zXeq-d{Vl=2ZN3efm}6z4>wh<2jICnG>ONk@TZP#CH`26D#pum^+ z1#fN{VrFxigiv!aH7@^%U|04rm)z)odm9cwI($NnPfVxryBpubsXAxyrjH{Z!o^s? z2~-51*~<89 z7)Ob)v&i(cJff&e-6?ngV?n8o4!@f5c6E9JnL@#5CiaTEqcH2ox3no`-`+~*rKKOs z^2f>EiETwVwcr2fC_Hs^@nfR{Z3X*0iacs?dGcY^vf@r;fkELmT?=I4Tv>?MDBhR) zCR*m4l+TF$&<(sK>$p~T$;lE~duR!K!{PD5m4&?u);%(sLZ*NWNyabc%$C!Ef`^GW z08>W~qe4tMmlG37{o>oqLB<{hcw>$>H^v$_F$Thm8NF|-{yZ*5_l+Lz^nKTz|Dvt< z5>s*hJF0ng$jSewvh^yMWa|E=Z|oJsY=I916N>~ZKK^n0HBVnDUStf}`zooyjbCvo zs$dT#^G`x|)$pSfY%BQsVK0)XF^Y1ZScGeSCMV~#%piNbj z<*JLxImW&F0V8G}l`MGFxX8j9NNH^a&r?GQfV0?i2OI4g{2F~^-0}ZS%`?23KVj(G znh(y_9QJB9Hlu9?mv*iB#xH-M=9LToi#C6DlWntn@Y$LlTGE?67_>x8iS@4Ux8$#* z19#^(_3$66@U;J?!fU(=B_G%d$5J8GK8iQUsji&r>T;`l{)-=I-v>9?_6`3}eY%IK zZZ>v%>d$reQ`O|*M>z$r|7Emp_!suAOBOsw_@KL~Gr7XZJoe^FtT^89F;a>UK`XK% zXoWRb^dsu~T~8M6_R`YZ#``t!X&+hlM?fawhthqS*4d8*Af?Pj$$T{%*$V z32$+!%YWt38hE1F!A&nBAfgV5@(Xtso7q>v1Ub7O@4mRD>^dFKFt^`I5^CD2X)i5? z`N>9Yh`EE}2Ck9}-tQiAAkx1-N78yV-IjPul4vA`?=YS zWX}m!maRwrnYMz{v#k%&tZD0Oo&0sR$^7A}tRHL7|6IcJHC)0<;)Bhva8Ic43uSlE zT(WYQx|7{h*WFT_T&Kc4oITlvG=Z8}Ju~xM?x3$|-BB3d(LFY4JT_h^c%2Eu&1<}? z$fDPH6YmokU&o)=;ql*=LQpxjCR7yLj}h|H=d7o9gw1A0?gp!~wDCp%j+S+dM|b09 z9WG;kS{+EA$hch&%s{$;v5lWFLfY)h|4N&mOtCxC zS5Q^XZk+vGaOv83d!ISdD8Kih>1Cr)&h96f*QM@WPfC<)iEr;SM~7+6Hlq~TrP9so z$Cn38{(ocIg|`UhA3**_9}DH##D`4(yT9*aR9{$6oK)<_eoH~wwT6?ITgS065=xc0y#<@oUfMsP|X02(EI4EtZ2z18pyexjfL;`F&;kf0K@8S4eZ-e8BSRs`# z4&4`jBQ&2hHbQn3Cm&NnF0u=Yi3q10Wy(Q$CGVYS|Lx(M0FuFXb!U9L>{l0qWN^ge z!|V9foHm-jn&fL}#?g;M_28lw?O?SPEL;&u@gTGwf($M~lv zHFBBE7{TmNFp~^#(Fr!3%aqQ+hNI)o*w{B~QUy!EA`D>!%PBbR{?P&F=qmjke=L8s zRdEW&*w9707A`T^wlLPO{+M#p*3{rLq4m82_l1A;r4y~KNr-lqeaa~!XCPapGhgs7 z#j1E2ccHkZ1i+tFIdWAWJ*#2nkl5sgStYSkwBc%)G(0wuz(oy{N@M8z7PgSzcN}N`hEeAU2|a8Rw<^1$LPz7I{0IV{ZV!KSFuLc;c1a+&(^e^ zP^?@vt(yu?Nkw{Yito&ej;TqVSyGccvnal^Tl9cb?am1IRA^2(@8xi6QbjmfF@`0y zB&^ed@-?x{NvW!yEj7tdaZOvONYLb^aArh@Ml!15&$*nMl&#hEjf;j)3Yo((!+LdD zTBFTuIr$v}xiuI@2@1cZ-fxM1-6KAP*9wAflSARMwFc0C4I}ff{|bgyh#$n`{tg(} zv6wcLtqm;;fc1Zk$Fv`S5h(ocVeG$q7%eT`|9co4KiCaD)|ajQuN!i!2VfKmI!laF z5yR_9DM9dWjUAS8=0?Y5`(3wzO+7Zx`))@b>G~KMJR;f|&NI8uqj3(t7S64Ho-$ft zpipVZ90+9dTw(HXlL-GB*!+pD)gcMwjIC_9=F&le0pHodDIfWQNi^@DVC9qpz>bP8 zgzO4H1qGl&08ZTv03(ZZ?u;LTAy{s||2r54kG1dp?+y8n)1wgpA@;1^S=5CeiX}>o z-Q9iqUGc+J@H%|zLh&k{e@NAI(YDvO;opLF2V=L;w%0?vR1PB?6n3~7k2*ZQqA;91 zaXWFbPmomx!)7C?rWX7sI^iKzPDKgwXnw{!zz^s#ajebh<&Bj?PLf3+Z#wdfI{e(ApxrX`I}@VlG0 z67E*Cw<==uSA!?5K=%uXz} zSNdNv zX?T=Pw5|Fiujz2*VXt zMv%ju*V!{k^S@JrpFA5>bbws!22{#VA!mR_>U*=gj_(q$sw*BoYuj z0i|NS#TF}8Y(rby#A}WOJkf*3J6@`^Sf#&uK|K*{6%tPpvb#MPv|6mzVlUQeFSOo5 z)EYnth+4#IL0gN~w)+@up;iRE@P58)_CDw25cvJy_xV5Xd7fnNJ+o$J&6+i9*37I~ zqwl0wm7TkVoHOMQQh1K88x@w?eI@4RA9$p1- z_RsGrMSWh}q9~4hU5a8HP1UXm!o<`woT2d{cE_Gp7!EKW=S8v zlDqLp=_6TA<_{C?vU@<;wUV79{ar+;A1o(n_6mag&!_VHyUc_dwa2NM{e6f!F87!l zoBuX%x(vvBx!%9x0DsE(dcUd4|LWL!{~P0itI)OM>5o`Q7+p^PY(JQO4yr3u(ey`k zsWWCB%I6F2vobZ2z$#er2?7ZB^oZ5J(02qM3kB5jQ8Tql?azyeoXm*tI?#(kQ1-*p zA5&aASjFs!HH!lsN}B$-Dm6aV{u~$(biNC!OYIkL`FIg|5;nuK8nHKzWNgyXmJdpl zN$YnkE7|K1LaDLV^As}AH_06qom7(7GX3 zzq+qB$N!{AxD<7yID{0iGWGkP3mype|G>Zpv)ow&@zA?BM@Sxc&K@@7ZQbhPJaM7ehvz;_K^}wnGx%O zX!*bq=6Qf-jVJJW0@EK?JAt%`tKwf> zip{TuDP|H$-g`h;U{G{16(A_q-b909!<5R6f3W(U z1k)3s&*zb<1Uy2(B-ynd?7n~D0HDua1OSRF(Giys2<%yU&}p*ovVEfQD>LFoO2eU0 zthEQ|So<#>ayJ8*{(!~42MEQbDrntgS&SIT!zj{e#f^B5Z`Ds@)Qtq`y-d|8b=7$N zFCqLiB5C|mqV^^Vo?A(jcrH7SsIdJ<>_r@`>j-?M((vIZtQ<*pOO&jU*z^a=@Fjw% zOH)+Vf313TVx&sA<4PBO4iDpw<1HF~L&z-=FFd7x(C3%0A|{8ttPL40%f#9y;YJ|b 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 z zb?GVngn-||R@L&WEDNPg)Mm?Cm9~0sV@kWjrz-{00%_W@z(nH|_NCUj!|0-VWx*4J zmFba?%p;Vyha{Ijyu*CDL{7fF470j5#Esh7kZU-9OvT&OogPkU^KlyXWw1%FqUCBE zoxCq2f7m9(dOvGNQj1pY5@78CjMzBf#^oMiD20|%_s9Ks0`K2H_q{n~HGCs7$hfQY z3q*;VVPEh+;a7N?X1|>O=QpEk%{J4w;wB2sp*renmYD3D^uXK9BngIm&g{T1JYoQ_ z&AvbCUfeRtNDuc75ofv8?CBJ+d7mS;HWc6I`NamSP(e!Xh#< zozd5bj1koHrOONIF_dMNGxy!^@^eMuwb$PEMA$kyQAK87HvP?xyIaV-&0J?J24WAp z*>Ttgg!Q_#pik@wZ7qsa^cix4J57MY4bViOuBhQ}p-ciMxv!NBioX)EXwK8xn~*2O zm_*&CBjZg+(n5TCPr?pY5gY${qGe5fqT7o(dkw)cF&DQK5`MUdn@QHPCAzvY72l8; z@kY%*EO%6#ICI{djc+oMV)b`X?wpP9+Vdan`F(p9SIs`3?wytv!2QVc$iHb2i?^_vGGlHon9+%+HJF zY=E>sUVeTcHCtndsUa)zxLhppR zZ`wS0LL~X}&69^ml26?{d51`HV)JB)H(}lTZl2r*ro!ayHcx&tlKlOU&9J89a$)XI zIwvQO50hT&oD{3S){jsK@dOazXboFLn9hq)AG36HH>v6J?gf1Fl=PXWq}85;T0IG^ z^d$6>C!rTS3H{ZR(9@oT9`PhJ-;>Zio`inmN$4g|me&VjN%nlDZBgjf>m?IYFS|45 zin3bV2NJUV7TX{@!s=ZK?5I(TJA%~*se8+uF07-%tV^i#_YQ(=Kb`j@i&i zKUw})>RRq^a^`!OO zog#&)1!2TY=cI3&F#CBeR3>l_RoOVEjF=2Q>h-;f^Moh8`^^kuHOeA5XCS~b{@3nh z58Su@l~k}5%~eJft=Q#W;mQbWQfB!3`5c<}@ym--uVP4v+jg35Zw~$c$UFDIIE$+P zCvAa5E}L*o0Wp;*iJ&Bknn00ko5HiOp)H_Ps9IhStDsa!pdyx(B+zvmC|VJTWUBkHp%8`9hR`S#R{*An?FBTU#)gWKs2fI)EO@$#rt2Beee7U zpdD;ah;`^XZkw?5>LFe1H4JHq6V)Q`a?23W!qr)j1V*SEF^6Q|oF)K^N0-n#0NJue zu+?;TI!iP`8u?$bF5lu`bpUBW(4^Z@Y1g6l`YEgofzyy?fu@p+pp1-lA97&*39wyu z4dofD>@$_(*4xOTk`K5vf?}4pe2TI>;I;21)nD)i28!}Xsc;Evh3nWUs*CnQKW%z( zcPd>)mNel+U8grDyH0Gheol?9O`mv7YVmr;~gk{1`aoR#%ow= zm!C4vd!VJv|HicaqW8E#F3xg1^&J-f`(HIdWkU?2+O=-^`h2i|z|Nn5EC<{A zNelPp7Q<_es^J(-MswFCu?fv#95G~m(uyJT12i!*lgx{>et0AKx(j9gx-wsw%k1WV z>9}?Iz}yLRdG@?}5AUvD%Ld(Wrt>&Zz4RBLF*B>b+6xzv-fg_AIRN+Fjxc`?M)-tc ziz#Vxz2>j7J0M$M;xvc$D=Uj)9m0^8hA&jR1+ociRZqt6p+2+MZCNZ>uT5W8NrXCs zZ)3|Px;Ko$9We9GkFTx~@USjncbx>h#ir;{rCe}p{oFR;qodY=5+ znp8WyIu*Vs|NhDk;(0xr7v!8Lw46HEqC=dVQ?{!5UGy6TxzxB2L{@=bkf`hHyh}bEnMb6 zUM&>ak7faB56Bx{6hEUE4 znhlH5pRoBVNTj*q*Q#qKKDc(|(f4{~{n4QLSv(ql+-PcEHk~o^GB6F6 zt?$>Pc=|3Lup(j|xAWkCoDXb&p>7`D-h~0IR+erT^W19{B z55Y;p6K8@m){r< zoAEckWv`e#it*jTUAT?@^OiQXCO-c=)YV<6!hx?*;nsWUmXDj{RAHizDg1LQ{0(m6 zL(ezXOWiT%pU;{ayIFq5cX9+YPoGW<@fv>?Eza6GFVN9s_wQuW0R8p7p4eY{GE4J& zU-A{P8r8tI9~DU=En6L0eLXF^o3(hD_3A1j{nVQ`vA6|d)L7xbBZJM5%u!46bn(11 z;X?Qb^T4Fk$=4Xmw2;#Z+9Wge>?*{rRQu&D0-e=o5Kh=dCm6>(8ambL?6JmckkP!LQ>1O0v_c{8i z@Z=-|ev&_(d7Rv%lXO1bWa||+L5{9$Ep_@Oky)}IC1>+QO|0|mt6c!g)G$G?7wV(iAFATOWIAYLdPBKxv}SvLpVm2cg(E1<;-=>@NJnUtE=mP zS}M@Aa>o5k?ai2Df0LUHyWR8wzg-#Ox3P=@SykpmfNy>{d`5m@b@hVmJ>-&b$qy1^8Pj^v%yvir7zRX!>(a`_l zSTcJY{9_x7hPj&*-24Q2l((RT?>7M)KDzPD-IU)L8@18dq!zKcN_$F zGKc=Egc&fJrAxp}&aLLCiHpVY|11><7nlgIHedQz;saT1DtikBKUrQIuGDO!;t5e2+4UQ*opo}B!5s2m6? znGwCiie{m&uw}JAOuvoi-b@$hnd1xhlL@Bh+C*w!^^czGy;K=Qb^a;$J>KZ0h9FewL(3nB z_4D4x@gCF{pO8o~hqLo7yq&eUJ<=sGjQ zJrZ|F=K1fVN1c0+P5#Q7s@=Hzkd`Ao6S)#3Q$5D`XBKlrOx$%;@Q zeNW4Q{v+-UXG>4(9p+C{j5Ip;7=6&3^GM5)6%Z3a#$SB5@Cac?ROqMp>NFlE)P>;V zOsFsYH4tLlzY+M*nE#hsX64Gue5^8$G6{zK42+g6tVsD~=YYyy%DsP1-r0C;ze6rR z76~4@?8x+VJtNwFL3Z!lVOMcq?m%D8UP`Ct^4;&aq!{0MyPoyu#+l6*-1pme!wP&> z^Dp;)FK!t8SlRd4=rGP<&c5INY;h5B{Z9W?%My}1OKt}@7c}}08CcqWr=fb;5$W~- z&jX`)0xvxmeEc)0&-y2VV>&%cpMJm^u}6%FT$ao(@PIeU?$aU(*M&PC`uQZurVaky zchPg{Q_B1^o(%f;6!#Ep^8FV1e4kqmT(PfNu|TzFmg@F{0H0fi1zj2@d>4_K`8*vF zCVceb;-XA*B;lrKNHCXXcw{*J8`v8GeNHv{lzZt>;z-T|P*=#53&~WQCDR^4E!&+r zc@p4Pg-32D^!hUH;*eg<%;oi;Bzm0}&`X-9^$R$-YOQwm)9WS}5$(Fi1EO7R52qu7 zPJwVL&_n_M^?U4cpl)ZNXnpC!B*RM>Mw#V&6n~6T=d^ye|AxRHK1!?*>pTETW%Mtk z->9Kb`1nXd9Y#XNu6_yHxRg~B3&;qIobWUW@1aOkzB(U5s4wBZsQ6|+J1p-V`?DmP z;H9UF$+Grku)enfu?gOq&f*h!WhHcxJkiU88S{09=gp(8O#kxh?1=PPZ&~JkrD$uJwN&q*% zb>1p^l(-RF2gvqMFrTR^P+MHJU17DU6y44E&cUk{hwKdA;RWDrI2(9J?GzqMLpz68 z2)~;I@9E!%^Sl2re&Ypi=1$@LyYVX)ypcPF_wT0PAI<{a+S_*4-uhk9@3%1OU~W1` z@aF6ko~CO%?cd)NfLAVf$wBb)?V+D&*f8~IpE|CnrO6GKr#_20qygoZ5s49+L$_GY z-P50`WGFEKOr2gbFpg9GSbxqMDw01D`{8;3WsMbWqIAYe_wUg34`$`1&5an*=aQQ_ z-osq7(?2gKUnB7122aan*fTkJUjbg`GK8{?hhVg3KS#e%6|s&V41qAm4T*JLD2>^$jH4}iNRO&a#VgZS$&yH!-P3M+8g|1BvP9bP3b#(= z^k&w+c=0IUq^_PzNiY3fiF_}8t^H_~;@7H92FyFu;#Vl7UFvzXDo=AkOnMsD2l*CS zK8}m}fF9C&uo5{LD>>Hjc8KpTXw&L<-fQ<{&M9{4$7Y=+RgrS_FvUD>{Hi2nX_4S$ns}k3%mtk z!|%sMzb~FXm%8m;@Ks9# zu6x9Nt{}C-zc5JcWbK0OhnYX}(Z7ZmS8uT)XbqoW4QSJ|I)k2M`88D6vY;q-4&%d$|9xV7!mwYj?r^7ZOQ^ z7HBKVBPt&X(QeHdo>fH2V3@x4=h)obQzRWu=#MnSv&?F>DM21cHbqk z%b;4UL+k!p5Pv-Q@>#x=`Je1Fldw}-09#dzPl1FD^X47L=JIX0a71=7F|<603_|%03tae_w5ZZ_O9o>wAN;E@!P0wdq_#=D=E}% zh7Z@nhq|rQFQD57##M?Xd*O=+!OoxMe{+L)IZwXNQ6^^;WS+AEoKI^c4P(iAl(KTFDxKR#MjKY94la4nIw{uit|Ydm zic$xk3sO7(K#|M~eDW_>gCfd+)4iheRIQRX6$oGIAg+$+)Q=!M9?Ci&DdFeHj|QBeRlM15q)+pm1NHcDWs3atJ0Z21D|iAz_b11{2O!ne`@k6 zJDhov znaFw_E--n9M@n=HjT_T$Y__*cMj6Q<`xUW+D=b)0UwcbqVByRQJIhh}Z}AL;$L zJz77`(QWB7OGJ*|hNaL1t9=+JlfTz%curB!T6A?$&_}yDSKyx5DS^t=z*Dq7W>G1| z7eV}YIO|$>ip{z{!x6y|nBl^HP=QI1LL=rjO8c+QWj^=gkbaT**7baKZ_K zL-o;M`=Iw^;BWtFU>XJd7VuZ0{MRf0!{m>~V+QkY*^3jarf5NKDwg9^Et`B6Tw0C} z7=Bs-1R4eKn^^=DmLPu{&Db-2aS7h(VGZkB@6o#3)Fl6=s99%!J~8lofMg+!{P!ycNfCwY~{IuJXn%nhU)`@ z6w0dmFZ>H!)=$|0X~e`4Kg2lU5A;hABb_=dNUO3z6XFBQkTBO?PO8bu%rKsE^bD#i zgnjQxRJVN&t-y3LJi;&k8T21Gk=l->wq4MFwelQj z82vr^|6W=9e`Hf{)O~kHwKv1)&wUlvg7qMn8(!5zmoq|TlWulN&mBz z=LYip1N^V77r3nd1@!N2qPp#P2BY+k#Mf&K+)|}c;kD1VNvsn_c16h}>|fUxtfK3t`N5iuX86c}H> zYXoElXLnA0eYTS2$KyhK?9JBR#BoKf3*zZ1CHQEDb#83^ed4&{*5AaL1EHvgH7siV zX}+m2%Sp`w8B3DK!=B| z;2hef^k*x%>7wO>>9b1W4XZ(Wb?ZICt2@q#-|>b;r1Z4@*2D(prM}GV-(dD*F#Zcw zGhNjzn2r7R{hYm#wZ~`l7`hL%Gz;A$19X=cK(|3~T7ct-9%!t6n$oA0a3e>{ZcP|% zJGasKqcG_^kIimnRyP!`YILmYoz+Qv!iSXA->#*f)JeQ2$ux zU3$dn!^X)Ve#XCn3-p+s`=93`LOEMF;q-L($aW&%3m@;c7Z#04pHvxVrLf~*6tmq-Q_e&GlhDiG_6-$w`zs$6 zWWEgaF9`cjt)6eK-{LR5oFxbQ{Nt=WV2Ej#TzijOqtH$7b}Ef_0DUb;v@j-j;Lh1W z(y`=AFpX)(_Z~ySZ7!0RfMv0amh*D>hW@GIMMMR(N8z}h7oM{eIBg6cPk}bmS6yWA{c<01P{h=4?!N4#ZZoeu>aCu zuf%asQ@45y;in9;%ax^?L*OIYtLrKVWtX=2p&`-&3{nU+>BJ+dEQu}-b;_OFD5O^U}fcU~cX zQk=^I{42WDmdw!GBW2as*(@dvq%J`WDV-`G~62q z3qCaZ1DBe>Xw39bTv5#v6zV)qq0YqXa&DCWIdTXfagn@gkr_ecNhFQaE~g1}SO0hY zPwq|d=C9-PX8_=lc0LjOlz9%m&)m595P%Hrj-2yx~oP4WAFkQ@{_g4(-?%PfTOijd6vGhpJl*hWj)(l*c-? zC*@9fR%>d6@ZZW4YkG=HPNc80-a*(|9J0drA>|y)qgGcdWt^UfzeY9^vaQWM+E|+O z6Rp;3Ni%bI!B0AW-#;pCM1L#fk6`>3;-_Ba-~MgOf3Gn_N7XE_^-{B|G~T_`%&Ini zeXm6-qriZj9wnL{`)AYwv9 z%M;n!rj2&d^6VeVaOMfIvBCOQdv9arh~stkNt-I=tfK)dD z2JeR)bRHu$&QOi=a%$hR-F@2AGTez#cg~?=X(H<{cZkd|)*t!Lu~#POWFlx)_t{I- zQyctWz%s$c=ko3$_OaK$={70L))86_*x;|AQ+3W+|HT~Y5QL@&=PGI`9vejp{i{Rl z#^r~-v@LNv%LQ@b_C>2Z+2vnGoY(B{IZeE%|7O1ekYWwGfhGO>>?WI#es!z+uaA(Q zcq(Ei+hzq+A4*$o6o%pcgU=si)GRQ)A&RjvlvDJZQ};Kg9`W1nrX6;2BnQ*j8GFkN zjaB}tm1Y-!PORgre3OZDpQX72jz3G9-Qrxkn+kI2&=&uIm&`Qjs3S=iFxpke{%x2W zI$y%Q-Q?aX-P?D0OCTbHtR2B?khe8>4Kkl^MVo`X6Wm*n^jAqk#eAq-UFbxKJ7n=M603Huh30JdJgK$rniqitHW6K2K*J0vx zmuTg`7bafl60LY!n0O|M&8f|93DLiU)nxV7M$0;s;dG-LPADzW#hqKZ#T{J<^Si@> zdiVq-lbkdao3R_+6A$JXSBSb7Ry8)I7B{C}N~E5~oM1F3Q*Pk(b22lWW6*T|pqCwx z98c*$FG1k6zgC=juKiuYKM>utm9C|&ANh+0$*1AZF=b=8YhiI}Q9L!^or}2G;$J`C zK34Ftf{#j?=8`H&s^pzi{{oWY>E`P6r>pB8Of791vAK@@;LX)_W2zJBVO6w#ZqWM9 z)6pz=N$r?fhpMwVo$^_}PGoC2EQvDf0b@H-Q`!6(ueo_iJ>}VVGyG_+d)`cz?n40` zu5g-B?xi6YJM=J-9C`fTv}5oeowc9C+`w7(5y6QAhbwCY$sqWbQ$TGU(kC&M@sH(K zBmSco1*h#y$eY_m0Ja&xTLf@p1YnIYxG&I8k?i9wJKdh2ed|?N@ZY4Vf&HlrIcSmc z<&^gyR&Gu2Lj9+3RT#HH z>KRoPyufziNq_yH#h_y@_#qrLQ=Dsq5-@G~^9eNl-^XnkEdT;Rp;kF?Mh|Hf;G zUPzx>?+;YHCy2@To_*TjfM+fvLx5jyy&=0;qmXZBOFg9dKBwM3=)Y}LYyCG1g_=O$ zVhB}Xn?hG3HjbBI5hc5Hl9|4Vc-#1V1xgg8TroKL3$B#?3|`^djsurV$ehK<$k}gs z{;KI~or(MirVJL>y~)%gGQMTQ`hSA4B-M%c$2xhDy>JXnasRg;5`$>{SD!y$D*e(q zmm*4Rw8YXqByzcDl9Z`R>1-__rE5&Fx45IKjlBBPSAw~*#u-18U{Qj%fMB0^AfQ=g zj=4_>u7hG9QU`7DkGMMA@b*rPr6d%MEZ5ZDeDS(Y)%nfD&Oc{g?b8JRjn1&p5?2T> zl>ZEgD(RW~?K+z1xm#G96*+j1tS>$M#U5zxZ}rfQ%q@y_)G>SDl-We;-DGNBm8Jl7 z2+qxQ8=F&`lIeL>6*PdOe)=yzC7pb`$lv!TDC!%%;~#@Kv1`~HR^%Q3J}Qh|{bN0& z3vr|^F6*X-qLUX7Tkn3G-h^^RMFs+u>rZ@dtmx#_us4m)Z>a{HcMbP@u~E8Cyg1Rm zxFmTTr<}z)KB4|A*HQYqj2akTO|s?aLG6os|RiYeTGjd%Q!)D*ksI+bhRJSKL{ zeNw9JoA)2SynP`NOq=)jhCjemgrnV;*oI%P__0&K^5n$<{vdMc?U_#?x5N4>yLShg z8tQ(7jG29-d8mCS+2n-N{L4%;J8964`Lv}AZlbL4-~1zjF|}CCcRYfHw6bKw8m7vf zFLG=^=ek(OeRPC4yYsz#_uAhnj&<&*CuWZ7Ixk(}HLQwto zBFeWNRc%V)Ps}_ye2{<6Ql{u3^8xDNbERI;%%40$N~4LF?mPMC^z!rH)H2sho83Bg zE+d=2?JAC|c)&kH69}xDU?1q)ALLUXpOiMiWnZJThb>K_FV-=B&j_k;u9te&>pH%h zY`ONSDAK?E{u2LsE4mLwTQd&gb!64-BOZ0zlOkqRykdH} z;^TzSaRHK^OB<=QBS>q)o}7NK)J$O|6;@S~hF z8KKByO6w*qb2(gQ_C`0Oq==1tIHL8G`4l~)!K>k{CQfFcyZeXL+*rrMWR(!Rk?;Cr z^h^?uv00Q^1bK|V;oD@F%arUoW}PzPTt=7g@B2R-j`@!_V+M&fia!D?%Z(wBUc(!) ztLLZ=0OPbwB0pod^?D5pFF72?MLDtW-lh$l*svQg&cKg>>TmQKMwP{`VkQI_1Ssd@ zRqA1!*Wkylen_m0c2o^*ssVGH1B8MWg7MTuY8}T=5A{eZA#)NBsc=(kn0Z|&x5*h* zlO!b@GuQIrlCFzCTlGGT^M1atzSuSl z08Rayt?3sdb%!CCyL)q4n2<(kB(#X z#oC_&VzPm`LhKs5zM9cu^{1%cOv=3d>&p%=%s=0lYWy?g@jU+d8M*yy?U35+h`LT` zms{GNIbEgYoIik}YwZQ((HJ?MY#Ea$s6EEIQ*aOw>7l-fD#EO`<6)}Elo@7QBh*tN zFY>G2$(IQ4z8{1#(=2$lLj{p0$GlU*uS4cpzH2(Vku27MM)ehNx-_Qgv6H)+YUw!; z^cEWgcWz@+$9~AmGMN+Nlc|kjDDTwN$iDRMU0$#eWJRBWD+Mi%jqiWIgRmV{JJAp&+e+s;v;LjIn zFSqKHqUAwwzE&l3@-Ct`1}dRQH+kzGpuFF>Jfz3Vd_W{Vc139NJnjQaP z>#$cd3YM3!C=-3twL0|RAVPw~34P2oB|F&?f_Q8$^H2DVn^^S;9A(sJEK0Js+Ir4e zrsCB~|Gc#z%wpSp;N$NRl)E)jj_qIOL!`%}<&Fxg5mD`>FJlhbQZ?28+HA}u z1a&ff62>b_ptPm7>tr}|p||3Bui?z<)+tEf8=V!f2|s%eYcD;C*oi&1Ar6`Cyci4( zgkhWT>1sOO#@@Kh(QmVNi34RbKcn(p81~iggW4}#0<~Y+yvuGGI86PojN7dL;?!4= zQJzr7>y@z=CXICLU3_pl)utQjl@Hyk@ww23w!*GhvkEQVT3$^sB-7`qk6WY`5K=lL z2&c_+TJ%A@E$Zid!m!8p-|Tx!Z65iNMEl5hi!b{mRxWFS@5VYF16_P3+r4y&*YM6| zI8+&%{=t@8vf(K@*p3*=JjIY!PWej26zul|RSn^Z&lv3G@$|5FBN7LbwD{5+;`flZ zsQ*xX#4;|9WJsd7uD%#6KwxdnBZDH^y!qtx{+mPAbDZ{}r&UAiotX>FGIh)(LKQRI z#Db$BDZ?-GaUsb@RERN2(|pJRIpi*E#H13wa1`&Z3I4^;%hDi)jkT%8xX&1ksr6`T zNu<~e&BpH%`c}$2cQYb3o_bxBXJ9=e*b|s)XlC|`<#HMwW!{u}M-B#AF#Rk^%(VHO zCZRo#8m%s?TZe>#Z{Lb_%q5f8F!Iey*Co>|EFSgOFrehS_ZBn5(#wf#YYMG6JTp zvB^}wXjV#NmDf5m7@#Vf4w;K268rAcR*pI_(K2K)mHsVcLtHG{@V<|@EstnXE;t7qaA`@vu}e@!vbc1 zA)vx8i+yi#W;9uy0%|?P6p%8Vbs0M7V1{}qc*367$44H^hfoZJ$Z`bnS!YI0q@BKY zhWbYig~$En^8qOYQ;17f>%hV66lo-j|L3Vv@b3KNF4Q|G4S9>XHt_BKgVKxFA2u36PI%j@-tFuhL* zjZ3U}>Ey0M*I8q*tZFXRC3-qlH`cM*p;;lGlM%u?O6%~9j%^P7GqOgS8{T$TEeY*Y z?im%|WPpBDNbsfJuja{3uf$Gy)2mtD z@s%Rs@a10n^P9OitIQ=Zn@3npXzv{s$*_>kKFkC%r-5O(o+k8u7U(k3koUUPU|-3z zrnVC+V9_$3{e8b0A!Me}CSZ-mdGqfQ#*UM|s@Bs@w^*92Wp(qJN|odhlWloG13K1m zkrJ_A#uddnJ}$m8lf?892zWxkysg|iGgK=IQ&~a4TwXMxvttEcS>T5Y#7kN$S-y4o9X>NFpySJ#IIejWcFO)-dCFK+81O2Vc zBjBx-rUEkTZ;a~O=7U0g3!%F21%e~a+ZUjlC(xka{x^}*`aVL+a>}~gi^(lUXe3vT zIWw%Y1ypK4k;blhLton=1yY;;9!p{4Vx4PwY~kcwpLqG~U7_gt#to-ErXtWlkr1PILsBKVI#uyEVA zd?h@R^JsF2g%7$I5qfey<@U>#X7^WiwE7DuoE;MxuIfbv)1Pz(F6<5d@zxoRSK@a| z%!J)-pAQQ@kAw0FmW*20WFF!%B9ZHQg2TyLcEhLKXuj4v)Y>9qMpz||#8bI=-y8X) zxR>)4#TbU>9|3y~mM*6qfOL81%Ypk=Cs5k_$>M#p`>)r$( z`5irk9|HKyh{q`MSCUU6vzj!Mot1j9FgXw_Gx$?&{=TqsvP^P5|RZ)DXMfM>@ z16UaGvn-Vbb6|3Rt`xXa=J(i#m5J0>(L)khL4c2;v^RPv(%R8f=lCeEwNIaiVpP_E z-vX}Ou_5t0s4Ul=_#?D{^`E1~ zFUTruYZ^xoXRefn2<;!gpOL9r7Lv+I&)R>G&{^6Xs*!GMlUag2!6fBgUC*NZ7jr?g zdlUZ#Gw^tYN3T6MWMCKHmp32aF62b&u|(<#i`06|zbz?~&(Zn?RfTnQ_Nhu+86iY0vS+;wqMn$LYC z+3-m0s!J*9dT#sP)^iGNtoL94@-X}tJkcl6A=WX?Fz|8du*6=o#ExEXBIBjE40jo+ z_T;Yp_wj$;#l)uJzF4Qu!%Cz+S+_Bf`iM=>`#*%0djqv}7Xysjg4TsB=6K6`nVH{y z|E6KP#b155sIG6i@27fqMvcS|nD5xHmYqAQs!lnPuA^%bN@NDII zm%IEhWHJB7a}ZbUu6&3b<<{&a{{Io#2;UI$hN}M+a@&E|R$nClA1pt!1;vl#@*k`G z@3#>Oe!xwUuK+Rl7}QXr5^e!6&ptHx@xkz)nndnkbnS2-FcSh7x!6%Pmx4(`Mx`)p zx$8w9{6pu6+)jF}&=*MW-3*5*RIlS*QWB}{w#KXZt^ZXx3(oMr$S*E(|8sh0(mi`2 z3&M;Mj&?6u80*|fISbj-(vAef+l-U&(%!?EpDV3*o~mYhx;Se8HUZvX5pK2qrL#18 zTJ~p3Q>$2;^X)y>xeqvyi|cs)Mt*&HnBPRh_7)C-UgO`BP~ryv%mo?{8UHpu_D63P zI&4pM>1dFmOEo8UUHbhm1Xlv(Z_|*y8K3`CvgPtd`g_@XkVg|K+8>EujeP$D-yM%L z@y1E|m=Z}$*5dc%N0P@ObK2LcU;=_7^Q7Gd#;YLu8Jqrl$+}SRM zpO7$_+isS}EUXqki9(-$PhwH){{7RiZy}eDS65|~tp1<;Ly_-11*w}Z)cj3uIekY2 z`2KUs-+FI+{!d8BwJd`ApGy%dIN4OaUoV8mfS75C4gOTCuZ8=~Y?86%X#@9C|7~H3 zAV4YGK@q?c0qno>IRL(eBIW#Z!xNdMb8B@zRW>i-Y)3D%+3Kx!-IeD0%4Bh5Z}@*& zWZz~sr`9mNwV1~({^!3hR9Y?;XD$D(QKeH89xe0LTF&*_t{XH=O#CqGGL&E;Fo?fS zm-zM5;AP(D(s+Eges%D!k(W%>XFsKCT}aVLnFImM;C_liO+TkZ`fnml-@-I5(D%Xq zFvXEDjw-ogqbapeK2_E*S(lSEpW^SKg>BP=#QAjLw~!+I2M zYcmob#AMbjd<7P9^mJ9tkJi>h@_bv#zjPb0QR&<_5%t%#ubr%*b>lPmX({xGD--Fh<6TZKx!VqxTSi=aupWX;e%FtkKK>$!e%~~T2kN{- z3AcSqLS}dWm-=o0l+lDk`eGd~ORfmmGZJ!Bo0QEd>a_?f|1$E2w!-Q_dJVl*zys;^ z8FqTbQ@x|QhP@-io7mfR9S1NOUTQ5XE!;xx$Jzm`YK{{S24aupW|+?B0U@e1k$~r( zQhV#sTWT4bE^^;Ey(jh9h=pDkbeeHS72^o+Mdo!faz06i!4d~x3t@9^4QWHBYO$VC zU%cWk#kneMmVk|xE#Q{USwP_oX}i99mH*l;HU>J(u$sawQwPk}+Lh-^Y49S=EHo zRvjRsV~4Ge_r5!npyDy9P5zMSE(E#>j^K=!-j|1tX?Qet?Mn!Qc>9_?;&%0}vnI#X zEb-6f5-U2Z)2&3p&8`uHjpUKT5E6?gAS8~X#d+)dBlwh6ej=KSKHEDSu@&|4#AQFogV9DF1r;B!quPuw$;# zJ9kbnvwNJ0Do0gH;IgWKH6z6Rf4f|)qd})J_E(Z5db$0T?L_g^O8@=(u1~f(1fF8& z4Xa)L!KAa}yTKL>xdiGSx&}ZSP+dB&6Qmd={u%$Kb$$x@XOSQOY`YybY4;^-wb7<5 zVc9qQXKox`gvy>THGU(gNIq0I>B6{-pTO;Bm8BN#N11xKQ{ML?~md|Q5=H#DxyF#xp#{aXl5#;XNhYpPJ$cNuO49+!ek!1;Z z*#G%y0ozzWUtn)%b3_2FedjRjpKR_j>WzGTl&^yeH?shEA_dx)3}n_|s7A8?)UwBE zm|f`<`O;}$glGSs^X~&Qe-VV>-XQekzSDP4!rS3K zg9$>tOjf%baiRYtz;AN_{MKv(-ozX{>o@1$V?nJ^@$Wl@Cyg+;y*CNoUO9Mq?Vaq} zJ6S*rv{z>LV0hyNZ^77X?;C#E`}`Ej{{(xe{9|h*wtM{{Yq#?&h1GJb^UB#NuKM)K z5M_BIu4T|werZx#Y!zOR6V`2a7jB#DmJZ6Zht_P>;HU&Ml*XS!1pN@j^Z>si_;CK zM(#w8PVn;QZ`0Q*#8O9hq*g#WI}+hefcPhVQh3^qQtl^M(;SB79+fFwWCvi`K)M?1Vse*>$eIST)9)4bdFqw@zaa`6ooU>Etsws52cl%J|2uvWIQ4$3 zfpV6Mc-KFVgisj>tbe*CxE!AxCYg^vH<9YK`4D?nSNXjVMJ<<$)FaNuc45`6%M3?k zXUCf|R{xM%7m0YQQLLcx*N+j-+;zZrHy?)hAl$FV?_6S3ytZ4~xa)wc-539BLGsU3 zZk0bURn2fVn6?^5`{BD=4MK+wI@Wq{*8!s)kh*pL5r7GM1~jfcgR&MXmgypQ_{B}7 zGG~#LTVJ7Je6L#cWn>S_w-+8|Stau>p1f`L-nT#Oz1J;nuKlVzu+jem-13U#Ekl|rv7#?K!MKpu& zGR#+o&C?u&PBK8?^SF89-QaPUs&q?3GAHPpC42$$Jq|;EK~Odk09P)yCU7i->c33j ze-LERk(n;uq~&mdRn~FYtXC=P*Mh84*2=2g11D3gb70!Xrw_D|8ox*XH4~a*qO&P> zDlGD3lQx%be)HE<>nC1!6#EMqnGqcWU{Lv3fba$Pxvx^I@{ml?c6x@ep1-aqubO^i6M)t!A;#UJpg*}O_LruL0slY)I_)GY6zkC3<&KytNUd}m z4miW**K)IZ@vgDM4DtJ^`aNcDj_EpSH;4IkuL-v++ZZJBC^kB&m#M&87V29Q3~@js z7>Y;_AvEnUgdhoZbcRTwq&H8^Hg3ct#Pivkbi-`8t6)smjLnMP!!(dsL zXM5;7g7$EbuT1&QAYZWUxa)xTJ4jUEFGlZK0~j>dy#SUu|G|#>^{Ej~hu!>QR)-DN zuh(qTr%=Cgn75Ay0(G3EIwAUYVguGke)D*@f4a%w4Zvl+$2J4tZll)E~XzQNKs@nbUd{G*Y*ddlU@hdL$ z&%rC|ip&xf(09S<0g%UT-DFBfTHQt_92Ntn0Mxl;)qR-tqPstBL2;2lv~pz0DO2$e z>`1R~ekrdl{YOMBf-k%g&Tcd>zYEZg1s0DPVoZMmWn~!r@@O@CgRlE3%vF-V&f{P6 z5q+2LZh0R{-9PDiy<6KmS1}NPP8i>BWuNhTSHxtSl^4Iz{*9^7fdyy|z2K-24l&YP zH#h@i5s%UpPZ=_+{F~Vo6xd9;GeCZPfhKvaHKN!m|FK$S$@s5;U(RHds}WnX19)P~ zGnsMYINji%bGL?g%e`LuBo+f$Hny&MHJKjU2oWUus{O9V(8WB1@hunhnNjG-!(Ft010JEU z{hbBi^}eR|7l!AhuWzFWGl-V=s@q!CL1+^@DK0=*84&PB-(@@w#`he-e;R|#IxL*e zcJ20M(zEB&oFBVrw;4D=V&%n7+UH-_ILl+&&H@;B26?GC4y;jS{NfAb!p;;oFV1q& z=5AJ253o^_Vl~6q6x>op=0n+{zO*?#d0caP$^^w6!LzY>>&v{}SIZJZ8yge*jbjmp z`yzQ^H2%%&W|2*QSMsIWt6ABMA{owJpV!#Tq!=x7C)LS=Mct)iQfMDL~P!2ME9~px7Alv)W&Cw!Zz%y^5?wN zF`O@Q1?`Q^d$*nn>YIm_0J$W2B&X>l58(`k=G2Pj)PspTT=BMnM9mwC;oHp9k?6kC zT0C&2+E?A2o>10Y{7`fG-I$5cDFqz(~itlpJlq5&= zBu6ZwJ2c@Wpk;Vc!|)-m*DpyH6NB|;k_uDXA;vaf5v5eTD4ANBDE}L!k|XY?IMuv> zF!;Jy1vXhpF)@kQm06`*0g6tZCGTVpCAy6SP{-qxvt;^Y4zhs1(jQHx2&q}!T)INI zAz?;<#%h?SzInt7ZJj!`YvN&S9DRcAr`3txZ6_p4S0?Usck_sq7N*_1`2?Kh z?R~{w&Hdh{C%vv=2Yacv6Qx@dBeo<*EcSZeIUzY>DQ7aaKTj4ORF&7emBz$N62;5B zu;Yup5%}_#Bzm{hd&RGj>C~=aF)vl81}AB%CeP6p>ijGh|65!z{`dTxy|v$s#av#m zkS1h`UHTo$!^sT3WcuJF2O^3#=&2(ZhKbaY^vM;xd_;pWy)Q!T<61jul>aQrI$`gt zl`MWTQkDmgxZNHM9zRMGgU1H)!sNBQRyWOVT22|ELdn`W>PjxAJ4&cpS)52d00 zVc1Nxc5?3g$3ga8J$sGPbId9Vk8?Boj^z}$P-EvVC>joBNJzXt=Ll)CRsMPAwPF!= zvHw~3D8uDcdvr$I4=6-rgCXK|?foXRd;eM#E0f1CZJW|ACoN3a9Ty8$gMU707W2Nv zKkh=aNRGhYFH`C$_X_t08?rGxDlDz#%i{Nlb#~LMvd**%K(YL5_%#Xc*Nk*-n+?{K zj9>ae7DCM|GmltyCDr)D@2^sW&DK7J@{Uy2AIM|5YTdl8Z3)>XUATRT>GR+&Y$YbUI@TRJ1&h3FoEnTjrBAb0g6Ej?A zeQPsHy;(Ye!M(esH|oucm7iFKM@$W8P)GRFPSWr0BYm*GUFO3r7anW+Hdj*A^2l9; zOy#jrk9w%rL*`NU{_U`G#Tyo>#gm zS-K?I)i{u&LZWU_vTjLIU!L+xd%gLptLWWxvH-vBBE0d)UYo+`oa>uw)2!l0J;%o_af?{3B zvQF7QIR(TJa%<5`&zn88#6iIFalQX;nJiAP z7yvtsu{YVA`X0}&n$fz`?K zm+ATk>G~BOrYV6EiQ?6X^0z=lwksWA=49_{^%5u0y#=~6wWOBHypiC>MsY9WlfmHC zZ19F}%O4D>UZ#IWG*9i)kjUENni<#-iHvHJYJBUiT!4Ir?e7%a_EANEJQWI$}yYi67WYSAn`Q*S^^*fN4 zk#1;9Dv~c-22zJIBc!uYQuMVlyisPEr<=f53m)_Nj)eZ4dnEsmjgvezV&Clybm(5m68q0E`HnWao|Kts|9-+uldS;2a;8~*^!!uGwQl9dCg@>y8#0v+i zm!9fSbG+(!P0S^Q9`M>LS-#mduL%Tn-htPGUQ?ItKw`?kYm|Z4$d}J+>vOz@HrtWn zr>=|gnw>2Bzm(ya-0j%>v1?uP$7!fdP|GKY|0e&h8fpbw{%Ow7l#uzq*YdMpRm&%; z<)+n`d5RDdBoMILkTe|05D_#cC_?St7ZEO)eF%+}QsENhE^b^>K^lyFCI}HC%4cR{ zAdn28)A>%2$OdpqUu-xzs`Y?eNRssAY+WhMP-~fpbpkpnNt`9FGA1FMr5j2TGbEg_ zrVK(INrF&El7zzFiSNHBNrq*jlH|Wjh+rKSQe4T@J3G-`ck6J4Tw8aLt~*s=1xMAu zD^7u7`g62}agvtIC)537YOXO@*w5d=Bg(DWcGDl+h&XN!CYbapZJ& z06@B1%1ZX4Z}uWQhXym7qE8KUMu%7<%tyatS3a+N9O4$W7p-=2gk{~eow!v7g zm?CnFlRGdpXr^Mzh&+>=AVM1v9U?M?LMX8R=PN0g>@0EfrQ8IkhmS!%DK|t>WJ(dt ztK6hYWmumO{euaWrf5OgKu%?OLU8cfA@AJKW76@0C2UUMSd+X9bxX6|M%{bYI1TrIcE}yt_rGVzRWr=~2M@VFJew72oT{vg=Gru*S++Crg4p;k zb%%Ie3*3!Z*|F3obYyWov$L^xG&%m6u~*Q#yy+QEL{al+2`XazM*DR)uSx6OYWVz* zHZ`~W)21d%RDr4agQtTbs3R`|{U08hLySmB7mis%wdmx|Hqiz45q)ITl0_U8YQVsX zmIgG5fOyebb+;mITTz;b(1udk48d8zjlhj|J;Y>nH2igp;mnt+B z3?YT3oj#Lp8w9D3lEGxu4}lP#!g|@}91xo&`fq+_+hAt*Sw&s5;}|eJ=UZwRZXo24zO$scI~RP*(z&j@(4$b z1)B&J^j7}U`mo@b-1{l9;Q#p{x%;ZfkPK#jjwpnGOEfuA6}nmG+2HxF^|ZL*ZwoGe z&)M={ISIsatHkcc+{!UWpu1CF{W2Wp^Myfa} zN!SHB{+V?tnJRK44`wn{V{~0ASU(n*rl;6aRK%O?h2CWGn)K^V)}^xQR%*G=)G{8z zP=U&uY(|j`i|ks~4&LO*Y}*+b&X6kPO}_ga>iGMz?RU!qo|8m_^5&l>Rs^D$Lsbj) zW@VhAwfX|f@ma5Gp8JBh-5tEDlyYi$^Zir2JhlqnIyn=-B402q&5p3cbt!aBvM^SI5iirKz1 zEodU5R&%TPJ6m>-E?`8L-T%{;LPv8=!Ym>j6%mrZ=QpQZwf{aE|2KVYJ-Ic-xRu}L zbPXp}mNciouKVrz{X&`Uu$!wasfUs<*euHxFKbQ{B&}FAIBkY~USeCHh%s?ivjUOE zb`3kkVtmPvNRO>3XfP8Wx5F~NlN-j5wlu}^6Cv+fHMl((+DMcIc`NxcqbW96Vy;hi zh09vOogZ4eC*H{BJu3%Kk_LIw0$$YeKrqF!PzPjXS5gsYv#UgF;)K4 z@q!F==tq>3UBJrN4JqS@QefurpG^qXhAV}#MllWhj}u^0Ap+d}h^7;JYA8=KLQCXL zPNvT;fr5eX=rPGj7Y0XI$r+nJWtEgrXku2RF$+GuOa)e&406K2H`|5CB3r3+!K7}b zGT;-b_^H7NH}#tSW(9KHmYEQeEFZDVq?#3FrieIPxjxUftVBA76Y1oiX;V-yHOEm; z*n)nLPi5|6@2UQVW+7Q@U0B-L!*iS+9G12kaRJS&Y7;@6WOlr^UQKnp_KJ6p!QKXJ z5(hKfsSi630(yKR@sD zz@hvHezM%gg>;gU%XOXwT9S{@8|6zBTNy8111N@KKm`I98E; zx$0*L4a?20j(ga*#oxQc3~%5}^m1sA21*Qy%@wtTC@ zr0bZ{0GmD~L#Z~Q99>JHrP*Kw7KHEjx`sIlVNp)M-&Ode!u4zJ_l9%&B7Av!FrpXO zi1zp3Mu%pkPD%67vBXg}>2w?J?ik9k35lVx1bm3fYa%LG;pQYZ4?U?OG4!&sv0Woe z<-Y1V^b-sv|@|62395FGwE zgGL2YuO=2R5)mnwOg*bmdCzJqh3gj9Z+bm$@Oc!tg=!ICF#QX9nTSgbFx2A(?tJ z*9A2Ocz8Y>0d{aCg7j=~%!FW2%n-i<%tq8=c5lZnCSBTcnh*kdrhjDrB0IU}hn&{XW%n`IZ}v>pnzrr)cad7#|+ie8s< zrs|eGoQVEJce&2PyjOZesW%cPDD~SipQr9x=(R32o%dLuX?M%@u zb1Kao+jZ0@5F4n|6C|=E7Xw}BBrD^ffQH1(U~Vn(oCqaz;KCP~0svWYOUIBkf9_Fh z`4}>@t3*GuwlQ-EV9qy<8Z953G@BcFET0e>r$>e^sS|=!+Ec4fll0!@TB7fhEvu=d zdVlmnC-)lNU3^lM3_MX~oYs^ih~xvBAlOX!BT6}I>NB+$*u16h;dDZW)~-n zy&QTKR1b~9%za_z$U;&i1VYraT2={l5fF1JEW3V(vSu7Y-9EF;B5)ja(Mut99fm*( zyF&34uAo_>p&{tVZQUYryV_luynN~ajnZrfyrPxU9_W>&Ib)=6IK9xNK|IN0J3 z&L5(uZJbK(- z8B3YzhJzabbKHQS#>oPd*9l|p5%+UYme%s-s;?j`)>oj99GMvivgn8!WOSGc$a4R` zoYM20x#1>3|6dVX;c5Y?yXFM8S|O4zze{|Np})%CgCW3u2%LVXdpNnTtJnCxW#9R9 zR8i(#4mis0KXr$5K2Q4K{kG@)mi@NdIjJl2kQHbnPwsp`I0OEC%)j$1I#sUqAiJXt zQ+^eDrR)--f1{A@Q~3&|x(mTC7W_HDM<2N|i*~qQasCjtGuPZ+HOqb%RL$kr1|b8O zDO|0_v6MBxNtmb1erHxy@T+Tk-aSy9#|(@2H)9t~E#n_vPcD!rL2xx*Nt;p@t3jvn z#5rBKeM#l44a9t`#&&5jEsxdAG^dg>HpXfen8hX#eY8&?s{tw77Wm9rrj)Qz3Hswv z82Jf?dp1rN(7~8fXCUb$UV3t=OL&xVt(_avdTu_VOiPt1tcW;mdEl`4Np*X@oI{5} z%izKKh{o(1_|3}h8~8r6jh0$I0GT;O4eJHVDU;1%KGYjD4`$URJO)~-Og$l5srm8* z;3Bb%OjQ}x{%8)0kYW>ABm|UC8$xQcraw*TG1}q0MC^V6s?Br3?%)nK>IG{IPG`eL z>IvGJe#cx|!pTAv+FqDG6GDeXr14CSEkAB~@5up{VbPIq{7u;J4qeG zA?V&EI*U2v8A?kdfFGwbgzVFt+8O~Mg|EI++hssnU)!_vX#mWa31HO@7!U+( zC2x6<2yitv79?8j_^B_>QDop?`%+EgtF|nc=mB+Fn`11jaK~Hzs=vCCRv+~Ad>d5r zg26Q>*a3Mow`em==xhzND=XB!Hg@q2vj4Zyx>>d}{AA5r8NXA#W{uocXS1P^Cb*Ky zm+PLq4mauJ_%*MqmkL|RB;g@4*}~xPV0%I{v#wAQfbU9CsQmf7K5pj7oEqDz-)J1d z;!dugKquPEeO7*X*u|0RcxNQ&#up{ z2N9d<^W32U8bUq7G8CxdM9c{8lGj*Qw|b?oChOoK{3G&#YWQ6tJl712xnpxi{WMg)hm5aThi;6=~#=>&AbYD*Tn;YLqHR7J~D;Zq{b^{EsES5 zc#xg9UTN(*cElaVCtNp^#<3QO(jKXV^<1)U6AuYY0gmPA=j)r2!=kBIx`=DM*=wKv1SeLUpndm^2@KGnkFy>vvP^yx(V+TtW9aZTZSqW!Jn1a7&yr@XqY&84p->Yh!ME^aR64&2M3 z(Hn{2)RNMr$x_zY#tk%=KAGH;>34JLT@C;_LC#I)HOyzUzG#!kJr@{-bd=6qYEIIZ zdj_ZK@M~S&x$ql%Cii5b6zh0?e@w0pGr2T{8oeJSQq1h_P?xDmv|z26NJ%>3g&9Bp zVl|W?ImkqV-AAQ2lCJsiBsc#;gyi%-^FWQ#`GRQ5SiTueg|KQEY|MIi?lUi(Rmv_o z`(_LTd z7+G@y3D6PjAEbh#;JBHtm$Yzn49md_%q1dssr3eMJwr6KzLw;A!Q3-F_SI62;DM^& zYUd(a~CJq*S-|+Jqmr+WK!{%91L6k`u`{P$a$(4ZWY@a15ilwp{yy#R{;k|F^PD}+ zuVeWR=Lbb8RfzSmLZtJ9(NM%MCLl{`hzCc18KQwO4o5KwZWJ?8%}PbE7^gF?Dg^#&k!)4@p+U}UaOl3-#{@)?n;h3CE;W}d02C>lB`17Z%`&wAd!4Fhq;>* zzxdPfa0_e_6N=@~q!H0%)_PrgL69Z#sg?*I6K^()jo8(b$fyNCpyAz7sUW+cPSHDZ zNyYVjs(tU%r#3y3G$Y6&E=k%7S70yG6V~lr`x^+2F|CBv1B$gZOEZg>9<-h+?vYhk zE7+c@quTX09{aR<*)^}KQZ=z6y_->?eff~Ofn?1}tx9VD#PF@0R&0m$Cu{Cc4&Nj= zRs#F(Zs6z-;}4g!wc(av?ri63$PT1qwCMSSEuPWB+pB7=g=i{%wFu3+nkrXis64}s zg>q9GPPv3I>9D6b|EGre*&3|}6?2d>#y^&aLB!2(zng=p7wdNc$(w5)vdGlt;eX>u zIGYNvh45j0HWYPC-@;_^Q_1o*Kup#=m{?#lQk~Z|oNu$M#u?;SZKZH#)damUg2##G zsn`4?eyw3SyQ+`&Cgz6$Azm(AWN0wjk91`ccZ5MFivQrFWM=Zn*=_{_bCrA(1bb+Q z3&Wx>jSr6OaK70i@xNHzuBdkirh@vG28n*+2jL?BfEp+ZQLH8#+GKHP5{=Pe_O}Q9 ziEoE?u?Edrvqud*f(Ya#5y)nRY2dgijxE305k=}$imKdF<(DO5Nv{aR%6t&c9t&nk zW}6A~B4x@hqk@*})&G}WXBo^YfG=NKSKn4PS$R|UUNkqHwA zJm)5I-MP}blXV~=3jFmT5KQ)%^QflHN|6D>=7z zAuS|`p46g-smjTa858ShGU7E=nVvuk&w=M?fC5nwkBAr?9D`G4f-;zzR(t03Ky*-x zA4cQ7ov|~6V@DB7Epk#y8}Kb{d1;GE%IkAlkQ9`r1?m0%*51!KC$XUa|GjfR_y7OQ z`LucVUVH7m*Is+?wbx$zjX5REAn(V61XGxY11GR@R`OCnHP+!&1M1Uv9(EahD}_aZ zvI>A+M0`n8nFXlpev7|L@tZ9EjV2+K0ZB9ivKXdg_KRz76d5#JFFNvjqv3C=OEC$> z_IZ=D^dCTIN*EvnWL`jxztEXUF_q?+$FL@QY4Y+1xY~G)HAXX|;(IDMu=CR71N->@ zFkYWpoRqAuB!zvo5|J$Lm2sBT?!vvO+#uyhkh*W12O z5i5f)p@>I{i{pNm_5(Zk4uJXqH%>m~&?{()r&$_+r};kx)_(pUl%HtC5{y{GqzOP- zKCq(#!NH7H+$9}NF?}u$2!3<29p-_yn~+_6MNBVDM1ci8Ij0TS&g2~N6;ba}_z|$t zG2FWbDH8lASNI~*5E^RsmjXC~PHYzwuxC=1E| z9TsXyLUk$i0~;m0h58%3rzVLfYBet~iRl$mO#+-me3|K{Y?wrS`hTXEp5=_w+9~<} zyJ^6S&jC;nn$!vWEer5Gl=aC^2L9}SxKUgEQ@)mr7xMd%+AH4eO7Zk|6<09GU+xvPOA3X zpuom~n$-afC_YcA3Q{;F*@=sNl8bVj*-`5OiCy8GhizJmSe`NwjUfU0*o?N(jh7W8 zzZ*Nl^Pl}`wLPfG+LHgr(tbj8Ki0@l*!+^~S286G@vaxix zDv-dB{`DKK*-Hqk3S6^~n>(YWDFR$(jcM)EEC$%TKSj(VaG%kKEkb?{C-Psc3S4Hj zRRI50S|8blVyD#qKK{de6+h0^?B|g2VpU)xE=?q!XrfVhUjFame~o$K537N;5nimh zi@P>---u?u?DvQ1R@L#07fm)^_M*{MWg;^i)f=Nh(VMkGD6L62J; zYavd>aAM;66*33px%0%h(%zAr1~j#i$_kFl>;@r$SHp}D@H z7v?3eyPiv|;{5@G8;wNX$+`w;@!HL#vZ#3al1^TRl5AB$@?(1ZwDXbCsD4rL%d5aZ zQPxy}Yhp@{_8i;BnHsgOnaab{3NOx|*Q{fs! z3Q+h|leq+IHrH=)rOb5*7f(Zg_dKo+a~;Ihg)3|nUfN)!|Ea)W%>O>sgDW`c)ZVc1 zY7Cr>TeyKe7YrS2O0GDc>7-T%a%MNr$)uZ;Q5_e+MJyRyo@{qRYK*~lXOBU76)2G% z2VPPMWM`fNJ1T+N2OY;G0|lmQ0^yb=E4T!wrP!;1xmWOB!E?YDuXrH2{JLYM^?qWF zn}rk|fdIVCAn)FWPqweI=5ClGB-!rf2ZpK4g^{DZ8isNeM!y5xWZ4O05P$-P`NEMN zjpAyKYMQi0*9K{J#e$^kqT;#s8mcu&Yq5)pr*&D&n|1W>X_-g=AuaROI}XK-a`(`~ zYLx7SS>5>n4fEBs{c6Ls28lS41R4JSZhKVkmskpl=cd^9Q*EAV5=~TE-1w^P>-V+H z49O5#ZNf#K(Ky56X=x$+felm*V!cs#dfFPRG}rSvu(@2wAW-xm?+@VW4lt_JL-Jixm%C`OoF0h!wqhcsRM@GD#THn}FAJGiRlB z{SET1C#u6G+nX&^y)oJDW~Lf;4AXT$hoDZFZ11x<>Ldus_EfT+$?dYu8uF&iNf~;) znZn5fak6;Etm1p>5fGEmO{XkgaFpf@&7^956_7?Y0tJ@Jnjar}=oo>oZ`FgS`8$ed zBzTo`XyO>@$t7XdW6dJ-ZecO1la@-XQGHQ<3yb0^aWHZ$ zZ(XREq|l@<{=eWGN0?AXgf##oqJl>Z9V;1MhVEZ`j5@rR4tt9wquR2=io5jB)Jj!O z(I!$v)qJO}9aG(mO5LLqv(@Q@BxKQ=yv140r51=Q^dK1nOE|lUn&8jz z3wBHiP0S;e9fw9Ij*?$oLtu?QG^=qudCOd-JOOCOAq9$P3#@M(R~jc&gj;uGiT6kQ z9t7cUUn??HOtp5)kI{I?lxSrspROa0nJ`8fKvxoz^pu^6=4YdcM1q1K6!e@ngS+E2 ztU)F4>O&9Nz+VkCCl1OjdD+YO?Z)m|EP?;NQ9OIZQCuVT^ie!))R?SMJhai?jp7=y z-6*bc-;LrL*)@v0(Y|&R?+F_3lxE>a@;S*Byw%K0HW#+`x`ES91KG|ejp@C5(`5pt z=qGpN-6pN{ewB@{6=B+|^GX(JvKCQ$A`CG_Yo9qlOUhVaMXEA-LyymbrPXN?l`Jmt zfr9tMDfUPd_b5_NMR-E6G$(xh3_fz$L9cAa1@ix#j0a@yD(I;Cc$H<>lM49^TFW zP550BI5w+Nl!3OXDp`h}Ty)rV|Cp%poVqUK~d0ILwo{?5N?c%v{v4vs#v{X>!5Q_7ssTQ}}mqC>94mW1swu3bPik1@3U#eP) zYs^8BO}|hckM}-p$2{p5PMtw5K$MzhfNoPAsnuphYP3WdeeO5YCVP5+YQ}l~onj8f z6SFj_OWBu%ofS*1SPa&*t&4AT%0|6JyDOUgL;I=`s&z-d;Yc%Z`PH(cN2~r3`R_Hq z>pynFK~G6*qN&uGyuFP<&xEzW#aCUrjHiYX$c`M23k@n2A_mFDSk&CzMp3CnJx(Ve zwBhHKib@>oZN>9*(I}1FLjK-DoDoB#nJ5g3Um4Vg=ecf(@h-N^zcL~?Rc&9rM-_+j zR3ifz`!X-o6kCVIkt!*f2QAMEy-!E~+@bf~H;b&v2BqevJ62^+vm3er+g#Lr3a<=1 z#S6q0dxZ!`#Alw){<}uJw1ONy>&%04@Ds2n{LFu$pK#YD~1UaO9q1i`=V^|*Mp7QZ@#N!TLS5z<<%t%pS?2~_*( zfDYR)R~J#nh@$RRJ_~|nzk*u>z?kwsBAyJ&&F=_Yq*-6Hfo6nz|z{KEX zlg`rOOdSEcR7dx)lXB{)Cg76J}{9IsO#NwxYxsG`+BH`_#CNHrF0cu-TZF>^KwC3JtZ%Q4~ zgTa0!fug3O@9AZQJSO+D66m1LqdzW6IyuaZwptk_4aD}igV8KG=}g1q$*Gv=_-nne z`bz=4kg^o_M^nOOPIay}yVeM%2@ij#Nu*c~nS??vsn@otWsr;HXf)?dCX~u^c?iAo zK2S|-ob#z8x5gWO1haq13csu3y;sp7R#1`7`v6|mblf2R(yCb1zv6Im`3P*B5Sb%O$|qi$lQISsXVLsgx(PfVaE@KboYi z_^*v5O9FGhD>AY!l}8q#56D4vd~a_o3Y+Bpa>7Z$*Vhb7vbc&otArXUc;+mJ+he#h zMBul6gFq=B_ar1!5zI^2_!_jc8~M2FsL*+r4l_;Mi#k4t>Dupjn%vcp{sj+iocq6B0wdP5ul?%arTat5+~^2xZiNS zbE9<5-Z$*rY25FT5K$pLb?1!)2Z39q24r9vRcZO zm!NKY2|*p#l^=ah`8kn*mf^<9>L6JoxO%TdB0aMODb+>F;KtF)ZI+YQj$*as1d(|O z<*OyL{5i6Zm6Y;l6iQ8rLO*hPDmRg0&4ZmY*H6|X=6Il%cOavSlgfcHlETzwS0I*5 zka1>xYTfe;7Uih)9s9ERFZv!%?aEOnU!W#F^qB_6>Nn%m0m=JbeV9G;?%moyvK}xQ zKS_JtXDR%BPd-oh&KUL;!8QTYd_0BPW-r}8t&}c&gOen?Aj%2wKU(^F)D9MMqIEyj z=xm}JGG3`w7#+}GT}R;7LH$+5B>$cFZ!c>k?DGwPjO01sW(#LDWEubT4(`F|l0SF( zT+M)IP!vVW`A^xG<%J<(Q)5?{_uKqox_vK z(R!3e`pf0le9UeL5U;0cR+`^nPwy;|l!_63+b8$YN^-aT`}3OL_3yjg+iRkK`<7V8 zVk9-CvaEO?YDH&h-`D(o0|;&CzD`Ar-a@e*(;oe#M!kd4w|-R5vY5^29KMycc&$oD zX`7>sbX!&G>nVZ{8*yQ&XvBvdMHnq#(vl)+>L&pVL)brK-E1X`p~aKanbF5)pH*D+_ViiBH@#gYX_GH?R&nFo)6|R?i}-JTdkX(q#T(yVXYeV# z$d2Co>hG9Jut+t2wO+BH#kjDgC=ww2hK>B)oc6f#LA1$%hNYi?i8lRd3llu8YBNy~ z%RdlFiBeT&W{a0gW?phkD$5#p{-NmKNJ-6-Ov(-2&m-p@at6&|gub3Z6&ysq zW#GL0prTa_G-Qf5w&py1Duxd|K9v<5k(5PaOiMJiPi4>mQ#dn7mO7*%Ru-PJ&zDEb z^;vRB0m_m~jt0frXoiR*5~#Lmq{srQQi0t;mUPk}nLWXtfwz~*;*mscP z!s6m|u9U&Yt>{P|V%78}RaWL;}C6VdEb5O~^8q2?=WjoLRbBF9ZxFpb_Tt`S2}RdAPA zIJZXctcRzf{}G`pY&9iH!ooU;*P^6B)s+vx8OCQPcV{2pFM)M5FM=P%q%$a9!`ZLL z>EfT8;*}b0Q!2h~|0f7&pDM1Dr00U6{FoLdMxP1(Y2TMC`n8*lZFra*W}e62_Hjm? z%h_6uK>QS$zXa+(3$+{6n(6cx1^d7jlc(<#?a31*kKhjhmG`K%yJN*&OB*JKmf3)G zN6la?`G0OO^h8Rh-9UPEJa8DQ8$6QNygV4%oYDi=gOmXR3MSf@d^i^E$C8~)S;8v+ zVAd=p=X5vKk^sM17)k_%Q!(*$GwPkne4@LFZ!_QKJBGW@ z?>?`4iC$Hg3TsB^%x!Yjm1yAkao%4p1Z|o6bVp`xPnULY+vXMy*0IrB8`XGpcTXyl zT(douY2TL7ZuUpm3zOBU(`U7#H~;jR#dp0rQ|LfrO@)S+=dj;EL)bpw~6@yJ;zn5-_)?Ih$Pb^HgT^;Z(MLS9kt_>oX3Ql;4-mJ+&p$0<}(d!sSop)HSv(Kc*v0N-i4+Lv1b}T&l5w3 zp6DSJ9mgyj%Z8t9;mn3i;bYC2t?35wS1m^yA(&M8M#s z!x(G==SsuJbn8k(Ca)KzKiR|^;n_U5YjNCTz}*a~4hml3a%bP|VmF#j@pY-|^5iDm zU82XL+2@A1_5L>7N42CipsEx5vb;>r`vrujLoS6WNLc3CMYWr%+m+yLWDWu6x!ov4 zR4Bb&+_Asd9fQqD22CP!%9HKNm+8>vHoPzXTHg-Gg65^(O}S*E&Me# zyqIQTY+yg()^6WmtkNblc%@X6)EqYtpdYEaIw-9=0q`#Bh&dWH(!qu_U@%tCrK{&> z^!Dl;(9Y(P+_Mk{G&gNo47uyI%K8^bStn~WAXqI^b0i$-Xb>l`InOcYL521x6Hr)q z6MKJZhf#FN4vntI-GPWlJY5XMk(hTLR6nj514^JjD5%X-Y+XP|`j2t`xLGBHw5Oci zWzaec+y2}Lr?r5U0v))77RQ9lJfuZ~o>0PMFcBm;cE@wyTK>yFrJOpH*p%4SFC@Ce zUOOv!xd_o2J&Nd<2Bl9~n+g+@)3+@s;w-Eojd213CuM@?kacn^rRt(oollBQ)^h+a zag3o%dvr%qpb!c*8RTCO0qm@WO76rkDyc&Hyc#!zS-D{gWq@4baE4)@s_}9kkVT59qLa{S`>j`-8bxHHR8(9uMo^n+oTCh}yfNi9=99{;Foq zK!tgr`46>`LK@P7Y<>)mF$|3|3^54moY&9P*Wvutt=bPlb5FKsnt}pEvsR99I$))c zao5_HwSrsBc|`{~b;Sgd@ZBW5C#8Ja@2DkU{>O6RyifM2n3ReL*o@EVn;zlL z>!$Wr+i-0nqGW-P6f9~H8o8l z|D$N~S=p317JCK8NEP?#O#ZH**nK$Y+#428W$Lgg7=0)ewroN%q9&Uvu7*s@xC@&)WuD@eAE;IKIBm4;OcMi23J_^!;YagG^ok=59JfGel&ljLr>FS}sB(`!&h)KUlz zTS{T0f_Y|IS!VEaj%jp)EWK-%aEh~hmU7k+mKmK|2rXD=8!`*FRg>-9#z2u7Dkq2) zG}64@%B`>(i^(t3VxzK^Y>eT6CeRSJco!ubJ+nBgsFLA4t2nFC!uDqlYzvebX&O!c z?~}Sq=~#(1lu5EIVBZl9^dZ!LF(ZG!7?pqP(Bp|g zVGY~&1}zZ^QjkBlA;{mIY2VU4^f2MO0W_iPEEwei6sp^z5)*`Q!LINGG8p&X{9iYl z-hI&rKj3vd^23h!+S3*AUep8np>of%={uCQ@55Fg0SS_(R{T(lJLqT24( z_=z1A*O|rRzT{fUHjKKBLCdI35yDP*cyM9RI3C#E7d6lfSB-Fc2m6GWIB=X&Eiq`> zq``su3aDv=HB?-)6zcZ{JLfAE28V;jF&p=h^iJea#%8ukXnw<<>RTm$k6Jq0^jY0C zcI${}On#}vePi)_CVJ*&iMp+)_1j#JPWFBuf118C^h6gjpCMWa#6~vEky%|9waTq~ zYt`d`1@GcEq3H4(ZQ(vT`D^yY;1{(!XC}Wndc8TF-SGw@VHMhtQsm;xPt!8zMZ2D- zDNMw$_Xu_-uo!R=0Ay`|V)#vOUl1KDIZQop4X|JjM*X)N#BgW`7hJZ0Tjv z@0pq_L#Eg--_OLXd;J&iK=_8o_`227gDfC0+C`&QlybD|tIr=^#OOSK?fuh4U3Y%#zEzeU zr0n}*%^cKCMEV2W)WS*I`(**{A!%En?KMa7LUc92xft9hNA&08&mS)Kyke+yOfuMX z$}v=Q^7GdcAf_GtxVV&DagF@NC7Nv7t{Aj?dXw8 z(Ti5XUN&89n3ML?*LfE$E`NHL&C7!P>%;s-4PpL#gz>u>gHBHc`FAtgp5FmC`{Cvt z-Roui*)YMMne+d%FQ@h||F*v`&#*5YW*$(&WU3u>2$;K+`vd!~t(8x&HfCkcp27-9FqRCygYw=ML zn9OABdsErDxwbI>S`-fEbf$WscBJB|HX3>t3VR2$)Shf1*URweXR-CYX`%+%#4e_) zp)_}nlgo-GO=1Z?1`ipKyHR=WOSaEZN~F?{>aUcz8@#7CEF9M=6~?r>6F3g0K~wia zK`c^{5mvg4>EZEE3o146p*E69lZ2F%O(-c7Dc$`%U5PrbRoVnNE2C=G`ZI*;}ofE{ujzMJ3nBe^;mXZ5890JmpD1%^wq?XKtDog z3wgI_9$A=$s(z2!8LAX>LDt8yg`m~Io*b+pX&CvC!jfxtCn}VtY!Z5Qo2KbAbB#;y zbQ{R*hsJ>_6|lW$;K(#)3w{0BLO;k6(nmy+?cNq=&n-ITr13P)xn}+mX|Vcr!8wNLPR$i z1eupb@2A3Uv?cs369uZxAFnHNEK%8j?)FDr@0Z3``D1ukJjV*F=yn4!CSd&{S-UMkw+L^EcE?*OcKKTiNIkj}APZbJ zXdJW~g#5vF1vVfal%iW-!$wB8VpbT9U|^T9<3a*4%3G;$VSDp=hI6lXn-oec?j{1mxoaGs=i@hic=$Zv@)vG&*IeX1 zUSW+p=`|nX6wbEJHhm>p9KFbuN-beuPZO$&6)EC!fZy)tb|ujIu@d64?vT2(x&+J8 zr0%r+L5#>5t=HQ@%@EqH?xB4^sZ#VoeJQZ&T2hUSRUBD@2<=fQsj5W6QcFVrJqN>@ zrUJAnVW8bIIXFke3ZWWkndf&Bc!>i0d>}h!#!1kpU=-yekp8C9jyYtib|(CM$Vle$ zGFnMTw4!igH;evpubM)9zs0Voh~L@`g8N|fAPv%5;htzYOFL>ald4l~+@bAljxGXS z0*S+Z3=+BMYn-^V{R`(m7rUhiSJ&|=Jyh|ubx_9BEsiBnyqh=sJQk1I(a44 z9%0W75=RGf&Tn8ipO5_Tcio9I>~n4l>Q6`T@_+96&DGY=z|O?FRFl#PcY~P%i$R}n zrJsP=h5@-2b2peBU?Q0KQpz5cGLN5<_R5`bZAW1_`RDkCLwKJLSBq76zYkY)Rr~=T z-r>UseR!7-U+Kfs9v<-31}KRhRgJ!x0xfzmg14`OF`+@N(^}Bn^Dz7@?qDQfn0_B@ zaS}2poQI|215Me&#f(p9rnKyqf`8%MkKjM2Ev(OCdpNI6qZFOEO+j;5>vp>f5M%5N zILy8QFPM&@Afz0q29WMOcBhRzkdfvaJ^eT>&Jg8DOP2D&|;Z?%HKGG^xqnU^~t7Dv@VJ~WRDXdZm?e5sxh!Kt3LeB&My_aKegM=>ZL#T-OB z>Ak)P6fj6^RqT>t&$(9#jNz1qb`+dMCB9Zn=%~ZWV~$74Tv`w|8SiyYS_Pq1E)EL&u4_tYxO4F)Jqltxi zD_Q;~S2CK%dXS>zV^k)XITJw#qYqNg^23i^KS)z?(J5*K6s^Pb286r5w-RD|EyN-l z>X9e5^(&SQ;#spr+2}4X)_A9M(gLEI24YS8=SiK}$o0w$}iD-E? zWfrlN2F)HNVmsMLq*qaUEybmx`D&C9#RGj2euR>u zI0_lMGreJ<9E^)40wjJWg}}Ht#y2x`XG!gF%G~#1uh~@MawQ6Xp)RHQ#G2MYVrPbS zEX3o;%M6uDnW1e9lkMy^uyS!J3eoN01AZNRFlNvSM~JLexz@gJx1?I}dig1K9r)G_ zh_B|-fIl;I2PDz5jih@PW|obn5n4*7L^Ld93&Z&gOQD7g3Ar(#0TB9tmNe8!h#Jgi zS3oe2^#kiB2BGP&TBEV1SLeY+bugc8!FqLO9{V1ptvbd!HnOS{P${al;5KMDY`T{^ zlpyM5_T|l(86y9|=HLfHPy(3*OBwHBFglo-^J}|&>4Pb5UkdXdMd)4t>rrdZ=!iZZxrbI( zlgSL@#&XMV#(YGzetQEU+LoMFL76=a^37<4lPLk=wwKwlDJ)Vze374($!a>Jp8yB3QBK?*%MTo1!R zs{*2KpF(P?@oOZKIH;;~Xkt)KYMxGJ<)fi!a^cfJO^eI`D z8VepWrX%_&@M;Ne<>m`t;EUq8T;=3DEDqOMtpp>kC~o_Qx@p=dc5^0`Am>Za&o?^! zV5J0$sstX?G|I8^msNz5st7x)2)9)cj;bPjzlv~U6=9D`>niTcF~a`n(;$ckBDBhb zRP^8Gnr#gCrgnFK^A^ zbCqgrXLC9;6qoT4syI!Kw<}ovw8yevfD=dXH4Kg!W(;`D=}Mzs9i?v0X_GOjKWL8xj--g0yX9`-6~=RXqehPVNgqrV^lq6z1u zY7TwX99{>4?VH3VBlCCnMkXe8(X$V@)EQ*UQ5jD)^>C^ygRbw)QjqYKs%DY&r@-Eh@#)9H;D~t$p)(N7u zs=Qkg3pzK2jhm|5wZg{j+0N0ByYzKl#TLP)Er&6ZYGI5lyz3>G!&vS+()!i1C)#E^ z6(xu8lomK3zcf~Z-_)9-`$%u;mmez(`iew$h~hX1NE+%&3vyaURNQ&^aI{_nI`zDs zkYu~nj5>C~EUZ{(;esXz6RLw%@!(%JOd%lxP<5j(?o#d0*Y`(fXx7G%l(MW*d(7aN zi%ujrW&tDQqdngVuAtX^MHI=7Is);?+7$o$*ni-}CZ1eMB3-gmA!bWad4(|ukjHwc z>s~_|Hva%C1vzeG{6r39EE@%z3$r~y`@Ie%lI@o;kxM+QS&lZeNxyf~0j)g2stHR4 zyOapaySagOy7iKzRz|oN1Kvx2)-=-6ouMx)$tKes-9%J#xDqaoxPnuAI@nUFv-;6b3(xjU2)4hxNnA;Z4K1vf8Nr zTr^9aoPKZOWO?f#$wxOls*2-;+9U$p8-Wq?Scb9j(&c2dk!f@tQDqOdISKxf zl490pGZ7|v8E+{a4&6tqXtFBG3-y)qWgn_ z&8pd9ue7CUM13Hd5H;byfkv#}GGfWV$>*XA(CIb3T?fc!BIW3MVY%M0K%r8TkpHA4 z64p^|mSQ>jOG^%;E!fd3Y;v%_VxFQJG<}|ga!gsiE;NCj5@bVM+cIHwsKvmQE`6yT zHE7k2gtfS;79?&47S17h3+Jjv3%}V3d1iCH_*L5zlPgN(SXBn-` zZAELeo0I#|><7h2rf(#Lm1^^YJlw!FAOKmnjc+}Xc!o7=H;IpXQ=xEs2`#Z@IpUlWAsewuc@Uj_@^gLR4&L`i*H`=h> z>ksAVFs$;8@Mh`LWH%^2i1SZJUob>#m!HEKs|n?3r&=kpB4x?OvZ4-}qmRdGxz$~h zKxbBySy-El8ck2MN@+>n?2kH)1gw2hp)PTxY1tyDT0NdXS7SGun|ilG_T2yk1LurHO&S3+1_Rs6888gFa?(Wp`~WM}lDMaw)i zCVaYu@q}*G1_jpgY4qwY9r)E*G!iEYP__Wag~Cs2Mm?Y#r^HX zmNi9ag9fI%Wo|b)0wcAEIp|}pBzSs+VT<7GL(}6-`Z%k>;O$;*@$T1YtSR84#E518 zCOzAYIcmQ<6?nq#Z2M2MdPSW3Jyo=J1|e4(b;*@V7@|}pC8(n4_IT1X@~J?}8?%zj ziztRVY3qcC{1Txkrzyqq6ZQ=oWsD&Tsmf6pxmqEKF^tR&xQN1zRmoRzQ}WfwR+*p{ zIZaw43i&}r7K?n9#4Rw8h~)KJaNJ1+tv+FslXaF<`h^Ko)+r5Q4w#>oAwN`*cS0MM zMZut8P#~tLDVFrr_^YotLR@Z9RWd8(obzzlzCS$SIW@0g0d&-do`F-mRp*uPDDjO} z{8ZwBzUfD$d$+0E?h1<7oM2J(5euh7E2boY<{3Qz?HnAd-6Tz@Gup3KWED!vDEK;v zST)+K*Ns~U#!7u-Elgu7ei>&=f};yDC?H}TlIv1=F^)7N!-TQ+rGHusZY6W&3(VK;!~3=@f$-_E*wsnR;>9-A~WQy`I?+qlY-hb(Zroe z`=XXpTC?ZymBgGRp2XgieOI+M&=f`5F!&PlDf_NzUClSP=C_%9nl)c-Kep!QWXMt@agV>!S4YKa9s39^aH;S|?z^)L$-AKUtAJqnV&pRO(^>Fu;Hss+Ls zXLQB5wD66s6XYtT%jQP3iJb5xGJuDLxf}xEB5^Lp9uM`joZgi?z-H&sY|Ei+3s=MG z*hk~t*_J7(6B>B3EnFSPv<0WFvRPB)_!lQyZt}}(42pzi8t+n^K{;F4)^)QRURv%A zTJ9Hm%Y7M45MbDN#NKB1=R&8ZznQnrV`p&ot!yr2@a)L8?8|mO9Ja9K!F8N${?~dg zFMqcrxYfLm7{2w~rYskjbLmC4<(W+9-fSmtpPbc}ZDA(vE(Zsg>14wO)?4Gixv6aD zrfkd8*_JX6g6#CW=MPn44X*I%j_|Fgb*YF}Z=FBOwnUlENnPhf!8CyhTJFuZ?B{tp zT{(n+{8?CdMOZk$Dd2Wq3aK_AhMsgy1DR=f$SI~OGUU#8icg(rhV9wrS_17EgrH@M ze|FDh1n=(8G+MH%{jhLRv(i$v2QAycrtI4J(qY_HnmVX}5CkFHct;j<6ua3wIrgxL z9n#SAP^L4=cHWJNsEKlkH-qp7U{JWMIV*0t&Yf-96LkJI%YB7~4BPD@L%tIb=QdJW zpc^4t(D|T_9-`n-ain}O)43bw;@~wxcJ6nCotzh^=HCN9Y30xt<}VTQg!nt9QgrUm zcJ2%d^Mo*|BDR#_FY#3}xT#1wamd?*lxsp!G~mVyYGPQ+{bA!TGx_IDlT{w}Qs_q8 z>!DP1SuuMh=&@nr1KKQ}$x{qg>3|R(o}^<2?CG_f?$0*v3r=E|Vd#@#p))L8){vol zpQQHL`Dl2O);IANIBL@Q1fk75X=tGtj;FcMX9!J&cng=cWhxA-*fH7xwGeiU}n*U{7c7-q*uy`R+E&?Q`0Q zYLk2%mhFHF4Avkq!u(ZDK9gbdo}B`%LBS*D&$Quh<`7zF$(Y~@NQUT2Cf^a}a}7aW z7NS0^kG(`6XbbcG9YMaQ3)^WMSkr8$rXT^-e#exAC8`u!*$Cn^wuwb=-y&^nueNAC zp?MQ?v$VoxZ^w?aHQKUS8W(z>(XcDJ1;5kGlpJze#7A{wii<$BZ1zSYN(;(W<2rYM zMai{J#_PTme*&4PbZIP`Bv2edOSYp6nf;6qyK{8CL6Lgoppjc_lU8isSf8dhO(@gC zY48R~gPU^`^_sVHn5S1FeA0;WCISSr3-4FBY07nK@|?v}{07_#Uv9Z7c9TNMZKZOD zJ(e4o&DK#cxpHWe+@gQ9L;JL&a`cdRW=kpzIr>3BRAdG#mQ2828#DNNJBuLXm=c}j z)MoU06?Ia9rkaA$p%5x#NYu%VHR&?FI>^sVkZs?3cw2kkK&MsmJ7w!_AIriH!uG}#roop(v&FgzNI zLZl*2>dORUif;&Ms)BGXN|(OS5LdOBuTkGrpj+eReicIOmv(4pwRCGUXp#p~;oN%!o>@ArO5+A+wyydR&)V=nNH61B zF9a$f?gH6ND0$e43SDSStN?%U4BgdOQo!L8lh>VpG~}GPsIHD1lSC4C^_&K%c-;i< zMa4669CPS=R%0RxFbQ+-aOabwQ@lT5*GqDSN^f6A3XCVf*xp82hRoWB?1;tmy0s$6TRjS ze2>7rLcobDZXVW~0vw+6cM$6)WB1NL%3SENGj1|=ZyD$&V|O2N+FZH?IWU**G@f>o zu^wX{+LWulM_`W-xNF(9V8bf}8?7>RCvZ;sNG{nU^VQXnJ?G~G>s>uLg*Rsxw4 zE3i}v)SkKcNdj1=!10>Euo6hd3Y4(5JnepB14*DR)&+UVm&165?HEdMmIS-2e)#&%>l? z_xrd56&O0Dhpnu@oFzv2uJ$mw*H*&ev5&Jp4$nIshiO5tv^Dh>9qe{p#EvUHTfDXe zH+Z{aP)vz?jejKJ^fdiS?`zEBYVQ|&z{7W+V_x*3gz4SqHI?hc^G^>wcFgFZde)Ct zcRuTS&ucmlAK|$Kbs??K{^9-Q|K$4}J-_$;4v8v>O)eNtV;b|_#y9?Ix3RwE1AXJK zb{p5tT!*6@a52>Mo>T2}np5S%;*e@|dI$0|DR*Cdz%|RhkFsWtFEzbG=~Q?1)^GJH zjV;iBwY${^0KG;-5W+1LU5gc7PbNs#+mi{uAe`RU>z+)wu(kKV-u%wd>XQj~(DF4R zB$t1gq!uxLmGIfa3F~lZU=z>6;^3gX#h$d?>cFwyN}juaWVd@M75#`&;*;MBM(^}d z<=Ss^#z2oKIP%;h3Z6822c%6_Nn5Zbx%_FRhpCMZ?@SYNuL>khH;prPMiUbTJ8!WV@Dv-ANL|?=fIclf}uIr&n6ElMTGSz_eqz zsYC$Rm~cq8YnA#YGtVa514U)x?9x$Gw+g~T3>HUsE!D^uIvZmp-(%Z`lE<7#pYNaGIQ1P^* za7_}&M2f&E11E6l$$<*E4RC&^o>3tihIl1I|B%tBok56PKlN6D0hO6GoXrqqq)o8M1{T_$Kb%>whp;APLLc**5gnF>jx7j@z; ztWMs-J2-i+6e?*cpG;HNC_eWM3`lxr+w zdVHVuyqMKBEjc{`@0{YJQNzh;Ej08furg|( z`e0^IBwYMaV5t(bD&Ygvt{%S-MX=DuD`*;d;xs^0;6x=*!;T9Sd=j{tf4>%ln4CG= zSXk^m%v%RiS5~Sd`~q%_!1|!M!mzvt*dH-9bMmHxDlG@IE$r$->9KgAw(P^k%B*v~ zkBW@wQ?|^r`rjh@gH&aEo$sNy#Ea zKP4--CAU*oIbxJW0}SHVH&#>w$6uj)r6&d*m@rp)P!k-Q#_-A{CaD`(mrg=$Lp&J(;%pL<34Pl zCM@T}cKWcDHDUceY{G}Ft_d6TVUfZp@38kzdjE+0(6}~^L;h1fo%Jz{cAuVjGP)a+*s%hl$1Wz|a&pB4>V{Z=hwW-BA7md?`Hgn-EosDpH+f4P&->)LPPsnOV)g#GWlt#ifNQ}pcBo@SU*|$n8E)$YXM}3tt2N9?0&O+U@HyiB zpcYQ142tDUP+f_nyOFY7MQ9t(va)MoTITqmX{Q_o;%p2j2#tDefiN~!t~=0X2**(N z^KeAnt>WuS19!mCTyyTpwErk`!q3Cxny2V-2tF;iG{pp9)0z-b$i`lot0KkDZ|2l} zCh==sQ#|Llrm@>`GL;QE*_XL(l1k7m3_9y9K7^cgmMF-!b2Y$2*%KaPqo=MG+?^8b zshMl_I=r_8joUT|G!c(`zQ~f>vcmSew3GXU9VDQ$_q$sxh;0Bn0+#Z*gwCzz4_anF zIjeZwIa&{rJl5{1G&d({6#{l}Y2FLr{L6JzX(?GbdbpLTohQ z`@3M81k?~IjfU;zT%wxgD)l1k{gNkaa7*2)yR5H#EggK>W?@!avo4KG${s4)?4a=V zN`cmM)+^4^A8W0rq^?mo7eQ5y?s4#&CFD)KYE6i6-3Xy;N?7(`=e!n;27yL@a+i$L z$V%JtT_S_%JO7Gs*7@oE(Sd)nP^EhlG}>nWgV7g2@Mk7IhttmBV&2{#?fjNcY=883 zLNA807(5;Id>7A(CzrmDnJFU*f6+@b#WPMM8!3*WB;Jd+uQ5JfGM2oByL2}txN9dU z2HYGxbtOfJ+!aV{!+pmv7Y=DV_9JC)>dO1sG|_E>a)XAKnU?~+tCdTEF8C;S^KSw1(qVT$5<~uu zP?u8uESk6D1vRSI#21e1;@u7!R{3JX?_U2gQaxhQdrl(h=P&j54Ji)yWz9JM*oOqK zZo^=K#{BFy;w$a7WZzY-V|=6B*_4doUP#eN=TSNqub2TG6Y$_U(=jz_M~?`o z4DeX(|22tfB||wf!M$Xb`T{zez`QR6o0PSAIhtAf;MG(`efilfFIb`@aiV&k+mCsVmK&o0wI<7L6$|ou%n%ZI(Rcr0(=-ZoL zIGo=qHvN&V(Dv15oxm8&GBpM|)TncWJFT8^A%(|uXHh7Y*oc8!T&0FO%F9%d@L&Xhew@I@_lIy&)fHXwZr86z zh#IxtPS>Nz;gbJyJ+dokDD{Q>1DzZDgp`5BWyRaXrkMN-?AcWUfKeDa}=P>0jf<>4~NCA&@+$$9#M=&Bxx{A z1kIeHSFj#oOY3T>jM_gnorW_HtK1r#7v#|`PS+9Ki~(NIM_&^hkxSBy@HbXBQ*@A^ zc2{UP&?bmUzGdo*TxN{#!GfJfkoPM-?}g!Si9^ycJ#kiS#kG{G`1j2kK0^9_ zJQ*XUSl&i|5~u%n#0PsIzJ8rP4o=Jm2&=E5g#hP#vm6n=FrIctw0m zmdkD>jX*tFBXIQC4<*RU``MgO)4KZS9kD}Rg$1;{1yrrKxR!l7nCcKe{7Bp(PBsXe z*SA(W#5V|(N3z3SB|AsmOL8~kEH;%!SlecO^I-!ZS1Udn9XHZ!WGfNcSm*ZW(AR+= zWF;SoxQYP%l+%R11WAs{A9??X_fN{dfU`aDAi4aH%?6LCFwVRdlRJxD=6=_t(feKL zFuG6lU*$kc{lwqJV+ped_RnAM#Qs!`u2UTh*-%(Bg3S7g!#&9|oiToVbR|`p->~peui?U4?E7ncq<+YiZKG! z{LMaW5?wU7Y>UZ1lmV+T+KkffzKw>7xPI5srgq`U6yKA}7QbHt9KHN&MC8SxdbsY-F3hB}}?>nM0~Whvm9!UZ`~op(vH zRV;+qEQCjBpWsz1p<8hS-Y@tVIQnUhS#tOTg72(>j~m>*mP$}m6C^q_g|Dns3It8n z1gX0cq z+?_me^xtTEi}HK79b$t)P(1z|E*sWsbFTqq(Q8s+f_0r^m1|tTGOnwBxgESg@VI^j zm*51>(es-6Eu7P=Fx9cDz}2at)K;~tPYx6lwYHvJW%70x@Y+gtHQB=jt5XW9tz^|? zP?#fdZ3U|qb$(s&+S*kWn$ZDxZPm`KOK_T*Gh1D{dLu$y7b=-5)z_14J9D+DvGyGL za`_w>J>-O9f{rZV7`*dl(@Bz_O(4Um_$h$W%73N6>WpnamT`7_Ipt`@s$Y}ZFU?r) z$Bgf+k%s6dcmeO@?Q-^UuLDaSj-YCnPbL$UUaeI>xz!c)lUqGTzw*-GfCxEbD$$T$ z$#be$`E0I;%Ww5_?uuSmGfs^ikFNRf1&m4^N~0#T^0=;-liXFJv3lMhx-O(Z%Fa4i z@s#6l$Kash5K{b;giM9lfpN;2`-JFhqGqSj)fvT8zRS%-roL(G1!i3y?wMQ-2uanW zKYGb%A&I*FRh<1@ADD`EeTLHh0~Hfb4a#+%78Tv=qt)VHMwuv*YKeYSSKd2?UiapB zzuJuX|4t35?8eXkB-;LU>IW|6h~$Q?VdBdG)7P!xWmnX3ntd6gqdzgHyZBn~@dZPF z7r)1+zI^&OU%+Iu*#>L(9$)2N>_Q97Km8g#DmUrWo#M;CBG{h;)9Ogdo=BLo+m*`E zkH0VTM{@Zth;q8av2)}1_);H~f*`Rkj6c_LUcJY+P7fb#o%SBzeFqx|tG>tA32s^E}t9ckP0ChipIqVopwuSt@ie|0>=8FaIHPs^mU5un0D_Rr*ORv`vlKV^)dB{@fSD9_NX-x+X2p- ze7$R&HgG&x;)QOJ=&|tq@FEp;`EYkNxbkBodhzs}wRYEYqm#ev407(NKg$8x8okcI zDDc;gz(^&mMiw0nSYvk&IJDiH2ty}=`4nC7aWygew>rQ1O-@%8fMFL;11*>ogqzds z%Xt&NN~hnB4w>hs*3>Zqa*9{q54#m@t(*+#_+#-+Y1R7Zqq76v>M1UHODZTXdJ8a= zaN=`=zAR>vNkO5J>GxaG>O_#;3l;jI=)5H*SaIW9>iFJvqJYFv@iKl$>Wh(q=N#O| zkAWI^zk@d`@s&03LEJpzB=G7Qu(%NT{k} zmLCi477cRSSp%OibOyabn(H>49a!^S7YDWuK(8vIc+9@LxTh_iPw9Fc)TmzP1K^#KEWY9&*+>xFtVU zgI_ZETqRS>>~RD0ZUpeC27SW8nNE2A5?uBekr{lK6>SRqrX39%XVIO*!K`3Fu^*qmEEq_)y( z)$2+flTM`qhyT0Ohca~-<{yo|Gpst?L#*hV=CqZS8|CCGoBqoCe*Z`M%XvPYNw6TuahzwR5A zK6C1I;yyE=a`bkbekJQoIC--*xk3uuwl&sEhHkPE4&Wd=OsrQ(SdP&?crHVI$i^q; z*)~2E*V(+9!J z0}a{Y_eN01f!03hnkjxS2UKrf201q5@ouZV(|X&Wa0@H+wySPsQ12BXJ$wPTd2pWx z=N!1hg9kjg-+{Y4Sp8Os3_5VygI9a7nhR+M9;_B4>=6g<@!<6yyv~7pJ$TH6OAeg# z;GG^k?!bM3mF5Iq6)SS!eu3$St}`lN%Ey~@2m_YfQj~upyTQ$OcE-1~2Ddib=%ekf zDSBi)$5v8mNKy06u(Md4uyh`Z4z4n9-SZ-6ceK}eQ|8?pJs@vk#Ry(jQ9(FD4XhkLy?|;=mZ4JatI_?3;8tY_k_+mR60QG2f2JA&9Ippq&#ckX- zthZD;#^H5V4=K%ksg{YndDD1RE!&(oXWqThCV3G`cwe+*$i8`mj?v-4Gdf0>2hZpj z%3q1h=oozB-?yzECXA?uqRdM3)@im#wY1w=*4I|+iY>qr3WW>S2{s@%c>NBxUNBcn{?Jw7f|6jX zJ>Iax8xzdckF)=h-nd}vJ>EKp$CfvD^OEwA$O3Odu$>-n+`%B%4HLqXumW#V?n&GV zn=)9e8(+XybLK+YPiMnI5VwBqw8MHDYkk$;q|5?7Z}g54gG=NV-}Zr>q!24C;L3`173pY^z?2s&Yw>O0vunUqz~by( z_FgwTUzK<&I&^vMd5oY={{Uh8@kjc!gIp3(mDz))6d#_uUJii3$-w5>!psL#qIFrl8f_>{u zv$xD6y0^C!XJ1CZfBJjfYaWkHKf4dV4o>;^x?cx9wa;}AvvxVVfra#%_qutrJH`JF z-uX?#mb%&tR#`7U>LuRq<^tCg_amhEqVwp&g;P8DcJQUPb=|_LX})P~hI8}vY4*sW zC;E7K6N|#fuqb@0D=fSZ75tOL{$%Q-K;eb^Jj!)-#*Gq1pXuKCWhiYHg_ zuW}`+Wb%k5EF$9!9l;`A1UFcS`Rr-ZCOxjEfRu3rqEIY}t910br_z})w_}0|5vLP~ zCD5!&hv~YjEYHhi;;iA&9;&hR@NkDE=aQbnZ3)!y@v)kWNW{Hk<`aX^N@C-dj=0YK zi(&qO+GKUgw95c4HOFtBmA-=Jca^GH^~v+R&;zY1o2Q=ST}4jnA|6+>j@D|?^-i&? zzx)+c%vHUXUdd>)Hc{I?e7kXps=UTl5`a(LIV0ojKG?<84y3CW-40A>J3HI7dH0;x z$P>WFac9geG6M^_gm%m3Y?Eqx9SLJUL4!1>Vn_L(nDk7kSly<$uik^xQZ-0H0W^kcWLp zlZD79WkgsL_8|E(>$N1r+tS;E{1>eE>PdK>zv98`Sv*dD2~TB{S$@i*Q9qV(m-&>H z$Y?X4qmcpBd~w!ke2zp3C<~&(En3ck9`+Xna@UOn*V%M#UYa*Tt9+=Gyurt9wv^&5 zMNX9uj+~e{kyGV_$U)fDP!RKirwA!Z{5m^zVnonHiS3GQL|D5t@*Ad+;0TH{b^M95 z5kXb*9DiaaIR1zUu~1352jbft2}V?fh`9P{+Jo5T_~{6WNf1HROdW@63953z@x-+V z4PNLqjs&$#-zZt8@_cY@D{hi-%<^e%g@~BCm;@12CBbnhCc$wi=7Qsp=R#T}1dfED zNO(k{UYaUX!!<=(D_u z1tEbCY%)IsgQ2Djl@X0|jEs_CGM?c^LX(8tN{|r~AL9fP99wvIEN};A2;7YV|e|7qW&H}J7vYttoe)U{4FZtS(8Qu4eOoF}S?2^B_wIPcZ zF}n9;)S9C+qfaO#gE!bv^3gIa_h%E&Ww4}=KKYIeCt>sNZOSH|&n6zq=6{?SEfe#R zqq*A-fG!#veF`LwOX(T*CA`L(KrCQ><~_dXWY*7)<_0qZWaupWd80c_{EUa^d1UP9 zOk&C|j0+hGxY|v=?zU{6qm(=p4n?ECdI#CPg9qk$Nn43C^e{)tplKAu4~oVs#QBePtE;_A2ywvvL`sEmi1aKy4SA0w4gZ0(scOQ~3PR zMqdyBYvLlfqm-(PCW>g+fmu@3iO`w%Wdrw^G8P%va z5z6T@AMob5EANl~fdHMF)fiD7NABo8uY1XP93soy>W1{g34eVdN&ra4oRZQ&)G zy$gc+IXdFZKp)m$hGy`DG=i}HLkz5sYWNT8FJlIXCh!zaU3U6{M&+RX3Y3*+G-3wz z??nTBKq^L9|K6@3zm3_f?k&|I*Rm(WvOfb~OF3+e!p4c9F$x-|g2u_9ac9UsMn>IG z7A15KL+2Rp69?Q9+p;_4ricUE!#{tTD6K2M z02QhMl|a+VrT}dQ#j6>u28HDuG^w*uE1abYB@Dfbt6EXJq#U56!K;U|Ex$HiB{0nJ zWc=QD1d01p7v^Hy+-|u{!SXIt(d{mjF@KW_g)cu5N8eq%dUpJpqpHIzWe$nc?}y-k z>bhljwsR6bzy#@WQX>x89mRV+Pcj$;bfmjwlXG#A+&C4>){2ITYZjqlan_e;id-fu z=PON#nOew$NLjQtw7V9}AeTrI~miTj60Bo#KI-qAE3Z3-JXt0|W?kj8r) z!mLc=J*YGPWN9}(g!%22Ls3h(nJjvh5FrQnc<3 z+Mf&a3o^n;{3>XPtakIi4BIDy(H9ny%Ftu9srxhS&jbmsn5N3H4UIlW$S;Q;Cgi?M z`|eDF8#~_H%*DwWLWIz=Ba>h$^=vLAIFxDG-VJKDWwe`&!^Ak3frKZ?CeXe!+rB4k zxf5eew*6q({-~mJD>Er%D7|8l68auV@JvVd&;)b%?l!C>At&#pc}Ap>p*_o@FnUmN zbt@3)WCJQ~uoSe62MJyl*WA1PCn&2zq!k2-y}BB=S*a>g*glCO*~J6ZVLSb&JB>=& z7Wb3xi_8F|J0NeBMZJFMY_kWk*>LFA5!FocOC`>Oo*N83LErvS^xe;~_3pHOqzRij zH>chopTDm?|2*_W7q>EE+E)VFJvPXfD$mNE=C{P@yu$$t-o<8y=uNM2dq;oWT-iHX zc22z~{!4SZZKO9?T2mWNRpjE!PdWzk`RkWFFXPWI`=hl6TY8z~2Wu@UGQ@=Z^0N=Tj;*|3zyskM%6#2{ zvRmh4*GD5=W<@DSH@xb3Hlt6$rLGy=UWC~H^zm+gCfh$x3-WiC-6qM6t%Ib;YQ^Qh z`4e_WO=@=tOD(Dy_NBTx9C|y`yXarP!H(km)_tpzIxh|>`@UFn0cf!7i7`tFGraV5 z?BHRM>5=Z2rYvoQ!98{>$k$=MQJ#!$T-5poaGNq)Pi^+VSpvQpU^Bp!2Ocfp+W@8j zy2Qxl6aZ}irlq$CU*u`}dmd-hN(h}?>@xDy))Nal{Vf*F+DmxIqh@*_5 zod_SlGO`+t-mFu>%QmZozWwPu^s*=eYE$yr05!&OK>ox*rCM{IGd!-}ALiVv*145X^{tY=)rmYiD}N!# z=w9wHzr&u7v!#q1TkjRPh4WH6dO-p|HMD(4%fQ+L{w%epz+%{J@A}q9DhV+K)xFEa z+UH=igvSIxSLP`!$0$xp7+fl}By@fFA;Rs-st%sDPusd&^3_-$l5>tWu-!%&BSU@zX3dF@uvKD-^&vMQAhbVv94VG`Xi!JnB+a6f$Jb#>7KE{w5l)Nuqg?LM#t z#hH^+j^5bO6FY*~k&Yd%wZ?s;+=-S{)4P7>e7svMo^juUnwDlV+AdPL??IT;#DUkR z*+-sI%kZbE-ehr>{#f@s1Vz;(lI1lH_(eo_mEJRAc`!La2D^bzug@f^k*%0PZG(@FjTp2_-BQFCm>fJn(jGP{Z#Ye zakyr83)t6Pt|pWw$q>R*_FZMy(Q3w;#vdYfCX|Q7kLBU^)7DHFL12YaPX0XFUXG_-^?k?f( zbWjPSl0ml#I^l7-_^C}iY3FUZRd!roDb#aEsX<2todj2>cGfF8rysi%#Kq^$d;@f& z1e>BQxd~l|E|v%F=va=sVZGzJj!gy%BJCbaV58L%t2CccO{m6j|BX7Sx}#v00WckH z6e9#v^5DH+Zc&c=9Jxg=?u^_b5H}0YE?vP?^MQqP3U;|8#iCMouKu+I*B`x+uI~gx zbY0m5g8JdjREt=Uf(q{PhnH!Un9(D!@2b{bzV9y1(x^c`C;!C0#6Y?NKmND!3%>`y z?!!}gShK6(b;u7T6MQisGkv+ySM$|KvEr->VwWLqv|4$0@m&U&vXcYul$Oyw^(xai zfHQr>%&p!A{h16mT~VhwvEzrnv3*9jm(6hxYjtkVw!@)CTK-&RJAf2Oa&?M<8tU2; zw|RLwRP~BHK)5cQPr)Bz4&wF6u9UO=uFmZY-3l762Cc@KZ69?}Myl|&2H)1XJ%ijO z$~yeYWIf+-{*u-X#h^i3jHeYcW-$&q_;?k*)5l1=kO{m(kMzZm`)`O}iJy-kVV&tv zqoo;pMsRSk$j4KcChu{FZFOf(KR##r)Og-R;X%H!br9s(KnF&}bmcUh*ak|7>zkx| zo(aEfs%pTh1bv`RBrWa${T}}R1niG=2=wtfb*mD2WeSVa1a0R3FM|5T>8dbv@^Pk6 zjB7C3`-{VesfkK^&^3&MB&d#_Gp1CUf`TNZKqs)j8mOvPpjhPs2djaqZ3Rl4xj@x7 z1G?C*`c~jbC2*t~s7hDh+Df2RyNjusSD+-DOSV*vsmfQNB$NwO3s8qOK~KhN26{27 z?xT*$6>H4 zAPPcNkSd6%2%&6AcUHTww3H<++nt6b1wW9sKz`5Hx$pPPB-GF6@qIkLfBhccJ|4~7 z_r2$yd+xdCo_p@On?>Gc`>k1_!4<~npdprw)dJLmE?ml&M6Xnl>&4-8nlqSIb-y}1 z&UZ$0A~_QM(P=u;yR*ht9TlRDPG5S!)qqAen*cL zcEc=uT6GZJf~nxwl0he&WRDV6z#aGLECLEz6&r*`MVWR~#%V!DmLRXQW59+uTF4;4 zX##8x0BuUp!iUvrno6+3#R3tk49&{W8f0h@<~csY8UC6fE3}Y-0oQshFOIaRg(k3F zhoz+CzR&A{;YFc>*N7vyBy&8nv=UT}=b!?OlvZ8xWC*ko%I^S8PIy@aigs==Oz!)p z*eJs6F3Au{0E->bCj49*IZwZb(3Bd&EOI}ZQz!tMZ$x+?-H!;obVB2V_Z#>9NErkW zz%B@24Zy=LR1~;tlHkOXh_9pwe@_4}pa6Gg03Q{6T<`)4@OK690t(<)2Jo~RBOP^B zz9!`pu<~VYD?A#ys+ezGkdN2y&R`Kee2ayA0vh}#3m6Q1(Az8+xeiFTA6K%-?<~uC z2lJi(zxto?xrMbYbwLlkPfhwAZ(2Nunc=FQmxek6Lj}cEQ`aqENAh4BNrEHjlQs&zcHDa$}I&Pdew?P>-0}0%5kjXwWiE)A>So4 zldABxvEH3zhXhKXjS}PK9FV>gHvy#LcGahr2{KcwC82`QqIY~8hWgX06M*34^+2k^ zVL)5Fw|<5o(24HMISU;(Fc{S=%e;Q6%~b500p>?%Z>d{MHxxsRt8it&JEXY0^I7{ zc$&;Sb}UQ#RExy{d|e#UoV!$V5Xwv7irv9}*ST*El9y@g{-3=3KY2Ojf0CEVkunl^ z35Q?x`5XDwoTpj8>LmQ4Kr~0~(cpmjq*wLitEc2q0yJ7SR+mNk zSLAepTIPrQ?iz&BFH2ToanZB%Qk8t0d+$l#&Q6KS?*EFA^r-}OJpeQm-@~^OXW$ zxJSJ~6sMX!iecjJOQ04Ze6u)anN|^nPY#ce`1ojO@skTcT$@n>z}Lp7oaKS&uDPNc61Fi(0WBDi3+c3vD^qYl+nX%f;^` zHi}!J$<^xHOrrJMBm((u4t`sLU-c!$&k26pg5P<;?|gpc46c-Knb#q`UWxC59*Lxn zL0u@SOu**Y=6(z>`VWWGJ#Isxr>m1yAS{MJ&_1d%h^iyF&q0_(fhu|UAsymnzkvc$sx{Fe-)2=l@n0r zrpF*dwLWAEOYsN8n!6LpYFW0pPC#YyMS*l1p5)_@V9#G?s7cs&p~;GgtS*D;);z`Q zjGOHx4NX;>HBD_1PXUz-Co^xvxvO3>tXM#pR$+!EGjHmE1zMq1HD>;0Ld`Tw5-m`= z$sCfBnOEf|l~k)!@;0QTI(f)#cBi#ob730S#u(1ZdLy=NW~n^2lJg|65^}-LQz3A` zEII}+d1)FmoPeO47oYrCKr9$FwUK43DU14qrYhz#(hOvb-u>R9gLn zeWI$g`iauWcB8V%Q$VvOnNC9UN|gY2sJe9@y^l!-RRA3#iBrY}MmSR~plf+T_Zo8m z%i5H*X>SDQtf<&J(sk9kXP5T0-bn2IF5hQgH zY%GTZ-k;uB&g%f)YuczDfj8XB!G%jX(sd@yR7@hQwr7%fulFk-!ek@#jmFC#OJsUk zo3`SuINI%I^OwfUH;A}Ci{&Zr+l)y_KytX`X;0)SK7mIOyy$r}f|BS3P_2TRlbrCZ zi1mE&(pQ8I1W*#(rs``>uHOkyiF@Ljs&8DUme#rXwOSHywS)res1U2(DT*Ys#WDiP zwJCj2#*J3SvOuW35c687c5_I&78n@sl=B;(@RZmt$z=luFd|6utIWX4$tOuP`(0IK z@y*MpZ7%jA8o+i1u#&OFgbf1pa(SHzWn+eo5{6VFA*2!?#0xmdqDuC%xHvI^Vs7(& zj)idO=mAvS&?JEjCS{C~eUb=xB589it8L5g$eK4f2^i=V%$Z&FE#WOwYj=i=V5E2t ztzM&*AQ0i#vGn474GoP;7Y$EvfVr42+)u|k6${FP3H4%M?6R= zI)+04U%ZPwfkuS9e$_D-9N499t*X;_OT-()huuFdPSGLnv0wVQ#dF%%zG*1?_L+a@&V&7rS}<93S~Ok-X%NA*{?CL~6E^1s?$SM7i9AEp#F2g_S~zr;A9O zFbq@L6psX3p?VLUv0fmcko}lqevi(L6Z{^Jb>N#+LDJOPeQiAy`%!K$f#5fg9jn^P z%hhJTclin<^$Yk8XoDcl2~>4oiV9w(bZA^>`S2_ATP!juHv-}#Ai3ED>G-hxtwlIL zgBNI@f%NtVA&llx@hY%1qqI6MK65qE%o1aDz(nYtxWb%Hq_Fam*!Kk-P|OL6KvNBxjQf1E@lY&}~5M^#i_AQQCO*NpfG*eF$UVRROrcc<|}~d|#I8 z5qASH*qQ*=06c7+q9CPNFQ&8z-UAtYG=MiC4<8TUTLq7!G;L}nAbnZ@Z$KWt$>7uD z+hA;bKi`tlA@(55jvh@EkdeGl@Q3uB1D-4!!PO0N*868E+SYgv-D@qN<=PyPRSz5 zlG#f83J_}ph_!-vRuI0nvslm-sNQ2YeogaVO_1^~ul_vb-=C*rwvhk?1 zyce&fKHyQ#_&8RL7=5X#$P(HrB!|MqJn6n5X|rW%R+j9sLPHg37)5yCZsORP$q%So z1y{>qK<;$%sHqPvrg(t^`vPSRW#@$zs_iqXttWa`z~mxB$@PP(v*MA0ODsA zD+U-}HG#JeE#k<>0H?@cZ1(idqFtm}EO!a3fm$oHo=oZyK&Z(@vuDBrvVpa=O6*zX zDZpLtk$JWVB*?SL7!staI;}O{jbI!WBO()0HY{N1ku5o{U#su(odhkQAaEk$aef&~ z00Yq;d=v!@#u@D*nZ$1+9fQSejcOLq{_QGK2Z`8frHV@BtzpY@;;@sW@q_SJ>kRd@ zfRtuW3cT3Bxib9KOeB32ZH@Y+56H730uz~&M{8%ZyxGaj#T7~)O?;S#^h(8564#iy zuu2~67H|=d$2eS#n?-jx86Wv|LE5ZnGV^(T#;u48XagoImW@02h;Op^%kgxdWawM$ z`&7`JWN7Eu_i<6a4egD5Co`XmXMFaB_IXkT-<8SCan{70#A%ZoafV_g-}Gztu7M*` z?VWJ=dgYTF4x|{%A16%e&`RXflXHU6VoAv{qw z7g9YX2*A-o&9KuuJowPni(x-|Cg{RJsv5Ofib*cF5~wGI13C0KLiZSvQHvDOm~Tso zuv{uQ^q3I`V|{r#XA_k)$A?djlHo;-4f824bc-QJp%2b{Vs7t8aJ@VhFU()#?7(Yc z9D>1YU}PJ6mz)%pGDL0nBC&i|>H82GJ&11xI(Z1gkbOTV5S#9Uti>a{6uX9v@R=2f z&TwWes2VafW)>@Nh4PYNjxr=c-fU@1)KQ^Ci6C;+S?pRYbJ0ec%#k21DilO5AgXqt zvD~f}pT~#(HSW&KYTjx|;%9LPjm&#WZc#RNqsj`>zeXJ@?@A6&(#?oo=wq1yV1N|t zoPu$KBbWR#i26)cz0m^>PomH?E32*Tm1zhMtQ!?QC&+5?8E?=G%F3ioRv^|uMUb^p zzhrF-vRXV@74NeOx(%XLkZP~*DpFM`qGZ{KTt$VmCn41AADYA3dm}>`#24YHQ3k&2 z^h<{M0RI{?Yw#bz(PC+YjH@JatQ;+7bXn2=fICc?7CJ%NNLB< z>1x`IpImyBeskxO1@3@s?)EGB8~JI1dw~6ZU2ZT}`DKyx*NMwzuc9`xu0(QXC2t>h z_YaTX$ji(-g)cJ)I68hg8ps)Ij7aTO$3A4RU8B9c_kbk!py$iGZzDj-%)9T`M=saI z57V*#tjGngQ7bi|IyW4dxgn98G!V;OT%O3R26Wb6`yq{CJlR54wCBsA?%fTM;O|*Hvjg zGsWI!&NArhecdp(k!Uj71(yuGDL|7aPw!o}i&42%r{1>=Lbs`zIQIm3{upR%NoO`=JR ztDa$^gieVjd?cE*hl!GBC7N85C{Zoslq4z9B#K0n+AwDsl~3cn{2AG}YLm^aXqpA1D`1 zWJS70Jh^HuhZt^7Cm(_L$s+Cw?;ao!K$L~Z$^sk}K7zaVE#fvacdfXp0HP*@hz1bR z5Qo@d7PgP@A}hk0!z`+`2x}!mkZtzMq4-7D%27}S0tDTl*SpA5{-$auL26fzO?3sbNLNF~6u z%W6_*kv&94CbVj{f3M92A`|8?0|va$Qsz_%mpBbXIKf~_N2E>fC_ulF33Zk(s~>a~ zhEB5%&{Y{a@l^#WXA@zgM7*^bB9WT=g2sS7uUkckf8ao9!rTj#iE@=enIqNsPSse| zq4`xEnqSqS`Bfd7U)7=cRUMjN)uH(XnrTA0gV*zN*%1_4pKHGorj%MSBX(NbU(b=W zo^n|>J;TNwQvr7l*NDEY7^py=^!)4(88i%>0RuS)AX6gXqQgMFI)o zt`-DFi+Z^Z6QDqlOlV}FawBX*+~$VN#cH6A4u@E|vF!fF3^DT9tWW zb$|D^11GG?jc7woJDNzYeY8T&sl&j7jj8!b%(y4e*7)#;%({%h zugo>$uOqc_MqhnyQaJ^7^3|ZJMrwRZjO;P6))Q~Mn6V`WV_&sMK{PiiW=rN~|K1LM zIn5fCMX61sCNp#dP$t;_fn$XQ+dg@UTlEON>c)}E5x6zjh8J7gPwUhvK@?FoD;v0C z)^3Y+_l#7us?olwynEAdUa5~o?%QYWHbsjviylF=P$*lIPrD{e8y2Kl2Ak?^e!J_gtgFWjSn#zLmWuhWWW!z z;M9PN{R`UKE{5DS*uG2Ep&50~We7R_Da7bq4lc~v$p3ZvcuiLA2)>?VgyCfB`K$G@ zjt?TvUpvghS_-CdNlJN;0_geA@Ua0OZ?DYVXEyNhrUI{`Z0gJHtVMFC3SLUCdY>85 zp*xX|le+hqJ_1k3-g=9#Zh*&PHgus*ECtVC@3CeTKNXp9Y)|~CE?6`BE^Z-6W*^YR zH^%%Rm@UL>x5e964AZR)u#CRzL!1t_&}yfEHv*9aUA~aSM%yJALB~Cx9D|GUBGx{9 z44{=*5**`?A9Mn@9d#wWIj0;l=aT$tgjF_`;A1sgQ*5k#dqt$Q_0-us93U)&zgigOrvbOWq2_M$`27Js(VO^CUBZ-!8`<6OmB@~E7le@GU+jIPivg=Y4K%(!`RNdv z1zepZ?|ds?<}9DD0RQA6Z&QGO1^2xOP>bpw0O++u59&(7eI?=klCXM+{weS1lCU~T z7+)ELbrXab>F(NzCtSzCp_1po=Y7s!_E4?546S+AFYk%e8^LPNfge7O=fI6wPvT?@ zleEW0UC`ag)pFwGRp3ivpZ1W?ESSY-4So+?(53HzcLJz=wH5Fro_okPnp(e+dsWKD z3~rIwCP>;)FEOhr2-f6Hx?sjUBJ_{m%-8?g0_tP#j5WUdD6jj>B>#S0a1(m}Uk@mA zzkhp})wB%&e?j_2MPCy{s}vvoxT0qh&2?Bin9Cp>RlvfST^9i9FBhnNd(md%{CzEB z-k@&(8{zq5FkK=CT6>v~xTN07ELQ5DnA93?$KKaVi?1jul3t;NtP(gqe@>q{m-X;2 zx6ZP0sJ*{Da@E)2wy)2&dsLrysC|ZIz^-_1Z%0hDh$J!^-p~Zj_-lRe1FRUNLo3~%%MaU^~gM{y; z{cnsST>_$i1;GhLjPjzE5XhQ3X0;+p<*ii2#50|Kn#0C!?z>`&s5R0y#27YLxzjl7 zY`ZA)wjQ9qu>ZYs@OwxW1mUV1V^OS~Y;~XfUH-~IAF@UKS7K#vm|K;)^ z{si+V5UzULZKSuQ>{!ub}VTo5(j;`wZX^EMfWXf7zip zUi>O7e@4E;|Bco8yMgkuuTns30rE;hFn-UG|3nkp{ftsPJB>`%EoX?eAg#VX$6b7L;Q9uDVx= z#V+c;z}*Q)R>mT`U#(uEn8u1k?ooXt za`$VeSF@XqH}-=bLB$CgZ@fx?isVj)?M~DSOZGMDCiMq`Mk(V|UUH$!Z>S z-U*jb(jLhQ3UbLshIaNJ1ADI>;Vs8AF*AMyIyrLX33!0$qaq5gW{0&LN>Nq;iuzcV zJXz86YP;hpJXQI_iIUVw5Z&jPe-?dlOY#%I7D}9?ceh=5`S&VC(&RQww09XpTJsL` zHt1-uy)1tVeK)f#xa+1c7?r4p_x?ne{vo8~SM+-lL}XZ+`~A)oHA*QZT{izkyLr^K zrgzcAI^&dP>&5zI{OR5}!apaxeyOty30t$N&k8T#BZ3obF0_GQ2ljKF$e`16DjQ}_Cp z^}z5lOW#fDJSKdM@aA^C=K=Wq`ba%6ye^D;S#hh0i)UtroWV07P-66T|9R*Kv&Hp%E8!_73^TK;GkjWhWo9X~7_J$?WR!?aLz<}A}4qCB& zfYEATpfA!r9BUA*H{s-uX+V6@ofR zXQ>0vp-z=9_BXF-4=sVPNeAB2Hq}#a3GW{O?F5jX?VU%02Hdik`2h8(p>`p$Nq@$Q zNx8j_esHdGN{#3xcr=N<2G7L=xxLn)Nk(yfC7R`H<&C+!_K|i;gD9MauQ_Xoo?%{qjwF?Yjg!iKFecS{$vLO|!}03$~eD4>;3h$++53~o^b z3qN5ILcM?@v^(ZT`^5#pubU)IgVq!iL>ZLdaL>*FhL#yxTNy$`6x2epO2G9T&N83p zf>Tu~Dw{!ggX;u65t``>KY6Rj>;5S%Rw&cBbwlOYkXyO?=Fv>RYN6IR*68!m4mPZd ze^j)Y93fR+JT5f6j5pfV$WCkD#Bsg3`Lb=Jg@*8c-&~^&rYPR&HkhGNa~esLxts=2 zKfd`z5qfBR?lOshHGsHO7Z&V>tIUc2J^SuBCpKD9%X|EBVBi6*EhpI-bdRyZ>-xuj zt2@@>iV1{IR7>;!v|9yw&41#fJ}k|D_zgZR%|G=KAC~5S_j(_$a%VzRBW{QVVC^Ja z7GqRWbE#|Qf6Eve);BwH>+J`?RUY8Vef=GR>IDgVnXBpVBxJ6dgZ|Kh#f1L&gykcp zI=kKQO!xco+k0;g-qd;dS4vlkFb7zxA7!hYfyzYtVSv{#IPuWIN$TXoen}JMtKbxnw^n^WXOxEMd8^77`m9 zcwTDzFl1Z$jDDin0dL~f;|EgKSom?cFQZzLaf7{pdM9 z2cB)1_^;F#C;-H|>bU%6hME@z699P3K+S$Zoy~eB*LcPwe|bX3351+p3IQ}o8PyR0 z7hFf?wNfHF`!{?8@j`OOo6?e&e}Y{;sbDhlmsj<4o|r(mH#z(^Lz(0;X^)z{$+=XN z_XF3(XM7O^UFB*6{ibAQ>i~zeIE1kUx>gde>3f|L zb4S+LHe3M03%IuoJe#Y(0+#e)u}1!~L`Ok{P^LhJg^X_DVoJIdTs_3IMGtWcK70}P z5RJ)l=s@c7`rL(F7yDsi!i##ytEOWhHC0iJ?%ZtKIOFMh6!D?dl-p-K^K^b6{&A7A zaEcF_*c~PvlChfj2I&2hX&9?NvCa$19l zm3P(88@42PWiGrAhD%&qq>x=q_7|^!xOrnS%v8rKOorFHDgW9&aFh(J z$hAp}+UoA@l9}R7u_oe@*#`D{Gg)~-PQ^Ev916j=1fBcd_~uxrijer?*}Ums?oEFgpX_U?N^{yHh` z%r>_aNc)mZx%osA+`D6glDEWU1C+T_EtxvQ$1QG^l5@8%2ys<-T&^x4#UuHXL2Wwy3pLR=qJv$=Dxlwa-XbYiCt(NFPU$x`?7m>v=^9vBJTN{`4jrX zf(hK7)N$y5RIAeNT5Xoz5VXbp54a`A02k~0ITc?dG<3Ks!X6#^=}69Fq8AAaB~JZ$ z(0DNSts6n0JJoX-AMxx7xKy6tvTZ466L9zN`KoK`b8@3ed&;8`G9&M9wba>11l06} zRD>i!?DzgmrJi3ER7%B#ys~RZ=F1Uxk4IeP5sSr>eX)1wUJ+?^DJFb?DnN2{^?ni* z?^Du+_7V(;?l!x`ol_|(qY2l$Qw8Y7=0t*$XWb02)inTvjup%|i!fg)2FDkJ`zlCj z6%f*>VXUOI8n^v3VQG(G>6W?P&lZa8A=v&-`D{8-+C1-e#B5OhsC%%OU&fcavzUKD zY5r+q1Faezl)uhhQp|s#^8cWizd6hw@@V}dZ32mtC6q_Qw%&a`1XU4rKJt+&0qp{ z{9>@97`&KZ*evVa%wo>(7hz5!C`z!HttOL;P)8J@Y7A3P0P}f+LBnpv!<9BMBydfz z(GAl$G9fv>*=?7!F@xqLP(Kpodbzfyk!@#(XnzYc4Xg>elS>^~)FKS+dG~&+A2i;; zuVdptquibA__E4K1G!tlB{b3SDVweC8bx`*9an-9q2A&ac$B7?^4Ee1f61rrJ3fSI zI+sd+rtn-4BX|vcGQSBMxNzUGdfHI^^fUYxZtPQjCTe+@-+TO3y5YZeUwjERgr;`m zOkjnpnzd_Ld;f^k5$zAkycv<&LvvV+SuW)+$Y1+|3rH(Vy=F`ZlZ*Cr_P9#-{ErOL z?EB-{<0@PRwDCnp?)AsYXKLQODE>hCeQ%%k(e;aF#}BKB9~K`SAM<$pfr^7qzwnUr zw_ij=MSRTa_@d?055N6_)8<#k51Ur0Z7E|`%GCPs1-7I_=6w%)1=N-9%Z7UAldgaI z?pjD{PHwL{4frTwfB|VR+-5a@ed(&u`aJ3h#xk&GR|Wq1+p`b z6P>p`+IX#s@4^8*+hlA<%hln#u(#yykSW^JGIhX?W1R7+D)x+6GhhlMSjlt zxfQaBLgI`5Z}ReRjb^OEiNJ%8~yf~^|vlrBxL8lV_jHo&lGn7 zo><|{LCNkj2S^n)65|cuZSJeET@%B{&D)W8S03#BuT3B=+{rqY6OgY=M>5z`2v7 z0kUko%2gJChL>WpCvDfe$ImTD?!Y;_a(xmia`w0WkL0$f1oUiA_vWM3rXu7Ks$7Z9be3(|b!{eV*9x&5Q@?pMdebJ;4Wa)&?d7nj?FNgN*ascc_UHVkpi zg{`2_n%n-A^6J(CW!!`fF}S?#a)0E;E(3L$dpZDaHQ;{)z*a2IFRm(jTb{6Ka)L~Q zuy}hTaV3-aClwv$7V*Le6xKg~XR-gE{N9y8ipF>gAytU{IZrt>I~LRIsob6JQ& z)$^v~%^>7>I%RXsyoP~!)7j@6aaRA9)Jn1v$+HNMZhG6vFp#!2!NQ@NL-vq-(zm%c&GcjD%|3y@S0Vpyx-Wsu zu}(SM-BLh&39`H{poC=Z_ifTR%p5aJgz=h}xm!XgTc(+2bihatw8>pz<%kaVFZ8RQ z6dR4(+>8PZZk?r}qC@(pkmj92?jcLVIUN-24zV=+I2+vp>1?ruCIWtwi;xyN74ojT zDoBROz-@MY*p?&*n12^0qu*7UTOB4F^7b&K@09?=l%FAu;pZqYW& zE)F;jMDCk>AWoug$G&$rD)1D!OF_-9&%@%m_BJbx+jHz!zHQA2Vvz}l18{x?ugnv^ zP+Nu1uaXj&2b^N66jP&+j)9yXRVb>^G=D$__*xXM}P>+5Y-Ya?rJOzdJlpzL*EsSs#ig%6SW}XH0$W z?DFGshwfv065_c-M@hkmszm0Uc;;h07R-raoP2uxjE&`feW`~%_g@c@2HWJCGt z&E>0T_JnVj+}C1aex@(B+PVMOi}s>D(1x7&baS@tQAQnfHsznl4_n_+Y3yX>7%Eep zt*~lF4SV31sUhy15B=EvV6Y-H9ZHr;ZC#P%M-x+!2r6$#6f zwav1=%URM{|0LHF#IyZ&61bJ|U3Se*t#Z8xS7PEvk&gEm(&}M$i>D&i{?15uEi+jE z>Dr6IImO@)i^01 zeGLfp3eE^D8&}?C?2l!ZW*p2%&ko^!{kWb|_REXm*1hr0ZUw)+5kin}CMF!J#)v7&yjehcKj!~5OsoB9(Io{5z&jkUkl z&tN(_a^>q}(pPO4N1(b!$5)Jyo-V7O*z@Ce@+%Fa+5T;c<)3V?W(9(!D7}?6bP_)H z*RbU3hdpqsfMq+k@#|Uk)~^o0_;%MX9mL${h;?&=xPZBf7578p@~8Z(lz)wtMVr?( zHv4gWKR_`5tAb%NxA$vmny&<@AHUCDm4<4R9DMZb4LlZn*(BsyI+0r9hqjoUchha6 zvBfp=POjqfT64}G^|_xOZ1vGx!2R~cz`F8VVJ+^m_k9aJ%PgcYtLR@?Z0d_4rP!v0 zrq&vU5Lh!;ez1MOTlzN%jYfIzgoJT3F*zDDuVaW!?7N)tCQrW|?e;m1xdASjeEagj zhFC1H#9~ELj3A3V+2dhF;EN;^@-bZiWz_t`>vR0W?1cG6F49CflRPu z`5R`1T??CJg?%43VukIpe3aQ>XY(2B)Tr~Y{%ADBzscaKR@o4#3U%wlf6r5DWl$vB_N;O}}gHEfnOP{7R#WTlqRr;!A?K*KdGX?+J zPVrr)jOKp@|0_B5%o!4#JBhg~$||TDQ~RRJ#2$L}8K>z0Qihv|>>W{a7mQ=j`-C`r zgj1UGOqB7FM#0d>YBC4UMu?dWjDLK_Xc7k1w8d#)g@0RO?aO!Kl;c_lJ2NixxUn;q zSrz+mUH!N&vqv)B8e#D~ZDCETWRTq!kQ-y(6w9m=W6#)4BbAwr`@YZc%Ki&73;Tvy+*a@>wtM*l-UMJ|P+Tb;=PVj3^HL{cEelm=H9_e^hs=YATPXB^4RKa|a%vdNN7G{#AQ}6uW>G1J( zZx?ZL&sov|PCv!8{9>e`A z^mDo@PH%Vlw$Gp@0?!MBPm?_1fY{_OQ-46e)&l+$phPBhARm5O$kbPRFg%{SOmCD- zh4Xz>wcsB@41*mwE9&>L;UJ!q2X7Ob5uPjWYwzh-$G!4Y%vi!yfwfM=XY{d|u{*~m zcKx_7KZ&HG|4!@jQdIdfamSWS-uJpL-27WIb-&_%Y6?)3v8=@5lK;s&!Tdj&y`%zW zxYzdlgm?4?A|1bBw?cld-?G4X7A)QDXsG$^FHrIOQ$+q(>_rUrAC!^ zC;nxBX1Zd*_!wJJKjI@1mVb#h569<{{4vWP1ERLnAMvOA{#~X1@%A8=l`RlFy2VL+`ukq&7HTdA7%G`s8E8XubRFF!|rS7=Ic4EkD~yo56&yDOKe?HhnDB zDeDk#7W~v+{2nj)yF=XrH9)zmAJM+Sr6&1VL&=yOt%|RRIw^Z|RKWi6n!4H^!f*Vi z_7JkS%Cgu7Ym)0oWvyZ$l3uQ%k*@Iatr|(!yXEDgd4)kgZr!Qdo!-l+iGd;`?72dB zy!2-f6{SD9Z$DJr%=iT(YQ4Kdk4Str_`;HK%vy zjo!0tKKCWr$_ko!y}RObzL4jsQTyBFvo|H?F4M5oIPrB3RG4oNnss1-Ns8?RWJ!LN zn{$BAwm{k7c)3by?~g`0D#@cW+e|-op9f9WQ2RkLd&c-ClOsKb8ck&OAJ1;>dfwfp zjkW!*Y(@Kx{KeLRufJcwkK0=fO}TaMkl$<{=$%>6XR*#7lfLME{(!o+R0aL)r!+Ox zm${w(4rf6wVKli}eoKh%#hVpkYS^hkmA$0HY#&o3E&Dxk?X~>%(mV-la-H-(AU(d- zO^P5YP*me463XY%iW+|<#pFS`@47oVyuLwSh(J%w#ebu}E;4ZXi~H_P+nHv2(OnCW zIzwIlKwE-We+tQ_cKH}2CMdJglXTCubpP){kK(Fb_etRvt6!2Jhsx2U<&Pp$QC}PL znFO9;4>4=~EJmS={uPo}LjMUu|Kwkxmi;I@(5JPe2maZClKTCc90jWL*D~xvy49-I z_B&f6C}aL%(o41vvA-xc@>c+a+kpn_<00>f^SX0zlU!y+J?k*)6z&MIR|iaf z$CoTQc4?jtYnsdFo62a9-{p(+$XZxt`(AU4)z`^_9Hww(}T>m?n z8CvoUh-5H6+bZ-XEX;xV6{JGNZ;c8Z#cbTg{K1H~)X_e*J$q8C4mPCtOlJ3i!sbNw zO3`cT`OgG&TuH~AwhXM&RP8tlGi1r^anVLSpke;NCGYr|*;h#RDJn{X$^#4>%DA^O zW=By(3+GV_Mcnu4B6^Xn!8m3II96MV@!GKG-S$gaP7(TB!Go!%M&;yDCg0H&ja>WlxGK%NAhGYqG_?c7hfWKZ&GgQ9>y9^oS!7u67RGrLQD^ ztn)|YSoBB!SeIbF_|c!~3rAUBXd{~DfX$-aH-zf{$G3e`^U&}>zJfn!p8YHb`bZ*S z4%dxt+`FDnx|3uuZ!g^JQ`QzzLf(G-mdAaYaNkRE(9HOt)nc)MpZj)>bhHTK=RmLv zQG7V)U_Z=VA)I^cmUsVd;hFdLtv8?$|xb?!7OUwhPx>8 zS+r)X^M_zA5+d;;=H6vj~f5O2VY(i6+iHe{CbS`O}-?Xh@l3UUdPiiHK#`_* zej<*x@WE2lBK`U??7llqI2&pQ+)dXr9(NYTV`k1#_sb`?59FHcdHBS-?(NJ!KN%LE zu_4a&Bgx$N_A5_B8kX3Y#}1OcL>-Q2Q5U)TCB7(14)vej3?Z!Ie9kU3p-4?FtYZQpLbXdVfBm^S)&xdpz@s zdy<1U!AtjvRko(JI6h%TTiQ2$%q40ge0j-<1GCQ#tCh^Wmy;R<{r_F~P=ibT`>Y zJu?rD7;^#jTjY>WmdsxIC!k7bF^W!#2K;^A)N)2g%Odw}5G_9MvAN`zaeHudB(oV` zj{8lRU(VA6!;-{wbdb9b0?9fml3p!RHA7G}<2K@MF*4lPF*aB5d%j)=Y~i-lB@LSB zzermo+P9XcE{%1bMZ%)9`D5y)L}pI83K^}t17+QX-fH^v{L^=U9p)XUydV8Rd3zU! z_FQ^HYHshf#s1}K9f~{OG0I!}ahH9Gac5m5eE^~-dHMIW{Z$;gKA?!W@tYONJ<}2iP2=C4pNM=%nJJ$y)-S>T_ ziWQTpjS6{8Csm2k&q8Ts8TL6sM;BO=8skZX|L#r>@5v~4zw?1A_bUQBqOZbT5yD;& zz%|)#p*21ytSd^8u#yGU^xdwFCGH_frp6>8|pDDt8%yus+6B;mu#TR0!Hs z%jteYqISTcT-e&h0RYu-54JN!-Q79~s_yy^RUA`g43^<970&XEb7+&M&ee#?j%bF< zhm^=w2#1(so9!FP?4)MQ^?_C9zxk5QyBWAr2NhAMlM1fI9JGMee&CHDnfDLo0`s2T zc&D9$9sfb<2xtT678enD<|;}dQ3JC-U;DP1DhN8%$k2?Po$Ww*gtMWUoE66WYt|v<( z_yU=_aS+Im@ixv>D0>co%zf9=4OQgUj8o zeb9_Rm(zzjP`}XFWUjf`akx*BXqyM?*vh~vMswKBnJ~?RHSx0+XKpHy@QL42rx@i& zypEreohI={nd{@uBep8)5`qL61j@x=m}uWKRGwXZK^)b`?_5|?3J zcXX+m`QH(Xe?_~Av&UAgIK~E%+BNRiRLKtfkdMR<&Ao?QyYSEo#hfA9*A$3yTcRZORSV$&!)~}N9A$6uU)^nH2 z@s$Avoj^L)Fr*Tn&Rsb;_kR@o_l4lVmhw~tYQ>csqS*)NX|#=Q&w1z+&i*YmRU7D( zC^Q~l<<6D~oZU^jbZ$uQILNJnyn~Y2OdVCgu1&GYo`p(g;j1BjVP;mf-O=8=0J^A> z^$_Iy&E8y5pSYW@^0G<}^u^Nr3YwvIL;gG(-u!!m?P*q4!yC5f;hZpJ66+7#xnr;l zO)xrk#aoSpT03ZcSl#|#SF4!y?jh?M*607~gX-ut?zZAbo%i}R4eG;YOL8N|7+E}G)>@ND~z#`^xuq0AEfqFHiin5OY08uRGsQ*IyqjZ!O9(}gSw6ai+h+h=ih?GVSb3QH9}iU zKv8K4Me-^Cm?r~wp4uGJqWnmR{K|tSAnrFWdU2jjb8(;}b+Dw;Ttez~*z5qQvIFx+ z2Z*NvSyJ5|Fe^_`h~zhEUX-_e|#5l@6v_~Z+dKPnDO&4xyP|zios#?m~y-}0&CUc&e!IqnPnEC?RSm z>eEq6)o2J8jE9fAFL^^K&FZ8d=lcSUsx$a$ys30__R#rmAeLxw-0Hp&6e!nmBf=t< zH_6C`>n~Va;zJ1zd#O}jV0;rauuQM<<8XmPC%V`2n+&!28E62U-}OIqR^qy?fPsh}PA4$Ol6Ek#li zP^=oY*q{wYxf$e)(#NO~iw=8XZw%0kNQc8_2kqdQE;*WPT5G2tBobyE?l*h+75 z86oY_@g1nkUj#&P{2pA50E-d zzuXIu&^!UXKth#SDAs-1DTV8)F`K9=4qNiqCNwN>Mc(L@vds(XJAH$to?Hcl<+ZDd z%!~`hz0`$;%o2x^%&AifDfIbLw5drUI$Ofn(x`TmZV9PMeV(XjC@J1A^rFei?ES*= zeFuK7(oEv*nAK|C)U$@b6XS)Vl*;=*MN5lli5F# zEExLXdDXU)|+GF!e|47Byk(rS?Pk ztXtGTtJ>~Ao>uG3J_vt;Uwa+}^s5{rVvEpvX;F{6Fp$+*CaZfRtum;!YL?6%YXfXS z??lq~l>nQrD*--65>l)|7EsNBjj^6@b?zGhML)7cFU=G#W1d;1Z~1HteOTacBz=s* za>m?Ofi$E7y}m8vbR>PCC(Fjj$>f%R6;s*c#h^5klj{Zf>4U0fVJf9~J)<1{45L_r z=N0R#tVybeKWM3FoB|n|t%rtuT6bUA=P zc@qiMwax7uq#Y9!9N%%l2a#M-F%wZ13I?&z42Yr_d*wC=;w6SxsZ7{}Wy>bR!fNE(cM3F03`NW{tqLlk>5G-lkGk}n(C$<`x7b~rd zs)a+ne3X^1{$N(=%K>k`V7ZS&DXUKiIS%4lqf9=`Jhzhs_C$&Q2E&VM`ZzMu&5a;# z?S;~z?3cL6es$1#K0&VmXYZ3goZf8y$Sp3u1nseeuKjJK6;igi<=ktjnAttS%Km{s z4_$jIpUHa8L)U1)$h-6$aLCD_hCb}`q<;F$^#=-d_X}NI2WV^4gCqxkP zUb}8Uf?4%%k$fJI7$+mp8fE7D$yX3lGN=9c+|c(}yJ1m*N$w9>=CrTVKj#lxJ*|<4 zO;(zB^gLy2r`o|T4u1Xu-(Z`q;j}?$c114_(5`n2yWy>Nn;z!dXTAFZmw}RwR4C_Y za!3tV%??HZ-3M`sTwXC<7~pGXx}4bv+O;62sYfyA5ioxbW!@b>!S>>$CJ)NQb`xci z+upNIBG`LX;2%FEC9>_vx%s&QPYcY3T-&e%m->>VmQ%g#Y|+E@zD9|2&=jJ|mP zL55rJagk@g9d-Brg)*rBH&A2Ewg7c|5HntmT4Gw_+?ilDBW^$> zvTO)`B89!tlYTF-Nvm*dUs_Y5~uI%2i5g)ULXN$pIt^ zetwW-I5o@5blz5B+?P6ytm||)Q)WtQ?};US?Pq7JuW1#W?My1ryZOI4kJTydw=0!; z8Y2yaO4{t^{Mj?4BWkiK-aQKsnGU$O&tta^_k*>HmFjb;-EiOJuczwha4opoMp>&o&ZxEYeYhz3+Wu$?QGq+{tXG`NSk|+AASmW#Ey1Pw;Z*yA})^0tH1!3YaL(LvvEdq|B41@$VR3$652GZ@m!qg=?A&l2R zOOR%y+w2Mp6}QfF@S8O$vj(=gZT~>)`I|sG*38CrSuMYlHt+^^S0lrNSN`Bu-UGvN zTka)FH2c_+A{`QZ+xAM0p|i%_N$q8HE}3N;6l!`$hMj(>t=&de_WNuxhMNTUuAgs} z!__XkD5%7Rf)_?`7;ahnao~Rk=G-Z zf&TyoQzbEYN;Mxas$J?cL%@M|iuWfn{I)p*U*OYAtnGv_-*>!oH!IiUE2Cw_s zz1BB7KJt+$%Hu2Dr9RT{UwM-h2qGnDn^Q|u|3vCw`JMX~eHWRyIk*{&Ek$%G{I*Xu zvePHsgLL9Aadpf*5o^ixd#b+LIY9o z{!Fu}y;kkDeuj|a!<2h15DDy6WWj^1EQ0hUvyD|n909-`MF8Ol8**9+jVYPsO#!k1YK@xCLqQWWWAoDvhPk^4BTOM#jM!GS0F#73 zE{kSO@+d{eMEGoVuVDBXOsb`jPF}g`NuT2$Eu;q-F89MnIw^J-$jl%n6*${p{9!N< zVpK~})^2dWddpw77>PGB(i-KrmGJ-UapJ)*E^Q^ii>QK`cC!pwkcdOrn{U-RZjSBt!WO^s= z9{2O0kn}`#>g>tZ3#YkD!m`Wge)$6|O&wZG0jGsoM)_#V(&FM_ma~;*Gk>gvLK8IM zhIPM}bJ%)ddSw7HtpL#?h`B|GKLCM3s?VN@Qi`NU(i<8&UW;^m#rp1aWQY60Z}&_} zUj(q95m=w-qm_iXb+FK!C@75_^foVgp`k9gqA(v~#LZOpOUHYI1Zf7sJZaksLO)z^ z_(=gl721M8DD}DrPJ%x0d{E)%ZEo6#8%IK`6SK&zt9`V znl#HOL1yg*i)@Sg??(!GFD5@GER_KQ5B+A=67m{e_{G@p8YQ8V2^@hhy3KAdKC-Y9 zlZ@p2lm9)o^nl9X@rwPgwlWeLT}#|=tb|C%&L+qui;KzZ0yCt7b;YQSDK`E{`AW-t zwM89!z1wz<{mR+-t`F+S%4=aPiqbvLhhJ5Uq_YLxjb2v6#|EBJW1LTXpx&zsAapF9 z770M6`FI_oL-dg8FhRZm<36X~)Yf~9edcn`tQr_S@E z8WLHkcIp&B(B>?KwcaTjqLJ&C^)`n3TNi*}W=?MQh!}$1V>V>4^smmdV=`wqh4~*w zb6PXDpY83$o6f`>)hg~#^U%*n+$Cph9|$tpd}FN^;L!HLe8X&j$u0Tupw)g6v6jJ& z=F*7t$V1j4e`56yTFTDo>>UhqKO|eooPagIW~qrL?9dv&ZCfju&ai%7y1Tn3drURg zFPm3h{-AwqrQfz-luoYP9dCSWTT^DgqSbWG6*{cd*1J=vy@dK;xWTWCs?QSi^8xm) zilv-LFi#;OmUq|msEf|7RHo=zo`p@Ys5cXi$2JJ?R50U!<#=I(b?T?HmshiG^D9PT zZ&%nJZoe5SS**py3OB^w(~X&J(8vT5r&QUZv-mS~zE%65%(vdU2%m(;*&VOPwZv?m z%6la?dFO>nwnwomZx#5oDZP$gZ5@iFb^cBjoJwW%yC;?7*KBh)%0ASxB2$yUcy7dh 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 z z7(}`XjGem~tJUNaEoY@B2Pgl0`DrUJUuR`1I$t%_2IpP_R%UNi?jQv$q$w}>g~+(C z%{Y~e7&(#+FrRMy!Etiu`oeMT=#1k*fp$*6;QuDq5Z24i+iv?9VL$EHX%)PPHW{2d zt#bv9R8Y;P)67q_lt=S$klMp#A2~w&%Yq6-7m=O@ZjuEzy)(F@0GGHsGi%Uh#aNcv zv>wW;yYoGM%+4^;AU}F1J|CLr+iz@mOQ-PF!!pxXcM4xvm6?8Lr|^x-yC&f`wDeBQ zc{MGJKNE500m?}0NJ=>;Pr)ZYaY6<@`H9mzg;#e9ACrM!eqw2-@Rm;D&zGg)(~_Uq z^C$S_o1CA;uW#bvV0!!eCgyYsACrM!-^87r!Ut#I(>HN?r|=0G`1MU(olZ|nzrJQ1 zWp+%zl0>%*d`c2~b_(CwDZHgq_{I!;OA>QBg&$_(@$D%MEhUN7>G)dwN=z$dc7UH} zZ<=5)2xBIyk^+nvdM9ww8h15U`SSA3NYG(VVXLnyt%OBp&W6X6`*3Hl95GElY-i9{ zSzofq@9kw|r31Z}4WeuO@#IF@qfcPbMY4{O#yv1RjtV!J++&LH&%ntE&k}5MmF1gN zNE7?~OAt*amnJneR|an9N++suW~dKaWQJ-nt2rNSXRrw@GkEP$a6!4UI-4@nA4&Je z{-4`>%9B6S-ak;Oxt$vS*Y?hPd^@gr!G1$A zuC%%Qp3}5>^6qoxR7NU}A<~K9_&gnLGw;mO z5)vPewPya8!pGZmg)-%vxlT8UzqekFzGi+uLkkz{uMRTn>Uy>v!+K60i(1CnU5{Uz z{qPo{W}J4+t=jhB`+Y4YnD!5xNqKVDad`z7_{_UZc+^@vFuE5vlxQDjlR5MzRiiBu zdc0NcV;TC4kIx(CSxYgiavjT}TcmjUpSGcgx`tk%3ciRZ8+wZ^;5C%lryl0YqP6K2 z%uYW~p&d=L?*Bv{>;KcZi~=%y-1wgOY?Ha!{#M)WZ+u*dy35TTFlo@{*L_5pL+aI_ zYIT{nk!#bm91AY6YTJeLo>j*4-c?Q7Ckiymx6OQHJKOmN>EWkPZ1-xeT%w^}5pl{k z!^X1p6su*u@%7RyEf7M{$@%8F8@#2n`iG0s24zKx&EH;h#9)PUQ~74OskQCSHX)sH zCA8ua%a?EJ$|7635VE$fxzr-C$sA+LCCrB#!4UDtjBc$eY?E{N5Gb!F^;eeY&FLF( zY5SoKi|Xwt&<)Xg)NWHk?NtYI7m;m9zPWCH#|0M*-fkQCI`Oo3_&ds~(c#`HF{j$T zwBsPqcoUhzTusQOgp*1uEiWXNX5|rE%bkN!V=jEj88&qOsS5nL(QiZ{nw~j)y=9n_ z+%=iw_H_Am9Z6rZN_6F$Gxq&aEPaSyu&)Y!_pvQlECqjWpjFEL^3}uYl{y~Mk)7*6 z+dLTgi+YJJ&!ZqXcQSz8_FE^_dd7yZM~;WsPFdeK+a)20Qr9IV*9Tlvy%7 zWb-a=TQ%G4bE0OZC2dbQecd0A*uCC$dwpgeZg&t&=M6Q4L-ErJMQ`)WN1_>5iN#No zX-`ZMJP^bA(>~fug(fC;S$oAC$TC?1ai*rYNA^L zjaL)$8nww(0}TL?ZnP#8pUj;rg8boJwWr<8VfL(v=9bzjwt;|4ZYG&kw7JVBdzGw9 zCf{#MuQgF_7qaGyggvP-cM3V?U%{Ww2DHm4U=D3#VP$JS&nsU;c?6zU=?G;yT2V`@ zfgyj(UZt);e(8|`kqaBf1u)AF~ z7i{UkKL{y6ro)IKVUQBeBY~U$BqoOMxmnkQ1c-K7$#bak3{jr=>4hRN`F1Jpj^r)) z{Dri9dn;eD%h%V-_gRt6_ey%ceC6ACzJ*sQV4DKng-b5+3a%o_w{oTIPnd8HkS(om zLwlFVQ4Q@mk&1@)JS-9Myw`!=(B3t&hxYJC&j$)76n&53yN$b)@^02gf{)Ym@evvh0cfLN}7(W~My9xeY#7(sTyEuRi8m%6{8~L^XXXzu6rl6?&p(_6y;di|78`jXC z8#zHpju3Xg1@Nyd;Cu)8k78>N@GQP9;7|1-OmEVMF#VH0gz2C4!Rv>48c%JU^UQlh z9}7HwO!sf)Y0oQQmen}SLD)IZi?FW+=k5-tnIq%Q_vj=^2(Eq0c^P|Ky!auTX)RB; zRmCf_u@t#nc1xgPI!AHJf^&;0PuAO9R+G5N<;k^>PDc@0YwAXI#Y*C3oZ)3`_A*K& zly45l51U3pTNSfxA)6+->Ke<_L z<>P19pyY#06QEQMH;rRI$wj6pmU_&jRKhK%NZ7C@2)TL}S#E9XVnvB}y4HCGr>3{g z_R4|b*zX}2r_qb=ea?1IRdlJj@n%QSH<@Q7>C6kQvh?Y?xyD^s6WJqgt4Orx-M+CO z-1+;1{oop3eXw!A;9o#wKbrxC{h2#_pC+D~M%tRzn#;~})l4AT-ui(y6KK59Wg6vW z`hJ$nG>qt)SW&5Z_u$>F`Z?Wy_{ONPe5pG)4e2Lx+ng9Bt z<+1}EaG%RQKiAdqi8v@;+{dfB-mCg`qJy#F`D(si^|Utln%HT+6q;FR1;_VlE~?jN zbEgOIHVTrD72R6%uYX|Sl>2YvG*`=q$?Oxn>=%$w&J%@0wtzre4$f+HZ;6?R0$;H> z5O1)p#oW8WjF(OiBmGAi2%kpSyJ+0HqT5@3Y`_RW^-$<3YcX_T&MM z^S!eozXs|Auhez6)U-?RF)y`bxyLIJxhUv_Ei18SEFI0RQDHD`sBQ)?(b8IqAZ$k3#*V zz7|F@CPIh-K(F#ZPe6{eNwD9netMse@%nh1kGMWw|C-YN?a==Fm( zcO+IgaC<;`h!&1rl5Z|J+fn;uW@;W1RlJ$;fKSY@jb(|YLqNK5)g08E9FU`FxE+wY z*bjQL!hSFy54Im%xm|2O7@6`gZ`jIEbXVKw?e$MPL^p#9LzD}%rQ*@l+r6f~ewL$R zj-_Ivl^?`bU)LKgE|V|rOxAm@Hv)}+arr8F$fZ9`VMs()Ydtu9K%$-`xRzCtx$nB9 zkURB5E98ikkh?LJ@We@0$c4-};t;Njte{973lyk)33%Hc8fHnFH;r%`ufpYBppQ@a zSOAVT2j|vR;s?Su$A9&q9IxsFr}n&O^zjxScjAhvCLyc1*bSj;K%8NK7PW~zA@e(%b?Q65YT^U(^t(Y9^{u-X9a+y7^f#Am z5~SsNe#2QP-hWCfQTZF3!Zr{Nx*wY>4%G3sK$A9l)AF{P1D?dn5Icp#1UBD^E}u1H zC5|Pt)lY+SucoQ02OZ2Qfq^U?0K9-8c^%tJ+m80K}d zNeo#XeO;WNrK#uGqCnFOiLTfc`CR{MkFmBDB*$xz!(SRa1Fl6PRxAo|$Dc0PTCceN z#IbZVYX)ssOKBH0)f9Wo6RbaDT^X(Up(9y09C>PfsQbdYf5oZ`gB8OI>mFmXDbSb= zB(tCnqIl+*g?R#P8a~PmZdok1>Oj-Q{0%PPk4V~hvqGB}^D01{`^pbA-9sb7vFV{& z-OPS2YJ%3rH7MRR#_TeQVSt{^K;uHn`mG&KGOeAu68q$B zmSnYhZsRLWgvVaxj1TL{Zylc%dFmBvM#3C6(f$URFIHWyMfehJBF)-Euou9vS!x-- zfhJv)9EzP#g6wo=?p0GP9#OFUCS7%hoPF$M=3 zpMoBCB)1hX;431f;Xvb`iF2lH^dE}oyD}W3#`UHcqa}R%maIROT48Ccbj4eW3^eI3 zaHtn-__QR@q{|Z|-;V?WzwwbBW+0!8r}@v3q(N!+&qJG8gwTvkl<*>2tBCBU5rT6s zBLJ}Z_5`&o9;S?^DcdT&@kMtcVRb)raIWr3wE4(izA+8boTs#OhsQSCF=0OckG2f4 zUtI~czsy(^mR<?Xv{auCWWM<~$k-HF9N@G@FMLwus{==~WgUx7-4MxrRVQ!-$km9;({*U4@j9xrLs%E> zgk#s_OW!%abYxo(kG?29>b*KhBc10?vPF3;d6T(P#A5L7GtdrRi=G|4*F2)Z+pQ*c zdVbB3xurEnj^-T^M(^{SQ!8csp5Tw)5x_D(z~%nF0ejTGTiW4DR!)RAx4!<5g zvc*-3@a3z7#m1{FR|%0-e8NK0uCxBoN?f5tD&;sI$F0O^FXPYSs5kQms23R}@|U%B z&3Ys^vIpO;YIC7t;9Wfg?p^5l2deBWP|tk=f%=#CpzSVXbnC73`Zk%9lJzxWw&+OQ zNWPlrhl$VdtMT%KK>nAGf9z?;B%j+3{UohJH$AQny&go&uT|->0Gll~9(Xb1$DR9D zX}?Hx34>?>g&fm=y_PNSP3HSPmgoPWc<2q|HJdqG04D_HzZ4`g#a2ErKwYl-7r;dw z<{@CI=6f&035!j%;#1$v%QE#5Z~O$BTGZM_{7EZcZt?G#0p7u5V470^nYfS=X&97m zga~O6zI@DU3Jz|fR^&;a_?e|8I$l$$>$XI= zgCG^x-N!eQN18yw{E8SY6J8tOO@?bw1~eHS@{hF1Feh{*cfK*2=HOFf=fbD#BJCf* zu^LD?dN8u8G9{~8!KLoZaO@BHx)B2py|!Vx5By{E?3LoW#pVpZLd{O9aNdKeu$uo& zyGM5AwRu}(cb3P&it571nW#Mia2^0~g?R@3$-Pd{sbZ^-a30$9{lYdaA!Rzq>b*90 zK?vaX)Zp2~30N+9zy^P=jghCEE)_lECjcw6I_W0^-3|h`wsFU&d76RX+hiN)hEVLZ z65W8&_>c{_BRP2u19Kx1BPGyG^UU3kh;3#NDBnCk!jBs-3*QxwvmXY~9V|>dc@&Oa zmd~5tJT9(*sqI2c2d9ZMdI z$rgLFzdM74;ho3e5@s-%hGNr7biY^Z(n533o9d7AONl_5Z?igCi+KT$K~@X5kDr}J zxAPtr-88{u(Cv@!FmALkvHhQxzue{zcFuo>^8aZE`Lk{Q`p)?eQT}m$e%{P33CBXc z6VKTg+Mh5JXnZJk2~AiUj@1>KWpAiWQ@u8A;2BBH1?%5an*ujaq+mkV0eSkf6;Mew zNW=f~hYx#DQ5 zWnGN{yONKL{7+`)zgPKdiZb($NzSGzn&f(1|Nyjg}e9B*AMKx{rjZjy90RdvLH)`_xGK{ zo6{#9UV8hlpkP}2cexN{=I$di+moJuXlDKo#*_ciT{H9V0N*9#OUL*7zwf;LTtLDI z`FZ}lsuR4&cMfmP{^{`2+cTMhY3;u^t2^!gO=f%2^M^9?U!wev7G~z(LHkc5UwZqq zcaHC#d!^&M19)9K!F%TZozip8eo1(~e{gg)3(uR?Qnr{`AhG-0V*2oEEK{4b_W`U1 zpJ zE3aby8=-$z%M|b`Jly zKM#M155FoY!hQljou7&TmBxR&P~7Z=*#5cs;gi2*HPOs z!0cpxxN{GmI6pH#T-6C)?atvHlOfO2+yARh?Rf=xx))pK>Fr6+|INJ_?SD%7%kT(K z&%cBA-_e{YFP{L+&f3q$7!ZG6{tWK~@64UUJ0>O1GR9v(ElnGL=L}1ZkLP48%@`jC zPHAUw{?hpSU&hD0zy9p_*jU#tFVFtwHm7tzf}im3FOH9~KMz0d!!J#WxSzmJ@9!Ky zrHzkS>hJb`nf;xf|E+s6@}I5z-O(U_fj>I;=S_gw34dJ84((3)V>9)pkGH`)hqq_% zB)km%_^^|FK0cV_kJ}`wGx(#+)&C=Zq|@u=zhuyB`<3k-=I%o?>6M;;R%ZS;l>gE0 znfZ4x{$3zoIz3JR%ueXLr_-o@e*BH^1aHfqcM5M#N}grV_hz*;ZT$T$Mc)CMsxs)i zaO?jEeJ=*FH2yvAedtwjNG83~={qDd|1Qd3!^-m)`1gemGU>bd?w!-aX)HUTZzp&U z?Hu0eo#f>&%%9_d_H*;|$DaHtN}~7^`S6SKr|ZwdAL7G*@aN@QdVe(BmC=76EI^)2 zVKtTBAL;o|$;|(h@<+R7=HJ2ixB~~s^zqRPFgqC^TilHQ^Zhrx6TAg??iAjgDS4JL zKF&ED%+tolbo>oH{jf+wC1ZU2{k#8heC(k8<7+bc_mrLEyT#4;Ki~d6I>F1?IlMc6 zN#1HNHd{&|;t>HIkfFgxMT(|cKnKi@w$bb`0<&f#tGg~4q9{$u&i1~)f%iHyRW zICD=dYN2twB3VCpmy&6FB)Spy_a_<>*@~UsE&8e+qWUs4?!AVE+2L`ohO)n@$=(!Q zu_UKQkZVPufIGqv#6}p7*JRg406psi)(?S~yVtk(2sEzZyS}}^c|*sCG8DeycAKu* z*5Ft60k50)A#Xl;Bae_T^1%E`N|?mnx&m=AgTdlNenS-4~DU^YLCokY__ z9U&fYix>5&i7v;O_-f)n@{ONOTNB+ac(*@BSRRMt7V_3#*Ti;gZM4Gf&?Ghy@ac;k z_s!^ARnf)a=o>mS+BY0sZXW5PyS}iFw^yv;cn~LdOl=O=1bX)+aW;YbntDDE$g;0! z5{*wvQ?uShjORW0Cm1zQwXA#Rdi=oE+^Z7Fm z{X*PU!jJ63mjTK=*Zc!JN8B8!(sL+n55p!dQ=?Ne#(3}i2u+T@YfLt8{l*KbD9^)= zISt!;L=GT)0O5x1`$vi!wiglH*CrSDpBPQhspB@ zCBX&i2@yB?4o+ea&Rk7}HPHm6zrB^x*{#8{MK$BzmKA%^AnUwy0x?|Rm)+XbF>QGK z1p08uYGsX2>YCkF1V1TVdlbqOs`$Ui0o)NV5YAHEiK9A@E>gWA$!`F zb9+Fn@wnut5;F1a?@qj6smH6@CJG0IA7^B?=YUBgAU(BhH@@97>gL(f;9aac5H38q-BD6c1omf0R8x~*rl0CN{ zO|T#fn^xfZZ877!cFVHDMO!sv39zdgws+TimjUbu=s*FTYJu7d3oJiS@JwxoommT? zMmMNyZG|Of=+_q2##1G4c$)s{EB?f%RjVqD7r4)xO6BIpI`0YZJ;lBU{>DwAMz;? zxSHRf<#24>>(#8h?YrBzfdWl$lEyKn9;DoQGb4#Xvh2s*HTdcW4G1*dPjdaW+5G}d zce;%7yPoJ}{2LjAbJZ6_UISbWIsiOOyn5|#u1I%ME4(6;1Y5gFc7IFaz4%uonbCfo zJpxU4sTjgJ2|6H@PbP<+GvdB|2UaM5ILo12tm5(F|0w8i7^E2agqP-22VUq`8eD?U zyxH$S)UbH*Bjke>?i@hqmurtaJ)s(C$Oql*v7K4k`r=wYsGxJy zy7o`0&7|7h_-RvcF4lEs(M{FapVaX580Te#Z`*;<_f~ETjawDU{+c&UH@9Zj<+Oa1 z+kKg?8JyWASn;1}#|2&p@0VptWAZ(jvclW0zW|zcmgA4ap~4sQ8S8(WQ1wk!&cCJVa}F&#%%89PVe%&? z!PTV${1J1C&}phw{+UC9ph#J?&;Hsuj6kDFkiWoDQ{VpX)!Mn zr#bfVZ5kVxQpA@bVB5K1v5DcC*|4=|WPEUe73AwU0_RSPXdGp_{lviN`?)```PXi~ zi3POXIzOw#vL@@|uQE^p;sk_l#6%1A{0|2bd zR-7{B#Mv}aq6^0UvRz|mF*4 z6wLm=s%)|$1!k!uU&>-x%2oXGT492IZ^i*T=JQH}R ztj^QHb6n|3Hji~DTCKEBa)!atAM%H}GzN}dn^dO=m!MwJ9ah;=ddO_QGl1^KS5tE^ zx-`&uoDit^JkabY5>jX}xk1nmuLW5kJLnnpHJ`R<=8qWUM^y@Eub**_WYkP-PiFC<6 zLc{F-Eq+$}|A(#-ejv!Tk?O33bXg}~r1@4tZzs{* z;swQkTWbaqn-yprL?3a(wnB^ybq%seKkC3ENDN0mPxJ<14<7RLpWj;5L)(IX?f9`H zyIEI`S9L874UujgxFH5Qi3Dz3tXDjar~4Co5S{LyGPg-11=C1YVkMa!e7{q7G)zPw zNQNsTQ02I*A+0;aG@c#99EL-mM`;lv82H=L#Jvu9BNb_WP0UIUr+c$$c*1`r$_L~0 z20yD#_$=?({KRLOu*A=aY5ANnBIhg zoYrW!yQXtN)HlOQG!f7G#$6Goc)O^(&&yO|uIIcABLgPr{o5_>Xvjz>dRo(H@K%Fp z;4SGUP}nJGdC%ZHqg9|^E-;mm5`-XRF-+?-s82#EdaVu!o zTTFE)ZHeKsQV-Wj5a{QYp9iPoDhcjz9s5rYSAWHtW>DySK5RlLdXtswnsG!>O*hT< z_omWi{F=7wr9Zj*365vDh{7vKsER#Ux`yAS{CBa<{0197$quEWY!{`10_ddzMWq`) z>S~Xx`~w@FJky){At=p__Q4jGE-mJV5u%c|^liVJFKk#oxN_N-o4H-R{DTiSL+p0F z)Eo)&XE+)JZ+SIw?CL(~#fuqJ`Dys*dk8(i&JuT1camQ;^&iG2eC4?0Fr4o|5h%>FLN zpBug`j4lZ-sdh+@(-P>68PY=9EfJ0ZBlGq194z(@xJ`v2L-A93TB}Kmxf3wp;2L}Y z14P!w7rjw)%jhNP2Pwn8`EafHmDmO z*X*6%=6s&&Cqv^?AZk}UmM~R1-@n%E)yAq}P!C`P8VksfRJ01|8fEDHrCp9TmH@t5 z@b@K`P6LEQ?+vF}de1zR$c7FaA;(I=ZTK-5xLJ=F1p~J)WdZ5kSvcEV#92nQ5?)zR zlgTU1Hth4t_3BTwq3aykHca>Vq-LI_Q{pYjd+&b1*<`k(DNQuYrG)w633m@ylX%%d zx{r9<8=K88cnxBIz{&3I=~^C0@18-jyvM)(*Y=LK6FvETi!IGjwKVu+gpt%Qb0?L^ zhxcXy;Rc8o(4f!;jv<3{Q(rQddUSlkgioZ+d<`^1`LdE?LWV-+Rk))DeLjr_9jXRd z@M{RVcFfoKp%Ld$jeCwEdEUUu#`!zK|1Qcq{8v8?{H(B3>D)O4<{MqK(IjLcj1(dX5bM8iO*syAo zq7cvf^g1Xog%W9FXQkqfA`Y%fyuy^3zjufTyL9Ln;VSBT11>wPW&c?uf$A} zUe8YjY>kzx3A1S`V1Ex-&jzt0^cq!Q*`svNnYKs04&Px@#whPS%9~|zt*5yfIpO$4 z-OU#pcIO*q7VB*@Ykcz-5s09skLdOh@$e8JvrmbXEWSr=f6hy0rO_b~^Nc14O)$&# zVF#wU)`_FB|I}cTm_R-&ObAr^_~uajPbPGgnjn? zjk9(J+ zI;c#AfyQr8x9nI4h4~0TuwQOI#m?G5nab-s1kl27 z9o9*+wemiV8$zI&RK<0s#?24c{Nv}<+fMH(&G=#_#b7ipYt4s~gV8Unf*Kc-qWG>L zH5`2{%o86N5=ApoSa(ktym zulA?x-6f0}MkD=RpGcDVQL+cQP(`d#5h!^hmGB7(tjqh_^IshHw2O3!9F{mYm3~Ea zrkoYM#^|*Og)rhn+LIKGk3V%1eI=RfOSxPT#J=2gz@}~rYSN8d^YAM|Vh)Lr6pn6A zr8eGf6N)bAw)P6l($Qb7sf&Yt{#w@8-%*0&)GD;F{ypy5 z3p9OzG!E8J?kEW~y~Sq@j}q0EeT984Fsqd?oX%mF?xS?yAPxJJhJ_mD&IOk&HcbfO z@6VB=b1fa=HFL>l?u6*Cl@s!XtcYJj$c@Ilt04bobM<3M+FSmwgTUjwxG^s0I>r5# zI8>+^i^Mh=T2yj^Q;Bhc1Q`xB`NB* z)I`-TpNOhG1GAoCz=rN}1>!@#29Bu8T&`v!Y@R(IDf@SDoQJhm>;PlTq|zjcb^Fi5Z%6#nM0Do8Qx~Y*t}eBX z)D$-bUT$Vh)W^MZ6CW}$Rn%jO#xj-d?aH2(D(jLdDRijxl%JMlGqS@6T-do}ph-%j zU%D(++Pf<2SxcR~QWD&aS#(NtX|lC}##;oPC5kG~?OeQRcT}XrC1gRA?fK*n9S3y; zSg&lI6lj`Hr1l!)#aR(xOZ=ICuqB+hp9E;JzmL=HBxjOwe^u$VSE(s7Ho~}hlZmR^ zrxUh58P|gl4X~-{oBOu$4;uyBs-7b zt#*$Ul(NBnL^e0jxGj%KhP!p{v0^gHZ4{5#G*4V|^R^Xs%wYYTD4cSIM4_GixnGd+ za4R*;HiLeTc}mhN(ZY;3+l|Ir^17T0cn&o&ft=p{m4kJdg~iBz>G9;qc5~_Oq?m^l z+exZ!yPSksBqa6*nr7B=2kT=Je7r8{3~rH1jZvvjpr1qTpTs%j`hc8krk(rmROX&S zcn+DJeGq?U4oCae9c!WDsXV5Pfo@u~W~!>v%N+5KLt((k#EtR3ed*`RBjjwCVdhGf z-@bJRUad#P2E&_AK8*;C9vJ=DiRiBCs^HCn*bxFg96kV z3P*Ol<*6%2tD`(&|FAmh_Ycx})?nuX}J(YjY4Q;Yaq?^91FK zd)SYCFm)rPr$5d3;#?$$MOtk{yTIS0Rc+>R3tsAD#s|U?K+ppoC0Z3QeYfmH%P_bz z*y&#W1h%nK4MLvyEB^K}fm$s#8tKgto}Bwb+C={zxiV6lBnw0^`v~_)Ru+HxiW`)? zJycyAZYK~=)swkggp~0UJjbaK8VO zt~`DHN#t<$Bh1lX$jJmXa-*Jd=K`vxJ=Ga!f!xPt$|Oxw>*@~Ces~(aj|BPT`*PQU zn$rjW@E42?cJ8->uz+0V4tB0P3xIDgB_XZ^(44VI{o|Q`b*A`RgaX@yvn3Zp<;%5W zG9%7sV# zxc^<&%6JqJ_6W;-V{d=pKy9IYo*C`-l1s#bADaey_bVDMK83o;1W0yX(z#k4VCKG# z<>Exo*zebVr`5&3$&^*XYAstyeXHN8K2%vN9M>SRom;;zkb^d$WII}rdJZ6_|r&$iSw=TAr zH}IID&yVHRh(hiNyi5#mSW<|B%-W6>MD49Zbi;Ir?)}{bs88F`zI@kQu#CtwzKl&u z8>cscpBtwO@5~sd7m&+*a4+Cea(R^EUR9ix%jaq$Nn4xx^mNS2XpeGV%*nP_xw2_| zsNtH)S&?(Xu@kuu7V8PjwhsVpM@s_j%9B`XsAagV$SYpD&`j)z&qt+C>w*49vKvYi zV~*!eu@t}A^UpuCUaq^$t(S)!nOrYdcUmtWD9f$9QDJ|KT3bzvCV#utVXhjWv~;gS zpWbP7{?$ck>*J~5=jeRK9n44z{rt)K=sq&AKPCII-Jxo@)W?jamD0G5A#MDh4r;y# z;I>46aPD;cuflWIUim$TR@-%yDox6QdICR{2WS7m$%89*6+TuTFa)iGW+!>DY0)nY z!M}YVj!#TMVEXM(qt`bR)94ig7e}u{ZnyS?48fK1*YL-$)DLgizQtf(0W3S4dsDfc zzBRIUK8ODw)(?%^N2%Q#wP?P+#vcV}YW}c;_?w5|2=8{^$T0JNy>&)`alB5$QR`hh z=j}y7b1Rxq+E~g{+%(0d#**x3ZAlPyFL}yM+^0nvv6f7rc;Gfz=}!OQYC9Z%hToem zR`0c#TI+sb1x;su|IG=?lE&}%Gaq^UenYv^eu3YQ1f`@sXqJz&`NN;Y@4g0xzMOtu zpq4Ue=a=5NIS+fkOi9pMZvW8A7|T--6*|1>GV1*Gyg8O{i`zb@1Xrl zI^p}-_?@@^y5KHV9bJ07(Rj5@Hf% zU6+El>RYYirBz$2v{C`}Z8l^HcM}Mg5J7?BCz1SK zh9^bx&tbR@*LRrtA7(f`lK(1(vm^Og|4>pS|7mnq=#xnP5W{hi{9_ruEt22G@V?(! z<#kMBI6IQRC&MLgTHo8e`cTvUbTMqvUvqigWWQ$Kq2(Z3Ziay^!H!7-Boa2d%j^M% zHCDU5U)l<8MNoBx|4Z2?8BjOA5RWZ!+R^JgCdFl5vgXX|w%VybKLjtDrSR@YyC`AO zW8ieRZ$f;!FInA$4Nr#eMcJbzyk;71R)G*3B-?U$6PUw$3@T?bSsyaP{}xt}uy>1G zx`-7tp{k53K!S!g!OV(yZu}w$fhZR-q6iC^p59}L2xiJ55ty$5Carwg|3m|Q%#rAmzD}=pqSpG`dZtlE8k?KkW%>8sop#?5I z17qW96ics$M9_PWSI$PV71!ZM^}_BV)@L8wGuM39#2?R6Nzd)ba9nN4Q*+aQ7(f*K zJW8Ce{4jL!6pM)vO~ya}&}!!AX$Ixq5v(?g_96PfQ zf@(8@-coc1cbhIqM@pQ6SlEv_GJ;wT+E4>ZU?eis-(HkuU8uzMAW+8j#-0rG^BDC4 zKKqBo;&UZFGk*qlDXvy?5sx_=286Zqr?+W*^;CoHqo6kc2oA9?)1NT{Q_=PbNQ3eb z&^7Q&QBs2usy9JFN@FPn`)6#9doS{jzR~e zeQPV&*`!vV1KVJ=`oir)3u-zqqSTfNK+4HMDTkZvrwf4ZnfntC>kB7^V$M9P*ZO1? z;B}-?iO*|H6Boul#j9>lN_YhY`YJ>$(?LZ-*W4DhF4 zZ(?99F>nGD(W#+lVGF{L;d{DoQc}P4w0C4u%uWHp)U(CjJ?XZ)^;~&aMvJo zLA#QMs_n=BF$sfvFGyYVY}yTpQ)7@3#!tM-Ztc)-WKQCM1t6SE#t#YXObWeXBmkNC zR;4d|6?}Vk0rcCqE&lsM?H@U*AArK`&qkkU3H9tVY`>*n zG?OO=ogrcXaWR;_Vr3Y2nW9f?(lmYa|2+WZ^dy-%u|6di@az!|6;K~zOxRVpb_~aD z3pfmxKgF#-*8UXf&y<`dq_!YtC8akwB*c}1Nd)aY@Z+863*X3KKx(grlA(ZSm zH$JfFwkW#)?~uS&P{rScTwm?~3SSFz!rgo;)Ry;rJNvCzfRXKZW0I#-b zQ&uJ{^sp)V$}#l28oG)5No9tJYx)A}r+|V41f+8BJ89+1*6`X0Gr?@dXrk3b=I0b2 zsd6Z$Qk4~A7KUEnW*x}&&J%w`iteRmKX;ycQF>vl3u^#3bQ(YAdQvld8YAY=7lj3g z!Tvd661-5hopp5&bXPKtm~7nBYw{3tiz`L@&^G8DBq0-t!O;topUh814~}Xr0#Xj9 zspqkrV3cZZ!?eW2c}SqfcA>9DZ8d%y5wu-Bw2{3=6^6+^0#*|3G5tR*{EP1IHU2tz z77l&TTV00jl}`HD-9Q+O!uB-P0kP1a6RGNqz`3ye`mVNuKSPhmukV&qOjVf`w{D25 zRlPRwNY!dwXrbNB_o_eJG&PMv z#UWpLuxR;Jnwol;1-+LGyz_T0KgP2ZwQ4PhP5K*gA0}czmm?yI&(C>~e2xd?u*>Oj zJT#ws>nZ5LFzf)UE>$__K^5k$_F;UxHjHoBn{+D+ZH9j+yt}STS3FqN{wNy60NcPt z=*Oh@`$(o-))~eZ980zp!j}^WvsQh89SiK9r#6#NTN42be}ZpvEPs(?;&BU|sT1E! zBtmA5M{4vsVy~XUao-2Q-74U)NY`2|_$5|7q|7fN^h4Mv6It&-AI_=O{W_z2Tui7t zQm|H&N(C=N84@mzAnY$N*J2fy0SC=s2p z#uu@)ggni^Osn2VK=KCF%4cAsKWr<^W#9POT+%Z7Wh7J`HSR}5w!dgq1~)kup-DKa z7v8T6lvVLpYLD`NKxX>8t5qkT(CG2kZpf|aVG42YG7dv_2a*QXft~~d`x#}+2AKY# zY~}n-ePLq;2*7s0gPgZG`h{**>^}U^UZHAUrwt>v}kuX#2skMsf62$@9nbjtluJf`LHka?&Z0EmjvgrDafk}0~s z&FYivw%3y0B;zcs!Wk+Um|IyVQlNPnxX5Rdx^s$Vh=nJa&ev8?JPh9mY-YGC-gg=2 z_|PSd1WfuT(fn|!>UFR9Pe)>G7^Hn*IxtARyd@rU9=8O*?V+B|R>xpb;n2-iJ0?Sy zg8amd45Wmya^hZ7$59rHxc%!%Y_%Bv&+z6gPATG%|Bo=Z{-`P?EGA@P6TPRxfAI#m; zr8w`8VNW7*PQ{X#lQ%@1rdn%9a`=D81q-AxIU<23Ok!8oqYy8lS^XG;wFdsFim}=M;Pc8h3+1zrrB}ON47g z=^698+*2L;Pb4xg8fdA=2U(<77m0nH*xw#iA16L)dk&9lg|o{r+>1OM@z4XTg}-Ch za9T-dL6Ig(h9qQY(kGJpT9z4MCRjh9Fqsn{gKM^7QU(9A_K$GxhQ+mbSzW@+47bD5 zWiSNQvt_V!0h{226ZdK2x*cI2C&OW^-?fE+vI9lv&zD9$qZECGUc;&$-XVDT-pF^H zgW>zh?2QI480Nc~)6##qUxo+ja7I-YTAc}lz^?KGaM55+^j+AHf`gVI;bgT5vpOo5 zk^MH9U*#R53M9=G4-aLyO9>HfU&lKK_W1EPNDMh~+mvj&Ao5?F-shB-tw5Ht0k$n{5 zmGkh^e6-x^@!!bsx+A&5?HAaq0b6!sK)x2MF{|V*GkrmExEu@LxwBS^X^!vJ_X7Dk zpd^fWI9GW6$HBhA9WLIjIMPRF>Awu2FG~l;102pzFaW`#uM)NutVd*iL#*w$yYXUV z9Kn|Sf)c*^9*@@|Hw&e4o^=)%2pQhNyv{Z|+d>&{Dy_aUxA+pd|7wC)xvRlD18VAcR0jQmdBIxea)@*kRIG~SHr4C|Ylh*_JZhB|-Yb8D zWX*fz%X`oxXJ$)}iyTa>qD=m{*Cp6Jq$8K<=riJy1rrf zvf_0Y6gGgqYW|5i+r4W=Yxyk!)GUc2Ik|7u#7Hm`F|~330z8l4Eae*V&Vod87*Mf2 z9SuJ!&8q~%smGggqXed*tT0h`RDx3$oDE-_#|8qSH69NIU2=W_RK@uOnw*znGZ_Zq z4mN@N)G0vF!#g*`i|xp?tU$jo9ud#y1s|gf-J2G=z@-w<`IS*&bmlgd3(@&cvznnZ z@|p89WFITpA45*r<#J*6sV!#L^C36P%nDi6Dje@3J7yrXiF{4?7vP`%C99Wtarp5j z{7@1`$1+5iPtE@v*owfrFd_fJ31E*l}h|HbfuNLcRY#I@1s*qjt~J7-W*fFE1;cjB&GHT^;8dz(eW z&%w+I7d@DJ@uKbzk52E<>1n6u2@!ju6P+)R3>aoq~+A(wt4uq zT>*Q$tuvMf=<&?K9t3bFQm&kipXS^yb_DrZ*+yJVn<~u;s6CZf6C*xg{}^wqqfdirNp{gqQkOtjsHpq|;G}v+AmIgc0U`OWb zd36*$S(_zfz72iG?BAB!yX0=P_b)S{cVVt{Pbv6?jEl}`v6&|F7F##5M4Er5F{hoX z`a3t^ru!#d)=CRd55T!H4pD}FItMZotb5cT@S^i6o9O`M$C}@H%U8!G#FU@LYM1RF z9WGtqPKY(~i{bgGEO+1P^yKp~_-Pbvt93fAeu1V1bfJFMOgzp(CpJfzJ;U@mTdLYN zgOfm@Tum@amT`U<=9iniTTT|o=45)y;I|~Uth^p;uA6g4;4Ww*!`x`SNZ_4TYPN39 zFgV|< z7x%55v@Prpj-OIRTQ&T`)chFwsXOmXV`D5p6-Ui^Z%5pn%(}vCW_qY z#sFok0Y~VkUYJEai_~i?p!pKo8m197{qqj8CeB#67FivKql~QT-bPFl1EEXuietXQ zlrs>s1JkQOas1>!Abzs}|_iZQ_A3{haUtCW;<~t;^dzDfA<}XcW&KYMrOp`Z#OP zIWsm8dsm_7xey#v^Y^Gx9EsGXC8la+9=-~`s-I`V-ct$%K;(avH=g`Mz1 z`!sg4Gf)(dmm;TseoQhXM(IP;1)DEVjNoVMW=*rYu?#kHI^NcI@pb=Xs?XO{0+o!EsZhxAzpE!s12bj7uIL)PvjnWOFm(Ll^1k|&M07WFvn=KqFK0Svv4Kw zE;{|g&BCW$O~1e2ES%OXycT^M4R36-aQo=6)qmIpzCQo-rP;U583T4X16C+!XMzUqZQ_hscHsXD@9^0d3Le%cGUyd zKwXd?(yS-?Hwg0TmRSeh7u=aCxY|n7PGgi1O`#)6in{fIN!%2^t-*Fh+-*FqG zmL>xe0N=&HzH#C79G}pO5%@hNe+2$j3}=VocjWkm-ihR2!SFqi{O>co@9A*;US;^U zNdBG-Pm1Kfis3Gi{2c$#JCXdShag-x$Et5fFT+WZ{Bsztm~NHV@nME1Me>hj_>)Nf z_6+a4--6fX^k9TvjN}h7oD|7l$#8Zg|HBNw6Ujf8;d>(aT@3FlwCd9}jp5rO`PU9Y zcv2+)3WmEx^1sjUJCXdaGF&&?s&B`h3@1hMU&U}mrd3|Y_6$#o79!7q9u98JHK1Ea&{epWjWZ2~%4{rMv(%K6y6t2s~; z`R({mNB}4e8|1hZ4+LVTT(_8rgxgLI1&dJMT5-my6gPj<>dPwG{bmImQm&MSYh zA5hG>3*jOTv&SKcZrJ~D=`9k%zb+1yz?1`!Futf6CQvU6(dMQitahy9wC4K9XzJEp zln%-FA&JZ{Tcw&n`KdseH`>U!7dIw$NP^8u4jbY$!+b)jnStg|wI1f}m4sSAT~fbm zBj=XGN;-uaSr+EYNTFuqbIsQ}Y_$&EnF4UyX$ICI3sI>RJ@BKtP3DZGQVl>ZttiAJ zA@?iweiU$i7X{%6rX0@YoYO|--}#Wv-wOFdSm}sf9Q#kn;6#R+jix?*Z+M22%DK}f z7zn&u2Z=t-C8wS>kAg45Ezqb~bLFX2CC-pnwP;u)JYZ%|LjvBM-2*9be`FbU58+m2 z)OW<~n4s$kaUZ1Ne6QhbYc5I6vG`=FHu^ck_9j(T*BY7HLI~viLnaH+NgVieTJ7lD z1{+DtLTV5&_kon55SV^Z*=;eXAt1cM`*I_N%FXUWsht z(gR0$P_2)yMi_~%wwh0MW|aX;>>o zAmI7P0CW(ubxWB8%=|er*90Q-lSq3py*Iq&HMk%M_VZe{VK(5Yv+#vxwjo2E$DwUD z_>UhqG^W*OJBg=f?ChJs%6L+%Ujpo?oKH$mYAbjJCTZCH z64gK98^3fAwmV=Bsk&0dea6ji{;t%qjEuOajM%cqJ=~~>BGw#AR@Z6 zsJTJYm-ZEV#d#t%&h_HFY=brk4}^XXs-f*cHMAz-RA7?_Ha=jn68k%kshMU%EYj); z*^78l?yEFLPC8E`w_dbtL>;;QF@b}Y$I4)c2I71l&-wlNudus%tAX@xb*=fnN?i}H zs7SPF2oM-nQs8?#Ozpd{@aaI*!G9CQYT-hRDOo8XuLW@I$3T0v`P3RH)eV~=(TfW` zOzZzVX+A5!JhFfM3HZob@QzO5kQ6*Dtw9#a{yYH(U!R(ZZ}950U62+v!V)Nr;#>jd zy{~u3NCCF0_@ks-a443gK7nObYyx(tRJpyMCnYitQU#{qJ{zFy7~a1mB}iNl`y)eY z_Br;q&EE-gJcQBS#}Naa&(1TmXK??!pv7Wjp`gKj8h9(W&XLX)KmnDdbVa#$M~*H! zR{$IkmP-T}YpZ|6K&H0B?N1v-1u{{ zzkz)-M*X8Zc}}hRE1t4CMmo1diR`-%&xdsL5_qq#G_Pu~*}SbBCpLI3W2AYHKkoKr zplSPT1y`ddo!EC5m*a7vL*qjqAUW){>@Kv2ZArMGEd{qh+=g3E9&s{s2y@$T6gWqO zZ}di;V?rC6eHYFW<|d&J`59V{y4*o`oTbDT z5W8ed`3HO6IY9)lwZGyUkYW2IAOl^Guy-BYVC&|d7SfCxds;|O>efGE(Vm?z{8KJV z0F&AU>A)%#5CP<~8+*gaVS%^cJ7?5qB0sQpB_5-r*UwW>xOQFEWTd;Hs-dpPE%kLS z=R#lv5iGKT{!|OSm`tO$Ixr3*fn*ed@`ks8cE)45QS<3YZ;pr2FZy%y!MKy(>Ffv0 zLj}%iuetD)MLqH<6bHx4>Vph)Ru0N>F8}Sts&*gJs*$J_wkkX*RT`G4CZ-efuCNur z)`-4B1*r>M;!6N$`z^O{Dcc<)O4T#<*oO&mOyTq+e9+u?PoI(w2z5e1 zQOX(DOPbn$XN%?LMe%)xLoF}@v#<$(EnH|SUl1`)B8Zk7MDWjn;0Mwku>}9>0TBEH zwcxM65-Yl>U4DHc*Z|O4#_UB6$WB1Oy&TMuOt*WobkhUTq};>m{$F9#55q<&4iLtX zCcw+-Ld=Og>MsvbtEWG1NFGG?V&v}-3A9UTRJ*7#LaEv+&yd=PCkS-41nZ&e&2GZw zuwR47?wbz2dUv8~beg8u)lSZ=?Yt6BD$u@ z;8d!=Ua1GCfr-(NqUwOcL${#-%}-E1cq{fdO(0K1J!XS1Vv`AWV}XiN-R;pHtk$Ru z6oZjHcPG&{px%L}cG;ki&eJDg8Q9-CiKP(d>(T2edjE3=6qItZ=87;sr$TjFJ#-no z#IKfX>p#GRA#JtIPyev&)oS&gOd*1*tgF_QQcn=&wW`3O9C5Piv=q5k(#YRcQ!$<_)j*K z?PS|>Av1;e-RT#Q{>B2hJR8LdiM#7XT*yVG^hW-I*Wa*RK;=1~HYicg& zKvgpZ>Wc4f^fqX^y?XA~-1C=n9R?d4V?rDjwPPxhcmv!`+i;EED)2DMg>FDtzXmL5 zpML~azu~}fed04beO6g4#JM~RF(Orn-*d6KIMjo5X^uaTimet=IuA`2a&fSg`56Bg z9OFaftrioB41hz#D5?ewI~aERJn_1XM@!{}9g9oAL`l9k8UY1-nQ&$z5_Y z#Q*PU^~(fs#qCIkhHSgjY6v7iq##jf2QZMTb|_{JiV?0yN(j{ovQmVihM13(F)7Se=3lGghsdrz<_#q zh0Nxl)KLc*OY-|;4s8m0HvO!S&p>Wg<9?!4@%b&ztnBI!A88`!D`+;3F7C0dZ6)Zv z(YXTBD{SL%E{|u)yG@hiWEQgcAdzHfBB44s$VbP5+XDau12mHZ$N*Qb?u;VNY`S3I zA9%^a4UAzVaGv((=(6j^p2y}QvvO#;0|{f)>oCwToA{4JHbb&?UCkUlkOS?v zL{at}$&5*4t(q*^=6MX9dv38!s6TK^+H{H8CY~#0-e<8x1FA%D4+I}t zOkXPLIYUyPTj{mouc<$NbDy6VE9hHgOg4!an_~yByA`i$9(KoA^7)ti<{O@uaY^$>2!G_9Gym|n>5M{Vvd8d!BC*iAJ)S?@Zk)@*DA+=p2e?e!7gpRuU zAkD_M-*y6_0oPL1iRG5~s<|DfG~{Hia^Mt=<*7jL7#^C+wxXH9@{oFSsBX+6899xy z6KHCia_Py&&@F&XeR>GSW(+EeVn6C@>eGJ|6=rB6c4(;oV5C;5uW6FrSe212>7I=z~A^G5g?e0Kypd!OM))eQ=G{2VHd^Jcec>iG`nLUx2BgFUFg& z3T(Q6_w zVDGv_3yeC*uMl_oihWqTl&@R>&`nqc<$oXWqu1P!Q`;o*e3maOO{%Y4*=Q>)MrAB! zgdCa3q4^L7B?428CXmGd()7H5q^A18)PycIP(7LY5wm_#&^tGQ9!Y1^i-VKUn{Yw18x#he~+g+q$g1%*08}D;|&@Q zsLf)Lu3X7gJIqV|UUL!yQUs=fVG+}X`j{y|;}hWhjAvAiwgcHsYA)$dtJL;-;QHcI zC>=jU3eA@=`y(RVcZW=43hDemRD(f@qKCQm&|Jir_Az2-Xcm&0Vc(DhaysyF3+sOV zSQzV|LYPTDY;GUtV;e)%MY{W1+r z#Nv|d4()+=^}4|(hSai0;1YsvD%lAZi^LimZ~zJpQ``!Lg$MGp%Un2nlgQJ139Q7A z_KBz}{0jt!s6sw^? zT8z>V_2aKu#d~O^!D;s*HS=!n;hUGi5j8~X4yivpCW*Td$4u4P_cPGrKX5EJbTcZj z2=hp|Gy-uxga$+qCu$geg$#O}Mhr&JV970-9{b^|cKepUzA=(tB{A(&NZXtq?~A(e zwl}Tvi%_r&c24ek#dhTNxL(^1F8? z`pPGL+OApZ>YI@It8{Z75xrB;ob<~Py=IyI!c2ccCSLyv+;&FY|Jp2R9+N)7q<@Ia zXUs)_mOzhWdN{x&-c{72h(>)dUj{YH#lrfpS8{K!P-B^vtNnWve=;)2RSk4 zb}$(EG9VX1Mw2e0~1HJk9MJ zn@AY#2UsN9h&P!}U~qAE<4sI2UJysMdRi)EP|7Fwk)0?JWsd>P9^2 z9cifz<6H}nHFDlW&-d-zs`4ef0Av86xw=am+;_c;i|noUC(%oE%e-L4qST-z=MOR3vn7qog)Xr%v_-(WD(O{N8nB|W& z%YXk%DW9$)BIS26%kQPj@2$(fxmo$U0pk11$5G0}(2%df_=Irp(Cr8}KM#eCJU|ef ziYiqK7eD2njm^G2|7H)&}RCsF`kc@dIrs#6MlIQ;N<*)=s3-m1Xf(f9| z3-|a|K@_skzWMc6W&hG#!{MHp<{eSo6D9i{W=CKblF*A@Z!wb9sBM%@Txp!1Y@rJi znF$iqEs+G_GmcEqgrIf(=t$SQ32TdY+Own85af)bFCXnjR}7RhfbxEs;oGM5S%TLH{^h>Uoj+o+;4Y6r&~oC{F^rYBv<6*Uiyb~M?f_Fp z>{p1z&b47C!+#XfV7OIk->-r8dT54YKLi6fEe|Zk!8Y}$AG48Ic%-`&5O{oP42`|& zXIo@9BYZUA43x9)38|H6kF(4Q8<)jw+a&Hp)^21-4eW^*D`WaZ7pY|`kuaC--r|4@71>H59xZK*;N zS)pD{D}?*i);4LcNiAA}wTA!`erx&=|Hwv0nscde4agQ8+vY&+aIxY%P+qLQx=x%b z?IPB4&ZK^ig9uEt>Mkb2NqBIf?J?YTF<9{Z?_6GQ`zOx1=c3e*TKTkW6@2?z@{gej zu;xV0@SmRoU@)n$=Xx8y`5&X-`JN=Tgrj${0G)0u^A-!LaHq>i3}pV9^Eo}8%ekpS zRy&)I)!-kaYdWVvb?$-G&gCy$EaBBms8WSzbIuyYU#xBD@V34Qb0nNE?foUmSevk( z21N6+0qy}0C~|Yue1^o2xTEn+TyvSwc@?`4J}YZgvv* zRoQ(^J~^+20@|{G^4rgaS7A(%V$wJE;Hl%|i3dYu%z6KS9Y`U%HuP@&iS!$MQ<{t?=<-kAZ(8&Q=Ga z3(2=S$qccNgc5VWhq%ARVMl>DA&&kk(r?y$Q2QwHIf1IJ#7i7k0$pBM!0E@t=d`=L zO%A|Y>0zsBMScDP{qVDESdS~SZ{Vzo-a}Bl0f~1^IX8-B$5OIHms?~eh_BhD`JXu` zlUo>+8P}pe`t>#YgW1FL2})G#-T-++J*&J_sQQvfw~=03!#rXUbvwHd^==fdiF!3x z5|QXTNiZ9v5VaoQPx!INP(T1qV{hLGQ0(UHfo|XPq}XA2za5kcdR+EMtD84i6r9~xwigG~XPRz*B8t-a?t1XXa`1YZnhiR4rz%*_ z!OOWsQ`^b)7PSdse9xeLel;rf%x%!9f?<7-e6;2RJ>E^`d7X}5OgDMv<>zQSU~vF@}y(R#F!W=~56kx>(oz2sK$0@BX}(*&QHqxtwQ0YEhknWUvG z*`lXpIY)9=BIY&fksk?N!@m_k%yW>m9$`~(4~kHBGPP4#Y+Zr``K|;@JB7<2ZztVR zQR~OpnauNjL+vOO$5Xzv5?K5o-0NZeS4u&rODQ>jP(O#0OJKNJJotc-Q1dr5wgANg z_an8^Mc4|b0vBt3XTnow?~TrmmKq7s{JIP=>@ea4U zy_dPYzlzuBg+l^BUR3*d6Ma6?NUOhFY@ge^)(9NL3h5D4WfYDa!KitkbF>Q=RQkpz zx_y}-4p^|pqlnCeVctWoz~NSI@19|?`)fKiQFvqAt@|36KL}56k0%(NH@Z%J3oE+Y zyTj$(EblOg;=Rl`^^GeQ@ygYCGu{nvjVpGwt8prS+$F4U@ zxiPlU)%l>iN15BZ)fG6{%E;f}+8tYlTt@yDSc0~~mcPf<_@%9IE|R*vI3Nt-72$ua(Ylp!Io+qUHM|(9D9~pA{~z{96HKt^XP9@l+xv|Hzo`D)>F6^> z+b40YHFwFh#+keH9!H0HE7N=I^bRR<1ynch=n^1jw@8}w9!2Rr)_I4N`Qzq$M_2f} zJntQ{N2lD!lu(m+K~-Q+2P3ezgS&l^yZt))gKG^x3HbF6IVu_Jn6Vu^{&+{n!K@vD z4^W)|r;}Aqf+X)E<=AyONxB?`LK0o=i_*PAdJjjcbno!nhWk5s5q97`o$d2M{s?T{ zG|4|?gETh1N3nPGSAeU5!ZpYa)*3aI>UxKq158$MNC!#Jib)YpLKhk%D)Gfv5`#uD1$~Z(49-I8Snuf>X_cvHK`@QIm0RLYE89OylMu}mu+2veYXt*1qW(6U_37y7W=KcGktov0(+8;z~Mx9>?%^W zt27|=j}JXU$S1@|rS$Vj^a-*hlEcA_$!hPB^q1okJo^1da$x&nuijl6I8>TbW^m4755`^Mnu$BOX3 zt|Tz$v2A#%!vFrzWt0IC)>CsiX1;RLpGx27j{MIkS^#8+$SofocV!9 z^P~egaZR_$ivX@2{)flmXLLM%#&^Kalmxf`wIrHX;C+yr|IzWeStIy6cS4DCPVT_z z{PoR8p?rCPY7}37|EBr!_Q&SSpNq_wzn7UWpY6emk$=!(_y_MXYy*x4f0H>2HOie1 z5kBoEp#GW6$L#odymxR;<{U>bkhQCAa7EVcw!x8)ZVHx9`>w?4oK{p4NXaTs4zA7G z+N~rovg$}lz?oGRR}yelohk{WWtClnh^odCXIfQhFr~(2w>`~WXeeuZ8GfehL3O8p z2T*gSZ%b#@|IAxLf^%}aBr)#zcStn)C||4ObJl!(8<&*8m_z({E#LOZw?`J?+oU8r zV~+9L6iK#OXM7VM;pvGVYXqvK(@-DzSfD!iv5p_dOF9iUt4P3(;KzdkR?=y(kCX}6 z3H*3mnqk&+k3gKxc+_)F=55j*v!X}w@tvgk7=W5KqQ3{**KNiBZVv4zJKhciPiNl4 zX11?W{Hf)a*1@H9>1ZEbhbEK+9{(G3Y+oT?@9!N9)s^CZQ?PS|LjG|{y@OX( zR5N*o1Mypf)%f0{Vkf>$N^&6IQN(P*|1RVRNr@wnTuK(nZ662ezY15N7I~hGJS#+Ju9{bPfrU3L({5)m04f43D#zn z0qN!dvqD*0fO9jdz6@4Y^#G(TK)Z*lwxdc_s6x#|_E|-1q^OXNs~Cldi52(vMk6aS zNC9@JZVsUaQo_W&2i zbv69VdJlXPJ#+#wwfL_`#&2~O%*h=3ac~8|t-u$iV0so(6illtLLrBwUyyj0fGI;+ z>j|dB*|VaYQA3X+-${YGqV5p#ACYPa$*!n73oykjO30U)$^djT{;M<@6A6~q?bGD^ zDu!oq#aF06UB(_n2ZX@A75jqkR}?iN^vX6u=o+1yQF}0@s(p(TA6%TZ1;d1qU~lga zzHg0MNuWo?Is_~5b!^pv;F7FzykQVAb`@JVV#Otao>|9Q$!qY{tj+kWN44UsXfQJX zrfDIzXFh=ZLq|b1yJNlljaq0D-OZ}m3Z_xnA>j(4k~B3zf()aGt|GZb zqHBTRf^()1FS-R?d2zA>swot{70+5!W;dP(QMvtSO>WsO2pvbAHJOnS0NHEMniGIL zWX~-K9h1)}=O{xV$x1RK-lx@-XtX~){Z4{9hMXty3?a{9LP)p;G_{6gR*lScQa(W0 z3F<6rwH>q>lHx#-WKbNb+}?y$hmyV}3E!m7VfLChEEc-oo@7kPIiE!&&e6K^_qH}f*{(jvjAkbJ{$HH| z|9kU~UmvmNA6}BAIsf=Q-l5pui7v7g(EmX*jrjky`G;uRZI4ph-s3t|%6jMQ;(R10 zTK)bn&quhE{1?!Wi}2rUI`T90RMhlO+YA36o1d^dvaf4leo}$cchNl--C6%TbCtbP z;+b?`*G0)mG0xB6QLyM=owy{2?UTqp64@~tEly)F!{+|$nF)h>>~x+g7N?elfi|=x zhUYhHFm9B*|FiQO?4P%Taxkk2He}A30M&jt+?MZy^QT6d-H8Gl4m+f_73WMGWcX}ha|>T;cdhszU>P(7fP4qa8Jtk^&7jnI_Slk){;7j|<08Vx z9l>Q;U$-p@+(dObFzC^vCC)z6fb@f=)ibgjs&1dG^0?p^S=+k>H)d^14)&?q7z|c5 z1p8M7gEv)e4Q{NNVGk~=*i8M_R9K`$a;I2CC zNe;HDI3K(o+UAp)j-$aKk_D0MddRb@EB503IQ}c7?HwVX+fLXC zwF{jYdPI_Lrh64#;?OLMJEkI_?Ix?2gbh1kT)CWrbB#s-Vm6E<_&)lKcip4&-mBy zGv)tE`-+(1E^0r8%W*0x&zJolaPsZlOiun}ri+|>d=w|2Qik;saC**Ra>>v$$!8~Pj$mxxp7IJr9mUB%r0?9 zJ=N#$%Iy&6S^9;MRj%W9OS)-Ev6AA9{2q{W_r%3|Jb<@aQe-E!lGt%^cmnbhNv$P3 zDXz6=BEsoOah@3sj=HZsGfp__4tQo9cGMm5%-HX!JLQ?N%Td?pS-Q-~+HChYzi`y8 z@i>vR%;QAT9Udo=?(sO0RC$(uXk=}%dpf^sR8)F8ziw3Q^>lv8sHpLD_8S#-p3a3v zMT5r~bkwaCK;;6WT0n#ZXr*WAMkA}D8HlLN8k}>Zqi&sK*ef6o3ee30bf;B(bgrnX zOhgO5MWY>c-+3l(b<}P0Oa!!To{6Z|?j{wzuo*MX8<|&lYVrFxWa2;OW28OhuRAc| z@yzfWRVSo{=RD=h9N^HN8SffZyQCYcJ>@SsAQ(L}3XQ4;Px*%qaB0ts*Nv+E(m@BM z&bvH|k?KS%Gf@7n1M@7;jF*h6!&0x~Edsu<_}UMRY3Duoee|Sf;*&pZnUV{{4QwsrEh^jTZ!~I73d$d3MJm>^9u-xrM#Vl) zOXEBd7{13daToEN*t5nn5%^zrQH+@gx~TRrSI9%0TkB!Wj+W93iJ<(*r~&>r0>4Je zDwlVV)c4@@K1q2K&ti~oz_S=Mvkn+(RBUNB zeC7KwR6tC@_*&5PH`a*03uc88ZD605pD-%cTjN;>qQ-|^MEKg*!M+eU!I3UMY*bWu z${UP|QcpQjooZzT@S!}6BQJsZAj@G6U^zNrR~T(BEYifJT0eLZ^6V!OmhUnuzSU?2 zgd*MAp4o)$#h#@N4)WKfCmdv{OAkB9M> zwYPyCXmkTI9J7#4qnk!ObpBoo^)RdlP1L&p>8O4Ry8IhR25~YtLGbF|z%*006?FMG zkjzwY1(#dGHH~G9F*slScW_O1RCux)jF{s~JzMZNuv9`j^rKoo4leZo3oCZZz#b5k zStS^^K`?47bb%cjNGo}q(~lkcQLP^bfotCfgvI}2cdR@P=*KGk*q|RtMkSJbJbqDqqWLVDQ|m$xa*WaQvM+ zVe%jw>~Q=QI~-rc4#yX$Sz z%{~{|$>ZXt1Z?a<0_^E=t*}C_9z}-jFKc?ay+e}SJ=Pe35H|Y^!E$8Wd~Etjg`KXI zfh`U&>$S2r0vV-4cs(HOB|o?!=wka@to=VPV@eFr$!^~e2lPmu9e0%$BN7XwXX0G8 zfyLOw>9VS zVm)s+B*z^7QbIGS6n>Q14jRoznQtTmj=W8YmB&Ykj9}j1w1%#goH-!whvaYdy!gy3 zxc$iU)4fa9XJx`sm4_QO7RjWNq zPS_!`*ub?fNJ#-Rk^amNoArlcqiu207%6Lfp%^7UaT+{0IrI897%sW_O@cS|MG*XJ4F=n`U@gWVcxGNZ z{11=E4{XY(iisJv!kh6Z+56*Djqg9^8AKJ6FBr;I5-Lv>`a>Zs(>@s^* ziD&ULdscZbXbJYL<6Rh6gDm*60aJhMV)J8RJ#-oBX1g@1t7Lsy&~Zp>HX~KuvD4tp zyz$BSnL@M9D*SK2|H0+Z^eA|_D?o@mh875sp9*xot`DT>__$iA?%;*^(@(H zKXRDw%MN;$Y_uOa>DjwK`4i}%LHm(LzArl?F=g_;!?Sl+@+W)vyG(iZZcYB=D1VpL z3$${9Qz_}IC4ETJ*Gl@+o~3?!*5+QGrTfwFcytLnBX7SQ{2w)f62$Kn_`Vh0j_#SE`b_ghcc5Fv{#&m7LpA8M?OHKmOw3lm7$j#lG)`a zk}EbfuE~Bdcw*YVlD%`rt_>cZc9<_P5lyS&OA*vAI~G^MqYgqVvBn->jsmctKDc9 zx#L?AFQHiDeM)P-@00h;IKCeSktOF2X#+Y<9$OT0K_zQiwP+om+=&2#`(aoy0S0%$ zzG4ClZpA8=1#sz;b{Ji1ZUeaReM3n1e&$CDh+EZod*(g9G42h+di&E*DK6cW<(wttZ9d5=}mU5@OqX$nw<4DzJO6xd#b^d zLZ0g&4vSks`XuV>#?|UdK*@Pwn1{9-ZnY`it0rK`M?YL(0DQn z$ncx;@FoH~5pMsQ^22`@|4KYhjt!DI9_P|n`&Pu-cOnKMHX#Pjix}K4V(@E8e?Zb7k@Tk|J*LbT zh{3ua5QFEwM+|m`7z|osaAR`CsjwK7010~=#Nfu{syff&U^0Z|#4nPkZ4G|$=wTQw zlBcZ-ZiKQjF_=7ULooR0K2O$%j)B2+&+#uD1CQge%rWp>I`}#5cKoHHW7_RtcY;u) zWeP@zkslgBa#)`#zJz(spf*^JFEDq(f(1pb73^61mA$v<~GE9m*j(RJ^U=IS7oJ&Qa=k8q2resk&a(x zL^}RMBhv978j+6Q7}fC`+3|Z3gHFafIyoqv9F$J}LOS^icJf|8gKP#IbS%=NW04*m zi}dJNq(2=k5*%727+NGav`8?tNN@nZtI^*S2@Wk13@s8I!o(dS5)3U83@s8I!qOcg z5{wuT2}X>Fgb1|jV51R{V8n<>h(ODS`J^n?^9>$5Vj&A)ZS(ZIn!hx|&t#VCaON1iBH!uaWBrn85ab&&7!yZv3RaHnmtJ+)cl=f8r-Am6AsD?WcEA`HI+r{Tub8@{PW;jKgA z9+f@tq`w1hJNm5m%h$Ya zSwBWx82}sp=_3sPd}*0qE}vV`1<~h@8}IU_7u>RdgXNOj<^A|Qd~tb~f6Rw(4jewN zUhyAhV)z>{;5!;l{@lK{Zr|NFs&rqn+y7vy+dmn1^4x>Vf9PhJmj?Cb&EctyU4Py) zDMp{Ogs*|uo#SzZ4LpZDaR2xRkDK@GS@(S|XZ51a!-_u^-+%;fUJ*X{26S=z^VnH9 zQ0~nuk*Gv(-Wqx7?#4w@b1drZ!>z<82M*y zv#tl!oSz%szwW_T)XJ{it?0Y=!u$rO#5F9Ovm-1(iT#@OS#9{AW=--N;%ENa@LlQl zKTVW#Sw4EJQ2en{hZ=sKIud?)DRDCV~0-&UFHD18L3DGKbkG#Sqk#$e;tq0oiek#+SMgE**z+In% z7S-FcwJQmFoWS}Fd~B<}EJ^&7WbYHN+uB<{psBOpwxe?{xcSM_-kfSm*mmBTn1EdH z>C>y`Zx%ON6!EtLR)#C(T^Y*l{Zg%lcUIh`CM=Df=Wdi?zz`vbnbm2M;tZo&nZD(*umnc~CX4KdSeB9>?|0Bt+(ip*RAVhom*i&!g zSc}DylOy~tOmDbv08SWEit>M9hua6XKsXS*FU(0^N%f4F^Vk4ZmTrBMP`Db-pl=jT zufuiq0IN<`PQiC;yn&so)kjWd52#tcV|N~<3o1XH?k$MQ2}F%PkiW>vzfBE5CZY$B z<@TjOU<@ic9QQTugI^E?u7Cr?mDk5fMK$Jzj$|}wXAT0jNqsh{WAL9}RE+yHC% z`&U(UL*H#X{zu#Iin_-X6lJHZpkj+J!De4_Zdggx7>A1=93L9^Vgq<0{Mo@PO;q$( zFW?eq@_?EH(jJkQ@O6SAnIYiTuV8)EJG|l#)%aPdBMyCn8o*_Ir8@kQ_>yH4DpeT* z7D_+{3Ov)F)f33F0%~p8tp*%!bOwCoK6=*je_P??w%e+cF0y z{*%OD>pUnCp}QgFhe7gZ-j{0Yd~YgV9yDy7A29GTd5o>|Lu2sr*i>8RN2lUt@NDFo zjhBTB1cILr1Ydqdf-mub;2++T;Ol%K_{ZfEe3uUd|GGwkAM$~q2wq#~!W}xeP{~(6 zANcxmy#!z4!|=TvFQoMnAGkIuzeKye3hN^rCj+Qpa<{LVU}|n9`uN5((sxmqI+f9v zBU%shX`oEa+opWA+@xSUok*sK8~3Y(2VDIcUbLfX5@C()Ssj4tGr2ab1kM z@`cth;ye0A-_@5Q0^VAoI`v7!E5%T{zHc?BYf4rAf4+id$J$<8CBC6Zmul?ubY<5m z`XlAZZZ!cP!pTyqYBqo#G{1tk0-~FD8{C1mFU#rR>+{uu%VT`~pWl96jBj8U;QbA0 zIEVkGbaB2zy124&1YB7RO;&T@r`0GOn2e7xrTMH6|0a9qcK2p=L3Ml0zANv$1(=KF zpKmqmP7c86iRMKMNQWVEfS&{T=QEp8D&YBQk&^kjfN`MT(t*^vp(u7dx`Q1)8-dB* zf!$Y5#mfrv(I^s#!di7(M~nRNIA39mA&bS_$f{a4&7? z$A(X%Gf*5ZQ^Gj?Zf|zRrE1u3agmxo|4sIdcc*Z0m4+*NeFN#}ZY75k5^l;iilj=w zaH{nu!6)FfExN60^}^OMzQMiI24a5ODfbs3M_a*rkUDB3J~T`F!HEk2MDUfA+(x~O zY|iERs8ytoqXuF7Rxqq%p|g#ltI^UZjRyYda9_JW4_CUtiCL>zJx&!<_T{*Q*1R3R zEkGA`eQgW)Og^q~2Y=A?wQ`O%l2N71U@6a`6j92UIvvxn<)qUV(>s}dT(k71yo0AB z?^aHd*`u0XE@SeWj)gI;pbno(9n``wG;Ln^ryV^PA&cYJBbsEvX*T5L7T}AM&c>Ud z(-}c0Uz-#87Oqs`ttGPf21*pkg0oMP-zHil;Y3aJs2MU3P~ScmHNLjrUditms48_B zAEHw(0-~qsn$f{4>IP&svDn{dJlkO6d)7~W2;cjJ+i>lLZ4i9FR=1&W#1G>8GSVRM z{Q=asIljA~UN^<}Sz9c8zg$%vkD#mB8w!JFk${eBj=$S{-;2Lj0=~NC0PuGhYHq4f zVP+DAg5PaM!uCw~DDas2`o;07m}xtrwie5c152m&JXYee;xXFdyU#li%4?fjzp%$x zEcbWUaXf)rf6%x!3#{tmxbRMuW{tDJH##T^` zkS~w=8D-!=M7lGa5J)3Olu9fD5DP6w;)a6Rn)0Z`Z z%Iz?KWsw4m{+)cIP{*NT0Lcl*Z7@RG0nr&y*E(a%Sdhb6Uf+lhtBtgQBW%w+!n|n% z$Jm~l$Tw7?x7?*Jm)YT-F)i-pP7fGZVKT^0vNy_|KTNN6J-p!B>(YVK`O?_+HO$W8 z?s>LPTI!WfsQJ0JFF=aw3o4dRL0XG7rNbQ?l%e69x@l*Mq69&=dvGtLq@naCg>Bc+j1@J0fjnpO?sxirEb^qo2_rtiV@{g}Q=h;2RqhkF$D zi|h|bZB=>e!T122eMP6CpM$Hdu2{EYj(;_GOvLq^%IPa%Dsp4n(Vn47>7Ck_qBO` zE|}-1U5Bi@E~aJ${L@C}FTJIL|JwW|X-|0mvMOqRvz!>Ji__zYeyUv0cK=J$mrY;m z=}YJ?86oyxm=)-*TlqK&0MG&ewfa`~`}4>PPpk<|Ez&T_9_3~lQWzPAog|prI3k`j^Lt5za0>+6B1vkE z$6Eie=#iCfktPSB|3tT#iI+|hu z7)hX??Lo-!U3~<>l#`feFAxo@unHK4FIf02nr!>oYTGl*CEcZZGSw5njEsR069Y%U z`s#pANP{C}-)E-myPbF%P_2!$GWcgJHquIG+6e5JVY^WvKK>gcf37{oR@k2@xq6et zmtV}CYJ28alwo2P5!|oB2jYGPp855$wt^3sk`8N6s-OKBucZU+s9lW7<{h>dS3{j( zP1~wB=C_VnWJ^ZRz}PF!e6a|D79D;3v17KeZ4%aWi#cXX=*TBx16ebVxoy25CZuX_ zvCXU+9mk@9wt{g)yeBc`X|))b)iW0!vyBT#sqi~ne`ig;6Yf`Ii=7Z2>9K3ePa7F);mjrUQG_2i z0%LXw_nyzvqwuja06Uk1Cz0P1Yc=2LRs~Z6`YXaE)G2$U-$I)RJG{Qv&| z?*E+cJ0ItexwpHzyQ;dXy1Kh=cNJiTClByJ`v#cT%TTl*F}@e4uD7 z;mTp0Tu4R#Er;6U#74j6@D-!a#u56vVk3=4|atq#|l~?l>I(Z*u zi#kd7%98Cg^~!_)O$)CiIJI!%ftVuhxwj9)8AKV~XMJQVWaOTEEvYY;#vt|Q@!{g> zP{>=86>=9cs14KbD+UII;6rL}S13auaf6>SV8 zYNL#2)JBdkqK(&!Hcp2&Dk2b0{Si4@8)q;)D@-Z`bd`=Osysm|-&ch`5RpZ9OW;dJC9N*+FlVvuny~!?8u+-qOW;>;5<2jcPSTWts%-$#%=%xJzLOD9uL%sAJajL zj|Uy-Pbj|jJyI?56dw=ZvEPSQe$M`*nEKcHn0)0?cjEer!`W>gEx7bqP~`N7-YR%a zNW*dj7I7PW<_GTTV<8&;;s*x1=iMn!u)Ooc-w&m2dOhFa*&T8em-Y>~u&MD50I=N< zfYa6U;?k)yr*RKc@W19D!!i3>*m9R6(8Hb$R91R3zI0d5LY~E54A^ofrL3psmxmS< zyoAj5kutC6lp=_^yggSE&z9Fta(&y=)SkOM4eoMi)C_-do%@kLvsP)ZpKedE18TS& zZImnYcn$IaS9PCA$CJ{KkGEoSGN6v^(<^&7qfLKfmE@uT^d`!CZ6+3g{_Y?P+bdYF=8E;PP=8H11pb1)U~J}e(@9I zIM5LZ@}=hsUD57j`+3rS^n6e$_8g5zm$PxsQw8nLO{!+yWVD^8GTs)~i;b~K5o&(g zOoV&*MUbiOGHZqV?XH>&zd`1f>VTUw#ubQ6aaYjcjmI@Qsd^rLKjK*@7uU<`Sp~0grMPpWE*~Q?6wLxXf@-L1e&>(={s-LEyD5zl zOc3R?1M8X9O|v~3qh7W?yQ`-{a(%G5)zm5+-rw?+J%85tQcI8PMlBryEnVeaPzX4G z|5cXg&-`n&4-&|KyZ0d%YnM?js0lzlF41c9ha6I@8GQz-EL4+vIUHWuq>mW~gjimW z`-Bqen=AEEJ(BA)QD5vny#y`Lx+_jJdN&cX3sIB$6^hBNWeH83EKN}Rlbbk$uzrxZ z&>MOn$49y2&Io3#lW`%C3*v}LE8Ic^OTmVWg_xtf@Fbz~$Wroy)A8iWo7SN67EvhZ zLtK$M+Mc;6uU;VVy8=81HE|$@5M+lQ<50jW{}927C0cwjo{rm_V6~m~vc08mZQ&+D zUw7}hTsM~Fe5N42WG-jgVvlQaLLmkf99Vy4KrD7*_>$c3M1X9^>`cG;*c^arAX{GM zwn^!WtXj@3o7*bT{mYnxV)+7ZW*xYNTb;Y{x7B|3E@68{-*N(Z zh#s1nl6b1+f6d2!tG(!6d80pA>)*DJ2fVWWYt&@(0WHw1;uX^h`-G-qpZL~ zU?8p5?Ec5a+LQYf&XnIg>D#wX({d4=0L0@ySkfLpWA3?AbL(B5_oS|RpyN(WP`7~g z`>C%tV3VdXtqQI1ALyyXqbdS@(NoZ%`sxz_m}mjWGv@hh#y+ivgN z_?P!~WZ|)B9e6-y7;lZ8(P?Pg;!pIUb$Ay4Pd$J~3HY|=_hNf4d*KCD^^UbEqB%?LSefI8w|NW!hHiH?)f_y zaVzKnn#YCGuE(n&97>ylM=GYi9lQ`jo7VqWyx*I;hC!_1OkG1^DEB1Runs}s;jB}c z6Gjd?7K1?GIK9^oMX9&oRug)}C6(df(Q$pN~{_ z?B@ZxK_H)@9$m|g{g(OaPtAOg20QrcG5$>l65!Gge+715-zq%-{(Xv9i+`UnrvfM_{lCX)Nuihf6Y^Htt7f3Dm zaFKcvNq#f!6Dwho3hIPKR>CFf)Z;nn2%OxQR)aK-#; zTk*_){!rHaOy12}8`Ex!C*RKG4H}`ww5zQQGxsz+Nv%l&fu#HLfhbOluM4DL{DAd> z={ioB5{X^{J|x4(Rxe5zWrmdt*#tD#NFc>WOF7$vdT;ov>~``E=y?l@_@G{TAJ)(E zNismNf9_ESa+dOs-<*Nq%-r9iAm)4$@@e|>)o*dao*#EYb1?R>NMotg1l{KrUdi5hz1irx>K-Vext0$Aa;c3v#@mz8 z4|kW>L5i9I5Iyukk_g$~PjF>by_ky$P!p8kcyf+6DqGyMdCF_}R#9sC6^4vgdi>_X z>{`EhEc;5ex$uooW2sB{u7|Jq_!UgMbv3jrHhxfFL%AosK{Ka!H4&?JCSD<8_$bG^ zmAf1EyTiHpSYm>SbRt)+xJgVTT)!=^qbyV$DtG{o>MZ2o`4FEkpU0_j*5`PJR(^pW zL8>t=Vm+!nK&uNuH^6FHWPmQdNEdnChRe~(59;KH?c^g9(O6^Jjn;c(TDkRP84NwY z0PZ(oTMb+aXO#j#bw_Q$xko5153f)e{W%Tv9g7g+9lVu;6)^aBvHhuuZL)^bAS$ip z!|`Wy_|`^Si36p{3Otz#yzPx-1>UyWR$zqPn-5@1nt{Fcb`R&v2IVUz=?SXv7^+fJ z-o@g;>Ue+t4Ezm*9|CyDFc8KdAI_~{+PIZ)0Uy%x6SrTyLlu`%PFyAT$AUYVp&3QR zvx?l0?xvv${W@PZ*?20R-yBgy`M7|K9sUrgpp7VQbI+4Kwa^27{ly2}^Mas+&iE`` zy6gv)w#~tE>a)ngdQvs_3#ei%v+;`>oBg3?S$JHTuh>!8~rI* zUom-kGJX-t?VkS;>;_l~?u~M}gS1-FwjC5e!E8#<*}OBbX9cit0=liiblUi)7sze$y-rErG?QpG(2e`mZ18U6*u3L zX^}Xu0o8F~w3^#-(Z8UaMKBkhIud**n+7 z^YRKWTF;IVaLYXAMmXKYP>6XD_?w|e@$dc! zj8ABQb-|}Vnm@pZ_o&DAd;FoK>(Lity$WADCgvNiK}SKwm}trPz;d9{w~X;)&thca*p``1D;E$~u;lYXqnNq)#E zDl4v?b}D8I4W-fxW?#-#Og{YwE;cVePKQ z^d~_c|M3c4J?<}Jd7aU(+SR-NZR>kCX(j=FuE3)YlHo4{yme!|?jJuls?QWsNEK;m zo`(C|xfB|>g7a~NKH2ok;*p=um6l(t6S~rGC)!ur7PAvtmdD|V(6X-J*Z$ttw^va} z>sytUpE8USL~RvO%hT(*K)NT^4$7SrzANdVaDDe@jNjd;UzH0!0xbQj^%?#THWIlP z70w#^5*(nkYi$SUM7+WQ!sNpBqP1i@eJU$FY9%`~d4Q)2_l#%Uj$($Gm&V zy`<-)e}wW$&qd67&h9@;{*_m}fku@_wDCb-RXu3chA`u0e0ayHocjD7I&*BxU3D7l zFlIt&hh92?aC#C4{|~RU%<4b2gw?aAGwA?u=Eh%{xvfmc6W9P-GQ2OscLKlQ2*!$Q z9!5)uM_R{Nq-F%l<-U$8;cqeSyQk6KEZ_DuSW`Z_0vgMSfTCx0`@fI0%ZyLdXQ2x1 zW>~1ThVd0ScI(&N-ib$`Wqd|a*=#nbyO0wvtL=qZ7u@b7KK`}4{26t`YTZ8fxOLGR zz%klOd%VR^`}vEI$Q~eE7SyDCg8oL3+r`xG;Wweb@%UkHES~hSuHml%ye4@n07&wT zWoXd_bkN^1`I|^TLlnUHEyO8xoCx44nET)rx|S>6?K|Kft9T0c2}3J-i#gzI%a#vj z*1TYg96nEAflyW&>ns`z5e?_IeJhf_4c*PT3=B#Gsq!2ii^)a8% ztP}-Xf@f&fJNV&0Nbm2M+criZf6rX=q*s{q6_RY7leu7Qd_`cu9qfoid{==OnJj}J zo%Rb@YdF^joYfxGN>SbfyB$jFh8(`F#v2elk?meCsGO9}LQu|gk)FczF_KQ<4rDXR z)B61W`s@7d+hJIMqMU94)2IeKPv)&8sOam(@^0(v*(;tWm1%#(Ps_`quTkX!{?J!v zO+Fd$FtZ-A>9gl&jPK3o6egT?0{|G+%l(ktDG+zn$09642PhBqQ=R)keKZ^ z&))GHA+ZiWEzd9_ws5-8*KfYi_Xg6VGevsAFPlCt(dr$Zc`P2zeF9;h>Jp#_%wR@G zBNb0Hqj%#`{b95abRB^~&^V-D&Gbb`SHn@(U%V-Bs=AJ=#-S2!8M>=N5W0?}sja&J zftn}T`$IecL2IQQljpqdTZNoVE( z%J-?r;oH&uA_f=ZRoyvCxOOHBforFOYo{^&9!baI78r3=Cl-x+HpT+!@5%BW>+ikK z3JccZr{%9g|J|DYYE3`WpZ*zQpZg7n4gA$2*5sLbWg)C&zdmhstl5~j*jngYy3~5)BpGl^7hP=nu}bSfL3FH4pG15M-p-?lK6Ht-q1nw2=T8g zg^)Y(OhWo2{Whk*Bk3}d@|+b~B2W;s>XR0#=bt7q4eVKw-#^Q{Ex+dvVvS~6E`D0x zu>6M^cL_ar2Zf%4Pb2G5d;MGc4`H7eMrnx*t+HJEjx3i^a2VRG~$E=Q(2lUj4c zTPwAivKuj$VyPGlzG+jQJpo^&JuEF&PD^a3m`N8xU1HpI<2)4TsTgGY6?Y{Li2XM=8&rQV>JD?D+1?{<&c$MYaEf~P` zAz*5^rWXdu(zpL!|6hTpT`L-Sw2NAwiPtLoCG){*ewkSqJ%V+D1P>bVA-5whAw@?0 zg!yzwe>=7jV+mwZJlfoE2B$I7>?3m{0&0%Krf}F|+?>QH!Fs&?G%U`(z){F5 z2WofKW8$br%ELDm6t(A;Z$oFAJIzRY?v;29wjzA!bU?V@9$f(c2C{%MH4NCSZoluC zNpp8P_Pj?|chcO0jyY~`8>GUFnn%^-7S0dP-wh6V+KqR34khL{4j@#$e^yrc#D=*? zop`BmSFFSdO9(Fzty0c!p!a4JF048Sk7%p4<`w`uKi}s*YrXo6J7fE2 zz0v=(>ix6-u#8pntfq~7(^!LQ2LkG0tPHb`Z?RfriwmN?7C%MrRH6XyLhUjFy$8W- zSJBrFwO5#}OR;uHQ~L-2)xR3xVl6@qM*D`~;8b_@oq%K$i_iqVO{l&R?-I*lEaBX6 zS**^4CQDJ%dw^?K4<$D-fKB`gO|ZtxP-E0cMm9r`<)I1^S(6|yv`2HlnE=*OAtq2U z%q{J?J0PUeZ^i6cblC)U-Xu(5stV?y8paJ3AsNT;;0s{948|#O1ygWJT)_||PsMKu zi_O3Tj*nSjZF`j$jH|Alku6=Wd%JobYFoyxrTI7q{eigd%3Hy=2~W~n->V*;MmeKR zbXPqoP48Vc2UxY|uGoB<-UGzfbSMqcKs9P-l-=Kk=}F11W8zh(>`CLN6LVLPRvJZ^ z1h2#KF8SH=RRWhkeS#f(Khc_sKYEcN_tir@@yhPgWq?sTRvc>A#a~S*{yQm7R=2!I ztD?8x@W2@%+;?w5iT&WWA4b{_Jj3_`=6b?xi%*q=C!DD&bduh^Irjr`mgYrsyrMhD8aFY z?d!e8${id7XwN!hDVb6Ma-&By${P33Nn19;cG*PXR~FoukWa+h*PC^0lS_{NXR%i0 z_6N7`QOBb-U8SzC{|Z!H9-dNAf=IqXC_Bo>m?P|xPr2LIv#u4W*O-H8t3Jb~+-$+l zSFk=cys-V~(W3{N`_;|eIS2m&%509P>;rXk<^a}MIYII?IY%r{69y+B?-WZj(5y|cArC{Z7^qTn%#7>)0hJsfC6Ywcq+8yf$(?7>~kQO>kU!ixx z-jkgTsVD!U(Q(eSJ8x{V#8!~VmdPe9h zoUCNH-;Vg)Z#Uy>xa`PxI4pF1%SE28hS`dPk#K^O5!`<1(3I49!TL1AtmWIVl+1ZP zbCrI~!DF+A88XiZ4L~`c`EgmWKHE6ZZ1g+q>$l36GU5lHbGzYGUT3ZQ?OHD`qKPQC zH=`E7M!#C0Gs2n=H2eBB`%*@=`kbqPPwlX9W;JQYNADs#}ee2M+t3 z%^Egmr3IVi%cw)WUh^Ywzl~le!v32Dyw-5G5|k82RL{uQY2J*+V2jgTJq%(T{1y-0 z@euhs+lcJQ2IM*bv!aYuzKmwm={1d1J;HJQOujaFhx~j`^Rsv8YH)PkVWgn!PJCCl z)rjoMj^_Mx-SL+|0mv z1lxOg`)x=0CT48+_G?ZVmdV=tM^F$5b|YMKzfAzC^$r;3l8o*0zS-yxW^F&f`t_r+ z_M6CdH$a=c8QTqWo3GzC6dN!s)!U!1#(|H0{XWJsh~FOk4h-c7`@!9KaN@y;?97h* zC)=0tv5~RWYxeV+SKAC-nB-pszrj3nc|k3h7WxIg-M}eep(hJg;kDd+Kd7*jtUsji zhOS8UnpFjVM-F_iB5vr3y8yRg0lEfJRAuzwFr78)08mInHsli*z`f?`E5bMZ5__{+ zzl_l3slE`7om}ZE3pThstG(33y|6sx80b*eua?56g6oN@+>1XjYJ9EeU8AO=&8WHR zpjj8$)fW$k5WijSUi={*4!l{?qA@0hd@HnOG$01PZMHEV@0bmGXGL1pHCFL{+J?9rQCPQ~9s zuD=?gOMRhRQo)OIbFb!7qYI~c;nVh;3d+@P@@6zv4ZH>Ao?V_j<`J*?mF7b$c?9w` zf4~m24k-u0Jk7?#5kK z^IbM)y`ZPiJ%2q0s?Z{-ABOdY1#mbf=DhBAu5RDy#nx_6IYCWLw%7cRKRmL%W=6ZW z=0=$Rq3vGG@x%Uh&|WhVFRlLYmF*aPY7D#_B0$akfSu9qGcm{>@S2x;P4GD3_zdx+ z-HR{7WNDWZR>?5m=UaLBSM8AGCcX*i+|Pb%~)%An!J4UhcBb9^(_xyjgxxI z0GVxMtTx<>N8n`9QM%w-0%olBtRZX2BAhQE#}t&SwTNJ2UvkUEZ`Cv;G z{AOKrFg7i1eKQ;IHI`w17abu^jKfrhxyvwHBD?!~%_jHaA8=BT7j_=)c+E8!nfkgH zZ(}>=>Xs*bh{5|2O#zq&&Z$wVq;QKXr z*IbWQ<8dMPH;TBIW3CsOmzfvBZG70jJXXEiidrZOTzTi#Q@uLGIKQMMd+M&o+c8{G zkq^bpO=ae4oFp;#;2g-M5iVmVlZZp97S$f z*q>ciyt*uWS$2v0iIrve%;bqkiEE9!YBzF&2i@*RzQBVS`5t#XI&iwX;qKin*oH6o ze*v*&qCXo+mt_araKr_VX=2*Qe5CyyX;h!ohtsb|5+>&j5XmPxfhpr zYY!frJ^PGue9RP18;V4K|CQa!(;V)_O~}r488w;R;1)WAt+Qu+U2^IrCGN#=QWmE= zYPw@~R#Y~z$%n&NCvGhZ=k&l?xjov;`{UdArlIGiod72P3^=Y=MYA(o>R~ke2H5)ui@_ z@;pah`08}yz-EziBXTGOs%|W0?|A!f4em(y_22BD`2G6!a_0s}|D)Yd!vC!9vnV1a zq3^Nv8Ke$`oD4+Jbi`S_YW8>0-vA)4f=OS`Vdwo15-P-TVWo)u;ZM1;QaeQZztC4uyBRQv~+w_R*ofuU_DMFZ-B9YNl-82vs%j% zq`McFw%4Sei{zSN`pn(3;?J;*h-fI3aW5VPLymIJHb^&YwX>#oaC^GfQ&%&l9e|b3 z872^;fr+i8So2R}wKEwjpj7-5DD_G}i8kt7U^NVg$*K=Add5Ey(;Z?o!ouhvFgmvf zu&KGcy`~3|c~Oqkuvpr`Kg0f_c3Auv7heO{@DU)`DAB4PmWBEl@XUN6H^0HcD2orT z@V|gG+(#Plxu8Eh6ZZ*(ryPqtK+dm0%mwnTce7v7wbmMJ}sLx z!91}PerBKmJ1yHKssF8Ugl=a`{5nX11i#|MEgG$Vm9RqYGRe)8_hK4 z)@_}dU*Pk6z(&Woe9oP0wXQeD*-7pdsq>va=N2isO`81JmvTiWo6I)mM!x;<1F0Rz%wd~-LFQQv z^M~7H<|LDeHc_%8oqgG69_T!FSkY@XoqapenbMigJhqt+I-O4qJ7UwB*NIM)>_}%m z+bjT`o1UF>t4(KqCpyth9qBA!n}wkBZwI^~o6dqxbfRQOIt$t6K+yRQERoxE7IvaD ztuvhi*=7;we0Sq`)24G^CpuBGBb`NTa}ek}wfDl?Z90oO(b>H-orBosV9@!*-Oqxz zT5Jb(q7x-M(m9xI4gsByl-~Czo6fY&Pfm&!A zBnjo$PI6D*%bRbS@gFai+J0cG(C}2E;syCPo__LvAp$B?Vv~`bEG#tF?~lcPcCb=kkbfko&oG&wSv&_unBQ(4G1$AL;5 zTGY*^a&$74iFz9+a|qiU4>IR|_3|d0%yFH_jOlHR%qz0l<^<5W>d^YHZ92zyqBEwq zaXJgw=1rjUt2H~YlcnjL(1}iHpVr$rorBrtWYD=G{la>i&YL>XiIQ5L<8)@S%_*RB ze%2>H*mO?rL}yHI<873DtPFruU%PyI-GT$0MtikSz zBD9|RH&Fa=`B`C`;+Y8)>yd}L%cXNqQ%Mc(!x;28TahKlo z(Bgw|UuwY#^EerOQ-5;w^>Fl+E^vVzbNAmpALAexfzeln-kx0!y&ev|qQRM9#i=*^ z_6})oCx%`bceA@5cRd_;MaHs0edgdVk4R%X%rTiV==SM)&=umuO67n!@2+?MU=cSa zJAt}H%@xN&NE0pU3({Wy=(7grs#CQny13cf>SNtVD+G341B4r}qDW zXuwI1kEq@4$~p|HViGf`kK(fV(X-FApH)gsJRc+ssy$-m;|{SH#SChtI2Pq#!KB3L=P7?YBZ>>zxvvn zZK_Aw<~T-mqMpV{7H@nUNPhf-%tvjKN81)TMslLI#%UI(aXe^#@Q3fj@OeP&g`#)&k?G&fGOxX3qw<|}5sc9%`_gsy0g>2I87@!=+e z=Ivh%JZjT?Q&%*jupV&ZG|Plw3TVzLb-rTv^W?5*jwy4TX7O96g65ZdyDqnBp3)V~ zF_n(fEYqI=Xr4D~)B&63sa??=Q|vg+;-$|3&FAmC=pCEpKvy)!)H_bIO!j7i=6|o- zc$Q7`jIL<5mHdvP*!UZ#p0g7fe;-@_P>W6d%&w@{L-4nlN0-$6*yUKPp#4#A3TDVD zoFQX7z~xQB^!WQy_w1Z=_;>s{+5EZboP7RFIj5*1JiDYKd`C(7#WM@C-Sd8n&#cNr zHx=|PjQB9q_Hm}|(=%<#ynpKD@#yynNt}fH}JR<2W*g7OlABJlt(d1OLI2jF2 zKzozX+&HvWg44(U*Xt+$zrG6c7jIifn_!Wpi>n}iay`YLvA;4ik!Pd0mQrSZkF}&S zb4>-d$o1-p_u;WzJqbz(5F&-nO64wg+V_tl)BtPdM{&RD`ilNv4h^L~Q+A*p{Rx;2 zSYtQb%eJ5Fo_8%4x&6Waq?d)KIRi#n|E-P)JVMNbhMGCgIGRyDlrx`&jdODfN^5ck zR-iMT{`U7PH?T-cuY_P2tOweqLwRqPMOL|_k~;6hsn0kzv)a5zL*BPjbXb}E%^XJvOPm1Ae+bSl-?&g!d6mCR{?gBZi|u$`T!OB!?P z1iP|ei>uOq?tLmQO?y`0Ngx z|9|2!L+U+EHJdLB4|+y;%K;s|Lr))`4i>Q-@U}5*Ia)5_dYBD^`Lv!`Cj+DOTDyQ) z0U;q9L?fpO-9y*L1+ybAwzw3W+*=K1vO#*$(xOwdiY2gRi4yRWrG#W?6mz5mJYgx( zEnWiKRww~qS4v2RE|DiC;LS>jlz54JDFJ^~N=Sw-Q6MGYkxGfwcnNr`Xai2Cl#mQv zVxW|OTPY>d;w6ft1RO^xAsM>FASnUYP)c-5T3Tbc<<1f zoIaJsl6u8U0%GlCg(zeZh}JDp#T5Xnh9K+{x@7L z(EkP3|8uPs;cF2W*3-Mpo&v;naU3@!e4sSJwA5J7KVZ>U9^HqwuO_N(+bDG1wY-i52O#D50 zI`+?MkN>_Ne>35(#P>rI9;H8~O&nA>c*ek6?+o;JSkDtD-!M(TcrLJVepNc?|9U}r zmrW+MJ_mUJ?0w#FmOem0DE+6wasR0gM2h~?>F|@#-2cm0Yk&TipY^BWJDvaA(^!5}xbZe@wTJJ^<2lN!{f!3Brr==xbt|4F zq_lr)*gwHj8;PcT@Bg!G79y6QacK6Q9qZ~52^;ULj`3QP%fcmyvsj>GWUwtd7#|-Z zLIDSIFs9-Yq%h(TKLhb8Fn&rxMkaoW@M$=H1}%hY4un>gU?0&7f4aypH^CYYGR&i) z%2dPC3LsYsDlsArJ$xPni);x!=<`h$8gpmh_1E=wxxQR5ubCHS?>+q(bwxiG~7Cr?orB`JZrHf3y>bz zWAl5Ro4p8*=^Kf-z0SQJ1P;895Jb;<)KiB&vCYm_>}p+?Z+O-sP{u$cVzENj5SBEMJfLaF7z#TY-bDeXG2W{3$J^4T#J1bWeMk3$?;^x-jb^{*> z@YD?p=V2#yN&))ejv|D&IaiZF!))>gSC&NTvV5MkKn7PLc-Ddk$0H_h3eY1`7_`_%|BPkBD`o zG2L(?HglcV(F_TZO-n5Q!wJ?M`f4hliJ6Oki)nT5`PA8(!Xv z@8|-j)gciJt$uv)I@`RE%z{WH3#5jZ_aU%!4$$m}IKeuv^B^JmM(TP3P1NreWCTrc z3}_19+K`hfIUun!nm~=UAo#Qv%&A37LK9F2n#5Iv1tF~A85hMBjUw5^;5b z4?mAlq2yil75w!PR0g5bmK7?)g&)LtcLd z;bGzBJ*9%WEQ)O>zFKUHWLmhs+_L#j$N=MsGbjKSu27rWo)iqtTtbOlM0y~?HA4#n zab-rNHYyx{L$~09Vs3u4)`8sK$Y{24nM}IU)g)6G60$ z2x=0N;pHhhS9l8KfGq-@QHhP87s4tSbd4W6EfamF`<`%JAPH^i^|MHloh~%$N@gcH z*MXyb!O^T_c3P|yoJCf9YIM7I#ZEMYo=^K(baUd8D!kFXpUl%V$w^ZFL`=iWyKh^5 z;-f$|4akD6i0$pyEJj#VE}z&!HZWX3cL@r$!idnX3F87v^{`9;aLv@X62`297428& zp_#TUKtY_f(jcOnFe>zmz<$zVX+uKR+FGTdnqfT+nkt$t3M=G5a%g&!5RS7oivW>Y zZ2~&t3Ne-JNCw3;2~Fs7PstOL3SH^~Lzo~jP}F2-FA%p)bZ53{Ats3!H?Y z)_ZCbcqu@c?0Fy#dWtm^LQO2QjLu`fpx-Y)GU|084u_)2j2u|&#Rmu4vRb|G0#kJF z6Vhwe9a!f@7$I=sXeuKB@O8sC0NXUkssqg#L{^V8koJ5aBIs%eLx0GSL8Nup8|Fqt zJCVCRvDE~^d+3@D!qC*oPy_oHF~U_@7P>tmb={q-5l0up7#=_byn`J8@7iEH2kRDb4uIHZfLWwZI?<59!N1unv|Wqi%S(s+&|rdhvxtEr#7o zm=LK;6IMA7`tWJRfsMY5kH{9ov(a#}8zE1PVCzTdMvV&jLR7q-R<^z%MQR}~wYJ@c z_t1zM@Xf|5baNr{3`VOkzQQzhMbYefsuka>u+g#;q!_o1CquuL$3<4)#6Kg>Pgiy@i;wrG}cD1q5pA3;XupJ4~2ne6EG^X!1q2s_XL=MxQ^9bh~B z#O`bqtN>Pyg0&UnX$at)_S*w*1sH0Uknivlg(U>ScRm=m=nV=>&@e;9?2n1+5S;y^8A8(rClmggXw8CN%$9*k22v6rW(^8ho8@EY zE$|2kzKW2}Ll;u2ogaF&e-Bplg!(!+z-Z)rf63H4ycv6`dBStDvxzpG8AO$ej(&?7 z@N{YfMze+<;i~SsG;IYnqYiXrW7M)_QP;4Fd=nL=zpsVS8j|*)+lmNfHjAexc4Ci# z4;ZZWMFJWi0T$-kdEP6iVhWAHx{0HjRDluH@}4=Uk)xs+l;?fu18K()H8(O4D)yo9 zjfM-F(SYHgfm#|zW{=FOA&KBcPbNod$zarmxv3UnF@Y9mU@Ib7(Mt^p}7|tqy%TF=}UE~rqB~vUWb>xj%C#Y!NxYNiCdI19J>cvhaYXMApDy(4Z%rwF<_CDxOk2wlVIN?HF>Ac$*J#q~!9vit zY@f@0iHOAgm3Nympo5B zoDHs#HPFhK-vb#&1N8O0PZQ$Yj527=MaxR_3#a9K#0g}2J?}fWVEGIE=5ucHneS_s zU~O%y2djCT&{lU}IM0ElIeZEyEWvQl>@&CcJev%B10Si^wjMs2<_emC(m`?~V84Y$ zw$HPLodi9FOAUpQ&cN7#)-Zuy3rzB{%txQbxenqsQ1nn7m3;_4W-vn`c!Cu&pYt1d z7Fa~|V#Sov2qln+BE$SFV~anChy*9R*J76D%9UqVX?RF?E@y^Qi_pgS((s_chVy+d z6k{|Lh}?!RTHli)6C<%|IyxU@zwkenRE0F6IeO!4;F^->%@MB71)=;eL30M2BOhar<(EtP%Id4u%Kgm%i*T zr8EZz*Sa5%;414-DcqSA_>`?2pJi=n_eY{9!C%3#wp?2NhD+Ds+w&^I1Myp)<|qrc zUV3kjvfzSz0DjaOKxh$f(tG5+6#)I*;*ZQ4}#FckV{R71`Ers4$T z(dtGtY4zE%5(1fR>YPPsj!=r(Jye=%4ok&Z(B?2#s5BE|jq?s6&^EjCA-fP+e2-Kf z#x_NrzY&6gDjL1LTlr8H+}>K=KN8Myfyu#x;N*Rv8PC{$i-3a_W~K`#Z+;);F)h0F z{&fMjr?vt2=n1{dl`}|KF`4|P+ziyVghWR(QA~diW!CDZ8@wDE&58C(w+z3Oakkpq8udliyu?{6~q8Bg+i^UASi8AW*$M)my9DKr+hcmyCG&0}H%2z9_EccUjIHgtu z8VoLRB-n$={?JgElxc-?2QNgt4wzjql1=KfjQKi_ua!e^p!Woab>mCkX{7P;3A}4y z96sn(&sU{Gtzj6tQNKge3*Vu7wq#oLzr#Zsu!qZw@fb@%wYR)rwP)z_ z*Lmos+=K!u^6?D0%DVds918Qz1fKncb8ghWlYhkSZKB}>g9uj!xP)r#8l*Z{;&Sy` ztd75;4%qba=xxA3`XA>@|5^)E6`M`uH%F3k4BHrqmdrsG%rUr91^$W!UdH5* zPoHS0??RUr>KCvD_apsvu_0EmDORy#q}YQlf5@#0Axgh|6e8`et`VV}?NUE1_z@;Q zLd`dCOvf2o`d}Lz=HjXpa-+q&Enbqk$0qYT7CXQmIR+~?y zC%1Wetj%*YV3h_$^|t|(HRS5*F-oKQ6(V1o)nA~U%xvW+z2V$1%7r93|58@ra5aPG?*R_*OB4L|Ba!_mieJ#SfgpXj_taBUhsWZND6i^e)^ zWiOWO*yK8U={P^YSdt3XEPDcfI@*UTN5DROFy1>hYQAGKf`Z#5gsqwHr*x95f<_O&aD3HL-_qt7Y{$ zmCw;22+S4&_gYpM*Nh;!-0iDX+c#>#`3s8#A1H(keg}_`IAbY(9XKBfmeuDj`vA49 zM=2v1>89S0QnMZ?51;<9Zr}-4h;#YjXu{jYZC-oT=?f_rfiXzVw~~2T0&;rloFT|5 zj2A!yZ=e>n`%x)(GIEQOa(~O*k0iHpgqT%11T^-=ukD`@=Wwo{h@r8g8%W`-kAUle z%Y+#R@e{oQU2NHNG&DG=p&@K&l1Aehcrrm@%!-5#4 zA?Sj~AzFa~x>-3bpmP8eix-may=6bTm!|=I!Ja{fdrj=bf8h&1n4+#lUKthxg`5pa@ z5{hx$-|+Lb64$|szwt6&)S?r}VeN1D>2C~}DgH*_p17}(_D+J6QKHIlAGkOfIPYFN z86|Ww{BSaQT`EpSVTHK^=bXqfX4=V6-YZj~5E$Nv1cul?#yERMl@L!Zq8-mz_zt+! z-V#iZ51g#WGvLCx&f#F^qU&)%7ixv|iI++U=&{a!o#Ds+NIsAF8wt}=j)P&w@!~44 z9HFE72y&IjqLLZJDFGi&DZ!U5uzv{9n$LnMdi6U*v}RQK3<+?>TsCOM6z6M%ywnnrbK9G=gYmL0KVo<7O(LeIB~ ztoapuM{80FKLeF;XyyeJI4(y${>ovTrC8#wdR-DWtGRZ<5+tagpr;x4j6mR6(};SZ z`p0&4Ci2*w7>01LVx8)9pVoZK1wE#ri(PE7+S z?2C<}+IcMb(WXvdI{Ney2UJ-GO??<+6_AKekmWRb>2K^3w$#PsAJ+_DM+VyVUZ2;- zLw;Z&IoaSMMCfvioEyFL!8me`tK`VJ0?Ff4=HA%I$pry5FonZrV4^=XoI~a!uZ$9( z^2gj98!~^3cNsGOf-`n8pbYZi@Q85k4h^QB(Ww}VeZx$`K1^u2Iv_N1}{@0XPELUG-0J8%B!fL~(Hew>!w$B+)ngxEC}opP_qPYCiAZ zqQ31@i^kHqT|oiBxhYejYx@HpbiF#3)oZ7CCTjMx+~;#G71*Z&QVx?Pmb?YCTI@-i zQQZBlE&>TSbQR}yPCzrLt{2g(=5+z@QmW;G0Sh_YKM~HIJ(Qi(hWqS3I?UdHFWHa; zRAx`9P%WfFxlnJ*0*H(^c3%4Am_019>>(o8De{BC5A{p|>lJ$_^S}=FkT9@^y@e}0 z3EEv{+e1I?A->=lT`+{T;X9r-l`&7-!;$K{ixTbOkpIaZo(Qw6p8l1#hkxy7*+Y$% zZ4bXb*6N>wDsxQS9*QLhX?r-flRbQVMci?NgLxyb$Mytj~;tQB%k4KO8%M*jSoH9iyRbz)_(ECB~9gBrF4` z&@v3S`r$i{cJ4?1LpVVA;jJxeg{_uC&_iR13kxYKvp-kg+>iX*f*V3Oj7JG@>4f_N z;|v9z6C3&jLkzABS1rV=5iUu=p}qHbdDf1fBY%myild_V3W1xHzc=O*uzq@6SUrsr zLCn=%$k5kK!gqm5gnqJLUc-ruQjJ-!zIg%9=HCAG!Io|as2!pPATzi<9SsJ~6GU+O z(0$cB10CzF^nvO%25+JuVp%v?M>*tL{ytInBBt5PjFx))eywsWl&nRkf_h^~cMxo` zvYxyfLYC$OXZ6{cjlmRxQ3H6i7WBX`w>u(NbuuK=DvNf813Hopblv(p<1i@POx z%O~ISEcjD2{1OZPB^$mE^UZY3T%dnV?kXM}r;aH|ci=k_oc}xm8CXVW3Y@EsoR*Gr zrk#O8V+mcbW%NWk+MVNv!0tR*A@?Yy+1}e=?Wf{AaGI(v%k8)r<;F`nutXOC{GSN_ zLKp4)gYW|Z?{DmmY&f1RPvgFt5q%qd4o1|Ilmjyki`sStwNb7&_$5B3fVtZm!1WO&X5lnAzVyQi3|Ak5g!40u%Hqy@I5Rq05zjX!(P`aacamSP))BG!t(3FQt28_j$tNt|<$- z;5xxF_;Chl4Z*?R!BWmwE~=DD%{=qu`ndC=?`R(~8+Ia1Ej&vqh<{wQI8 z41xg?&qnRhC)rocV0r9FReeV|EQ;rs!z^M}iKUyUKdgyW$3TXu>|E+5<@xwUcP$WB zhXB!a%D2uE>E| z3$#oPeOix79JnsPb8&;a>I+nDEcqR{&}F}0e<3t_iyue-`$W7jzF9NhuB5~RXe}kL zvPd5knY2*Ge^_rEzL$YRlGUOjOW-O`=V5g-JnQrXSCv9_&|NQbbtLS?M>}HjupTK= z`6N*6D3y^5fZY%@wS=PC@}Z0uN#`q0joBD4?)o!7;?CIo9^JUxkv4Jg2@Z2z*~HX^ zxFHW$99i=j>?CFDX_LEZJLJsJ+g+lpqWx3#G=rB(a6g1%xC(G~c>zqguOqR(g@D6} zf7`TZn@#FH?05Px7MC~zjUtOGd^X2USt7weo(8HpG=2?du;q`MzDDOuAV8Xl-VVBn zz%8gac+^=r59a`?gS|4~tsvxrr?^8CVahODz&sc#pw2!v13JJI443)8u=>JXwF^z* zYFcags_F;4N)y3WoTZwIW~hM^JnJy3zVS;8vapKS>W1`qwgUeN-Ekay^i#aT9>n?g z63{1l)K{SAuKpYlKoQR5m#bZ%jAq+i^+%>c(I;Cdx2d;3bUFUbPG$B($QG0ZA>ut5 zYy5)P?a2D&Gq9!Zs%rc-mi!(qE_)GwI?BpZgHF&js-DAmSr`gxf9KzLYLA{8dnY2W zB*MEk^=&U?axE~Xe?TAFHvtqm)WWPpPKzTO=X8B)U8#g>lHPMW&> zWHCC&U?pNg@Q~A86+qtx4|NZu<0RoQG=f9JQXZPAO=?uTPq*NsWJ(E^t71M>ov=qO zpZ;TebQDTj{vtJC9FWCfzD?>bd~YkXk;(}o6f2QGM5r0M#zo)oA*?Q zAUzh+&z(f1-H%)idVu&4L7ci0JcRA=Qc?+$aqCY{`k^$jF?)qtV4)o7E8g^x{e|}N zA3#|a85uLCy!}KP6d%9PYH*YV2PQ}DDvhO?Xob*L#nPbq*MBhXt^}4fC!>(+4lFba zaWE!p!P1|fGo${T4HZ77=TUj;oM{}8IFE8yeE`HUZ=xeP98Bfp02AX8E>(;x*9gFa zlEJHMRO{U=C37`*)l(>@&bWmsdU1;DBrH5x7AqoZ*9Cf+npdAMeHDMyv$zd`zNR?K zsnTqn`W}_4lc9$)566f>LvZ;djIJ13&*M2B&OsK)VXH@KL7YCdx~otq0Nf z+PaK$sT)9wYJ_df;;7~G=XE={f#9q^ck)QVb=v$1DU}QYMyNxVqLR;00EhoZxv7&-=6WgfQl~PFEb|6nQRI&} zr5_Z+4>u-41>jgEoc6pB>wRgPG4{mPOSvDLkI*8_9tYvz^S~7{A;dA}f$s2laK9|p zJcIY8IxF|89mfM#%q@?Xg;!*8{ajruYYwv1^R>+2burujKyl^o1*X%yU`nwqY5G-y z$@MpdY`2HBi?W4iu^Xag@|AH1Cg6~5PQVM%*c?{ylkk02?=IoPX|JD`KriUOy2E=$ z;yWa*?ObeW20TB?{s26)DBlZ)>37^~u$k{~U2DJRHt{|63j00nKD@{Hi~4Sr^6~nv z=KIG!8$PRy?>EKkE9U!Km+O3#m-fFXvftCB{U@#R$TtbUBA(CoqXD~qe83*gn#80V z4tIAfYCEq)oS3Mb;fZoRH2Cfr9j1bgB-Fp3gNK}Km0l(NORaeVzBgeQB zRW2_p_%c{sDv$_-RHvW8GLU|_TV?3O3OtTyO}iqfh(6uNt$HEl%mnpwz`-|`ya6f1D)_RO@T+Zvf5;(h z@HRS);`YkF;X+=VKvg;z*Qdeoa$mamWfD+%OpAx>6~UEGZ}E4y-&o_wt!T9o7nTV8 zJ`^br!9UPN*6B0sS_Z|}FRehQSmO!k-Ecn8lcWFC;)}Vyy;q%c-F`T@d(|2E)w8ZV z>uIn$#(FAJEoK}>BZ9 zCmv+QCrHJC^J0=(3yz`BMN-fHM4}~B<>Or0zRex@we%LF21EmZHf@5}uA^+NRL6rX6oNDhS@-{4Bff{ud?&KKI(3>y{C^np&W9>OXJdV)~DBe1hN z!KM-R^<<%bOkf}E1iSfsz*Z!~-Yl@(C{CvBFN9q$x>$uw3g$P1{lWW+9Dy_OGg$Up z?(6G71YYpId`I9I{1iF@J+V}S^{y!I^E8%lk19UgB~bGn{84oonh=k0Fr1!*`cK#O zpNt>W-$&PD>gM8(`;PwNVb4(S6}%$7Tcq$i6Fq)U)2Gu7Wenaj1(y$3@5^7XDLEQ*jIKJI2ekC-LRpe7@~fpMuNf z2yzIn@WV}f*2Mjn^3Yv4q;odLgj;a*(QfyXkqTIn zCu?1i%9(Hp1NXAcSJ@_h?;;{xX@GH7H^yIz)Kz$aFN#(Izf|fuO!Y6K z#RwFrkC1^dNo%O}NV2>7Iq))uFPj+$?k7lf|ADj<3jhV&mvN&)yLmU93tifltanES z5Z34fdp=?R4p>9B5aYEZv=c#Dl}W()0JP;9D>FrwBYS!k_r|_QhzTqq;mxKnJ?@Ax6<5ol&@r=MUpQ%v%NzDsvFB5Z zAQ(0ut6193N87l&lq(NQGtjO&We2w;LNxp8Sa>>s>Z^8%bYb4HLq8NMzkVoEm+FVX z>H_^xqR!S2epR3!MyeC_!vwW%uO8|UadQh=Q{CQY10k^@V<4J%eu)iVrk}aef%yxd zU+)h&$+_?dREe*@!7G)5ghr2Ca3pa<)860EkW&Tn!=-;`wXfh-IeW=59SYxAG8KOv z?!WF)lh*?iGf1+*A$OG@8S2e5X_`uD_2ztWi1v(AxW5nvcHm2l#su9h@6%;~zu^Q< zI)vTss*jO@qKWL))u`J(<#JNsGU=I6$zXO$hV(WbP!S_Ku(@pQ{~Jq&p{8ZG;g4ux zg8n>K2)=x94jW}W$WD=0yR>b;)t`?iK!d#=TKy|%2%FZQePI8Z%G+iA9@akv^+#_( z8B0HnC1?B;yp!-l2+w_x82nGxzxGVPXKMU8Q{9TreTQj<=O4kEme>S*@h5lF#_W}7 zgor%YFPl?|+J^nlU}SQ%59HXkCwy2_=f zVBEa+*U{989AZnT0^`(~O_=-DWA4`rONsSP^^D8mD6XHmCZ_vweT&BvNehWF5(o+m zJ^&x%91MMx7h<)$vSiXiy)%hr>nyZXsCEM(zj=G1>_h?&?CIj;M})>zuL~Tf*PAXU z#B{9nwFl}DQ=Ct6943hmen4@!&ndz9sXoB+fsaMVQeX7+sDJCVH0o10%|j(6e-8U?^+MP;ZqBTVUea zg_VBwdr5h~pTyyjDkRCbk4)f7GK=DUNq%?mUj~O>D0m49!0Te;;V=gv=;*EkrhbrhHsbY#O;>_haAO}iGC*@+wsUz z__E;4Bivfk;gBwMB`FDE1H`W%vel({xGa=<6b2nW4mM8k0%0k2T^8~lf!!+2R^uZ; zB0St#QT$zCRGHbR2BgxW(O;>ofdamOg&|IjZ(7+6d#EKkT3TXV;>#g$8U6?`K;LOW zUjXQqj|pF4P8!EK$Xlqkx|W*{g@My(;@kkgi>0t?k`8dAaTvaJv;uTnep6-+8yB4k z4eYo+ir%I72}iFRWslGKWhQv7z0$%m)0t=iC=G;xXvg5OroaWsIcSakIsN5vY7}r_ z*8od6%+z{-#Nssy84wLH!~`nbIqBe6i?hxOPv+)K3fYC&Uqr2(j4Xc$G^Kv-50^Uq zxI}KJd|zOH!^oJ7M1jHpqwy<1Nz$K7; zcNJ$=+%WWe!xK8-It?Z8$tB#_oX_D5V5Iqf*n1cFDvN9HKj9)lz#SAdRIGu)x<~I}m8Bm(pr$1dG^Oh#D#$6+)9(cH^e;)b`j@+tPD-u|2lsoMUaIwoM>g zE~193U_^p~KAV6E_Yfew-`_mXvoFaGZzS~pvG3>aN3x%1o|(1Q%v!T%&CFUe{_XH^ zB6nZDGjD5*YS%T^?%#Hmxj@d{kB`=UjDg3tOSJMW^LDoUDKuYrhjh<>V5RWK;SJ;; zpV!>-SeN#J)$vUxc6WJaS`%whvAWB9UYB=om-j%I_u}~XqZ>xwSQckLRr|_DH^#jW z*4G&N8V)N>c!!?!_yjZGL{=}dedEf`t7Z>@{bW0gfgleyqs_&K96802BxVpYO2PW} zOBiFA0xNBIibHl7Z`A(N@b$MFjyOiq4>IG7BI}bU8M`Va+%bExdazYPcB3%9V?U%@ z3+#ssYhD!6lz2!#1yWpXncoV(R-Eb0qsjTgSa4W3d@5#J$?eYiVL;lrzxw@Wte|_nz)ortavH4sG9M*`dWYf`(?!VOr6fxU3KaW z0n{3*cg?)j)=X0)c2_5=G3NaVzdt7J=wB8zP{@oES6Z(TdW*nZXIST=F=Z;SoSE*Y&VlUsH2R35|fh9r==ODo?oYxX}Z zcc=lDO$a`A%}R?Almj&}_zMO9w-f0Htg>9fXm4E#9;^;kve-&DNb!d;Xs?k^2wo?p z;s9-+b&<+3B(mmNq+R+FJN}+!{n;i6-|$P!3K%gVl9f_{;FayhZNQ=(jBs{X^YPep z8D%dPnH8W_)*s9&{uk5S#EA71QcT^ZR(m+ZJ=mD#l1@^xISy=tWOmSqYB3%qK zST45tK@n=N7F;acEb-<)l2zpSp8RsOqA{K01Bz4!DncEsCnku;gm+lqF;7pL#x#J} zTb2KANq{Y&Wjk++Uu=9{m9OIJ()=>cE2Ouvc+nv>?M>;K3hK) zF30u5W2TG_msQiBYJJ`jUW6tFr``JB-^5GKFSY*O=u-u38L-CnK-(n_ZU4y{KeXk= zU>e#+IkZ)33&4Rz6Ns3dPuaD)hffGl)ik6D2${yr*3JSQAj6p2YmH#un#Sh#(^o=M z{)8M)<#k2?9O?>;1m8N}?o61*Za;F#5i9|BICz+K`J(DdqlU~1+D_|$L(UuegoXSc zEFYpaZgkr#!;zP_t;NsSgfDY)X0V_S+b#xvh68M%11#iZxy1nURBkouz$V&fhrNFn zk&MhHpOJT~$s6O}=Siif=GgM9A#*!$932Pq)loyX?tXF(A0(Sg?6%5t%N(R*9MBy&$@tg>CHST%X5@z0GR~- z*yq%SMw+Jm6OTw!S(@Pf8IK(3%d@_CopMaep>jn$=C7L9d}LA?hs_+KTNG74W~*&` zWH5a&VrAWJ_ra%)yN}6XzUZ28>p|z^LW96AZhE18i#XblHREY)PfZF~S7g|LZn6QD zQ%A|L#jgQ~f1~wTN)?bWtU%K%1bHOB5wn+?p|Pjo+}7Z zT}Nk^(p_&oW%`q+vY5}2J*E#JeF&-bIl~yK)T?-keA<-f8{?fdCi*Qy-!9^twS*`4 zXpMf#tnp`R@V#7851COY5PZv)?G7vVPyJwSrDLejR@kW;ajHkOTbrM>yZj$%33d_F zofT}ekC|U?*GB8^ay)dpo*4hnUqFy-hxs8=A4cyL{z9MfpcgU6h8G9ihm_ogO{zp_NiJmI8F3 zr}9lo`eXy5y!Km@F({mGsmzh^UqT5w3H?1)CS8w0vXKtn1Apt2XVBg1B{hXdD!vVD!858HA26miZOnIXtgF_?(t>2!|5 zpv8g|vZ+4BnUmJJcjz}9IhX9SYLtc4gk07jCaB8t9`>lO_MV<-t@A`1VDp90dX5N4 zJntsJA&%n08o?H1aEzm}fQU#dPjfRvtj;+`}O^dFOs`l+(GH;j{^=dhB~V&~3C? z)sF*_cv~>RdGGJ3)WJ{A8`D|!e|Cb#l9y9;_A_wM=I+*zXuRcr&P!<-E&I%dNU+BQ z%0%;$<=bj>qczk5uK`J(OL_9Jmj{;h1!-#$_8gzYe)0YkgPJeww9IiF}bvC)XDv3V~iwZ=; z1@zZXC-hhG=+RT+-+t={Cl4oRj(L={QZ92fN8)CFd@G&!{&^{p&5#l8pQbA%qh@rB zn$JLuST)UN)r^taavwGmQj*r~ARe>$!v*M@?p z@~g}QB#v7+SV1%OpPKH(G$3q!UyqFB406_>Pn!dx=Mj z2?8t(=kpNjB@1a*=Z$fy3L%Zkf8`9`e6@yqvy#ZtOpyPTHaulLG~8^dT0Ue(M1M&Y z!fs>Plc8rPORu6WX1S=KJ?-Pk6HUnxu^1K-k!;v=hey<+kq7eJ_@n|9< zDi(No{0&*jApg6c+K=+T`#z6GJ|?AMWg8zzPBDm_Djut5oX41rtx-0TZ$`~a3s|Q@ zwpIH@dqkIN8dx?puJ0<-@{zHo=rpvx#o<3$^-${dVWz2q6_ zw)#IO>-~8x=NY5wV`P>_yTm>}s_Gp+@O`QK{Q*(olzs1iSwKP(b|48_y;6()D6YKm zyRq9XVs$(r52O8NR5%adviRleBz|fZso4FPiE0hWb*Puu0n^TyMQjf&LniUP+BS>T zDgqZHk!XR32f6+HiD6K4fyrG-!5E!!xu-^R&s6T+Og61;|9s?>P4*UE0*yC z^L({XXBbzSfn5=|=N^$-u}z8>rN&Sc&mUFVerv%o^DF)MfF6xO(O|u&MXk_r zF*Alb8ogg|CGn`J7tfOa{-T*4ioM#mUEqF- z@3h=c@tZCi!VfyTs)lUV9x)$nLVP6re1(?47>j8MYY(fi_KfZj$oOW=Fj_wvi63xg za;S{sl#?Vshm^ajQWHXzZKJGFm9~ULtk)iQRb{|>hmSORpk*|UVA9x9QFDMM73CKA zDFuQnq)kUa4>B70nwGF_n@8r2I}iFL3skCNm13f`7!x4M%)0CfsydvMnEpx1u-7LV zhCOd!+Y;tXT_2rteoEx0q{sFbjYT05OAtEbZFqk-#`zP2(H%dc6#HeibK&kyjy`q$ z3q4gjCef+7^{w9}=+jmGqWY9rxhO8{wKU-R1oxj^dj4$mDciPDeTw_&0c#%k9N>7m ziF4AY9?%$lIvL!yK6U1|Q5=lr|Sgd;dYalElVfAxYXwJAtf#h(5}p&R@8v)9fFa`gH7z|1$6pQ2)D zK5JIt`RFs2*g68KD_`QokkFJ=>rN8gtxo5-ImUz9Icf|o8g!Ens%H(QX2u1|l$d4w zt8?TOP|5dW<=mf~hd+@QI@C74ibyIR$i}zOQ~88aYPFQHyp%uP z>Yw5Y!=Q5%6XmP@dQVy3JvGu1y*CFU3Gy$rg+Qme`D(w}Q@P(q%l$&-#+lsr^_06j zn)_SIt&T5JP`9ZfD!*&sDc5=6%847(+{bLcY)>wphvr^lxFgW+i?| zZQ_6Cjw0Q?!ItNjm#xk82@2q8$5(V}vzS~!lf8LA68At~2M-7^Vd!iDm zERIO4(YvzrbDbkoto#9SBCP_fp|@1I^XK^WnnimpfOxXYvPwMJk7SklJ=v96EDo_(fKoo#)xCMjoo4&MKy#5Lv*YZXQp#5O6>tqr{SLvXWDPGv1QB zc<|+K^L+1~NZDbw#l7uZ>?n=3`O3oBkykV`T$tKc6dIbw z1XuoFuLk#o3NXp0ox)$JvA+GXqm9886>p~&W;bSY!tz?*n3U|bizl7R-?)%V$ZzC6 z@;V=TS{l?g6mUexfqvXh?hj3%IM-{@)$rfe9dM($ZxU#exPX4JpR<~CUn#7p=YH}P zJ~EiR1;MRktnawYH`?+I-pI8vy0SR`<%KW%LSHz-#UcLC!-s?0eHCrza@$hH0d53c z;b+rA?c(Pe5_&C#{n?wj(J0p%-N-tOK4tI8-9yfC_8Uj=Kr8vE9rq!(UtyOYXaBH$ z=5>nsb2|oen^ikBk8Z?9DR#4P?_D4?iPIui@bi&Enl|JcYOEMv#i>-!lK;UVWJ~|% zg5cr8;HIfKo3Q*mJrH~`D@TNKEz0OU!N!U`sYe?D{08v-*(;7VR&)&EoC}$nGaF%Y z=*x#DhaMSz$+S?>@F9iyC%m5Tho|Q6=Z7-@PBK3pER}TpJkMi)Q%>y3ic6@{rUPo25J=Xrh{x6h9so_o~CmBq9q zcjts|9O_#<&YzEPKGD1U!`%FL_AdWq41c&~u@ieyCA!8Cf7OE2U6Egow>&EdH#IK*?pH>7jyj6XmS^!IV3ed#0q&=hvf zk9xjem$rgyAhdi z)Rz{%Y?|e1sh{QZ%w5Ol*1hB-Z)*c7osB&3a)0w>%KRotgl~D8!n}3v;0-{eH!JJg zWZQWeAIWfMJ<0cgXzpr0-6>G_n4IsJZ=Shp`QAziVQPBGAOWt-Me>OE@1^?bkcW&YelkvrEO^voSGh&->(^4wj|OHt|& zP_89Knrww<_<%uNGm{>WIk^T~gq44Pu&tuGO{b7qQqGJ@{NJLB#Jt&iriBJv?8{w= z*xWvRNbVkNO0FAy!ylTSis*1}J>yaE4gYBFMr2r7U$8jMpZ}I;$UePh2XBfl?^$y0so?(2iw=lSi zOKqC0J*M;)#-N^I4C*b6w4PyTH@sJEikj)EE(?1LgImgaf^ltcVGQXR#!)nHuj-;} z;CkSTmalpRV^~ix7ChjVuc$jO+Fh^(F-F`@Lw702eGL){f*tYQE&rtjSF6A7DVn)D zdk^}&DD^cgI<7AB58ja5NME~o@DN#1quaPGQJ0$6Egoe2skEM~jg8R2MF%k6_x3-@ zH0EbiX1V4`adY<>d^YyJHNCw<2aS2T&u3?<_3s(1rETRFUduC9hWuD#$d7dm`LV7c zKh`zm$GV36Sl5srYa8--+iE_L;B8xk3nsVP1>E%ws+2};MiA)8gf(|9DkpdC;^I?9 z9MAbqt&S=N3IZM!L#IEHsRPKUk zIi33uy`#%skMIV9FB><PDqhvbeQFz!_Ba^%lM| z@riw{yi;XadeqnJx_up}uMFY(`tfdGb?BG-by&Br(x>j%Lv3C09z(mhUz@spy+mbM zU>4pLUB4P1Px~0q$QK}CR?Q3PcGe%0HKFpA|05EeuRrPbRqMwua6-1we6QQrkE^Wn zwW8bC43Ws(Ph}tM_Vu6mN`QiUDCKQJb@M9(KiXF)dF^04E#irI&3~E3 zp$YPoV149k?Dv7PjGN?0Lw77U?9|bR1K@{<&a?&?co6oinL%5>xR7`O&eL@Tvgv&z zHog}`iG+4V`5P&f8_Eh@*{F9ju#{;s7@052b|veV_IF3#v4T@8x%5vh_`+wjIEPoW zPKS-2J??5U>+9C~3+x1zdHRu{V%gizH_F;KiQ`++b1MLYu)86_nk@nT<1U`LV zYk$9w@A@bzVugQaf4n*2qd1_FHTFj$#ZPH-@>E32;LetRlz(vyPTxB+#bmS|+Ye7q zG39a2x2XQoSRGtFi4C|kD{?-23Dr}O^g5P`np#lakF_gMehNE8N?NU?2S~DCU*J_O zS)l;++m%yKPJE4t-?H;PVe-BFLNVl913Jh@r}{jnzOG71NmGD&I;thbJ_43Q4Rwef zCq=AaUO-)dz3Z9ni#ntqIIE7jdzO3;P>VWr3@rZF^jpvO{++g1)S;s=J(Zs` zDe_fY)FFN6sT@kmq7ID>tx(p?8K_S zkZ3yLT?AyAucjG_f?T9g;he!=(J_dFdcnEy?uw293#V3e^!J2r;k}}Rt=3EksOZ3- zW(?SUwc_`3RiZ1$`dc)`f_)fs>SrxKch;+O>nb`1BD)-c-5G~*h<$&kXNk0MMaM8t zWQO#!BqRBPSBKn zzoPIY=JpC(rYBv)Pm`l?g&)ADgw&oQLfM+-!T3J3MoI8ioxQHKs% zomUKw0Y;8IRqsPeOev3h7k<8V;DjwTM(qBV3v%b<_F0Ls7!MkvfA6uKhuyh(M!JSiGj$C z^DI$c2wrQq-lxrHanSIvqWNS+J4pY_G@RYlw(zOq;j3sL&Ht(8SiAF_yvC`ZE*4m0 zz0Yet9u>1_D_^ZP?~}^<#k*;nf8Ap=#2*>;Xq~c4t8W?=?UT>rM{jzYB=uDYwsG5+ zmQKmEaW6{5eZPZy54G{tKG75IAMXP9MK2}duTNGl_s~wwWP3TD)(EKTcJ)k zWY6F6m%aEius!Tq(rBvni=IGa3dD~A!NBlWr#!+t)|SF&NwH4)HF8hPjQr40GruQL zo8Jahag>@;%KB=b?kV@Lm3vGy_XLC6miO5Hrx|f79@aVZxJ+%bw~wt8Oc0!4+k0_p zs`LgMrQFwzNxXTO z8N{lJ7&|!rK*pY(A9Y!szNkaiH5XHxTdxC|Mb&|^ejQ0hzq_9O_s&{cj!jR0T~TnY zbt|fzt2u;M!oa7AzzdCl+B-_laesF9xm-tLe zQ>6czvh%FD=f>J*R`sM&FwC1mVHTh#WqO8B%q+V$rl9||8H%pk2So~huAU}$D^{T% zR`Ny9X%alqD;8f$tKq>kF<``$F<1vwU>@4->)5x^`;y}B3kT?z#xf=%Oo8ef({)i1 zS5BtL3H?aZ9`^Qphz)2)3R z(Axltrvv9O+(cyJL>j%`__i@KA&CZN-Gm4I($F_~MV9e*3$Czs+>7(Rt~!s|*Vd1x zx-B{UExRQndvs8J9U`Wd9+iA|?ciiT@QaH@`(#8MN$e<=z+`S`v z8nL0#*zgX!_huazvv18oea&nyy4H@?@KpVqJ<4ZVqxe$Meut-0^B#m*Hf7}v8j;&E zZgsYiZr-TM;(^*z0es_Do2HRn9)d@Cb&FyB7WO0fsCt(PM=C_$)JM8^KIg(?f0saZ8msUn1RlZwj&=y0GNUkvLG)N&2sj zNcvYeJo8iyJ3YHTPD$(MJ6(3=liStzFuRaYeXBw^o+`?3_k7#-#GXQ9a*R_Aq$%oC zB&r?{f9!nOUzygo|5-Ck>l;_tE$_5i^>ZfY;sKv_%fJ}lKn@1DMxGC&`H{A99+2pa6MGDA$wX(OCD|c5V^EZlEpN;0;V5}u$ zLnO=ngmMohcg5;ckzW}b*qf4Y{t7zizOfodbXwUoy7lI%!3ORPGK|rj-Smdvm)G7BSSz;zUsIdLVXPZ;b8j=d>8D#VtC7h4H+Sik=*md47ericE!<i-SqK;X9K&Qv_SG9MMak=d1uH4+e75?1& z7ON|Y;c)tkbz8s{yY+lmU;NE(M}JZ?^rsfh(jyvRWS{<--%}CY>f_=w(vu9|BH=r+ z9ej@)G4qMAWMkQMG8(wntIGXV8@O!`bRGZg;Y;JcdK%t!Q#FkJ3sVmI_TRuD?d7Sw z5Ye$3|4Aw!aBXGQQa*U9){Xtm}52lbH?6@ z%O54@9Y}^)$bcA3UQ~|tDX0m|WQf)n$-!eQ0{QkP+`L*17E)`fseJ#R{pk5nG;gUr z7nmKD59`O-QYxq+k%V%_ww6Dc${~DTq1Pl-z^JBcCb=^5yDheiRJ{{F#(Jt&o}RuYSavyI%Yz7DRpwidYHr#aw1-UYl4k8Jsw*RJf&&d{nU%T62@D#b{-;>lLXW@GDjTco zLv`xT;(ZLVL=Ci4PV;&4Id80sC|m` z15Uk2dp)YFz+mEnZ#bA5z^^qxsGhgX>zH8PTEj*%zYi;ZjsA_K|*uzq=)iG*8x7`rA`zCb4*YW*+}x+&ckn$TI8zp0RM zFx~V0`au3h+=T1aL#(tJZlLe}eNM&c)`7kKE9d)a& z;HkQg5(uC<=OSW@&770=F}p94feVJ!7@-UA+^ns`h_(Kd{ZXs=g)>_fmZ-kSC#+uU zf1R(3NHP-V%RgS0;mbZAm`ONRB#??*(n>32a+Tc?2yr2TLC)bA9o9u$uflfpQ)Q}k1^Xs2q@TiE+l z;h#G?6hpeGL3$;@@4=nl#u;RH8u&7M*#C%OSi7ZzomDqKfo5vW$e&oh5kKO}k2dAM z*|q$4DIfWY8Ls`b?^C|empg5}5PaI^Oyy31Mef&_P!k7l{YKSSlt;|oftmljASTsH zdu2y9wvS%1_<~3SrX7QSC28W~claA4KMvj^;8`a&L(OY3eec+>(dx$Kzft+uDZf?? zo$(>Kf`jvh#q6^{aJ58xK+e$q0nBe4-sbI%e8L!;H0F zU6l0I&hDwmUsWVuMYLLN_lLcCOnFMQWSYqehwK3B*SM)LYI0Cz*LdpbvQz5-U;T8} zYJNC$+5`n~ej8HziW^7Bkiz-8W3d0sh$0`TisK9>AC;;+&T{%^ObP?aC{lEQO@{R! zhYlliI~ge0kn;s!f)c;=m!DCeV7P#5Fo*hH;*7eAeT0atO67!DS&^Z?Km&(sWVe$$ zui`j9)&Hf@%StVpc`$#gXUTRAK`8Mm4IoCu|GZwkbHDZdrr7mw#-UIng7pfwv&*Qx zf&5lFE--~+*i>wjQKt8;XVRndnF7Q=ayU8Nk1=N6zYu;S0<6v>9d;N$L5vE-o(3{2 zf5!=(ikL@>CWhv9m47lju?tU8ExUg{z7aGt4;sJxU5L&P{tSl+ZZhnnKY%%^c&tXS z-F7@mm#6YB@=EV$a!AginX9a8NAas}7suzxB##u7_Ll`i#+t99 zCADy7i`8>=N0I79Z5~z{^ zEe()mzBj|L z7XN&~t@u*aTLTK~n+IqN?w2qI_tO|$M3~Vo&W3!uje|`mhy1CjjIEWIfpDVfk!hjH zsrfH^mY545XRc8<9hwtJ4NdN+RQcouqN)8tllv=mXF_WK(BuJ1eK{d@KxpznrT#G? zbzo@nIZD-N5rcb9X!0PX1`|>Tg(j!vzr5hVSUzYSOv=|{DT70k&n4xiSjxGf$wNr- z#ZrcZCJ!a$Q?Znxp~=HYxs;TO6=u+-%EK6jhu9oEdR!K zU*@2xGxwPRcj8O_Pn~)(!nx-3hYhUfzrmB_op|Voj@oneZD@KY;%#E*jD98#bsyS1 zs*mIJY3i#{eNNwX=4)}^cfR8GACN4Mb)mvWbxIL&3&k9T9sL{!U?~8sOQN|yL2e>F z90OuSKb(sF15WvKxPHwT5smZqMfM}NajTQ82XTgz^l8+C#wb+nR~dy`6F2{xEw^=} zL__i=SI^VLY8@K_eoA?v%#U_VvDyzD!puHKK;-ZL{S=p|9LYa`M&k?9Zbi~Da35Z0 z+Z=z{qS=srxW&&UGgzxk(l8pNp8fzJg+^=rO!Y?88SdZUF2X7Rv$EikvZy1~7!bjJ z_LBEg1~@atZPqv8qd8P!wrdTnjBCKTWc1aRQa<;{a>bq6I&Af;#)_zjU0W90e~2rc zYfAgNmi}&%(y{R~VLisH(diigFfHZOj{?o6*I5t!NQ)fKthwxSaTx#hvgmzK7@L;Q zkJ6hVjM~GHrx^ia&fU%BWZ>98yTL0dO1oM`o7Ldlw5!jKwUwk#LbOC?<*m)T`{<=V#a=%&DvHs+dNmur%IFg4Nk~P35ko>h* zFtTu%rQvlp?tW`m+aZlaW{vI`BhjX{$o3z$p5X3c^m(lP@FRPHPp0-N>!Px|iOs(> z0spN%%jkLk3@Os4{(MZDV8*Tr%&Ih zHxX=Q_uHS4QPW>kE5PET1CSCeNCtwO2M(T6M~-pAVQ$}OzC4mOALyl4N2X$~HH^$h zd^OGn&oO;Acmam1D20pB{TN?u87a%PMQSSN)|YmuUqcg(TBq&DxPrdgc|8@VQGu41 zyA+612k^t3SB%y4be1#@i`;3PF+QCzJrFZ|lf*;7JizJETK;1x{AqJKl{rR(dsvL! z;P_|B_vbdoxhzlBdP)gOmZ0bso}2MjdHjcLP@|1CGnijtolCgzLeZ;(%i{@egul(1*GimB|gZ2ew`Cx}>aIomF<0ds|qN_g%f z6!VI}OpZVaYeO-6b5ZJHg*<)dBjnIsgP38Qw#urAE`g(y5$d(yEwUit3g#zPmC<4RG0Mu^HGbCk#F$Pu3uc?pPTRM zo{=fh@7Oy5S@QE`?w1x;Pmq2qK{UDLf_@S>)yyJ_CYNKSBs6!>n7}32PG_^OMF^GC zIrbpBzuP_D{1;$$;>`~Sy2P7bc(KuG52`b1h&gS%xi=PXJ_&b@(6qsJze?Dv&(_+P+58%PXpT9z=fQdhE;2|1+{`?B*HpY2bkzZQp=$>uLg8n}%@#ma@ zt||I1#Dr_z+z9k9m#eSXWrpZFLUj}(M_?F8}rDh}SKxF!Pnn=1~d5!J4c zc0$|OdWQWetROZBG1*11Y9x?6(!QBwjPbD`KC{!>yTrj%1 zqV1yq@++W~{6xt^(l@WDG~k>tc!G@JXfZJtw0&Hdd{Hb+K0ti@xzRBBl>sMA-fM@+ z|AA!^5Jbb|-%1FRx9y43h01?{^1Ta{e=Zs-|64m$KF8lJR6eI$sQj#&GYyv4Jr%tO zrj7>7FYaCbXt4bB-sO)5%a83{{%Ej#J1p%5{n23g)xFCf4VHhZclo2i^76Uv1wGMV zc?o?l@<)T^(|VUb8Z5sRiSGscXt4Yb7uL9+>dJ`z`#>kg5 zv?hy@FN(&<|CLErT#S66rx^L!1o7E1@?YhN9-kA7kVbi;oZV5Fh_Y)>XZZk0)j~KDPaX$H#Y^ zh4}dHFg|#Ee0LZhJU+fVj1L|k-yOyWkB{#TU40C?MLXh1M|f@f;;FjZ-P2 zk@3Of1jozr8{J{Y%o8YYqU4<(M~M8Voe=ptCq#ag36b|iL*!ExB2OSVVdX@~uUH;VCZ-$XI8raHhiMngBPx@TJsma3EFLNS*daMB2<1%l`~TRuyH6X1-RKy5ILw z>T(^z)$(8VdW3zR-@+th-zl=kyJSZZC9YSR_(bHV#E+9iRRdty_hP?o@(($qFV*v% z{~@Kk;~Qn4D8xsF%^RkO<>ULU^HkxhuU$9mc>D0^fqbklgr=XYYFbd}E1#eG=c%DU zzj>dlU{fx1b4ou`U4QoKmJ3Bbn=3w6Hrkh$P2=yM=UqH0G$O4qfBn3-{n;B^eiYpg za*nVo2U}OREPBp$yZa*hElv;uVMl9QUi8&!18sS-Qd6R(MpG){)6}xIx~JTiMspwh zBe^dicVhe5F_>lf3qD@^8GtN0_HzvPvI`a+`wxC=uNGX*UOfdX;IN;$_A#$Xs2#^A zrPgYJGIj=Jm-PTG9O^u}Qcw1aS>?QN++3wu#pS^c74TPoX@I}_#-Y{u)%T_OJe<2$ z@xnvb{M6@JTM&HH^Qz}HUwuoOKf5vX^ffm;w)##cfa$^Z`u8&Gtu!uPtKXI355Dft z-R8?}sBg_+IeI9*^0<-7z%B^x<(dIj#QvjNDbBMen}5eSUp}Lt3_QU|O)*m%GMSzgvh3LeGu=$jC9@@dXcMAMoXd z{mgvp_ky`BD3%lw~(^z3>vUdaZ9X4du1z+VMmX3M!WLL^N|5R~Q% zb{6EWCcptt17H2SWD6IB9v}b8>hye@s)O02?<1W%>_fjBcTMX{(BR8`MRRL^aQCFp zFFy67Cr00&8}^0D@1FBkNXxBxtT>C>Y)fs*0UtE^g zKXK`-yA}&UI}#JzFP87jsDGcTuJvcXoJ+b|5Z(nh`$8`c{p`Bc>A|(R?Bdr^|AK5- zy)(@hTJ{o*Do|@QrxoOe&6AY@ud*L_>WR@%?gJ!zHzK?^1m7efx%&&U>vLHbLGRRq z#vfXA34A~at}B{(fMlwcUJ!bA;O?A{;U=(!E8Vh};r8!&epmI-#S_LozAS}Rv2l;r zqzp(&;dQA(nOR8k_Z_`k(FiLWpc+bs}OtFq&_1U6tF?e1_bS6rBlkEH5({(HvYwNWEItRDIw)7LdvVYzUD>s9g~;g-ZXidxQsZcy^c0*IXC|3UVtfHjlZ+6N<;mV{i zieoUii!CXPywlNuZglH#bJopC%a4!IuvRqCH1(6Jf8jQS(~Q1c`eipMVekM!IxXRi zqr&hbulF#Rf=`2{1|B6IG_ z^814wY8Dp+1aRizy=xg%wPHP%&7>=X+n6k9;F(lCpxi&M(x@mjf_bFF2e*+c$0*Y^ zCXFsk8OFmaHHJ}^Cc7)^%F`9UDp_%0y2U|oy5bqhiUZRv&Ti}JijSh&ZvX;1xuTV^ zAXW`Eh^hhx2iUzEdjyq81+9{)qN6x_5hXvWSM8XU2*Ym2%qVi&F|$YXARL;kI56FY zxIHWDbj79M-mx3v_AInRd_(v=GmM=A3b!TRJRPhNT}e?nnj>8j(WM}I-IXTPyxOaX zd=fQe$*(v8e-`khcURf1IU*6lt8Q^JC*sv!tZZh(L?eh9p5fEefigow_FY*+J;RF$ zIu7J;DCUfvp5b0E5BD~EhR-kd4Cg~>iD&riQk_}HAJ^C)>l*uGZDSut6-^0ZeoDkU z#!W~P{dbuURNphSpgPT0J$(Q(fmgU3zB=ERyFa(Z7d-5%F4b|09vP8L5`u5|f=yUA zQ+_>?fsr9_PddXOyxD=iqdnLx!xI5z?F;T@7Zi`K7lU-@g^9SSVTz%y-yUNenResi~^0TH;L3MGu zFBLXKAbtdM3QmCLbZvj``|u{0GXyun4PWrhXgykJ$h~Mr!;2>BVGPK)dKiO*dWe?L zsE3>4mI8#o1@b_&{UP>}itbA*EG z>GZsf)NNGmabIqeFL!ML=R*cjY_DSrfq5-cOzPqCb{F*5s!cu5cbZ4p(A6(4HNBBJ z8Qa2=*ZOmrSTQHSxo8uXS_gGvmMECj<7>yg z_>5{IaKV$nANQ=G#;s0nYicKbE_leu*A`Z&zahfd(NO6_nax@Bf8s{dLVZ{6F~&*N={a$Zye_wc9sN; zm^y&EK{0G~poB(UoIY3$ z84#;!c4!oP{ci?$xP6yWtr;|mDMgb~L)tQL+;gT~Ok-0rboOw!QsB-nJ!f+urrzY}?sM+m?Zw5#-)n`W$l` zMhIuDVARl9fo9QgA^qx(6^Ah~q@T>thc1_5dO!83qw_U%MfE5{UbnHrX#Hwi`@+$v z0;Zq_8GEq6hUr!?VUS^fEA^+oUcgc5)x~9YgEQbI8SNP9ObtHhXxB?ZAmWThyZMZE zTJ+pcO&*~gSpCj@)w3qIlUtF3hl2++9%)Vr540#`teH9uKpMhqdv3zGr_Jov9~y8O zE5d#)t*&60Z)Y5#C8@Z^uyHS%p+rpM38q!sBd+%4igP&3bCTE_RR@drQR4^AGCVC={554iSy zU_R>okz@vbX%Ykf>p%WSH1Ny*@eKUgQ3LmS*`zdf0OKm8xgz%Pz7 z@NfQ*59Wb510SRALucT7lMd$g0kM!~Z4 z1(1MKh1l|xY28coB0=oYcr2oW%7#Rqf6t8vi&P(s^LDFIyu0B4@^*)|q(FZiIOzh7 zMIQfu`{Z%YyCw2EO;IZ8fnYONa&l)y5pk2%!yf$iF)0Dh@}1XtzCG=Vl$4|Ov=UKv zV?IqA2b*uYB@p^W)^vGpWnY!0%Rt#q%BI2ii&GGPix=}}`cwQVd4@l;Yxz^Unm_Zm z5-_d!+rXk-DF6rrE3?w|8v5k-=IiI_tQ1~xvC7~lcS8{;@=i<3U+?++`l>a-Aw`~P z;Udmcte%$PrcD_@;wwefw`NvP8yihbBXM(4^;dJMr{zTxhmyEmXKtRzPDwe)?QGm0 zWJ`cv?#R^NyS@55w?u#cB;mjZ|C=RjRLy;~xy2K=n`Hd+eV#cfQ$uF6YR>Sfp+fCi z&H2dG&=<_Z$EJpE^Rk(@QmFwpy4cn&@XRUH(+WLJ;3+R9tj`bY61o|yNu8@tokz7d z_8Mt(kL%At{@mX-kiR=l@~7z#e`c&vZhRURddtb(*+$x&V%=zW|N2WfU+XAOlrGTi zc|yCIyXcO7R5_0*&&Gbj(j`1Adf@Lx+pR4E6)Z)j3r_=lWEQb-L=>9x_~?^ zATzcKe3(C-??s8}NhRFjCCu}!(T=x<^1QW5huX>&>%`5Q+}CwUxV8l%L# zt2|o_G0h@oJDKK8XcRGO&N&YY$c$!zZ{Sbojwmr=%iO~%ZWE)HY7%iXb}BdZT{wN2 zh-o5ij#pO%#u0OpJPt8z{X1-WOL;aMVz!Ey-DH|GVUvhy6_AGoWJaC9ujEhX>rrCF zmbsDplOcxYlGKWrts>?< z0eM(J&RBre!j1sz7RNYZ;sp53C^5+e_)QUG3$TEku>d!V7+ZjKbz~edaRQ8ZI4zT0 zfCa=6U;#N}0d5m9wgB%+BqmOPcSVUwF2K7)j4i+da;5^DAzEztwGwHGlV3XVY30`v zEw=m$$QjFTx`?smcW)vwaq_!2N=$P3-78{j`4x~emfuVfV=G|&jT4zT`9;?{Et6b+ z#cD@>1>}t7H%G+S@@sTJtY^o`@1ZC$$>sNuh_My0fSj@XdPR&azwL=F6DPmzQDTzI zZ@Y-G_?{lXwm8M_8TN)48 z6O0HNAT=T=2d^5pF(*88B`cT|;M6y z*xZt30;%hBi_=AeI{jRYi#83au(2g}(BgCVh=zkIfDvKSumKuqV`vb8ac$#>u}edu z0Jm%w4LIPoGI-7Pn&A#Bu;>>SgX*Wo;}y}0V5A9^s0W2 ze0t_eFJmrH077<%gW53M z7_7}g&DGOLFJJ9S%cezW9n>v}sNV&(k&CF=+C}T@LvXIzYghR&R|^OY$7lM&-yD%@k%-2BI3p ztR8`cI+(3Q%v-=*r@T>%)D<;H$h^WF6SAekoK(oth5Bp?SxK=_$E0kTP$!i#Q|q%T zWhFu#ld?LYPAX+NXI;ulg*ql>jY6GN%DiV?%F2a0CS}b+olMH$%-I&R8ljGfS({KN z6|<7FE@n%GIx1%A!kkpfN`?8XO4%}Dj!Bt8om9%oh5D@OGD&otlx3>cNu{htsL!e{ zYZU63l;sF@QYl+1)Mr(hNuuMV%q!GMrEHl{pH*enCe%?WD=rr5q+(Vl)Mr!7QiM4s zWhKI#RLUBK`K(G=x=_b-S*cJbm9l1`KC4oeDbz73D;MgdQr0HaXGh9ponqkv``QOk|_ z1vySTdGLx5BY7ABtt{lp8iNp5`uO^);A&EX>1xj)972=_Lz3x3y70uCiIgzrlxxXh zwvpqsQ;1?wVk8m6vz1jm8D~)9N+Vxi5hZ4E6s%?*;ZUMHt=L@)i!+7iZOX;9iLtI+ z!wx|r$Ga4Wtw44$<%c zL`sac<=S}|b>ukhbV7Z?mQ%=Y^)~Wng(z`lm9Ls(HkoBnu$noALy7XVB0398yuu@{ z#xTEtzJau}!sh4OL?Rg4!%JmI(D(oi;61gGZ-L(i&02)EInxHS3I}!hBX|P0NHi zHfu^3YS$74^&x%MIwOn$_1T#4j%w}B zjuND7sZgI)DQgz$*yP+R)JdgmnNXiqDQgqzsFa!2*5qPVC)8(C%p_KEQdXi$CzY~B zVLq!;W>CkZtW>CzN?Ef|pH(T7M8`>4xlkvSvNoYUt5TLD)G;Zm5$f(z2G+AGU=rpy z0b44p?gTrg$H00vWy`Fr#R=CkVeKwlU_GmHRie7ato>dQ{O@6h|_OZ2W8WM?zk|6trMN!icGg%>M1 zqNh7DRpPK7jhE&^#(?(@KQ6$_TixsWshnLuQ?A$bQ#reSrd+S< zr*gJfnsUA7-jZ1FS&w$PbN-%8QncW)tMCr`8FL_7d!s(PUVz`pZ;Ya$&vt^tHph4W|=!{Eox)OxO=TlBCU)R&u z*HGXFRO|y=(|Eduhqv@_Lo-j?^z4r}`u@>J>oYMMJXI~Dxq0b=xBql7!KPg;h=wL|zJqDmU-AF_i;^k9NW8dg3ureCU}NE%k& zGv)%GZu9D6pdoy0#)<~tLxhkty!}v0xMAgeV9_rcxS6H9RXAJjuZT8ItZpfO?Y@`q@n(v8S8~< zOBB=eb;5KY4%0evzE3$E<^;`Zc>A7|&Ef2p*Be&eIp)jjY)t(4Ms~g@OozcVc*k-6 zG#vm_@zU_f&bJ%t@0_tsm^Mc-l{5;|kvL3^@r~}>AxwwBG<-(~f0~YfY5KD8=+35w`Y+AcDNLK9n7o^W>2MsTP2_xwa>Q&1 z+SZ1*zm&2&JiMi~0ftW4WMksTm)-fgFdYQb$Q_;hX*vw1lDcqqCqN&XQ7=pzqnH9) zh3QZnrmf`MLOI;u1g+6XLwID%dkvC^tu`ipdXk97o+RQ;VTzZCH%}`OZ`zpn=}97* zdy)v`K2ai+vuBBDwlVS3lSH)jBoVuWDPAIWomL`t*_in0K_W7G5(rC(;swGwtw2~d zB7S-ji1eNWVy`g83&h^j3dCL;6F)r(L}pI{f!;_Ih_=%TM4OF?pPmFFrze3pBuw!t z;?QXY;*gDrpPmH5+mk@F3sby6w4YWW+HFky^dJz^i+hp?G-IMfoajj+!p8_FFnZ#I zjgB9Qg=QqzCsP(BU1URZmFsQI9u*DJCSTu0GDw?peNn{uM?_`*Xjv(RvEoJ}-M_M<5qhwi+f>AEPAX{;|kl15~ zO2vtV1Og-*E(=FGH^dDd;Yf=aJHk6#w}Ql5*P~3-NG8ZOJyS^RVMC?jBto(Pl8u*z zcS`R^$BppL7Bg&wx3%sBNuaSuaabyGAX`a}kk})JO2r9-!~i6lE(>q#L_bA`jPSM= zGh&2~wXOh3adVHlVVU?(HZP`uJ6NcckT{w_oCitcW#MC;b#bFb_*hF=gN4kG6qosQ zbYnT#8e({>#&d6-!}mb3kZic5p}w&7(3x?b1~>MCtrteNY7`GNx;!rt{4ECl!82q! zVq?q%TOEvU)!<#+?DD%*2sRr82hNb;rUqCCwid{4)tEiK&E<8u5Nt9Cj+`O0bDVx| z4+n#3>0=8sT{hPU{zd~I#2<{$PXG2MV{y96;-x~+Cl;3!C*yIZ%j0E2&^I2JB;#?8 z%i}sB=o^nqg`g{sy)KU%g`jUdE*Am}zjz*(6uV4r7J|Mpxkd<>0VMR}5|_zsLeMuR zFBJj||AdZQ>M%K7@cYK&WrB~npU{uXT^<_*ed94=(w)aOE{`+&&f`WQ=*r`zE{}8i z&SS)+JCB#SJofgT$8AE;mB)2%M=tI&lT!r0D~~l%Gh=g!;P;Kk=|a%8A2+)^E){~l z_2Wz-=*r_Zm&fHoaEASuK{?YMlyed+vf)i9_`oFF%=7JjJlr0S!yOA##D6oDXUt!J z8ACO5a$}6ifahcU#J;Op=1nlmMm8OnA+{8TGtIX<^hhiM*>D~BR7((COdAZQ1GYsb z1D=oZ)3~m-S#g4GHoB=p*4Q#w&otlW`egns3X&U|9>8bRGCSOGsQyjRq3~y$m!NZhVZN*hft@X9zD(CJ@cZ1;Sh07m27z zCJ}8tNJL3rBw}e2iOA?dAWHip5X+JYM0yVbQQjAUs7odgGUbv9L``1=qA{63x)3NB@qbb*vVByT^}SOEtx=+^dJz8eG!QCWCBszgFrO*MIbVh z2}F4h0@2nNfyhZF5H-mKBCRj-;7ukEOM8%q^ghS~)7MMgoB$;dKoOES~NbqgULQMbW5Xs&BIbES~NbW3jj{OQKl_`Zg`75rVEJV~Ln8 z1ENg``ergN6@soNW2tzIjgTq$eX|&s34T|Lv0R*$wU90ZXJ|1xwn3c`be;LhSTsB~ zHRv0U8-<|jtUyMh;c-sidE6`nU3o0q(D2yXcOJJ1L02BjBs9x)#eHUSy5M)^u?#`O zRBKbGq@^VQ-CK_pJ*fAzj$(aCWI+ z_pSRDcVn%?)n$U+x1L)f*a=*97+NRTePd{;U?+51hnJ0l-8WvA3wA<(b$Hn<*nQ(= zjbJBqRfm^tf_-MZ6v+7ADM)OyYCguo_Ter|=kY7%td=`IkT{me{gEHJKJp{4M}D@m zy+4j=U27fd_U!5UX0?acbRG?7H@zMn-LwNF7l%hSy@#&BH(+>ED_RZzfWb{i>09^+ z4DPgj1pZ~=#o>R!)sa7PAHc_vKaTsr!g0ohK#m?Oc0`>>;+-2WAlY?p#P8wn>W=sQO#o4h%h9RK1|vfuSdh zswa7?rv;*?h^9M-kQP@@n;uOZ;T%F*Qax>UG%>?DgtWAJ+WctZC>=r??wmU);G8|m z^XD@~emNegynNBipF2wU^XqclXTl5SPAzG%GsbZ*@r}8jr-k0|CuiV!Q8;FtaW)BG zI^$izx;?9*Vd5wAt?*vQ2&+A_rhVqVZw)Z91I_B+7o_sVR5;V-)@+AdEVC4@L%q4yd=E2 z^?hNvD{FQ5mHYR9w4uJBrQM)i9p2u#JAC;5_5FBwuVKRFDciz_TV6GE;J^YMt5u^} zxTS~=eniLWR4Rcx1a$Cd==fUa4(K>EFnn^yf$+(u2z0RJS^qWGeI{O-*DN~Nt8?hM zH)|bqw8hb}F1)*Qd-&x2js1Ao(JQ><@2mvY?}+uA%;$XrYN0=2@ZxrR302memLyZ0JSX zqcOa%b8~n*t{*(S-Z0_9lt_4c3kzY;flh~x#)gT5$9zkkEzrS_=x9t051WC@3v}>k z=$O~}8gv{O7~Z|3ExfyFFLcaqZm6Hv`AWmYVR>z$gRNeNj+?VKK?j~8Q93q-4|l#2 z-i@me53e;$7?!d>yu0NsLx;Rr=G;epvd7$t^oS0AM8~F7SJWQh(a`Z|=PKyfKQO#+ z$D#1PrWWYPX{dj+^Cih1#Que216(q0&)NzZcnL(w*cv|B84mBmkBEm=MnuE=T3AD) zIoQ^PjI9k4Q#r*z20tPLsdL4YM?*$3G0p5*Oy7i#crktRG-8TZ4RpL|#8fUb(7})B zcrzxZJQ_NZiK(||F>Qv9crk50jhMn+=x8=#Du){A;74>I{jQkuXy`~LrX@X#=`QGq z7t>v*5mR=&p<|a3Q@Ptf2S1`?S4>QKG;|~p({GgbET$H8#EYqQ8ZpIT2RbYxrnupV z4t_)jz0lE!5AbN{NFt^WEbUoN_d-X!obEl1oZ`*{9eW!jr}EW-4t_+(-k6;7Xy`~H zr#IF0ET?VI5ih50r;$@kE9hu5aw<f{u7OJ#-p5 z#T5uT4jDPc!AErPBRUSnmy;JdtaJ5RIg5=VHl2CjF8 z`I}0NT!t@iy{#NI?vC;lBp2RFQOT4{k~I1HhWe}Vya6^dat-+;PPyKU`@YLt>~Y_B zY3sY-Ep3*pbsy2ojR=M>ZJoIkla2*!M{`>|mBxOz$?xss$Nk!=G%u z02J;Rt0GZJkPrw3n|!`cc5a9bv%XKZtk*CL^hZ;oqELdkwc*q%6}7un1{N)dohJdv z1cwoTJ$Cj4-U~-O+mmwqfpWkzBQ$K^*DAY7t%v<4ZhL`mxXsSwnQ{B3rNC!;Xn20O zRrZit4!caOE&;w_wFO7dh}E~%0iRjE;rGc_**UXITsD`M1K+TDFWfvMHqUGZ{(j(# z*V`q)3m+(VS)yb-?e!-4d6(Gs}VBH}2x;*Oj{^u@v}yV{ZoF6S+HksmtC6>HyzI z_GSVji!yd$lQJ>*h-U-$(A206vks8BykD0={p|y{R1ViCwoO zGs;{q@cYKx+m-^q3wOOy?v?<*Z`_?(2mCJFEpfS9Tn_v*EOjkXB!|>BtYS~Sc z%;l}qmokvP3wXG@yVV(Z7c9J~+;HBWLz|H|yt#>CQ%0ADWeUYDxcndP-UU3W>%JG& zAOSK6kErDw9Lx5|87HC&1)Gh=~7 z4lWi$Z(Toz9c>Xd)iG#>jBs$yf8Jbw-AxlE(`;vU+UG}@tU=yFXu*N=0UJo|pDSY)};20qVi-HNIfCL_c7+{<@F?hNop%{?BoQXBW4X-_1fi0+Xj}U_| zC6ofvmlLhVFjr;^7L<*Y0!KnAaEwI=o~|A#1n$H_fN`!~2o~3kl!CIvQs5qo6uc4~ zAq7uXCzgV;u}Hy+juBE&R+mr=Na3p&gPTT3!O~ztDIkG4oo-0m6?z262r;PaNGJv* z@EF9vJwgn!6G{Q;d*!x(!2zBKsaYDNukrC8sHwugCmEoPG5%wK790OP4JxYC92Ku) z4FHk7#s`3lK|Ph4FJ*u>wg3?6YkUCsN}2GMGcXL$#ufk~eH{@1Rtr-R2VmaeY6C!n zz4_=qF1oKX*o$e0F|*f!{$ttuWYAzQrX9x2UN`!Wi|;!O_I?%JkCD4&=sq^Q&o`Ot zK=)%~F0$7V%ypQ|b))~Qi|!5PB6}UdUAM{IGW0(-#?Qa$WjwC(T%RhsGfD`IuRGk(Dl`+COWk64&Aii#YwnOJm=__C<&BxC0XmN`?si1u@u>%aseXUkbErJk@9=ML{qt16*7_H=r~0K&u%%6&G%;i9lp8YbH%`lnKjt}J zV;f#uC09PlIfJkb_ef&-j1g53I&|d6n74n)Fw!ZF*Pkd4CiC1YXZC(HcJZ z?|S1BZI|D*%^!F?6CZ=-nsxZrbACzfb44Y!OJ7F5kTR z{yWp&=aPl^cDMWIp65N!d7kw=^X${lKNqt=-^MG$-~Of-dNh&-_L>59UW(InI#6wt z`cRElH^0hsVX#=+!!NMAJ%K_` zV0DHs@MNYhP?qHjEY0qj616g(z;yd|PvGSYuhyaEIJJIzlh<{yzJ6lf;Qh7l{V`SB zW5cPA`o`Nmwy+N(?bQxy%bd8O+hgD58f4qP`)l91OSRp}+Z)g}yA1o=elQKwTIA_Yvmz99{xcmaR{a%-70U+WhVnEaZh0I=e3=0^HLL zCMbSAQ2Wl8Rof_HfM7Nddla9a2fLaqczsbdjp79miomXA&e=dqKrs1ruRv=-YvEj= zMF5I`7bu|P<*EJGZ%NZAV&5!q60b*{bG80&E`!vFAY#uE6-J05x`0TwgdvXJZ?2>u z9@KbeH;=LeLGC%DQVDrPUmn{|PfG&?^P7)4GnHWC-eWk*7F@BDZxv5SCgjt$qh&J$ z6i{S|fI^lJ;UGt`5_<*SJVQ(=qOLyM?v}8vksxF%NzKxRcr-)D9lM25fu*dXFWWA_ zW@`WpISRCF(BM(Xn9vJ*vnjUpq=HG4Qpc9f0APl|1+D1Dfx{$P5p?oS-asUFDwS*z zia~IxK#=rfLMW4Db1B1eOCRtyRI`OpL4HM(aPJ`;<|~TjI4Q^qsxI4ZrJ@29_(5%Q zXhT9Gk$dcA)c)%?RPzpCENZG?$`_S_{UJn!QA%aP3e8e?fPp&NAQfOJP?`m;=_Y-2 z#9=}x+=7J#aS{r0P5pu*9K%tOppBhuVEsjDZ^2qY1@Wey;l@LRYp&7>?B&${_Fe^* ziM9f&NY}R6Ks?8(3kj?W#a-PHMVv6r6^$zrfzQyH4bwu~tC~l#CP=ekP5=;8N~B#^ z5yIx62^K7(SSyeqY)<5vLa7K1#Z-9I!Sp#tJ4AXGJC0 zYd&)1n<;7lgt-~gowcXbMNU<8!B zXHdu)1$$j>Kn#WrWXii>$omlh11Ud9BZ@xSNU6L*CH9#VcHZi`Aa{mZHs_r&^!+eM zR3HMDuU#Oy^7@qQXHn$kt}}Ai7BDie$JF^Yf>$V#R-m2XK@kk2t_0Z-eFbX|?zJ@n zRBv9VuKewQ4N8Ny)MBj%hjU>cK_D15>VUellXo_>Z1(20>1N<4z$;R6hxHC zok3ktx9P-b30r7G=%5Z1K-@2oX9#h40ebY#U4o}h9n#f89t1p~BRT+i;1m>jV6~_k za+^UOKx!cmpvnMsaQ7MPW+~cW&j}4tkSfxUswQO!4>XHX3C-%^VYZNld->25b*CbY z5H(60iHk%w(L*O`si*^EMwL-_8r0crp$>q8(ojgDq-{8wp#%pujjAI!8iEtHP=+wU z5dqe0?E(*Sg*M!S&i(8*xlt#Mz-pxq%$+jLIiL?+hsX~0il|5mSe-zit4Sb02Mwf! zoW;;Jyv7k@~DFWz%idA4JR>o&3 z7Cjb>geX>_p;&NNpQ%{zTYxoRDc0<$Vr6}nVnLxqvEaa{SkOtOSlOSYSbA6|>NMAM zGC5Q%=GHM0g+vHua0f2~$06pHbcQaza~E&1#1vpZfPo4MY|ue^nGEGzVH>GRa!0I} zF+)A&WHOblg>i%mDVXA%40MKJp7JqS%GMGjSlheR4RJok2=T3{Kn0S> zGvrus%yAl$JR^xDOEd7%NPhXnt z(F#2pPH8x$;gq&CySU~Pyk1u9wr`l<#~I6&PB&h|!}LfwW*L`Yma!aPRCo?wRQPhT zFDgV+fBPL?OqC@5z5-r_dmrx*;D!=nrKAHaoAaq^;Ca6ftn78vKM z{o5m>8bj9bPc()s(w}GyS%p8*7_!VhE_{T6Ph0UwI)*GHpJ)tTNQeh7>`ycXFW_5g zBWaa%3|WmHcL=Q%mlbtoxp|%2^2rEATUkfmWIY%jZGFI$1AbURc$e-0KuQ*{OuKxb zwql!oL*J##m(_aiN|4q<*w#FfjXCxAF{KVU%%>dY`@8&FD2aF{d7rje>olfm`8I7C zCI>zCng5HE_xSshw|w@Q^WVnip?9%a^gcFEZ&j0MgP2akR9bQU@kymNi0a)_zlHg^ z0RBIj;R*ONJ%I&T+EEW?)wJEN19|e*;Md$(%f8~_AV0TZKNyS;J7d#=?`~u`u{Vqh_!vhvcR{nY2&lN*(vxAo!<|;YV**Il zaoW{N)!D*@@^@&B=><-FSmc;%M}2Uj?JSzFIGB;w?%Dy4;@!0Rt&`ENce87^b~+ut z8rOR}U=za=aT-Gv+J^HQ*xf$YLE9(wO>A8eauK!_!&y+(548j7B~E^{1}mew!u6Xc z+WLv|_PkzKm}mFgZfmLEJ{h|`9j-=gSNb!~ES~S5fNk$_*C%ZKc#v7Zg*<*Pr}voa z6WfmZZQyui_i5K@j>xZ&MD}Uz>0TgjU-pTsrGCpq8yEIpaVR5iw+j^N?Y14P-yzuS za2?PZ(&4z-Teo12``6|;ZI|+nvb(Trhk<%UlZ)TIUNJ~yPHDX$!VDZ^$v2^bZGhl4 z=QX+x@@(_%iU>fa+tseM0`**;9}r}^fH7L%-$5!2i8)AVNI$6UY7nMVS$gUX+$#^9ww)o@Z9Bl_EOMK&J?LtM3fK;UdQISB zHl!3lHEWH4ALq8)&boFJsI5xoBS9Ort#>=*HwR#yRvKKoe-=B!VD5^wp|i5Xu<%tEev4u0nNY!*HKNrSk`Asq zPP+tXng!wlLbL5OM5k3W%hdp2ZPfX8z*;CKV%c_WH$cU?!?rW7Uf~zb4xrfszyZx6 zKt3CSLGlus9i%aKXhnt8fVK$GoS6VAXv7`hnAl9$ZqgXg91@7<5}G}ybt03#LRpO5 zk)Gug6<@YjI{-*=>V&P|CBm~++0MuozztxI1Mm!;yaZ;S?Sh~Iy)G0|16X{Or0UZN zu2xMxa0W)vqI7fg|Ha88^p~P-Y*Mjy%Yy~?`e{jq-jxh zKeAKFau>uRM<*|#3EPGQkF{A&p)`P{)SR8*I<4&{WxywzELX2?*}Ft|MQV1Q27ua8 zz$sEJ#tB0Y09Z#Jj+DGEYtkAa3-;dgLSkVTKm)h-i*4%d7g{@MsuZjhyEM=oEx@mA zF-ZW?UUhB)O%h>hxgA*K=QW6>?&$~M+5t!k*Z>mkKMh8}7>RTj&@2IRZ5I%r-*L54 z{Q%7cki9SuM@o>Ff%cFQSSq1Cp?uf@y#tsH@Hyb)uyA2EZID8&01?$qps?%eImofO0!=kr-h!^b}Aw zOQ6uZO?Z=|^9C0xwvj=EGRLX22|&Vhkync0UQA+vTLf|&#SYv8I=H2>`80F|ToL}{ z>ii*Vbe;%1XwIPhWQG#5Wi4a|fZR)5#P@H7{sPE)5v$%k!WpN|83MV7>>-fw$U2t* zB}^JwrTC5K>EaFm^0}R&-urp}m#q@}E7g5fQH|Y>yhxkdx<}p-)hohTxl1eHhR{}~m$w9UW z2>Ck2bgL}`7bKukp}0SW{83V&mq?4yYc}bnf_)`l^nM(qMPMi*6`}-?f#>RO&Ne8_ z@ua7D(knAO>Bv#i7i4)f9CAvbGDAD#(fpa(ZjZJg%XPqmS%thv_rIP&xfAjUgT!&2 z3t^))y>fC!DH$bVlzdlCxhT=1^ommIYKTMvkxrx;2?e@=KqQaHp0B5h`Aik_nJVTp zRm^9qnE&+F(!h#?rGZyEN&}0#iUY6o6$hRkEUx{MHAjusYb5%fWrF+^RcN95)hb8j z&QIP7c~&D!<@TX>xn1-=w@DM#7rv4*QN>ya(7TZ5^@`_$q52Sm@yP zsX~6@q=9Z(=cQWtyDh_bV=Dag}M6lDfk7clJ!=qGWrpz|B)V9kzb@78}-F znhE>N9*^1I+cO#JB}pkyARV>8vrRHldKvqB+a|kChdN)jcW0{P6Cm$&wb9@H*7mXi(j<|GqFUio+WDS zqAA@fLj(xhXk>2J;jMo;njtD908JIjWHXUb(1yFAtAIA2K9bNfg;6lV;`B5F#sWG> zfe~4Y4&&mN?e&>h%2rPhwcR2c$5e6%K(^}u*MGnFpph3Ut*+XuU~oh!8$O1l5J6ZG zg9ecRB;N)xzu&`{Yc6940na31Xz};$n=@(9BrQ~A#G#~w00GuTkrS2;{LdgGj1{2EB}7aubjd{iK)GCK4`tHY z07yvzNje;#XHEeiniNTu-7)eCCoPUH4YVZ$R68Bs#)J<9fE*0F#Bcy?Bz?HK2a{7I zDboyHVq+3Mg35$K7g~!I38pw0oZnlS9BGvx6|-qzbXlS4 zAXZvKxSqKl=%Z3U+6mAe`5tb@yp+NNIfgFEF}a>Vk8DDhWy$tJrjgNeKB7S*!z=;- z>YPwU#>gZxEJlV&gE?#+SaC(nO)P7`5af1ZY;**`5nb{P7D!&F=pIXQiy_kUJ0bwX zw3qoEK-;G14-?YcY$n{4Il}_c@hX0Z1&U<~v;Y~M*dHAOFhf@fg9nn$#pwg`xlq(H zNmi#@X<8;26+i~dq^vY8lb*~GSiojlCey|!%Txl(l)y~WGCc#!G{Q_Hm%~6iqNYT- zBg3FTC?uDQwIzT>vN>IFbsG%rlYCAWS>60fM)z}Mbdao3N0xvU8J)zJ%D&*{NGB(m zl#!9x5>g@ghi+hW*9V9tq0=Q-x6Oc9QaXXyBpDz^QYR6tGRY9JNKe$gspu8JNOGqe z3*8E1bjj&-G1Lt(MwhH^1ig^gNsz3}t^~+Y@1^2nKqL8GEd4OLq;;`Y7NbjIr*Nle z*$!S|YWMo5e5|I|iz|Z1+w$?EaD3P>UKEXw0>(-~Bv)1ems4z z8)fo`qJQ;-lFv1(@c>nxRMx)i#^cLs^~Cb2TO<)IowL8xKEE4}D$NI%9=t#js$WBG zO`HMBs<&I-DDtIYoxD{=rP;R7@i)>MLR*#>J?6mvDx`&5UMhOF5c|uK9eUO_v! zbHq28Bd&_{;JquSlP@fu!5)GEzEO7pyC_}2_D`H;q0UuE4#WSBY!GX1b%gKbm-(K> z4qmvsBm7Uy?~d>bk61$uIo-289ijSJlFL2Yi|;``+l#LoJsa5(UbFV6&T70R5$ary z%njWg&cM5B-RN#hsQxjmb@uPFlpG-JK&ME-_D4<`oj%rsbu3kG<3XjV9>Ug&5lX4 zmI-=(}N6sSO0ov~h+Oa6-AtzkbvsF+AqVEZ!Av)~PEI|SR1XE{)b;d0(VLB%bofYU(x!-V`bSc@-?Cqp!}csX;i z6TR(V>q$Ww2Zv)>3ro;@Q0FhOK%{d5ITvtGOUP+7?|}@0-9R)$5Dj@=0v0h`&TA4Z z$^;8=8W?9L<4JMU^tgjL>9PnN|6Y_!_{e>qgbmI>_M45TIFXYma>?!EL$&;uE!3z(@BAFj~TVw_?8df)NrR z?!ds@3+5A_GUAg|8^ChEV)+Pe8~B#E_9ntrRJtsY6pO8TF_HYbjzWHyj)2=RNQQkI z!6=46^#HXx5s)srjrB=Ed@Cu4KTQf^T~ZL=NebJ$Nnv|0DQv-{u!WMswlyhiJCnlJ zkrcKMlfu@O6t>**+P`P$U0nMC{}@SDdbWD_x)cu)vHPSvSJayEG!{=5PvW6s zruKV}_GFfJ77rS;wOuHum-&+~Pv!gxGqRF72Yxg!JY4ZW5SvGuv3a5co9FvNvH6&u zim5EDC);A%CH`k>z|{oe@_^!+?rPZN>Xebu`jpY%Tgjt8*qy5m!uMndAz#DTW~vx>Rn!)+r1z3M0%bXKu-Y+M~pnGy%m z2Fxmkjt`#=n6D~o28|gj$9g5hyg8HVXM9W?jT{S->SwYjSf7KyG=&}p$GQ|V`b`RE ze7I|gbd#EqWC5efp|&=l@Xi1>K9IG3}n!xx7H45sxN$Hv*CIwKKq17jjFjE9|LoAvy3ef}4MB-tDn<=BN zF-4g@nZ|son#htlEodVG&Xl2s9$h99BZ;OFQ(n7JQq8tOLlH(AAtcxyjUJ82Nsk#5 zNtVROh!j(@W^4hX%mzX!5F9cvlzG88#b8#>X+n`YnJbLOh6ou^9}>+Dq7#VFDOBho zYd0qn1z}@q4YP^hAfiT@Q#9DfsYNP>C1)@u8jZmDs^dpBQwhruA4SUKrJmI@pXVGV zC?X*x<|eyFSTrEb&t!0J(+n}AlbjYN8^|NE7aL+Ak6BNd#V{gJnF5Uy0BhPWk#!y7 zisV6QsFPEs2|`nuMb&3BnEP`w6-1CY6;q{sBWxtFLmdhy02r}GXIp`nkt!H?A@A3P zLe1u4`c(*0CzG&orpY=TAP5Bop=XoCxS>u?+5+MDNLS`@b(h6C0Z!)vZwY%bSvxqw zxB?+msc=ew0dRD_7YG^7!9WNT0wM?oqc8z1l)&^erh()1!a7eN2z3ZTrPo==Y)n^s zt};sg)30=2zRX8B<4~8!C1_IpxO_#bA74vP_2YZ1seb8KvwqpwRxY!o2uo6~-&In3 z^Y4Cj`7+imv%mQ`W}EbNyKwsd39HjJ_u;fZ;CA~Htl2e+^}4z*LqM+to*(N2zuABr z0m#`#9gu&+vA?$RePhk9OdNBawC8d8#g}o#N&(bjnKD%gTHp-KmRfhe^A0%x*=GiZSiZn{a8)R?mg(& z_ILd<9bXCEwjsE3X0e7>Fo$ueYZmX*2K?Hgt~)W$f>XaK!>O+Q_6!^x@@rfD>q6}O z>F1t*b_5jZ_0u6ru5I&bGs0+|mOeixuxN(;FY7hz z%zwtGg=&UuC0c#W?=So7yKl2?*A~t2^R|;{?5}+#x3snZe@iB&71s>j_oFGrHJ9$Q z|LJ$p=kMHXF|)y66UnsK9L9nBTtkL^!#60p8_un?+y8CyTQ;1VVBhd{ob#w<@3c<{ zzwLb27ynE!6)O$={mDeXre7 ztn~>64;9yUP3rpfFYzun&eU`S{kBHJy5XFC!!Oa?Sb{H~^z%I9d3KAS7xZe2pYhi| zl&kvbYMneit!FQv=lKKpD(b?_Vr|G@b9~UR+57?TxAE8O8uZU>DW18_Z^QC%$FNe| zP^SIOY=|+BT*1;n2FRN+!Cw>1^v~H^)!Y3k7Ry_L=heeqtI@k{#WUR%XdRfW+0f%f zba=751x@U~_I^9E1c#CC%{cUEpLRcwc1C=xsM)=L6HnoNbBbHdNk?EF!2fY>gLgu1 zHHNhLu|lD?*I%18*#Kh1pd4Vs7(yI{_bBW6GQKl z2;CRS3!$GDR6{pGyZ=RobA&mG|tQJJGN)b^Hf{&pQUesC&~H& zfoVT#f+?~8=GeXVH~&v4!ufg(lWpJdKU`!1)-3$2uNp7FimEf8@!ikEDe21K`&sOZi`$z{Sac?KzOu~EBYnN8zFw%>|mZ^B#X_)74#4E$g zt8p~M(>JnxNUmY$FdIz7srCkJ+KxyooZo6RXy!e5{hWRFZsEO$xEbVqgs=A?_6|(L z#qDU+#nU$|vA1>N#BN@}0j}WvIu1TSnD}yT??r4P9Br68m$kItjt@}+!If=tK0(1y!1_7|*g2L|@ZxjL$xwhld3jHhCumdhd2_O>i z5y!v8`-A`|us4zbBPHM?-eF2WCs7U?1USK?kI`@W(rj)$vVBmti?B38ECHZ?x&%-^ zl>|U#bpiy@L8J$VaRf+Icr2_O>iA;-VK`$Ph0MMe@}qy&(XQ3=>f zl+PLjkkupj>VEms8Qgkg`=D$W&4?!e)K8ZH>Zg(bsH{!^ny3i8Mmz!BF$CaCyCMP9 zU_}6mPFuUQ0)j9qssZgxtOT^7VTHICApot&NCJ$M0Fcx|09pM5rV4|A5>4FfChAMM z_C~o!whzj7QEof|E)f8zrd0xcvMB*5o58sLgT zFt@bUO(`z-V6RyA z9>m`FWN#7no<>{~>lIQ*2bClUbJf(*fyX|>f1eQnBnlDGp!h!YbtQ2E?s*WMCJPpD z`60P{0|u7FdDIaDCL5Mke}D4uG%9;(D9g3LnlHs*F!2hwpMxgF*WD%=Q+ zWTpUdk0MJ2(gK7fX0(E}W2T@X1Gv4@^-KNJ%!vV zPhwx@PiE}f$I}qrwvn-~T$(CSUZ*YNkfSF|nj3n5j|8GKBOaN-9LYqOzHix*)lv){P+Q zI7;dubr2Bzr<(nNq=NU6%Ch8=x@iPaDJ|n*2QYM;q&i|Gwb77N zTEx-KD4CM_A^DkPMyZe8C6-ir)wmfYn0{qbxd>w903{V2M3z=2m((D8xmGqcLd+Ox z{AZe_vR5Dxk5pDC7u4nvG#y7lHR4;Hrsl*KI1NFiyu=A=S&X1w#l)8>sHrBtIB*g{ zO%TR%noVZ@WT{zm;tTScO?lmzTwX!RYbUSCqE*hnd|oHhU|1cL*Sh5LD!hxa0ig1D z8P=r1YBq`b`3+VJDX5#03ToQ5l+&cKs)IB=HNplg560L4C?vQG)BJk^dA&RVgrK@9 zsDL$DteQQ7s2$@cs7YhhLK5}!8>=p$pf)EJRJUUUQU4IJDray$uXB@-)G|scgfE$- z7LFk5I7({LSaku3`uUAjD=Ddc$tBf2f~eytsYzqiG7_~LL&wHd%K?ogRaHqMZ0dFO zL=}=+4WdFClL_jA5i}h~K}{N~R+6URbR11rmBrBXdX7~ut95l^}U5C zb+%XBa}Os?g6iYv88~rXeE>akiG4|*`UrX!7!u)!&@pTKKs6Gzwg&7yQpder*n1+# zy;kgDwhennv55q6$d&K$fEq{Jc!Pt7{FFvy5ASmGQ0CIuaYY#qBfQE^BHgG;TPveQ z2DmH3MJ{ny3fb05A=_FOvaOXuwzX2owstKzvi2U}ad-a{X=(hHdhsEYiK?_t0H0+L=>%ZklB`6tdwp2UQ2Wj&|-a68Vv=ydZe9=ud; zzEQQu*_BQRV@2skjD)PWC=E~)?Lcx`foZ~u$2M}H7BvDo=M$W@Y;{4v*vkhtYb`?& zqc(fd&J&h_(0Ls?-xbqu9sAuQ{bI9|VV zkN^iU%{lfUR>;t!iqcAQ0AA~!*zO;b@NO?}5c7P`RD?UBdmhTb9~S;q?oNy9DGm=j zhLbTC)oWkEk0UK89_!s_x zL*XBK5U;)URt7A#Av2D_oe4c8P2Wjw&Z5N&e4zBh)7)dV@(<6mryo>fcg0~ucdcJv zVqbA2Q%=_5u)@LJiXgA!w7vC55TX@Fr2*nP9G4+{%0&3&AT+-|&v^)Fq$2gA1BA@m{rHcw-peK+B_ zD}1P}GrUf9+x!Ki+rBAbSMNov7%ZLgY}gjLgdbL=d>yZ1aO=q+IzP-1eCB7wBD7Z! zIwJ^y3JW7Z^VO=oCPHTfp*jUJE|>_N0YdmD1U79Ss;f6t9WW6(PlWLD^PJv~!#DKy z8wec`gw893j

    QYYL$QCPL?@-~$3@!ZRcL*{L9OL*#7uh6vXB0z#RBP^KW1sSwJH zMQD#8G$07!b@GK=J@nP8Jtjf}f>6*vXpf1|01%ql4wz@QwW+Jqt6EKj&gmSo^&SmR z$E*H2hgt=pb5Rccg+i#+MCjZUaP(x@6=^aNnjSe7o=y$}p)5ftOAyLZ2xY}0)FKG= z3qqTS&`BcHVj|Qp2z3|;wU`L?10h#CrK;_?x_V31eiNayI)`rPJrTa8_n3juenIGL zltX{55ZZ4dbao0j+8Le`37ZJr5?;!)BeS*-Z zQ4amBLTI0f(5F+t(ZixQhR9K$@*?em5Iz%|r+v1$njV zfQis~LC9esbihRDJP@+AW64Qdo6f(PsKGK2I-_&w7EpU;Z;OG@UP0(gltX{75ZY@Z zbY==Tx)(ZgmP4{T(WjXatp5j*n;{6z5QJtZgl5Dd)G7#_6NEa55Z2m#wW`%b=$s(r zHV|qx5jqEiZfFNnZ)j^*SMh}x6QKc}LwUWwht=9#%ApSwLM9 zNvXRaHrK{lcM(7CKJAW4Dy-hAk_e8*J8@q0KBfm&7sbiZ`(phRPCbZruU1){70x|$ z-#B|L%vm5?mkBIoh-DiSggS#XuPtHrriZp25K_#uS2RBu}Zt6zg7a={FO zt}NA)(GdPh5QJ23Tcj_XI@N168F)kF98*0?%O*-o;i#mgdQ8${bNDi^b7bZlbh&O0vYHosgCeLt3sj?bM~kOgjx}NuGA%GhTX9b4%nS zrk#|QW=hL~QAtbPn54xTE(9qp*KN2!Y3ZP}l#NPSHjPPIEI~(QGo@vK(h`#bLs}e$ zv|McptV@fT0vpnjJOw^yO3TbhE7ITtl$Jh9OXaAfB{(K&v4$=k*LCOuvgA`(sz)U( z&0`W4OT1IrM`6JxE*poiKx~yGy4q}97Zx)cH-sg5HZCbXh8;#G-eAebDKpuWnT?~8 znT|2Z%;zSjr-5-$X6i;IGks%{8Ef#8eccByg%p-eqY;+0G0BQGc5z(yv5T9+5*(GV zWRFQ$tg%bsbsxJdps+NLMp)dAF-eOxc5z?#u}c}HrDIgmQaC1QvBoY7uKU=flG4&Q zDrs?#Nm{J2OWE}vyDY7Sv=oj?SQd;)Sgf&2<>w)GVSVeG)6x3YsxPOdNgYR6)p0c4 z^H3(rIriW4P!|3i2@h4=gGaYP{5>DuwgiF}iNMi6P#vDr)_@&6X?L~l!VaFc&unYO zPDMvJuk9$JC4K>Aa`+ZJC~-x$v8f|Gz3nt&?mcYo4&TsrP99X_ma?#|ErQ&w1J882 z!#_qrE7JY}?4Wx-zy2|bS+U{6{Iz(Pk4jc-_%I)Jta$W(4?4ViCKk12#f7KCtpBjq zvA)(Gtz*R^)YqUU!!pa2s(#h;C>GOw-1Ed|t)%&=(~V^_pK&h0whVQ(Gnb;Sc4j5& zYGHq zSWEM4Nnp*0wKOl41nzeS9`>6{ab{yFPOi_nAn@>$=E)p=ea^DL!%NMRGjNjYb5;f( zUTvPt#mOV#HP%{=HIOjEUyX-gxB@X)!j!4DbU;Zj;Ix^(@ znDw(%{YHU2WJ=@wYpHCfa{~5jGO;`X+gIMYb_3|o|fdK0| zd{uyDAgfpgqCJd}ali!zW|C<8IDo`%QS(^MGAhE{O-zrZ1=}@3n1Xu?Nf?P1MX06C9){4wR zt%zK`nYAK1)~FQ`UQa}=$jzt~(XnQ&$nq-GiWt29E7dJ(MfCAdD>4zaB6s82wt@A{ zc;ElRZz0biF6MVF56PsE|lt$a#dY2kAHwQicAcw zu{#oL2EWiWVx3QkkuMJGBCC^`YsX@o#7m`Jne4?Uxq26iPIRPEbRw+2 z83iPFq3A?Mnnfot6;W3ILUoIx6MZ}so$wy2vVk;J{4P~=vdk$}CvMr6%66etpp>f$ zlzIFEq)~`sAdTITNHesBq6w=V#2U{6S8-ZShXR!;z}i6&qzNt>R-t;Whj#Ome+}HD}deM54U@cZD@-T=el! z<1!01E>vX$YpVFYF*Ppop>b$8gcA;1whN`;rCb%f%;O&*kGdBFdF+lvo|9&}*M6m% z$Y1AP+bK3pwxzONC}lC_sw`$6{{U-L#~4^+cO=#pul-6LvA)i|HViL#E!$GrE|l7t z@_eBC`knLm2UzDvvBvI5tSw&ql_0S`MM1xQy>@|ME!$GrE|dbBa#dh6kAHwQ>TC>N zV|OIh7O(wE2eH1+y>_8sE!$GrE|e;qa#e*hkAHwQig66Au{#oLi`V`tk-pBo_H02~ zwxzOND3v=;O6cO=pluli?@yCbo-cN%7A-qYen<;O<(t zNfNy*Xe3!IZvB-ql4Ue*9R)rmPE`FM9hN(2rA9GcAE#JqgjS~O$0<}ACHDWw;Ejr*H0VwX*KIjzdgLp5F z{s=q6JaZ$O&Uc4Tunw^^Ps1H&|qCN;@DGMJ-OqM3p)Er4l7F^}bhb5Y*tiy-+SRWKO2hha& zAPg-R%mDJr<^W_gBq0(&Vh*4Q^+BoU09s83PD6bV<^U)y9h8=i(MXHCdQ8${2{*3u zNdk~1ALRVzXk^7*HzrxJL?e|Ql$B2@5;1cKkQJ~;&k9Ugxw1I~T~^FF1VdJm&mlCJ zvT_@$gD{6cS#eNS9HWwz;Fx5^60RV=y^g~bP-Uqbva-TGDq-muldxFgnMwzR1;s&e zvk(v#@J9&?ii2R(=tr(>7D5*ma~8r7mgKV#=S*Rlh2kL0LQq)BC@f{85tg(u$%-Z3 zS?a#7;~h}tm1+nJii1Ysh47GiEMCYG?^KpiSo$a|G1C|j7Vt+2%hgU}=)z)7V;I5` z6VSxOGBP(p$;1>!gJl{6)LFsM1%&@3Tj;W)?s^Yh zRxoryY33-TW&XH@F4y@?38dw#5SGHx$jbb23td)pT<@XF3WhGIvKx)8j9ch(eb2Pe zurPE%75pd+%lvT*T~;`*_t0epLzksxqY;+$@d{n8^QjsL3rd3!=T?tOSjH`MS@F3D zU056RX0$d4tD&i)l85m}YJ^Ux8lh9FM(C`n5xR8GL#X>GMg0&eJxWnOgxU_)522a^ z^+T6XKXeK8LzhrL)P(w>FzSaQtRK1;^+OTX58aLWp$IEGW}$v4!up}RP(O4p>W3nz zAG!?>q3%Zg5Slu|H=}-N7V3x4+#Q~V`XN3e#VuvwiKrjC4fR7eqkd=&>xZVHerOHr zhxkZ!4eN*2uzqL_>W9{_erOHrht{xuD6;k*v%&;LB*(CV8|#QZIHC%MSXiS9hVs?g zcSZWzcU%e&OWVDruZ6c!UkmSTeJwoJ?Bug%C!aMt`K#YA39N1|2~-{|2`ud>36ymu zSrM;iv89mcTJ665_5V6A)$cF7-+ndKZ})}ZuTuSf(e|tERKKS;KRzebuYY>~Q>lLM zym{YWruyxFF83c({oekE$p=&YY){wxQL5kXHn^Orep}widMwp%<+H!5O7)BU@@RFc z-~XI+_-|7ER`&l*eX3vm%YXA>s^6bJ@VnkrzlNXJ+f)5^{%w{s)vuzUdseF7KdfK* zV5;BYzu)vss^9P58hS0&?|Tcs`*y0|@&?ztseW6(lD;X`uW{{D|B>o<=0Quj+)mzu6`ejaN{AsG+ z@a5laO!ezow&0yqzw>`L^t)8Qfz_`zr23^#u%%6&G%;i9lp8YbH%`lnKW1z||4$!J zKTcmwe@vfCze?Xp|41K5KSy6ie?^}}zeC?b|3M!?KR{bgdrq58yG+|l`$`*1J4ste zdq6epVUF>8Fh*JLY<)8Q?@C;lu^ndWsUMgnW0>e z_v9~mNIsDlq&I0wx-Ig1zH#@r9LrZNTlw;=7nW5le#Nn}>igv@mQ++NcVOdKUG%Nz zzcstSG5>o{EqL^i2Rx;V951}?nEU<8%Bl)?MdeH7D^@J~T1C|lzME#h!<&}&_!EmB zGYY?d=C3*FE)KX?7YE)R#99c&fmbt215XwC0yjNeoAZT|IeV-8#ewR#amg20l%bzn zG20)g&PElqETW9Xl#8{uH}Y=n-8%g7*UB1$#kKDPe1?MnJt#sb>o%c zZ-3K^*m@)l>@@}IycD|!o*ZNd%}`o})C{dxH^9=`s3=Q0#b;luh*}faLd)5tOZ-IUNzkCH(&u_*77NUG%2FR^-M3ul_e>?+v zQ0A}A`M>-%9|j4K+pn#3`uz~J1%A!zd@?XO@O(z#k<7poS>C_{+1|h-Io`k%GrWQ4 zb9-*INSFPNG_4))KKx)h-gemS4Sd$G+23-*lr-+wF6OJ@vb8@VO3nHK)_# zYVhSX;?hK)?J&;a(p0qY*)DptMsNB{X=vbawWGl#kJjeRyNm`Ce72Jw*9EWbxX;$< zuU($uvz_qN7{#T9EmM#7rk0LN5XX% zA;CbKJ?20@*Ra=i%x62U1{%OXnI5glr?u(>d9(u_R}%;Fxf(f8rq9*t$wU7fX(vvq zk(z*$PdlJSYV|3ceA*!^PD5T>r_Xjw4b_jKvOL-mpSDXMO55#m9pOl%-HXmFpKDhh zNrQ1higdhAgm$Z8c6oWaX_8NCwqi8swRQMx9T+CZXY0c-*&Z$IGnwSk+C7R%9!0ur zADECQT=LlV;iSSSEEoxw(7?yjO_RLZ_9#ZKVQ>h1B0^ppX_w>Ej(AMkX^lP|p>`sa z<8ifm6-FN0PEv@%K#UaKcv-Q?tJOyl^16n=A8<(xL%PlIY5P4U-F#ZRPsxHuv1o?J zwacf3!DBm&lWL^>B6dPMH1H_eX?rdBTmW~#BQ+3(F4w0uc`QPAz^7!v>k^D|J+7l( zB?}%~2q)D*O+-nA4%Zdkw5?Wz2EiUMi5&6@ha9QY=tZYv9QDYVT92ILrbqdy^(cQF z^{60~9uvFNx^Iry#7%N;amd97(w({ zSbS|_1c2xOgrJ3PXhx&Pv@$O`b7>JtKV6HjL1Y2woFpJ9afNm;gAg(%NookkD<+|y zKqRua9zW74c9eX z*PhR{zj+SN?)`z4&L^>010FTMhWW5^JZfHoN6qE<_}X)W{@O2p_Q%&OGb@RAG2aqD zKOBD?KVKYw96x^?e;hxb9Df`?zZ`!YKi?dG96$dYe;hv_9e*4@KOKJ@KVKbx96x^@ ze;hxb9e*4@za4)ZKi?gH96$dZe;hv_9)BGFydeHK%{C!D^M)x?F}*7P;*XP^H`?j* z?_-;JPbR&Xk54@R>Bk#f?{bY5F0q1jR@_^$@gKxyL6^UF+Mivzd>Nl$wDYTs`0iH4 z2V9hd-yXXan{B_uX3wqoI8a3+zfZOu-v(ON+%sv3%>Uz-+wohHjZL|OpRa4j-fQ^M zRfVS-A6vo);EK{d=FRxp*$#d>EqLQb9&W=SzbNOaL#q&5^_mT6FYw8ipLk9ayd_2rP6Wg2PvR1YAg zS*;6{tK#0SVKEPrpx6&n&mVVC7aOtnTp^xLY#Su8iqdwY?MvWn1s){g@Bnz+fumJ! z9^uo56>pT`R5yP3;By2Dxt2KvKCFokZDwm|fbV5GT<8Vg*hK6V?n#F~_Sc-M=Bxp3 zKjzgC%I?J81#tO%H~q8$%Y*e}2YA&!vh#^Ej}9l3OcpOG{o$%%1NgOG7b}BfLLqIsS3`2b-jpct(M(hnWJYIlMsVkw&8;#9dAeh86ZO7&=D6Q;MBCO3s1$O90+a8SWlMFgZVq5%~M=rMqD z|LimB`r*8l$2Xk4?&!tI>xiI@^6jeA7Sp8@(5O3Co*d_NFK%(*BYd~1q*0fx+_mnh zed44Qs1^t9iTdWK5-OK$!m2xB1uHd9X`6zTepmHs(J$p~WBsi1vFubp)mAx=c0!oH{{9N`2_ zVK;rB_&wd_DQ~C1w0OFxlQSKh_%;(t-J>ZeDY;5&6_kuHwGO7Ao7 zGD?p!{xVu{Eo9VU_s2~}Va3N?MroPHSw`nxnT)ClT&*vCvP|J#{RHl>`t=E1dp@($ ze921ljjS|ZWu+x!ncUUCzm;VEYea?K*z#w*HkBfU4!>S8abM5n%lJF(B>whHS@Jcb zULrhHaqru_He4|YzlXE2dE9}`bA_SfuctL4pMJgj^5xL+SJQTfj=!9CAUqU#DJ^vT z`)Tdrey(8I9a-fLAB((E79LXhGyY2cjK7jU<8NI49O`_P$+7*tQ@T$Kb$%ZiGESV+ zU1NA#)xODW02_%K!Vm^U<{Z|YBvu>WmySf5Hy~wb54Ti(dLvS4-ay+Pu4hW4oMw24 z2{Rh%t`j{Y7vd9v#}l{N4YOGRUrr(>`qws=E8kM(!2pv2fKy)tQY0*I`_@QnWR$e7auR&XLXfM zdU8;Cdl_E1uY5jx6YiUiU#M()f0Oqr1c+fiZUM+URWQJgh51OCRYah3U>ApATp&Eq z4hsYb288)AvjPD^1axHy6M)dr0%eDJgW|nPn|XuDdzCn|Ys_vC1SHNfun|F+oL6B) zl=CWWmQhIqM7xM6aJb5$=gwlXWpIfrWLVZW8mY2ATr{!}OOQ<^M*^&nW|%=UFsS&h z0^%s&b*=A?z=cEWRorofYLBFtc&mt67(Z6E*W(nE^@-KKJF;)Q)V@1{Vq-(?^TGPz zKakpEU^2>3d)jzi?ezeNq`eZghbN$#cPjoHdjGP0Nbz6g#!>$3dVeg!Vr4xuzEZs( z9%sE*5tYgOBzk`=a(KM-{#XQ>r>6%+VE%0U>9Z%@-RlF=(?`9$#lc&AyW!V)x31e3wYGS2ixW2;xW#w#e&x40xbCtodTY9B ziYAENm)de~x&S^{ErYA;Xtb@J7biiz(J6~SY{Vvby$~OjgtM^SGtM|ljh3#*Tc)qZmk70${}5^`&%v|Mm#9n^s;N{R z?D3Ro}pa*tb{{c|JFmW4g8QL1fyKpf3%RXxaP^6zyg%kb`; zyePNs!?cT-8Q{Be>q0?1n@{w*T&gG8z|&uIIvAK-tbK}?>ilzB@m^ht-TPsJck9A$ zR7{+E7`gWw71JKY-<}CeHe&gfdoy`%xZ-|(*XiMACgdGV$ooQD-YCj&Vo~Q+MI}yr zedG8WX^o*R%Zna$VzK_?tB{~?d8z0bXQ2&Ad*~38_T|XeFG;@s67u!4%-2sbUq8Wo z{SxwZpX(g{qL7&tIYF%*2eX~XsV*UBN73s}KJMLA&uw$;M94w8HEqj=6)&MgiJm(uV~=7&vl8H`X&LQMqcu{&f@78mIvCG z9$Ng9zK$>87NwZT$Cs{7{7K&hz>?*9 zpf<-VR39f+r4g2Xfu$R;WPt8?YLBTB1VErh z25i}3k)=@Qa%B5pPMyFJA{>;IH<0pke-MCV6oSKdDoJ@^^}sQmDv*@3k=?u`MA0P$ z<92)jC;ynKzeozsKvJ;nngEI5>eITU;K4cRMo|&|C`kc--T^F_&F4L!2?b>fNrGO# z0T$;eL3zP3&`Fx0(HRjGUIHZGj>ySkvIpm8!VO3tI05cp`w8I4!6MnFpy0tdP(g%o z8tvyGv?0-1t;cNlrL0!Js{$jArT&tkfO06=rF?Ex5uh~Qbe&>;hL$vYt;$P9Ix@)D*864;bg zm?R)zscp)s$bqri6igUgA2#I_W)QA{O*s{5B^|9cW%z%WP0?YA+7!AaLN_{_@&;xS zM%t9+m`U4Hs!+q4x6IGVcL`vn2NXp zoAOW9Flwsy{{cLK=PaT-8md6lq6Q^4K8e~9j%J1>Jg`P2Ml=#N8k}D6ngK{`@DUq# zL}L!hyb*42-x_L|QAX4nuzb#s83zK>eG9kIs3JC^hz1ieO3wpp3}J>3f`&v6tdlFj zY(IPNfvdJg3!#`uAsQsGTT_{N@ELjxN|j*(fx;UG{;P47*BqK-S(X-EAvdo}fn z2Ua(&3lt+L<($EXWtf;?*WmRQt3wXOIAhZfvr9u?xc?dMm(SC#y-J|WNsq~|nM!2- z0aPOE+N*@)nyUoZt%tqWN+t5IwMrCRQFNyi@S+&5v z{-^1P@LlJ$c0|3}&K}!FZ~C*@*IMNs%emGXS32XGE1WO)TI<_mh1Xc!N@rhVZF{!p z+A5oG?zPpm+T}t2oD=q%k2&XNRlIkSDW1Rf-x${MO-)R&SzgxU6kGBaHvjY&CpoKE z;PltNgmvBU;^sKbM_%!IYkv*s6Ro$l4(Cg1Z(fX29Ii{3<-bcNA}6Xj$OeDF{iLxT z-PNzdh5?p@)c`ptpei#KWXr_he~3lw=6@;qB6fPcRI2ss0DgO;fNy_uAzp06@t1a} z;~Ec+{k4_v8YoTCQR?Qxb7NRy4xf;J^sy%%UxX#p^8MNlL|S3=oQBo=v;*n$9f3to zEbM3h%lg18OSSoqnju?>R$ue`%l`WA+icslMNa>QQ}*@$j5|tdU&$}7Et!>8Tr+sz zk8Ui+Jc%EB_CNg&T#VOaBkI&Sa2}^>F1uuYJ;9561pT%~|ICJ-_xu6W?k&tL)`t8w#|QnI?ZJTe zD}xVe-n>Eo%$DMr+e)z3SIx0Of6Y*){mmS*6-TaMX&?i%&6wb?31<4|Y_00;9^~qQ z0HkZsm7Qi=v9$YpXdIZV+2*0gi}TRq#qND*Gtd5O?^hyAcp}oh1t%=i*&Cn0+awb| zzVu%}w%7But$uC0ztQ7RB=~p``!8~T=3uRVnJZY|oqopukM`*kg!;Vm-*IQ-yk)s) zW1l`R`}r->->}qg$ZQwhJT?dLI@3k90yr^?T%Q%`o%xT2^K`vzTtlXR%4OOsLYDO z1-;thrBUJS3Vl60t!M9&jaMd)(^H7!SxT13<5KiZd3<%GJT}M6b2 z4&%Umt^ua!8@L9l>ZS+hV0yl8vfD4F$8S5|^~HbU%ATu|aoew39{d%{gTD@pk%qsz zg;JIW$EM|p=k~APOT_J8qL)!}yLA@1P5O@Dw?E+hHq4OMrJEnWtv_mhvQzN;Q9SB{+<9Z`OJJyzrV&s|-Wlz5gG{es5Zuay5>?JP7NL z^BcSq@~dI-Y<{d5tL^pIW=)3ED6;=q7>xK0>E)lfS!?#Ww$%)SdF?n+a~!<;2$wem zS59rPrM(Nbog^y*^Bu}-z+}Qc`|U7x^UJ!P#>l#&{>IG?wV|$We=|KTuxMG$aISs* zF7`R>u&($M%f^ygPo~!FZv-%a6*VP;+$pZ<7%Z7tUz;%nJ2iuF9MeE!?7Q}8Ej61nOSP=b zIh(7_be{tY6yOHP2CxR027m@=22cV<_e!!@5WmvbJGciWH6B=@&_f?i^gzHoJllx#^MaNo;F* zCccsKweBR}x%SsiykoB;P5j?E`ae90fnzDrwiIjIN^0+S`0d_cU4<|_1WfD8Kndhv)9!hU&jRb9Z7$=dHR6h-V3>z(>TJu z@Fo@UJIuza-u&In8oMCT#OB7+1HP-)Iry&opMmd!_kyqN-SC~-4PPTZNFKh=yeE9w zFHx?*o)kvRe$Z!GLnw$0;u42%_I+82{;V~mSkj3Mis~whzS~IWw?*X(?l+fHyxB}z zZR-@BZ|}P~-=07Y+FSn~?X4(iZ}qX;TbggLs=K|`_h|2lg7%&{c6$r*?bUX-_qX?G z?~euT{pH>52XX3Dg{Z%z*;>q@xDI>jd&e#vy*5^$8 zK+edAMQPt_?)klNCc}$+>(E0?Ny4h3IV5Rb27>|#gc3I~k=esYD8#XO{@xPqRW}Q6 zqDFQUvI=|be+^R>>g?-IL;~-)bfWm^*{{Q)7&mfhGQ?PR;Alu+d=-JLFK^vAfAF9L zIwN5f#yHab=BT5eXj`nvN!e9MGmDRZA6^I9I3Vk8t<<$S7e?BL> z4S7=_!H=>J>-^`E{$lG7WWk}g?t;KUP4te|CQ@~Y$Pbv8F}0~iu@`p#c%}$HswL65 z1t)dqIf>BngnwB=4n>9%e#?TH{7H;lgReTIsII0t^6ir~jTT9=FYv>NqTF7b^j{Mf zCH>I2RICqwQN@Xo2NNS#B|;h8Up%GXwb@>&B<=FinQ#>zt0REA&?2*AE}YbOWX7#{ z*8B74rQU!blKx8+ZhUP9USxl>K;=g6uM6$6R=zbvfQh;Vo@r1YV}HhN3;k^4JH^v( ztv#?9GJJ-jvzOJM9F08Mr(({S@dq-!AW7`9k|UrzHt>l5MdOQ1=D27y;iKb#DTpAf0 z_;yxrVu7{n34)@VT;~1%i9VX|`SvcKVR`!gZ18w=HamS4MrxGI_fa?oDfmXIf>NGm0q(#6aDHMt0T9Se+1TMPHlN^E za`IxCbAF3ib4qCtFlg(qZu9jD1gHYNW#+Yu4$(p@ilF|~L@H67Kz|e`CYPF1Dm3CP z)GYf_cFz&|(XRq{bCF`)^|j{LwwVrEGV|@vtqDKldd*H-)dvnNvgNB2jkj0Q?urIR z)LB}89K&l|RQ;td6K~~_j!EWL_2e%RJg+2Dq(m*=Xw95WJ970C{+Qr)&Bar$$Q56&zgQSHQvRIhx^YswefJjyDn@z9I`VJiEqYD zYg|+nFvq;c!^by#Ffn;!BApm!&fQ#6*_<-wAk*_<>TTvS)87DLT5H%V{UDM=ck%Ka{5* zp`S~Oo0;>Fg=fX%!iO2WgO(ZLC);ZK*pXnOGZ|OXA*F?)EvA-_+`LwO$@yc^1yQOm zyo-MxkMK`htfGuRAb8*duY=$xH+H%yvlVKK0(n|(c?KHZXuAiRX)1m13l@qv`0Li0#FllC${cGvJ)g>WC%z_^|avEg$C~F@4-rg?1jlrGC6@6oeJp<_z)rb$% z{e6{@LE|cQhhKGM(C4dlg;7@5E19AQ^pYSj*K|Eah_+b?kTE+?f?87-mbyw$ z3KOqy6N2t2b;RRO8`d_aj5>MIl1L3e!$q3(1XT=4`dIma0zw1gZh1=hfwj9(HyM)4 zgFUAH@P4|`3`LqARMV*e=-XT~{u#Nk+lop5!fs)hx{T+~#tcjP%giSMy+_MhpBckS zf6xB9NB8`zj4rIvwT%IF1QAX~`bQVs$j^oP=kZVTPr;o3NfjPkFP_NWh^j)rOntAi zvsCs@S2jvnXYVP&F-@Zjddk@^f&5RP5C4N^68=i*08oMiY0azCNYi`) zG?0HNn6d@Cm2G5pKct6U8X)&uQu?C%1@CBpVUo;u9$`fAsjB=38* zc3xp?dHPoy3!YRP4NrpF^ov5R6$#$}(08MD>S~AD>|_KD^lt@wcA{)fD<1;XliK&{CjFWocBRz1-4#9i_;M(B$yJ23iDn|~BTwT|a9|5^8p_?BH?2}ovi=F$p zX2jHQVlF^*gm9MgGps~!4eXC^Qs!v-jZ)u?rf;vgeO-?J0{v;tkJTbQwT{pmtilm> z;>+!dG`*~J|9tqE@L=kAd0+$0MW-V-{oVrPTZzWIrRXjiR?j;XvZvO*Kog@js0kwL z6gh(zHW3D6vHCM+eZ-Yc5m@&x9LBPFB1I71A5)yetJTfHc%~g=JU6TTsViaN)K!&v zQQm%1p(r1xGSi>SiSp0!DGHlHN}}z2OWR=M2i^F7AN+;X*4xioU8U^-*8YfI9-UYa z13sM;82+xQOPpVe)RW!`~}nOP8zAhuR?j5 zeo(&pF=cKsMUUIRb(G(~!2VRz)yBAwI>h33`!iONunoK*uD#$56>T%;@wX0NYj#(p z>GWI|r|<)3E{Oxz>%xD+b&;m6R1ybNV!w^^jW!nKNLbd+4d))P#r_r)lk_SpRg z9cH)Za(|S|9p}Gja}Orqq6e8pbEvQD=N4P!pg9z>-?JM)X#y2lZ96?=zRfz5;JHBM zl&;Y3IfwVz-W6^&^L8>abW3g0KZtW=#s@Y2KsR;%mT`V(QcLR{=CP=QYMyAA-G&Lv z;eb|$VW|dGXzy`?qyC%lyxqsuVeYr>)nol44{T|24$+xe;>wOO1K;R2v)0l&ecFX$ z=-cLOF;6@q^y43YL^I9SE63v6y~UfcSHZAsNiJIWb^bY;Vb^Sj;8M#WaQ~opz=U?~ z>r&?j+xK;~|2B}n0llhv-0SkXa#Mxu{65ufljeNdXkQrEOR@Lr?knnUxQc%7UHot? z@H~~@#qHkNE0~QOJn!O%4deW_I$|2<^%VlF^1fU=3Z%7wqD=!83H=aVr~g~nvJsj~ zKcMo^>$XVKqoM&3!=EhCY%w3USlwcFTfVU@R&93h0TbAQO)7}{&(vmFvaCp$Uc2{q znJbM*CaL5Wv!~M%)0|?;nlV8Rw9#TV207ZC6;N2#WL)CCTY|)dxaOfCagh?O-atDf z#`#%CSE5@}+}lySYkDmD1ksg;HmZm=3jBf;8W*(EMyMTmQ;f%)971pofC?Lbko=(e3>g?X~|o zr;iHCuidKt#T`BR{}$!5cUX#plwCZk8@z)0->1GwsRcl`cv0 zBQ@7Xr_KCc2fCKTDrQ)!?7ve(USi(-i>MPR&1&=DoCqBdNa<_-rp$m8Ki~aPYZBcb z33GP$$9VIJ?vF{Py!+#7Gnfw)gr(&_*coRLyu+-_c3S!OX(i3-Ix+%>_qz}B5lff6 z!&spCsTDKak{;z_GPrlfu(_vB$(Z6f49J}IhHGLkrDM?N)LdzG5Sx>v$k3q3YBe~! zOQ9!3DKWSX^Y(66`w?Y1dglZjoFGcA7139l>jxjO@r6j!y~2&nC znDar%w|nT{+T~`TFR7A1|5YkJl*LNbNx@8v7uv4=sFMj=!B)H6S7qC+4%*e;+wOKh z6tw%Np!B4m^l?GyAN45x&vpmJ3|l&2nv079P*9cuAXf{JO(Pv3mj+E=9W?!y-EM$q z^=SHMLDLnax`GmrjX~Mtdz8H~DBH>UKQk6cy4!-(mq@kIt?VbL^{)BfDE#B0pg9k8 zlYlw76_N3d-B3_lbd-IESY2J`ZyM(>8t1PvZ@y|pp+dH2mdYR1Y{_0pPUfKk*}wzo zLzA?4h3E(BMwuO?N6XiH_>tuKZ)}SlC-cP` zM~a40<)IB1AmU~9~D{XD zBO3TVN$SQ|H;VsShpYghRqHi@RzV+F_%(pHv+)eb?K00j!=yi+pO1WQLG_MxLyKJD z|5V|*&OXhZ?m&X^*f+arc;|hUY{Y6hfL)|z__7wGx%VZ3NJxxq%Til~LTmQnzH{lx z9&@3Jh8#oPS`K%SriW|; zC^#7j_wym2ql9Pdm<`%ZI1c(CqcZ)LIQF?{2i4W5iP4>%tMQJHn5~&KQK*kzTq|^5 zPvSxaJS;Mw7BanUX7VV49;2M- zj1t)oGPJ_{bl)(*wC2M4_PoaBq$JX}|NG}Zw5Q=yRI;H1ckttV?7eg?(9Eq^10)H5 ze#K_{7Xe_mZ7ui+y9h%N)UZ^vkGLomE#}X)sb~p*ZX%4tpDR+)!Th;C6&=Q(sj292 z{?xnu?2p(6lN_H@!^zZrt^>H=cGT$p*2Yp7@g#9kD$yqzS(chqoEp!&hDkkddeN{{ zZD};JG_owRJhFmgswA=XIvRO4Mr@Pd=_(S+qLEcpRFx_|d2Dnge=4Jql`)?eKHcXi z`?;Eos>o^-&1hIDp1SzV$SUH`wQ+xSJau7pG_pEqsDw{mw&WQYmGigSV!X7-tH&)R zJbmMDh`}sZ#8TH*Tpgo@SnqlskD|NkczW(fPmVu(d)#|DcE%MI*T&A6P;osM630T% zXWIIE@5Iu>Kf$w^_4wXXxdDe;i#Eo+Ju&~)Xs9EzI85^O+`vdn+;O#>dYM%NGpi$X z8}|2;d2Q4?6!W_>ZIQUQJnD7&n`kxaALP01xR?DtZH23F}hTif<q5YD}g(GVkeV@!H9K<@$KsQ)&NhNGE9VP1-k`#WsH zv%tIqm}$KPNWFu8n+5*aGnfx=HKijl@Ab^GFgHE=%QBe~=4m+hMMcw37JqfH_j=6V z67xE2m6b@6%Bc4?HzRsmxKE*sn@yu3sA6qsJ6Jz6nrRJt9nsA4fiW)=%7W0<{>seC zNTx09z3Hu{c4;OP@mBC-l)pWb>CZrFGm9hMmduKk}kF>f1XdFKhri0KWVSH1N-c@XnkFtt z#i;asgMMF|9_Z364fnXW^7&|J-5JE% zGph&2LwlmU&td0dJxdM3PiA=}=5LGo?ZEBtgkCc(K(Iba=WA#=7WG>)E&Ulw3Dg(y zTA-?!w=U}M^;#ekPz-nzDw5}==b!k=-^{6rd3z`x4Q2eLQE#2s84qm{166sOf9{Pup2FJanQNJUz1jT&b=4smj2EcALTv^v!0cftdfewP8k(zySkvMVg*o*DOeL1_`B{34X7^jOq8 z45P-q6_)*8<1$fFqR=tqpphhF{tI0A#ZnIg5K&jgcme^A_TGy7E5@eh7C$-nLp+j} z>Cb&#G!uF!7TO;5p#ZBvPv+KP!-8kQpxww?fb7rJoGnj{J&?nBR!|uZrDN z32ycdLQ_I^0(roUh_=BkgbXsdza7W>Y?uTw9nCx&fx=?QK!6$@^HvB})_t=`6}5oO zSp;x^#gkf#BT;{s1#nqdm(ta}(T*?|w17BZ9}>)tGw!!*8bZ+T zVadGER-TJHKV5NL)L#yfMd1j4ZJe#W^vhkY>5{Wz{&G6zNs$OM5c77bU9h-Z5JE+3 zCD4$UMd7ze5gm!eHQJVRV8t50g9pxYv3jSxjm2@>bG&ztGJ)5ZvAHUynG;ZsF$Tj!zSts{#b>S zi+V>wkbZweGBR~Plt**IbZsaT3+?7TmRM*d9PTf(bl40AEeKWKQXjq$XpSzU!WtBf zU`+%hB3!xY9}K~;V=_|`_n^;LrMh`ddAG<+K&5o;zl5L_2dG|2EdAt( z(-34)e=UM|C(Q(kpbR{EysyReUk91I1mYGBSQ3^>Frx8N*ujH4>~xJrHR!zuO_;w9 zB8&Q)^kX@!yh(}#VrFniDXF`4n#C&1>y|Czz_c8BuvZ2c6&YBC?oF1$fR&)J`U<9Y zrwA}Tf9Pw7w^(RH)ZYs6hu(=wH(^7phcjdTn*fX8Wv;LlkTA@5625>JoEHT}N;0*z}plhcZll%+&?xQBm}&_%m9*76D9n z1{tFl2faNal2~XNB1rktM*4-i_14glw-gfLb;cHGQ+7u+CW=h97>bB{tEE;~gT(XF zb4w%p2Xhr7)d6iU3_Dn~UrrQrlak88|JrC+)>^{j0m`@ix1`>@rJ;Sm#~r67eQ+B? zDOV&$+ulBQL5q5lu5lV$M#Z;gfzfz(mn z3sS`p?p`5vD+2hu^qqZ+Ld&iBfn*V2s|Lo)nfm5fsKsAPn!l1i%OajNQN0bm+Sj}> z(=nuthg`56uHRey6&QMl1epvye_ML)klP>pPiAIK%->pmIDCkTvGV0%$qo$dmv|i{ z233Zh_xAE8Bv6&_3@sg#9^NnRV?bc@LO-hqN`owd8R2Fol?O$sjnrBM;zxrPw1>6u zu=I~@;qiv*#%P%FF7Y=9zC%KiuM%$Vvv2&xfA!g}LLY}><(s4B;_7JF+JrIB$N)6) z&{|F{!$qjm@*Th&S{6G4lOxl{baZA`4#XVwGh*tDGecK-8#O|CR+cErXcK+Q>y?WE z*8r%sKQ*b=1{GtWw$@5H`Rm~8lU{$|SJyD{(XfPp6bkpm@f4|~PP80p2IsvL58KAs zVYpup*|tQzo$(Mn(;5x6N!u_#;dpw~i8P7$(}*j?W9^tTaQc#nRyHeF0F)v@%MLw%_A1=zeq!-X*XgD~;%Sot9cl5bweMfghd zpa%781&G_O#uHpy5AC6e8Cg6Gqb?7CjFztu(=aNSwVgZkHYUm{mU2UfNqd%b;D9rBvMb1ISqQcY$!#FjkB`(U||d5=th&OD5% zOtgHPBwJ_)z0)?BM7oNKwC!cwbMM*jvAQ;jcs%^EPowKa}88wiEz86uoom4L%dG< zf{Imv*fJg-j$#^ymLMCTFs@C(!Sh~9_xUK&+6u;u6^vG~)OsRixi2|%B{hT6EFKzP zin{{?5o#M9OW!weGh$KkkZdfBTaW2i&crR#cX>xFY)wvhjTb22#`Y4SS#M=UXhpgN zcE%f9JM>QsjY>=)AtSkE0Qu^p0y4y&R<8ge3?_$!@bSWlO2VgNM3?W z+=S(eyh}iEI0AViEj_vjO+eq(h*614dBlg(eLjVR@|XCnxXge{3)pA`0st83h)+>t zRLtA#t+BxbBsHRLoj4b#o{n2e#-{H(=^8|4V4H*;G{glkRLT+SNWC@Du)+Xkh#)-g z&&y??B)^>8~3)hXe1VVvrZ4P|?Wj^3IsIBV?rT!u|#eo~QVUBSYi}9JJQKb|%S#k?g_j z3ad~*I7BQudvZc7J^z$@5P31gWEhvBrGGh3pu;@vF^SC0@vvo{gzANObLlxpk+{@W zzGEC_(!)bBNgn93!(ZyJ#XJ~=%7-##9>zd}BTf)5;$#8?v(YJap6ig!qIA)w*caxB zrsocpyd!MlEXp+$qH-J+!t76yeHq@0oV8Z$UaN7ebWO&?(C-#m=FcPg^nf{Ji5Z4s zr1|loO@yNmh9cYM2sBx~16dQ=0}+a+CH+g3D1&`qR*syRtamG6@Nb;JcJ5(HoP>67>NxY?v*{H_@TJe zTali7%6}p@Nm2{#LTz}x=#+RRbV`$3;$ds$RK-J!WPv{`GSyop7?dE)5+@RJMY##d z03B~BQc78K?o7*PHK3enNe?bwNBGgns%Af9Rgi3Rr1#n|Zn>mNQU-H*HZU*I1CTx0 z@$@5oE=F#aZ(&4$OXLAf33sdK1JF3~WDPWFgLK9cWM?-iM*Ss1i*V!}V36}8CkQ;nH@)Rvi{FXK3$v8^nRHXXUm+zS1TER$L+_#n1CZAeC;NTs|u>U!T$ar|MSiO9EynG4lhMg_jjKFa$ zyi?x)Xo5MIy@C=;16{BeG9RxJgaTUh*x_0$F?R?rd1<-W&NM_pnBA)Dyw_c=2)z~M z!$Dq75o!(zwb;N8Q6fbxDq`t}2I6yn7ndy-CR(_-fB8Y{Cm#6YBra`K|wPP|}6N65Bt=6DHC zc7(Bnu|x#Fyz!QB`IcCDOVpPacV;v!RYB0xTON{t8_eWR3T=vo-jqTP5zWg&i;7;* zLOFKcq0nADDB5zeF~$>>(18tCU?7Seg*=NmOaW&^ECoLVk!%!Aj_N4U7rT~-4O5fDQE@*!?j5U2a-^a zYtbKCwG9i-&8QNX8}(}w;0?!!1>`sfd05c=(N2xq$$q<L?R*odR740svlO;r_buV&0E{t}QP`#=r0|D` z5nDTbW`DvalEPikBN`8*v5k*(pU?U%wT1m7{8=6Gj>vhl(y=1LI@}>(*<`ITeRUG% zWW6NQMoec7rnEt`*j=yMiL9Z6)#8dZHkp|ien_8?pwpoye%VaNZiDK z-P(n3A{l*_DXjw-T8Wi-h}FXoehTy_D+OH1iD}czS=LUhhN)br8=2$`ZSd%~@vI3+HftGD%K|Io%+VoYjwpp_n1vx`{!ME<5EgBT zrb|vBxC7TB42k{YMO!H-`^MReGQ5O-#Sv@>GDbvJq;3gu6nVL2f--)CcwA&>I69*d zZ-&JOrVb3!IW;FK-X30FzFPE02oJRORZLQja@dAaODul9W|Xq5b{>E~Y|&RC-x<6G zdYL&KE&>$wISVoHkoA(AZ0<$SF4j*=e=D?``Kl6;fJnh6)XUQ%_#pETbjq2-1;GV? zuLmpiCh}#t^sbk7K6)oVmL;_>ljU`Le6kB|3}5XVWl9=AbwUs-sMOhxVU^7 zwjwj)i*U;%o8W12H%dC-ZfqZx7%WLvk_Q!va9JLcA!^rwX_SSZ&nUWxE{}&-F~8`# zK=KVnF5>%!x}ZW31L;Z-;xF@L(QBf^sP_iup|~lu*x!s67F)7nJ@|7{z^uerGUSOT zIV^%R2F>{^&@!-~EI$aX4D)1!;)a-XS_}^3Q!l~li+g(+ED7c9VXY|Rh9f&Np)Eu~ zSpnl^Wv(RMDtj)pT}u{Kuy#1`PeS`~S@EP@;0_ehnPAa6rlPJ1ptL3`2B;h`7i}Gr zo`0(1gf3DOCCaK*rET)^@ilNd$^iyfR%;g9!&*9NuXnl=qpFi){<#l2q= z{oxD7q)`ca6OP#nu~cc-0m$P`f{Zu`uhid)Bw{j00|MI)e;e*CT(TV z3qNhF+ILSo>;23pV#vC2FT(+!Rg})Up-gjgf5IVpw;O`9t{pK%yQYaB@N}F@f#RTb7p-7Z2wIXToz^u` z$xDbkVk~wLyRK5OEd*?>$oetqJ}0vNoE}_kpO<7i!W)n$qmX#Exz-Z+p$ZdbghE|(rB#41W0$Q8cd$hV#IP{%a)5-|FpB~7 zN5S=RkHG9=JiusZHzq77=bJ_WNq<-!XXRCoXrhr&A^t)8Yc&#?UvJs~Cq1>HC)#0{ z8W-|9h-+!N1?G7f6NyC^{53mKty1=$VUF24K_r506K+yB$I6!?H{p~b7k(>tu`+wE$8_C{*PL0gP(;S!yePnFR>erfpKZL(VwhUN3BNEs1Z&s?q5wRL!%IrePd9x^u_t-ph%gbar=bl; z;QJYW4^b{)dNvl`M))3Y4;l}>NvCCWQOoj7s7*8)`UgSj&_Clojt>|`4zC^vII(i# zfJ;M&=KusSZw2*hR(F>Q07U)R^dp~Dd`YZ}jI{37V9$6gnn{$a(Nhz%o}nU*LDnlPIsPvrh;LS|?yv2<(Lr$w`WlvEc3Eu&bq^1e9hHS_lvx;?lYnvlp2?A!o6Z6TS;cR5)4zYSTi&Yzg z0C7Et)p=8SBt{aG=%aUS#kJyW8=Sa0=4mHbXjSO>1pD2zv5tgcG4Rj9zCH>=_`UUY zt^6HS7WP<-lYSCdH$g#Hcx=6*_3IIF*V{Rr8uKPp)F&FJR!k2uL-j~epF8A!rGaFiuu^+!+ui^hU@AExt)BpDSd^c^>Zf158?+C61 z*9n)|{}cE5_S+cw-*}(zgBv3MtM~ct-w^Eo5AHAdSNHkuhlF$Y`En~3N3C?>UZeI9 z>n6pM*yGQ3>fC+4!};W5gtFX88tvM*cS4T2+T20UN8jgr-L_su|2N!PYd7X{-$OFZ z7S)zS{tn(joq(CYgLiN-_qyvI$ZvmvZNB{G1VE;-+1ycG3-@~` zbuR#0zFWCJpFQVG5;g7hCno%@+KK&gvpp-~>r7Iz=4G3%b0I5&^v6g~fBE>vC0u7e z=}zXf2AWNPU+ZP-MT-=Ua9h|{jn}GzhxXZtjupNZi&oZ zVAD8x{TEH#anm(%oI7o2yGbefjC%3k}@z;qtQGhlhW& z%I195EN7~M;};*z6|+a8IbD)5N!vg}DWpSlr&6}P4?C?6h+Jn{NIJ}Pd+e~_+Ake7 z3+`j`wza>~gI;=`zvb+xE-L2~1=osM1at)mXga_Ti<{l{2iMKKqTvs?P2euJM<&)Q z;W%K*9n8~xI_4nYa8}or(D^%K1Rs1MX#ihX)ZLaK3<|ck*eet`G@UhH`JFHlY5Ff) z3ht4ZG>19sBrbC2H|`~`yJoXJn%-e9Uuki9S1!k%Y2B%_(0^*PIg|79M+}`{2s*S^ z`)B>lnri;KQy5S4tGzb|rIYqRi@nJre-b;Q^MUzsP$=&0ZvRU@f$m5%cc_V<<@?L? zXDt`Ka7PLF=0J}nujYWfe2q!h`OM^pdEzfRGiFcYOw%cwKRyI-=^;(`b1*XD4o0&7 zyg74_gOSV3?jPEV*F=m%O;PrsJ(j3LrY&agU&T}npY!mSBwx;>1qsA^s3OGPVms3D zpxXSAliDItR$-dxY~IQUNY`xWM9T*rvCR5lAnnsbcK%w7xy6KB#`lEcD{U3dBiSmi z|4mgQO?qGj#0WX} z{!zrZB|Tn7yz)pPXFhGL?e)Y`9ogUtC~bo+i-51@-5c*EET4Qa=z7=|K+l z*%M?LbNzoc%@@ z<06wt)8}P@%w891O4=U~+ZcXW_CCx0AVu$mB&hzdsz;hW#HTrhQRGem>Ol)LoPKl6 zt@G+;fK71ca&`BWImDbeCXY1fy$XBbj%9Sic*SqiAF#97WY4?%d#$G2!UYDUorSC} z;nH0fR)?WG%+zJB?%xY?t+ccvXMr>K~czpp4S9>j*w z+5xd(+bvG;Jo5)9h#s?l51PO5*9oFetNGt?o~odJ`y#%B^MahP(q(WWHG6|p(oDNq zgkxpvx#m`?2gEmomwT*?-Ks%+yu}WJ3mrw+=K_a_u8n>z&2dj42L*%M9^D7|kXysk z7P0eN+uI7X$@{_c@=XQsyrzLUX6OmeFEfSk{KbwTYd-rg;d%9`_kbtQpJg1K)U~%@ z=u5g|Yhp6};d4(bMZhKfm)lQ@1ouNG8kdCZMU#z3`qzJoJHCn~l@3@r)9{k+{NjMT zdCh&Vr#CdwI7$Ok05Kb7Ym9t!G}8^m+t%Ahja(w3M<#YFKXnWqSU~rNi|{e-p!L{5UT%jWAK5JaEJtx=x$^wq(7qxGyLz+N*opS1;(R z#HIEQsP;_HyKRJV4ndiXlLqMIqCJF(-1D0GNK&n63YvT@o$8$Pb9^JrOwAVt6fM*# zQGE>O!{4)T;^#mA`L}iw=;<6WvL)T;(vf>&>8pE38{h6-{~?`nv)3<;b<*5j-*F-p zrDIZRXfh#twp(LgWN9?Xod?N8=n!Y4%`PAVE7ucMNb;yHH*p}9wkX7(n7ocM=7ui~ zC{idQsb_T)G2l(uZikPX{0evc!8XZ}uU(KH{1KSSoDM>l^!coXycaF!t|qd#G}#BZ z)HsV+=9S9_6wxYIe0AUNB6=ynU!K)5$S~$X*=WX66nV5)di+~64~1?!f%4F5DDr4; zmvU>z=(76VLfh`eQqdezZA-lMeB*1q6FRavBl6uC0+?y7N@Pqg{?;bWSrpcl5PFl$ zQ~^^?xPMRu8;|skG%d9=kumE)#6l5(B-U(-+G{Q5k|4|q>D90XnOr4v(oZ?m`d2D2 z19QHsA}D#GeKdlfQeauFe9xAc{xu;2?CK^TlEF`P;-{Rt?OSBVO$JSDu;Z=XYC`+f zHP7F5c5-qnnV)8S*^&F|M(!~WGgxKnJ`#1Lr%-~9tbP5WIo)=2d%28G5P|vdqPb?G zoq=j*ATO*H0kn{~dWDd*UgIV#L=)}LEKn=$i>A2q+Ou|bg2hCeumf07JvWB&5E(cW zy02jD2s@_bR4fL(pf6x!$d}w=p0a|upR9rycu~?JPH|J_^n970*)siAW{@MOS&P)4 zmCanOWrqD0Y1*cXDfGNUL1s=KJNRVSq=(%7hV%ao2Px*e%81gYYj1LfgCiq z0)uWRn0~3NRA(!7n2RnxO!?jdg+Q~t8G!qRtT5+Y3{sJfdKD%Q-aKwgbWQZ533ICL zPfjn8{PRaci%=!U*|Z+D3RFr?zez#inMi&&d^CGMz++Nlf6LkLFjGzu-ghQaNb5FJ z+G-_T4AxL)4Vg8qcW#ho+sy<71HMX7Xcjumbtl@3+RBK@=w3^w=v@1W)cM^>`N7lx zy18Ty$U{MxpJK1MA(fM^Is6P+w4QIOTmJ{=rKJe!FXN8GV)I36ORty=W>CI|P4nsD z&F|VCDqZ7?l=Kgh+~?o7gxMq6W*yAZBbZM&(z&~R@j zZP|If%7pEQo6k#h;X9XemVxl1$RORzcA)-)4uCUlbKrNJh{9djX6N4yJMcFdkhz{S z+!j$+>4%MZF#Y>~Xs3UGg+m4|Xm6cYh@UZuRG5Oxm^1U+4+L#|&^1=-V0f5D%+l}V zaPk13d7S)}5-;ylcVNbxUB-BQR-Au>vXdp#y%nv_8De}nAQ6m$fIQHn`PWuS6}08 z8#jA*!|Cmpxca|6S@^Q%Y6LdMx;J&tST?@MvT@ejLW!EqGuFss_&s-8Nkm9%H7F6hRnj2Q-4Kf?7_OuhggXp8VJkZ|=dWs<3jY4iNj zMEWxRLzw*Wpu~Tq=|&+kb-cr{S!}P8j5J+NDoSh=bWoJtj+9QM2v2CWRB@Z zINP}h)$;SNe<_KD=;~*G1d@I@{hBlBl&nDVgh|SN1qy&4*;Qj(p%I8g*Ki`+A%%~% zf138)grO@KjP<+*>B0>Hb;YLUDN7IK!4zLZ8N~W34XMh^4=z}NyT<62>S95yE~1e^ zV~1tmhDhvqlnf4wvO7u9hX#|~9(-7|mIIPyX`dDi(*^D$TB!{2FK=@zW&oX}gmY6Q5Rj7x@5AWg+&A6HsyIRF8EMUJ=Xdk3LbH{TllX;N zw6;%Qu0Ct{yk_;F`LISL+u+Wh2Q2dP&-5c;k%Mz#kwJR2Ac7ZQjj+V5g%9L@04&NtW!@fI92|feV_$B4Nzr~LA?{H%gd|`P9arq>mj*@x@Nwi zes7KE=BoZ11seWR3k300n{B05{Y6N`QuF!yG@6Ssx0aYX{VqfdXW$ADbD%z~iJdLO z8v&Kg!fW03kW8+2)BTg4Myk){=za=DK! z{6ONO%#=dh>T2pkFCQZqr_by48H89LRgP}u`;+}arAPF`$0gh$`kA;>usVX=Nsjq6 zvsdTGsRW5Gwq@n?q~_XQbSb!OxrV)9on6kjH915Z|7fDh%{N}UhSFh zP}POVW9eGO!efy-_A++%Hdnmi%!^^_rtw^~fYf1~|CuB^0u$Uu#(Oz)Ej~?jH%vf; z^9pY_D;rv5B4R0-^x%(NxblAf+Eq>jZ3i!coCa*>4hbWG7;icN!Vb^8Zo#qS&P3(N z-5ME*)cDdw>ZW3Pz>;NZbX`3dJZe^Ee;uh21mNAgm`fK~TK|N)s0BGT*G&C|i#F51 z`0Q7y1muD{I|kAhe;x34XFqFy&$I+ebfMY}&=wm`mWmIyMQWiv;Gzg=R6Ih1ZXQ1S zU8JupMDr~k3(47{&yz2Er8c*^kTLDMgz$PS+H0U)CXDwzofo8)g;=T|i}tgd zXB^-D7k(=w7p>WRH*yxFO>QU7wp|qysgkX78D2>ArZRiOx}M`!cyZYB^j(k*4=#6g z)qgg98F$QgB}Q&YWM1!`NDtqQ@af(!K_iI1W%d1|T^sBL=#6jk(&Y;cuRCP?sYxV} zF@L{JFiHS|*PoKe62$|gWe3n$Fl94<>F6oDk)kGX6L-A51VzFx-O+s(jlj`t zC)Gx$zL@Z*51W19?n_fhi$t-)Z!<=&!6p9QFQ^c5vFOGleIm&{!cNWE(+1a{&PzXt zCj`?^Xf2U>skb>*XptWHk-A|=89TxpDT@T8e-o3r4@^j#Z0o=ZXIUsLD>SU>fv<(L zXoYBJHANjx&A@LuyYDD^KS{$Wzg2URr}kb-8%SFATZ|^Je=!={mv`Gk0e%$xk}CZz zJz8U8_PXg8rA~Hu*j&>R`QAOk!&XI@N?l{}7v194=Dd4sdaT zz+pxvh?e~?54OIDMMGlp3WtNMY*}#d8B0!<OHK>N9)y?RVBq zCa6%cM%@L^&=3mCONE?-JJxtVN9*R~8{HEhIWdAfUG4BULY+&T9#HReEPOxg-@zSo zy|Z@#Fz@3`-X9%lkS*FlRy1xhq&K)&Vm6UZ78jche@50~B2xhn_hctgi9?QWj0mk- zdnB}~=Ez;+W*yO(?>^2VAlpv`_GWgD2<=^aD73NWt-D7B1%@1jEBjFGyuz|a?tD&< zW5FodXDs)}it_7=vDC>n0J}aud)wV-B~rH+C(a&PKRTKo)0Ir0Un~a`JTKPs=j|u5 z?}od`tY&!wn|24deGUpjM)i8`gkHtbMia_)pH%m~V^nQlpIhTq zS;@Ovb!W{MYwd!GR7gVRzxkC+)eU3kQ2lMZYr~(IwS#{qWbrT(QHDxI8JKGhCqFL5 zlt^8s$#&Lar{W6%!f8-uR>Qfp&p=H)*nf;LH1j`8m)>O3r zB)HEKZ{QQaP+WKRp!zc~2D=pMBSObCMQl8wF%zmgd&08L`rmM=Y)z)&4apQe+d@aO zmzvw}DZsFe&;Bos*AmKmjCaJB{@wBZ=#T#ojrVAIWrfv$GKj=vZx&19NFi z>WT}+m54$9Wh^xYS<`m+CEX18lqw?YoU~d%At$ZgxD$DD`%MxS8BIKD4;^)b`tiGzlmnnoL0}yUx1VffIT+1aui)-GwYuc=LoIJ8)%vMm+HyJY`WY%_4;LW=)4GLtB zLPu7+a*&5dq9gZUGQGnv19=z<4)f+0dkv)0+qv$9x8KVj5^%pC> zW~v2C%~|d1aq#BuSGFvx)uc$1LQtte#J%if>b2?gdB@Z{%_?a1&e`3tKdovxy|aoE zZYC@4aC+yVZ#cbkgJv>yqU?>y%aiFo>a=L~y1TE^5)^NooAw9Y$Wm-ztptEVO@y7D zyRZ3ulQ{%0t{Wl=z@U zrn+RV)smN3EomP4PswGpLi=`WPvXIDER5NjO2WNuwUHj%1!G0%PAt*(PF0h z6mOf}!zdrrO;uD2#+nU**e48?=U^v=cY4_`)|kv0=Mz02&B5;xypZ#p=wll zq`9{BE8x7VDeUkI~*A1nBUVycCD%5KE z2z*(5qE?6247&S7Ymu={BGqRN0L)bXN8?lFKSueFQ2w-_eA4f;Mn7{duB-0gKe~S5 zdf*5yQ)W7Nw$16(NMiD!#zUbQ0|TY!VAr4nt@zE~F++hue97^@TR^viik5PVwEP<` zVqIo_^O-~V=?xLT@7FFW(~MR!q+0yZhfB1u^`qvjND35oQ; zPmyi1{q1J|A*mrF__Q6e!3MW*QFSZ#%}2qKedz0PtxsSAl<`MyMCdl==-F#>{7d)P zU)i%+*Du%spGcj+s%ZA(zm2dQK)ybzCu;FG4^O4JjykB1gx~k6aRmAU*#E$9JFY_h z2<#W)HQHqYoS$+8({wA|o??0CEKwXx8P}r`yzoizyISGh@mdbBWt%(h+Z$+gqBL}TWD29_0#yOF2dStyt}rj{;T{+6xDwj>iUR;XL{hS3!$!5 zUrSxbr}}Q;6Uv-@D(w`I(enD7H|lL$*g$`l&dju{d4VJd+E``c=%t|I_ie>`YV@dh z)=?Fo9>Al4Qz+Yn?i>x>+o76$3+!`Pr`QciPY+P$hJR>FcDg#hU$Owcj%ga0NUaBaKfj76CsO?$cZT$kHIy<_?&>jEw!A%Z z0k~U@wC49u`7OEhIaYz50C`2`(Fu;mv8o5&qmqj$S%58)CzH%>mEm8In250P@i}JX zZY_wXhg`=WbHZiPqXZ}WR@?TQ8}28J{^tT>75(SrnQ66eb~Ho~&w=)s2_!H;AeH|{ zq}cg0?$seJ>;y}KtaoZ}Sgp!OMsnr6zNYKT+-O^^zZ9VMYNLF5;A3?RXClLag)dF@ z{VkvTN-&}al=CEL)Z$)2<>-R1k?Ee?I7(a`PZMSt71)23o6xSCN&C?qgrxMw2lhfYJ{V<*MoDml zljl{8c3FaPya#SBVH6B~T&nM{Da9}Lmkhj*pXM=fVrt+_RklbND|&D%YL}34n+pB6 z3KfpS%9q0N1E>@4(5Kia82=T=9)G?>K@-PotjnlSIR2Y7{%@Je&9zt`C?p0XUn_cdwNIlq{Pp%V zJoUW2!2Uo#cMUl!6(~{%Tz9tB-(5pK@GtU@qiZMWrPm8svWLBQTGx=wJ!Kg1vY3AO zO=+V5w^M-1=@SQeHvo1%0wuB{6>dD(t9~R6STDQ1|CD($UQgw&jXjaS4nVx^=~~y; zTaqdV4RKKXn9g1-Ok!XJt#>z{hp%hMsf>Y>tA1~%&s|aXo-pgWE4qgK4%kxz{3TsO zdQ()3)~#Jb9tJZG;j)}%FYc;Lg}a6r(sO2wMQUKbSMWK%|D5^o*ZvtWV5F%Id@U@pA}C}2p$riD z5#|PRxzd&sJtgEL<%uMF>BqZX$iAjs43!0ofg9wrz%OJ1Rbj;;!sBRF>>1E}I=fWY;Kr_A7Va zq?Pk1@`Z?5v@}`MoJ{N8jvrnty9=RvUF6hO*S@NUwh3VuuMKf!P z*q>%cb)aEDbmm<}r$w4{PR!i;vq%wFTaKH2bBkr8Lt;O}NFag(?O zKhR8Y^H@JZt+x9PeV?4FT~Y_lTVFoZ)pmYaKS61y`PS>0b+#LrQ}hfGXmsVfZa_3H zr!Yyu*0x=UT~dns*dl)X2!JS5AHIm$A5+GJU>?h{=D0w#Opdnu@7faEIE^H`Jj z^4eOg#+xxLs0A0RnY?&t)sBIgw4f*Juc(teu)8CgikL@BW&JxeaP~jnJxSXX*=6!e ziUvE+Rvh#)*HEKsp~mlM<}otDQj-Lfaaiy+4oQ(NUIs=(wdq{1JSXX_J##) z$|=1dRkFwYQ2^+}AGJq2buJ>z->n?FfzHWi*Uzg-+h+Yuv=^<}UjMM*2CgeDTpV%$ zlS|ACY8&X5!%WBkJ2HQadEO{f5U5BTrxv}mdWePW7k?G6KOiEK3TpQiYHk=o6w1*H>>8WXD@d>RG&2Nmlj$$^iq7l|H@vW< zmzY;v4L|jsb6!YAlU#v9E9=H-VWFk2u+N6M(IsQLjuTYl{1>!Y!=iU2cLQ~rH{ROY z6|3oN7|SVzN=V~uuE~zf-pmY1D^*?dPdzJN2|M)EmUiVpC7#v{K`{N2sV^6||5y`% z)ac^%5PoSY+8--0o~%Fr`Fw=D(%Y5_xxkm^aUaF8H+aI^-=0iYY*%%nUv5p3s28_$ z^dS_+p#}tW*BXADOsbdyHa=u}7jlwYRA=|^!)jT}C&bbMepLHh(w|I^>e0nH$L!+6 zK^M^eA=5lotfzh1hv>D^%nR7%OLUjMEEG$BHB_@Ea_=$$?yqm3ukp5xwVcGZSpOTG zDH_XdVLQMl#+9=^5H1%LtMS&?B|{cT7W|Y3a`Y2rzg8EGh{d>BeD*8#PjiqcF?n0v z$X$ud%e^m1k9t)L{<-oNzEla8#4;AN9oA%4bYl(q$q-b8Ueo6@q{eoZ-P#+lUtT#H zI_ATHR{?mmQWn+bEM0%tV-Vf^9Dtg=+`>fsreMBx(nSIEYiWY08^(|pxF+}aThKAn zKbDxhl|{diYcwnwP#PBfmz*pB&EH}|{>7zBP60(hfzZKi)NYXc234pn3YuIr)ej#3V8kRATZ_#7#0aY9m*2*sX!8>}?|!dulg+ zOP){Eblfs2S(CjD4VyAPQ~hcGp7vkm`UjRDK+Adg34U}9g?dw!-8fq{BW7f?Uk7=G zZRf1$oIX7etqnB)HmZP5#no3eZV zTS+&%q+r9*ua)#gk_z?Y<9IYE>~tx08so&;&Gj2}+kcG-=1T-4%KoKcbPR2PF}|>2v<@6=GfM>Z4BH zASD;vYhzWBCao1|(EM?4Fmkrmy~t?&U^|0{liW7+^odRD8Wveg;s%(-(&9XRI7}z# z;PC`)m`}L4gIj`SALzJLlRdMn(-%p9a&cR4nL+-TTGE^OmGp1m!XzGjgszm|!2ZzO=KrseZz>cWOXX;5qLK!=q=2@@DCx+h zLG!b7{9*3cCgsIFFK)xt?2~~~&_!ndkpVjh`coHzH_uSrE%<3=%Fb7G!5E4yypezG zoaCm9c>CI`=<$jRJA*3PyBCC}j#c_MD*cIk>4$A;+xFCBwB4Z6MfuX-mIlrvY?3lh z1Xhq0nQaaAJhDbB?=2gs$suc`l3sC10kTd~(pr+ThiSP$CEIvGz`z|}hODXp&fF$U z+i(^RrV_@o3zRj#N-2_a%+isf`{w%7I0BYTbFRhT`uG49`(EckDT#Ak0HKO=W%JB0 z%CQ1u+%!=FHgW42*Yope{N7Ce=IuH~zk(RgRixmw57Ss|5Qrws62G z$D-jSrCsBzMN&v=W~s|G!sIzlNYYAe1h2I$lwnyCZfW&wQTI>94k*=>X~~vke67=g`}CDmt6PKpp#tnv+scfQD3i$_Gs@icycJzqfvt5?t2HN`KJ3Oc zz>Nt3G}=6a=ZN&tq3T@eZmxUjOIA#cHb0}36H}ubo)CsyLoMW+yT~Ic;Gn-K>FX{j z;Jo{kba~KE_I9SpY_YeY5%`bW=+SJM%uYhx#VB0kU!|HP)G5?-66&LNhT)(0luw?z zdU9+|K52V|-bel#jUH2;g;aiSzPyf2c8~s*FOvCdJW(riuA}qrkuOzVqrBAo$p5aS zn_N;b^8ZlMl_X_HTF?Xj&+X?Ey+ACyN1fDOMd;;${OGS!)e}zC854J=!tVCB=P&Z4 zG=?&clt!xCcazc`A|(+}At_CBq@)Vc|S{TuH_y1@rI$C2b%{{WuD|++MHN zO@SRuz183|9QD0E$x+|0spY8eElLFXF)Dhxj(?7p-+!f+86DHwZMLnu{Cm>hER`>z zyz63q5Bj@SnIq`m(w_}vMNqgi1^5U=?#D|o$ouuqX-i!Wv%B!zH zEY_}@lP9w0FV7L#BDGyWWS1UOUfG~YPG0FmZjQ)~l2dxC{eH61H&tfY7E5SD3Mi&q zzUFA>BW_UR04PU0AwW8ccH}?j%&ZSl)KbqD+|(TPJl@U4y~sCD$%V~x@tYG#`Y)Fh zVDTSH`Uy#vdTs-g=Hzu!l-<-bjKrhm*YBt%`E?~V-SnPnC*l40=Vo>Fb~Hy1I(q-U z@++$H&*sZN)q{R2l=%V?r(?*kV&%1x*FEz6pC{>ImlTZrB_;imq<>d_{Rb23X6Zjw z_0r?J<<}!nl=T$u%9BDD5}c}}kGP~@BEF!c z!9hPxfcyJ09$dZrFj%$B0d} zg4o?ATrg?hp!Cs`cDy?K**W&?F3@*fA~NYPj}cpP!0xswtpDUww%L@d`C&d~87V9a zeVYVJTkVYnPU1skIsm-g3-chD57TG+Jvfnb$+zj8Gt;T@GN249SYXZJ(U|jBYR;{` zb^8Nr-6b*BOu8U1LTYKtiICHQrBH;_DcDqCO$VDp+j{q*H;m_D>eU+6+F(S2B_9O> z0>j#zx!y_+)(x#`oL{d!N*_HnUKn(?%*|tZhyu4Cty>uUfTC6y)KM-c3<~toE##Yz zlh-W_u2RwmTvEUnNhS3UddgaT#9Fq~M{YHC_Qye<6$Y2MIX#&w5(aC}%LxN#5X=-3 z-bWn1crjf~Jv%24_V(cLMarB(i;Se5>9W4_DGAlC1r52c%)Xu&gJ&6zAyW0ta7qoTHZqsO6MLFG>VbWeP|-TB0>S_0RKuQ4I{}Oam4>9qz|s| z!)@x82UY)rwKsu}vPk~8lK>KdIG_f>Gip>+(8QA{YDN;ANYLPkw=Rmfx}Fn77d7l8 z!Z;4#uDZJVcfIdh7Xw~|E8@ZB1>ymoJv*R8*FaFo`~7u4&s;=z-}m$S`ADYw>8`G> zuCA`GuCAuAV}kwy@*7M*2hvR7%&-50JSb(w#U}XQ9IZUsO+(|@(coaX28Et z)Q)cj<^1u@kOzO@yV;3v>6vuAvU<5Jk3hqewf;zNe62jVwl#ZvbLGL7RFOPrp_Uup z|4kk&9Z6GX9_kNswmf)AA1?!9jy$+W`KOYf?nP8tRW8fx#ns9xC+q)}Jg8KyWVf#5 z!5(~atk7Ex{RS&!$%D;U;kV?$z<2*=d2sKsV7T`ozb_B2rI0TVh8&U2Ga2&W1d3UH z*^)9ozhuaR1Ju^qVVRWPMOh!aERWKCl+{XBS{~HQ&*qn0d9b3!@yo5$+Dsl?(1kpB zj0)z!gMCKHmIpC?908~td2p5T_j9;<^59%$?clOJ^hYVHkSt#wc>cragc$iMD{aVD zt7i4@T*9zBQ>8tk2SB~R? z+M(k(N-4MTGk&G89AoCybCw}>kSjDzHZNhGBhQJ>XF^074sTHu8cP`9HZ$#T%X?^j zfks*Abm~)qtD+9ZzAX4zUW*(;YA#+NF6QfjHfx1BnY8_BL);zXeJ%IC9%^|$<;68O zvcQum`_aDF_BN@u!zJl0)|*Mz+LC)_N+ zhb~rAg6iDfQcyo2vieu_t-jHbB`lMi?n3Pbz;PtS-8_Zv3u1qbjV!^h{r$}K-r1)a zz1mo186XLFf&Dx(0l)5{K@Fia@9>z|i6!lG3hK9syj7rP%4aK%PQ+fQ579!5U{KK& zYT?9^-c`{rMo{!msiL>~=jU95$moEFKQB|g z$E}S&=;Y9BKtK>oi?j3N3h^=NAX&aJRu(^{GeQ)~?p(;`$ly&6{a~|})L9pIf$X`$ zAXyIWiHx5vFWXa><;zt5m7MY!xN85GjqfEE-;l%iAP?Ufk|}Hhu}YuNcKvc1|Jn@u zzD56*laQHs_4}!nx85pib0s0s+nr_mcZVVCq=p zcl+>NIojHSUs_qY&9ql2HleS6Gi}2>Xl|~1N8$}HtvQ_^v4Y>AZv=`nCy-yU0PdOi zE}*TCKz}jO5le30iev4R%&Ba;KPZ^`o{nj{Lc4~{re7o{lySW;@dv(ceqJVC=nZwEqYGIgD&2k4jPtbgccPO1 z?)L%z<$KA0`R?wkS=p4?eq_x6IXsjJk==Alz0h9aDlDI^OI&4ve!((WSB*D7T8Do! zEf3T9S9aZgq$QNN=JOOkK?)jTP2k#=`kPL>{-@Kfzv;B=UpnpjlTN$#)9JDt_(N?P z{thJ`{UU`=HhVMQvX?vb(d_$W<+CFd-RgzEYd@CH-BL2$LKhs6xmK!wv3x8jIQd_* z1!92toJ)VfE3oh!zM18@iLhDu%}s)({)mzbg7JQ|<;`Cb&tm zIv5v81%r5 z{*>G=@cPFX=~(w$T!HXAa#ID)wxv^0TwtCtzCQ{0=44E-iXA&hfvygjRRmaKvAlew zeRe{@pog1h9>!lWcKl%Xk#|yv)xvjk2l*A34GK(~Or?s;1_y3=Uq~qyC){;RXzZu> z*78n(c@3QSK9QB{m;npA4-mga&ymbbBc)G)87Jp$hOKv&IswqRvie^~fJNoro~%v` zLY78Gmf)gUbT?mu&DtjTVrW(hfZ2)~1QuIMnOePPV#CQ{>7?Eq@@Do>FXF|o2>KjO zYLoYQP^&G}^E04wA6)l4oxXrt$}=Gx(eQx7T+{cD0eoDSTUDC}MO)~ty&Jp=_iI{z z99X`4*z{=8XWNwI<;e3vq1aAi-;y@lT-I*R&_sOghiXD8C0JBk;ND+JZ^n?9llv<_6>RQl(y<;#kz%t}N0~wVR7;w&HdJT4sA8A` zh0QKs)>-_(DJ6L`iG7RdCeWxLhMmRVlBFnfwZUdx>!^*tR9XiB`QVjM06xSqoqOek zzU(YM{nV1Y=v-C)hEHsnYc)1o$LltYi@bW0>J!SR z;7r=qt$d&l6?FZuo*VofmL0;k)YIPQugSBnJ zqMkz5^}+hhb7AZu3JKfrFdx&cz_elFwsl~65D?*(ZTpFI-RtnvfX0?;G?3P}@k#FS zN#7ELVSyFRfvV-Ad$pze8+@S3w700@-7so18~;?GtDlqRiMxEsmU=&_DpqtWwW@Jo zX{rNAYmci*f{PnK*QZ#I>&cv@@zA!p`9iozs9gr}!1-K0npemquStq2d9}*>CwX>w znySg2)eESq9~$S?KL>!-9L97*kh67mAqLHgpF2C(FX1uA}fJuV^*TLq@xPl;HMKaf=Cb><&C;t~}W2X__^ISC%%t<8;{#T)sVxP;==z2 zF43Fp$d^B>(8ry{AE?k`GKci5m*Sd$K&cSaqUR z<2=yy1)hXC%1i@U5NL%NLlszLSMWl3)eYT_!JlnTu%lAcn_P3Yep7O1N(SxSL!JFZ z+t^41DcVYG6Sj&EsfgO=FNO$HVt-0Jm`}&*B@l~%Y|z&*KDDu;XNyW$>onvpzEiyD zi$htt?h_@L2YfYO@tZx;2r78?;3KXjUoG9wFiZ5{mVSq;agJ)dpx=DHlFtrT?Vc>U z;Oehs+k&#_7m6LRw+C-@8r}#C?}&i+<(TxB!LFsB`p{CyYpIaWL}gJ-Bov!9tbR3v z%v@Os@N9v>k!Rl&u@BU)G7W!#l8u z7H{*et97`$fdThCLcBoKUn#ak10sSdYDx_AgoH-nVqk*dP+IttpJ&pV0g}30={c9byd@PS;;sEf$WZ>;*sd?3iz z2s9nfr%>E?U2ZI0P8Vw9LslFNf!L!=F#GMV8$voa4m2J`Rh<^ADOj23dR|nySS6;h zs?v~Ib^w)QN1S>>i8Qg3M2+bDTB0(K(UEybVFJyOuV545V<5i0npQqRvQDz!4&Yme zaDveV4Tt3g8hbGC81o8gdWyXf9hs9)d?CKouh|3g-w4mf>-y<>&=_GU6u+g-RPP$Q zOFEagdl}ewwq$-y2{~-ENvOmRZi4y*| zfBXP?fQW7kc79|HFnAmkt zQM$9ZkSPtZ!`&hDL+N&JZ&AA*IUS*S*g%B-`T2}5X+pn`wjpoF6y{f12!21Rl_C^= zC7d@2@~d2BRmJ7qujlpS%nlDzL1`>!Ff_5AA?`A0rbUU!%JDc(@vl>x_y9XWd^b4( z8q&qEGfT%LcVm4%m3VR)-J^M1*nM67c2&oCxbdI3=ykSEUN}i_0MTSvx?tRpi=9A&wNEnmsMPmJxef933kMnoeRAoQT{V zfKH>jb~o%@5(o0Vhz@eoYmOa8O#w3#4&if?qPSrGPjSR~Z)lNq!HZcYmX&GKxX^6e zHD&CQeL15K&r!l@WRGmm-jOT7m70%tk!|OpLNxou-I;+aJ%Q4i&}EQ^6Pii$#3*Ua zHh9il?989>Kku9Q3_9<1E`#($*~-yptUb+9U{~6e@gcUQ83E4BH|BKlD;+3k?JxOc z`elC=^6nz-Lb0ykQSBi_Y$$eGU(H(cGS&5P%#C|9o_b&66tHoPK9vb?ami-zGVPTO zw(KJJ8p?Z=^_Lb|70jGLVis$rJODQdDaZJ$ye5uxZ`o|?*2?JFIwY6pzSBo~8$(Uc z9I2ZImdHNc8ILV#)^s1}J0)%0&r-nb1_I^MZv-m6pLO>qx`NX}Mf2(a`QN4x$je%f z@f{QYQ?53C@NOG~y29mGGo_**CVLCt#@XSmLecL6Gq}=tY5uUo>%ZfPkX`)2313|moxokE zHuJ)xR%=7kw)?^1-2Pf^j`&&y?V#0%B7Y`!(xpH~do(9L<95Y&(5t|V>P~vtv@=ZQ z>s9v5G!-Ahlmb0uqb~=V6j#L?&-1$&&x#?8!$I3=9FjB8`@H$D+~amm@%>zsOtXop z?ml<*n9=;x?nw8<})zZ6%5RdG!9+v_VrP-FKU@~6l34Tybk!|1pTz2H{}&6sJ&LjXXPztvKD({QoId ze~!M8p&zIGCy6bN-{ew6QB?J+*0Sn(n&_J#$GpCZdGy)wq{LB0i> zSqgY`B3;=WOX(c&TmBaKa|M1N73^t~m5lgyqyR419daWer-rMCRcenhNs(+QO4+FmnjL7_a^8*(2 zQPv68wLGUmjyh_&{w=G2?a|3jIkMrB`ZF-moN5Y0$L|x@!Q>f4-;bso(cKxL=9J#~ zFz;;*6-Q+k&bNg%@smrv`IrIf%RvIAv0?l!=+sAR#3zO9Qqb0Qu2;Xbe$!GOK_Cb@AK(jz}S(1{E)kh%D1s37)AUx{={_(qFyNPBs%>1*TC;3jNyAD5d z_YkP{WU9Tc`EQG)_^!n)diuZd-&6B`pZ^BKie2(wB$(pAH7e3(mOk@a{5No~&G~P* zt)Iz%Ntt5hgzflmw<9z7uNXZxhyVTpaW?0_XZB3-pN>*3EiM0@$ZN~F{5Q!K{w@9+ zYrlH@mjY&b2~b!3cc3lr@n5?9$AL`#3t|lm_e#u1d$;_UI0HkFZ_MCtmi{wo&7Jh2 zMz5%I2DY?1y1?wXZ9ZCbhh*}u`WY|!cn>Y5c(dc-v@_B!7#~5DAFh;F%UemV&Ls%f ze^H7s;jbY=sB}JR`xiI=(3#xNhFf93&O0C`?@6nX%&JqF=xQ0^j@Y2L)xHqJ|DjpD zlrV2Sfz)1begEplwe^bUdbw?Xg*lq<$>+%UgO^cG2KXJOq;`0^uhcbi$2jC{s0PH< z&Z@!rS*1BLg=2@s@hfvCtz+x5ID(CEylcI5ChK_h`pd$x!|dsB+`78)tNIqSFya3I z-;ytZ-<(nrY=ya%jB?b74)draD6Ggm0jTBZ2IdVa7%%>SKjx(3r>Ts69p#k~)?& zHB_$Ph1VOu^t6h2alnK79n0`^HaKDnU&z~MW>WIN;nBw{ziG-3Y@40%(DI1^$Ku(t zyCcD8`aTBvma3n{e~~rgYj~2Bw_I%bMdlgGYqc7|Q0lqAO*^@D3M1%z)6y>c&}@ny zqvB&Zz*}L4VdxZhLRkDt(8_yLRfHVM=+$xtQ)!~qGY4Iy7tt1S79&$BqHvI~Rlo@i ziK)g%TeTOHIV!roCVuI*wb36T<25t|4S78PCT%lC9)gdmveXRXgsgH%y|A15++nWU z28`mx!)=$^%*x5?(hb+BJI7-rbHXlsp?P3D0zA5cM=s5&Z@1|uHl^$NWuHn1*U;FH zQixi-Tg<&URl^kfgyK7WMsvwt(`!(7YAU`DA6Xrk(bHLh&3N17jbBNh&>QI@*|r{b zpKR^zqQ+;9FC}{05^ZK5YFlkHxdMAz&Ug)t9T1BB5yQ#b917U$GTcI)ItyyVN6=E| z8x>Q(g!1;tc1V99iW7GQ(_!BFTOB_xe?(vgLDFdQDBI+Us)|KCDnBYv{jPcXCQGf; zYU0P_*H-XCT=+bKd{sp^R7W?h|F-4d1@Z37@@FeV&x{oFo&bEYLOIG1l-{WdgWhyI zxGSonbIcQn2^^ema_bw!usg_%Sa&HvTY7-Zvp;aeknchYCKqSyxW}dMBYX({H`xkr z*D`Pqy=WV+3=x$YTs}CoO}Lcny~5Leu#u5ZMo5LroWkLGdFuSruK4Nm3X5MQW8>)y zv~p#M>tE0|5%{MU=+G9L?qo(B?q@lEHt%P##~pgefEzipXTVmZZwkd4?h`@8;a4+T zgEO`2co&M03chC0xgDnD!_{@a7K>CBY)`;wms@h>HRnT~y-i?Rk2?7JOX? zdBImP>OxsuBg61quvuCJP}aKsn)atG1`oJnKR$fnefZRUh-&njj;5*zIG{>;dcieU zNp$k02b(QDU-tY?mSitb)qMRI0SrtFP{le5`ukhepF(}w_{p__^fu${)D2AC8Rk^~ z{WI9G7$46i5m zZU=493H54Wn|3|d*J$1brs$=ylw4@rk&c1Sk|$lK#;TdCC;>hW{{9~P?s&_w}4#C*BYyx=mu5KiE^e`Cg zU`%}<93j+B0v#_d@%!)LH-oRKpk;d>X!|@>)T3-S51VD)w7FT37`0{FdlF4 z*xXl5M=?pXnS*cY=uDgh-YQvmwDK)Ik9g3+Zmb4Ku$hS`Y>w3EQK{hxN3B6#3#)>u zdOf^)MYbN3Q}r&|!PN`7defGn3NP8h7QRKfQy| z4hYf*81=n^>sRo5HNUH*$pZTr*K4`@m6*L6+(4hA25tsMnx7PFYU5D-LdgukYty8bZ6MoHr#`UHTXc_`Pk29Q5GAhSIncY8p( zc|eAyfe=_+K$@`Wbtb;F8ow2A8!FvquaL%qi1%n4YAk(h1f+TL=ls0HtJHAoq3w_5 zD-4C^QX-7hqF4^K=nBz3n4>k3|E4x>6ozzLfk=e?WHMn)s{pqd-goUxgvp{F{di!Y zCB|HcY(Bg}dUKok>^WSJhq%U_zL;Y_`VfC3{P4`fpQu8M`O`o3S4M(xH97)~&HAGy zVT(CohCcnk^a^5bVa**4s?wqsm`Cqpr?`%l)ql_>J%0XDhltMy!PJq))j;+3{{`&( zvMQ%*kK=rIAxI>?hV*uS<@=)(<0bl``EI2{d&a#fw2#CllZp1-|FUR1I70g$fO2TB zqqC`&z4bo>-_ZlQ#P{R;41DM2`b$7hGl10%0&ZpLB)10B-j+7(mPpx1?GO_q{}0wk z_t<~0nMFUkRHmocw@%>(;8;ZkIu0#3*bMc=*TFz&x!Dp3(fJtOdL_%J^Of+Ldt3Je z(|M1&x>1i&pU%uFDdAFju%vTVDoyirc{X+&mA+`>9GmZ*! z%>0TF2nK4Fn;30GTL}`^CwU<9S?&Mqw|}E;pXhXj=BxJqt$lkQGDzkeZWk^LmzaHl z!S-~!ruGTjXmhKh8Bk5^PCo6GOTQ%T+lx1=pS-*4`jOkZte@g9LbU5WltAM@L~0&J z;MVv7+HbtIRHV0?#Zx?6(BwNbX^BS_IZ_WGSQ^_40mNszc$&t*n%!E;@lSB)Cpyuw z?4QAJSHN#(V&{5_cbJoGD+(F?@jnDWmyIk){fzGHr=~NnDyTP00A&~P;kiq)ZiWp4 zX7ULqe=__LF}z#VQg7N-d++tN0S2zK{KZg;y`G?bg3B_({SwRgEdHzbG|-4omo*%> znL8<={Tjpk>woMpuZ;Z6YVeRs|JoV28k|Exo<5!uBVDmPFg20_akA~?+{mw+ z0`Y|^4LNoEUTF5^3rcSN={jlS6&s~J33ZGl))~B}7vwyre~9SO9$CD&+VBJd=Q_a6 zQj59t&fgAt_t~_*)AEofy6l^p97p4egz_8OV4l3ob$;9%6z3z8*)<2%ulH%F}GzB%M?y~bO#h-{TG5G$nsPCgQ$vK0yDQz=1vwfi!r$#9g zWd?ue@_X)hE{?v(bEAlK%e!Z@k_V$71}A-!hw>0;lCdAF5wZB|_iS2Oe}dZE{*|`W zp;IOi9KS?~Iit7Sje=2QSD+U2Mzhm4{teh*^fPA2Gv?>gAGkR;PXoBK2EXZV zd}OVYL~1cZHg(fV)-+W$+*G)kpSeRbu9%^@;+OT%b+wrZL?L!pUlmOz(HGFSn%R zxk(FhsKXC>PLO>(qD{3PTV zYWuHAU+A^J@=Y zWoEuD3T6WJg)YMQsja0npr*=iBh@SOa0lJ6=eB9nd58;QB*{kPP~Od#I+(R>Yv%({hta>wiWevH?v8`f)TIq&m$@x98M!kMcL z2y5lBXp^Q)2I;O)*@@KG*sU}#?A6wpIEazY(2lsTmO;P8(va-%kNZr-aD>v#Gd(Q& zj+Bp+A>-hXrE!H>{-y}h!5Hjki)C`bX7uxfY+~&{+;UA{-WY>j)SMSS~?n2s_th}F+JX!p}DU^v)R%UJN(YcS9zAH z*_ZcbUklXI_A1dfW`TE@6H_<@ni?FkfyOXB1ff8aE>|XBw*2^;^S7-C`u*}B&EMsA z{wj`r@h8e%pflGBVEFoLSN!?BO1?_{L{Ca?*0B?qDOz;oMPbKaHA`Tkm{i6DpRSd! zw{Arz4w%lD>G%U@e8!*7eb4vx{oL=)pQ=i-U||^FpqfI{kKiP|Bk-6v=9CJ>YCc>!o3_WkTK`uqM?9aK0H+pbwLtk=)M z671gl4lk*HntR3J z$MBiOdG)vf4t}EHATC?ked<(?zS_u`Ag(js&OlC$Wmo~&FFZL&ld#piI6?pBpcAvA!<=g?fBMV@@>G{ zQ~FwWRiL!EQcu}Zgcld&QMfWv^G-aVOB9gbzi$@10t%h(QRr|>q56XyO-8Yg0kshs zR2U*E(5EaaTnCEq+cGU_{a1>r*S>D4;*Ek^ul0R}Y5&-Me=7NzH-51zLbM-pBlQ2R z{f!5t+rPuX|IPNV-n@MV^mGPP9PZ`oQj zFTlUKd>NzGU3N(Bs7L12+4reE`vQCyySB_sMXq`*J5(dpVQOh$R-tgCwP{CnbefIB zGa2_2yma7>0giDmrGA=mHNSDQ?n~8Btgf&&hJUE#^YGG4o}B6OUb8$oGo!DrelROu zUnrh^-#9m&rcX#1$CpE&p(Fn*eX4i-ALtV@m*NwWO&|HMr08?mkNc75 zIZi$$zD9<4-Hbj(sHTik7JcNONM6_Uar4Itk`HGg8$s`F)AN^n9T<4&HnSd^Zzz68 z3F0{vkLizNJF{SaIh)oW5F0tMX<_}ou~R0pw?p0ypHOx9hzS#Sy^$wsPq`evy4(|W zw^PCQ2$g7UR+Gse(){Vo=g74K;1~(z@DaQk57a}PG&$Z$lTd~<* zkCP`0KD6`Y)!&jQkGStoBtP@VA1d5RrWscAU&p=%nb_6bXwV!=&yVP0a~ZBS*~34C zHd4cX`7nlmWo72@zs7(=;DK&>98dks;m6*YGe3&#bP6xYoF8|&yjSh~XwI1*)*d=( z%>)gteNH5N&X2*sW%%*wp3h08byAwR8WZS;P>?JbnmoYm6t0{sX8E@s&(<#Ty%)4* z)^DwqO4k26Q_hmc$n?X&CP{DrNfMJ`}P=&TLR;j)ZYtB)lUiG`s`Ep8XJ>s#{jx}m7uP6P0Uu0K91Zj6nrGtaPkSmPVk*T3*x zBKc!a^N$pwWwZ5ZJhme{r_37Ct#aA59$=YU^GlV%=pSdt;LM9^{siL=?Pnp z0sETykL7Y7A7Gu*?Uq=Hk^Hvw@;WC?U1)KgVN)keHP~*XfNu^5PbngUAt(pz6FDT* zuIoYzpfWFBH$TEf$H^Np$3-^fM?Pe(468q1U@PW3gL7o|u*6C}+x9HGB;FzE=Ci%N zm6(=FgWzG{k$A#ZsLV?-0u1+0@-TJYsXy(>`|K7aF-cX^ET7sRVab~tTt8d9UEj-E zRqdX|?%*ab!s~*)Q@dEH&GM()KK0AlK2j(?xq)$y;jJP$uG#lPA6r`s6| zfB)2J_fL^YUt0EQs%Npa9kNgPT6(B(KeyTH+=2a5py>n(sX~G4d!XqkG7`i1NAkd} z&zMqv#QKNaPZrywIb^&!Z<2Ca%)s5mS#2gr8iD`0vn^`1Xa6X9hfevnIdQ4wM>$PQ z*;1UQ^FUv=Ncn)(0n-wk30AycvjzXWu{c%dB(Ki?S#_Ak8Fkj-*JFPEdVR)mz+5{L z_Bw`}&))iM;{hX<*k&&ak2Euus3Cm&=9pxmL#{N{5axt5a>CL~rXe<`;jKOB)*Z{2 z7wy2?!Xj?r-R;49KLg&nSt-OVyh9y4=Rk%?b7yaMyl8!f5!de zc#pE2^!_>NgL2Zta?%w_``aT^2s$6MN;PAI(Yk%))Pc;_o@> z){M07t4CVKn;*&ht@i)^QU<;);}fkJ{UN4d;+i3u{Vz#O&Pn&o!mlK8VNQB|PI|A+ z@GCJV{w97UiS;jL;#ZQ`3;etRu2mqst%I?`=$rc%)c4Z8f*tjUa!=oXFm^&=4d<4L zZ8-8r9*6vNWSvcW`lBwGqp$N+4LW0qBy!^;%#7EN8lB9j3l*p>5Ym299x~`?(k5|* zDY5bmpF+L%i4_GG$HQBDY7)f9T&7q%?US!i& zetN-2S9PfJqM0R8)X-Bra#cjv+0`W_(Gg+A|LH31}b>G*m5 zu$*oU_b;gUS)5yDG{AYYJ3r|P{v=iSI1># z=upuOdhkm6nl^r+*!6vNL1K?G048lbrw$Xg$nlLJqSPQZYaQ%~SyH$MpMk&ZF%^IPqdUPCCtgq-*0%!kn$P8-=$R z1pK?fIV_ZU>tHRlM3L_JxRH7P|bFFRsQ3KLu z9v}#4vL$ObjG?4lA>}yZpE zcd3QX_C2G7jWgPit__ml$7U|Z)D^LBC9IC=WwsOZ;;-R<;t z>yhW*hnMprOWB!y>6jacD}G=I*Dwm+GJAfj$clY|Ewd$On>m|ZB}~^RwbbHP80)4* ze=jZi{h_jhwFj_Rcoz|PGs$d6Y`ym)Yy9Wa?eAkg;P-o(>+u~ll*_NH+ra0{<*dik z)9bNQF?y>t7ykee!{On4to+`3K;oWuzkC2DvQEUEfmQT@cL8zURj0 zL>&mZE*=efmU^an6*Pk^+c<(DT0*Jy&YLn_^)DX))?#R``ACyew!^ueeOLDdt-lzg zUTVJGMz*>7ZS3f4qnJStOZ~kq^{wpkA2GbD5Ij`YQvBo>M19MTj795vq`0xm{-DeD z*5gz0zqjZ1X4&n1{d{J7r>5IuawZIR5?>#%`jrk<*zztRUz0Tu)ir!8p%a4zPoi?{L2+;0L2tpcF5Lz zl=o_fIpY#dnR+7aR8!uy(Nnlk>?mwV+D6BV59SwlV9w?=He@fiS9*)97o^Ef3-gf>bI01oH^tx8u^J^x|Ji*NBtwm<tDdG1G^{L9+{$o#_lzEx>fVJWurTRLH-j$3d*Oqc|gSJtC;FA3v@9^eq?( zvqOg+3u5c7_QzrTzJc+6@+)tLQiONZfn<*XxO=BaE# zJ!akupkiX46Q6x!|HMl)rv9b)_dzm5kYIe<9WDRPf#g2_w%;UDTmHQpbF}hBW|$??Owm_ciJ8b>2r8J8T6d ztdbFEoC>HkGc`QvH#{TZX3E(gu>)(b-_utPQ9|$Llj8)G(23NyYKG~)WW75ow8tUZ zOnUouhYITN0}QN(N7L-+{K~-X3(Rq#LKKyI5>SODjP=v<-!-_MT5nIC9|dV+R#)qN zKQJ-3EQaaMvb7s1nD@K%{M`8TJb8Iq+&Fr=RoBt;m`IwQv8&SbJRaM-6q9UvMk&!H zJZ}dDt3#%LS6g@X-6SFxz_rkaJztgkj zTj)8Ab~EYuTjy!>GZft^s@M%y@m)ywf|%YyN=Sm%Y7I=DS^cRN(l*bQEyo}o9i72~ zrxmnG3P7!PQr2&pz(x>yd&SHNHZ#1yUSYo9PkL0K=|aikEmW&5D!Vt$K5(>j2#26S_&~4!U#I*39{Yub zR`xykC_J#zF3?EA;)SH%^;47imYn0wKfbPilk^LzbWL*3w>$^BwoHOwI5;s zFi3f3_si4!HUhDxx#{h$PQ%NwcVQYM%ztKo6!t$O9UV<;8EHKvkeQB- z&hm%Co|c`Cj^~wT=UC#IHbaeEXobTD`=;(8EzGtVS zqsQlb&rU~2U!L6Z zUn;#%lb<-YS~f#Ov6ZT?h!8TvTNi*%L{=5SHkDB=)5rxJ1BQrA=@wcRz@dOZ1-+j9 zae>PYe(wwI$jjIAc+6w`O!Hf#Ya~`^o;x3bF+UJr3v5Mg6)1!oUmoELf2H^)pVO76 zKx3mmwwQ^}ZbV4x`cI(o3bJ&p-?x|I|Fh#chR~j67&(HIHsx_4DKM==C1PU=BO7;c zaYX}r6G24yPyL8b)jZiGC(dM_^n6g*x0cB2ZdI{MZlUDbaDSe5=+mt#esq3hPWMQn zq@m;NU|__O5clM3E0)wR8WBI~u!8FN;O&Exes!%z0ByI|7E3u41mhci-hd zYK;su?rVDu-9p{Q6fWqte{KAXeB>Sm$=c|OQDZwz+m>`Izcsj^=Mm~!P5gKs(FzrU z{SB8?$Ik}yHR=~Fz|(hre$CiV z6GtIoWNNCbjrH`S{+K8Jv#v8y&lf8Xs}6t4@<hENw8s9w>%kcg=K5iZIu9GQ(Z@JmN)A^XOB_YyQ;K` z|3iVM!2p8yv}?9(Ic;w;%9kbNju32SSCKbMjxxEXo-J0fB44pUTQqLqV>sI5!yh}R z2L|~QLE-K-HQc6HhA)DGn)^Or=r}3Em?iUR_>x%&Yo<$!Ifd%VIXyiiSg99iKFAW@ z>L!v(Cstwjx236g#cZY(7ZF*ot){*5Z_-w*zd>XILwM%F$xYy(dIAQ&9RXuy%m`3SEJUrSvSvZzgics8#noBL9tA+|vyYm{b=C$TQ z9lXllh9`P*c+ygr_~M1G=wr#O^9QjzV#zwPW#}Iaabn6{-7@5NaA@WTuwG}cx3T~7 z-RdJzjiu@PByKl)tz}T+WIS!%_{W0T>u)TWyk09q#rxc(C}Mkfhc zDCS80@Z;Pd;(ULwT(<@xu}*5%vKp=vdFZ=jz~JcLgbt3w$Kob-;-&CBCE)0W<$}cT z-9qudHRyLdrlvTLoX#J68s0M!6V^ggb2)Y2#mkP`3g&ezgOZnz?8UwVfJ>FA*s7zm zWmQ4cb{~3ko?jX6Gx1+T?qh{Sm%ipn2c#hRz;yIm`A5X^_ASVqe^_C;l4Jd&B~g)e z?=NE2`lfp`+DKk~|5#)RfA`2M5kPxsrGOv<;yf9*)7WO&TVnr^q0B}Q)*VWwej{fJ zkd$!iFi$xbo!e*k4VNVClY< zzwR5}HQ{W=y{S3FtGNmKP_v$rsyIy**WI|%1|`j4fFq{Tt#HDJKi{ywDvc993{ zc>&u{zbrYsvVDGG_+ThwDI}HYU++Smue;Zm1lt=+v47^3go~ZTO`D4Be6$42XxhW< zr_QDOB~cfCBuAY;+;!mvi(~zg#=Pi&1T0tD zfE44ItJu5#OowL0`6pMYyW&Fz{GL}m?`oCKl+WizzStzh7mte0(^a{5BZ~@XK5)}4 z5hzyF&7lxzd`oFX1>)(9GBens5tt(3#=fA1A^!}iK!s(G*&+X#{XDut`|$1s^`|(_ zGarac6Q+!(d_pdGdZ6({YQ;|M&NjzN`NM0YV+$i+r?1h^$O;!+MqNFO;(#pC0KL8JPT0cd=aYJt*E$!bEnzIh4PobCqi!|55q@D?9ki z*#jw-neLU7Uj1qI_m^_g7v-cYa?%~2WY=%WNl(p5{~;%RP)@pUPCBtN8-8m}`qrHE zX*ua#bJE{`oDFYgPI^*KdR$I=SWbG&ob4a?(qeWy60YCp{%6Jvt{nFeklY zX*RsOa?)4kq(|kX_sB_aSdtBISx)+)ob(kr>580m$Kq^wZ{?)#%1J+-!~Zq;n1psS>ezodd=N1gbiek^SGWs9`|vZmfg_L zMuA{cgP)Y6ug>2;um9*3R<+D9YSVe8 z(ekzadFyx<{#-StA9C94_yTGSx?guSrf_Y2@!QOb%|W9W9M2zxg7(e0=@}=-OOewq ztQw(7QVp25o=1aOXkO&lJNd7y_%zIr>gYUFS+n5p{v`4ASBwW2c#%XnkLzvbuUZFM z9VY&W3hKZwd|fc|3w!C4v6*9lh>z?$aCV9_9E;Oflt?iO(t^TjRz6#JDsYo!NO;u$@f+@9CmZMC0j*cGxX3*z()}d7B zmP`BrFi$*(;qx5W+v!ULk2=979DjRi=b!xI8Su^np1DM|ueB8#D3iA5h`)%JH8Dbq~DL1HRf|i?2?C5#6JGFh+X@jCH6id_S2RJA5~122U7HXlC6%TFHg7; zON$sg?OZ}2=!#s57|a#sPKtOBj#%<9|ID?2-$Q=;^$p24ojmv*dT5N@<}*@v)|g8=_WlhJZeSm&Df^-Xz45C!luwTc5-!ffxsDgYK|NR~C<wU9kXTzWC(tPGY~8bchA`#2DHSd% zUu$XWmR?9>Ep3{dBXOK)k6061{Rwz>ax-C?h70=6W{C?`EC>^y4a{3i9xMQ?8J1aW zArq$v?p$x%cQ`UyNUh%TiWU-JFT*5Bpv+t`y!Xs=~$QRM6VY!K*QIp@J| zQc{oEFxz7%aK*Q=v;^}2vEQpW93I5a;QIGrv@pdeH?Kft6$7Y8WOk2W#losU?W(3_ z6F8Fm>X)jfaf9kBaUQ|Z#O>nqP*i!zOxMhZncZLLAchmasyK0-G*1mX=I~D2{PiM+ zzs2Mc3@&GW1XX`lm)62n(ev>%T`oEVHxYYpHB!mR1qJolN;R-%Gx~URW#}XNL*WuvK8j z5;?1LzT1!Mc(qr~4a|76q9f2W0jgm44_8OOuBkY+Z~Ze8xAeWP2IoBUm*iH++4{SP z%x=S5Ly1*^znrEzBL*XYqx;hwCM$6Rv@5BN-awR^*~q05@U?>*9WmGpe@?DNj(>QU zvqTI&?Q6yDV$2gsjGS)0CjMOskW9C4m<(XW!A^_Wf*C?nQ#4U(Iair5N-hUClVTt^ zV$o1k@iJwlo^eG`a6+FCSJiSf5Q=r5!H*@LW+L+#1Wu(BfO@lB9Ai%6GJ$F>p zn4LacuPJwx$f0Lv>k{A6yILNitxJ5$FYGr$$w%_Dhb&%E{F;1&R#yYJ-695V>&H?9 zH_-OBK`jga#n#B=4eDyngM-XcmheYu(5|;bu^K@z`Q*1(Zrith&-SCQF9_3vs?u{Y z6}Q@>ol>gs(DI2x72x|^I#DC5C4#EWv_^!c?hn%6$b_=O@X%I!y0V?EgX<&JGS*Vv zVf5ykFR5J?_w6}@$xD8hk~bcHk(tZMXKuaC)pjAzQlKi+W4Ep&RU4b6p~IR!&;=xz zμHjk4R;#v=O2ovaehlOEI0c4?U}tB0gBF6q@LuH$ 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

    5?+`aFk;zEo6B?{}(NTQ~Rf~0y! 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

    0_d}m(&E%#bz*uRq{jtYEu2UtYqa$ZAz+f z7hq}vi?!D@EtZm@w+nYC>B~jYbap^2&=&1#&rj7fZXxkdY|txEucq-W1!@OvtV!=5 zP#bu;R*#Gmi z4REWYO)+IkiUk(brW#d1)MRBRq*b}20iJ1-nB&axK_X7ZH^(MM{STsnH>0UvDMO9( zF9X>XIat&99#ORaaP6QEWO&hJThsUsk%wy<-&R`fplwkTaVTnlp}>}~b5&uK_(5%9 z=gey7s-kM=l3o%{r3eMk<7KxCN@b}lvy`BaRk5!0UD&y#ENWBIu0zz@{}yDTuri ztve$*5>=v}J@>kOH)OxSjLF1f9i1f4E2|Fdh}Nw&`oOuVVa0@;4|HL?j%bYRBXGA- z4@=g4gl4)l#-4ic@xAOxU034($!rSCzRz^dF}grY^$knEpp7gfO-&uI`7wjT5$C2x z^yM?KQ=SHxc$wIPk7t;}HG!8hueb1TLT%muV(}y=@exqGg;oWe}!}M5T(_uOod7L?wn74h=lxmxoSPf0J~Q9%Jbyf|=gW)Sz4zK{uf6u#YyVz* zpR*doV=rLRNn;ww#9o$}!&LP3Mf|B7kH0M%MJsaoxtFto@c}Jk&V4b*Y+3c>}qp)nHP?sd1v{b{}%dLUu(LueDxtiKu{tgn*hwLrx$ad%Qnka`I8CCg*9hg5Y;X1KC8dubN=}{O>mnVi@ zSk`||-6|c|yTg7g=O0y1Ri04?7#j+^u&_gkx);}*O{F`bi&38zc9J7q8+}sPyJaBg zIw45Dk*-I5xa;RKe4pEOOv;TeDeIrQHb3j^AL;a_B}V!@b$Dx#K-63DiUIwaYOl~o zeP~kHqlGf1$5Kber;+{~xzcgD-tXFS^<(P5)WfMWW8Y-ns9sF_QQ>;pYdaEs zfZTL$s$=(Fs8r`GRo=a^VyHvG)u0ybkGQk0%SY0~9>-tD?ls%c2akzI%i@9&6p9LH z;NEIw@$ZI$ERF?7WsK&qpT;|?7{~6tLD)A(1c!odP*#R#ZND5rkMcL-xd{DO@O4lY zf^W>+I)WcDV-kK-#LPhOx1fZQ{!oN1g8^N%9SB|;ROW44ROyjU*#6|`^|7r^eAYP+ z1Q&>2{<=yp-`Et4Bapq}qkI@*VN3RgPb|ycaNWEd+m1Ih%=K=#rb%6BZSICAa&+NL zESft%G2eRCbmvDGa0evg-_L|8{`32_UCHWj>s9%g7c=Z&uW&Z@JOfYtja`f{jCt2B zunxWc#wXv#cz8j5jHTuod{5hG$EbBxKCz73v+UzD3t<>YcYbjZ1adck!FFSPjIpz! znPn}si1@w6&n6Nqg2?ar`z&phj_s79V$2yuCI0i%_-WtxPG*=UGHcLchMD!lH(s*< z&hCeK-rOLpe6jwxIWZ4pOw)#P%($SZWEkGDk}zL4zHJbt7b5nIU=W?B)Gaw*^XFkm zvVsV+)o^n>#8TF*N5Zrx4W~B~dq~-+IP*lRCg(p2K;zp9@b6cA?2OCqG;C4KY)q?^ zS2BjEVF|Mz(1;Y3iKlHS}v4xEVi>J&_1$?0|}pm@OC!nhCMEvyoD3Le?+al@TLo!N;-nHkHtGqPO%~ zXo%@+^QC{L#rV8zY(TS+W^lUryV({e50d?Fy;wJZLs}uB2}3p}8b$@btdXwHm%br{ zFUrJtU}w_%S@sBx1%OYx8+-A}FuMro!mWeZm z11{YeY2NZ|@?o$0l{e(_okF-KzvL$NUS-wE`oc|YZNSX`((+6`aCLs>$F+K-kz$DH7z z+Du;OnPb9b4=9>_=kldZu5>ZpEcA@btX)^X{il3UF%Fzw%=jTrwYnwS{InY7<-cGJmTFW*q(-@8gN zSM+`6d@fhkc-&>VWeRJS7voDCDi_AjjE_&Qt5l$dKtnm9n$8AqYy;!$?TJ>B`gI&I zX2!IhCDrmMx4A zALQ>fBIb;~z}ri$=AcoQcOSzCVM!MUyBE%0si{^IoV_% zp55_eV^cg?*PKq)wImyt#glW&c{oHjKPN+VvJr#5WV-~^S+^|d#L~7!!$vf!j9xEw zHdKxs&z;!LhM8k^$#iCCL)F-ZiGE#GXTxP<8@POWS!YAdSlu~AO0&i`T;$iy;yUTr zhN+yPbT*{NHca#D(gPdpOs}>iJiVL8hMkvBl`~NBD5sbIpsL~1W!@D#)6pTE{kIDWG@7p`zOS&QjUK4DUe+s2U@{3#2m|J-@M{vk{dzvpXHD^Q0k`k|$Er zGa9q8#%yP&stklZX}^)`oKr(abC$<;`i(7}olfh!|B8FP#-$Sk8P;r`JIN+u?;i*l$tw&5~A#ogxeu{7EgHGk3A zhFN~1}_5T(9`uGTi|FV9~;MA!| zzorpHzm^yD>oo?rt_hqb9psIq&GDqI~WX>~1;rqTPDqM=l#YiO4A zNh;?w48<&HUS}PkO$wEgR81ayWzbsgo(_9H9Rubt~L2 z`0vuUMgP6}_GqMU+*hB98Eu!BpIx3hvDdqz`_qgnbZl2_ir?~c3_Q|IYbPy?e`0=O z5|wuz7b?pZ##?sNULW7CKs;Fnd^Wwo(G)+AZ!%9jnWAPh6&#K7GIM%*mwr1l2|oph z?{9{nZ2oFmMuH4^T&(*ule76u4V)+tzwIBLmVQiQ+0_i0j*lhc=I9Q1cqHOs2M8al ziBHZ5b2jRAbW6y{miXjU4f*n>l2^!-aMn)&$`(NI(d4JH@X<`xpFSTx=rLz2@Tq@@ za&{89x(WIjenw=FVbID*iDoye@ccL_G$RFi&rD0_?3O}SgqQg#K+6E7rg!m`R(gPC ztd*x~J=8gy)k3DJ7=5mvYU-Rlw-_|fPtEO|J+Bxv-%ri!oISr7)a<9`cg}7u1}*SY z&7HFs6oVG|sRf<07Zrn+_$fZbx1<2_Q%eRe<22a#yi$RmrVb7ja3@TUGJ-fUZbdfso*%uXqrm8!iJ+&A# zO&$AeK6V?5L*4r^%r~9=4DV_1!m(d?UxW8ihsLtN<6+&>^Zf4i0~1oaPx8gYSbaxn zjE6j8-jyY^gPR_!-gU36k`ABmwQq`Ho+jwBzfHBynq0E%NXmbl3Gd`z11m`-cjLWM z$e-Pvir-huwe4kZ!gJZ=-TnDlFIYag0$ zQ+H7gH+`3B)#hYR`s)hl=h#j@3?3(X9Xn5`hB^4x@yef*NyCN^e{7p>&z8h z%YNEgQ*zVMo|4$%?~lZvyMG;DpNhrTe_#ydkEJ^oU*hprr`O#-k?_af>XmUj`vViQ zWnBbQQ!YJwmIu#-;Fl&kQ)9gDV4Q=|H%tU$yi&SE zs64*@!xv+;)0sL?mJ=3Hs!d@IBYPqDT3J{K3Q?_Z9Le)>yq)ZVZ0bzKWe;KL#@hw~ z+`gWRx}<%bvP(r|`zLD2Tb1tojGU@-Ejy ze6^YGrzd8*Uzp&P@mzE2jhXJ}OGD}@8HIpt5eYb$iLf&7=v>UUnVm;eS~ENm$-d4HT$U|U&wYi-X=YTQU>wVEGa)d{RnaN!M%$G!->D|jw}LScq-Nl7GE zO7ANF&*gTeW+C|u?_OB7XBMBlaOQa&xShc_^_>&&y@K!Kr^@i1#y6*D@T?bmCBFW1 zm0tIA6WNo%o5Ty%vvB&kx8vp(pWHcROi6BWSNqDB&wAZQd1;uvi=N!#Zc)$1HscfZ zoWVpr7uyO<)Y+KF=hEM=^x4?f?BXt=XW403yv<0Ar2?TtgiGCn&!rZ!QhP3U?ej0* zq|{z)tG9TQQfnny!_gNJN^NvDxzy0vScF!@uMycI}^EBFA=VqP^KQ2dJ{gShGB2)C#sfFTF zLuac?{k&5V3ckgqK9pH}#HHqVhsq#AsjXpcaj8+iEw0>8yVM|A-nrOQxy8@8awifr zDc~-#FkG>z0n0kKILw-QT4D9*ROTq>RHSs(g$}SsyFslA0JTh=Yy}wCTho87GM3 z!JPku0NGfG@f1eTneJCOFcdJPbC9gNf!i&wquj+t-3IUKX34|FYNp%!IO| z7-%wMI^pd+i;v0B39tLiWH8HQxv34X?&nI`^(-&r`T9?u$CrMHFU9*Byr>L=(3wdx z<80(iB~>dKHHmR#Pu~=-TUTfR7{p0Hyp=<*eWfs5GTC4L-39fqABzM!lROl&}3pJl%t^U{vgRD5hLGcKNdO-JetUcU4@ zDs`%iOYVEI1fj&TVa>b|8_z5UhTZ)W$~Mch^JK?|W#oxJV?{n$mhSkZ3_btgaI-MK z=V)^c#J&9GKfjgxMe+Mi^6h3`t?7+vdft8X5BC^Da87_H>GlCxNaW@M^Jibsvg|0EAB?WL`q-KBSjK-qTSwdQd{|pm)A?J>&c-lX0<1G?L8>5> zVs%fdc#;{A;EOs_E%C_<65ffu@ySbgLd!jF(V1e0DVt~knp}}+MM^|y|30{d%vW+E zx`u!jSx$dOt&iG{Ooi=u^6tbS#fvAIrx2F;PP4fjm-hsRo*1hOwYR?b8c^0Zl*ZRz zGfr0@TqXX7WwBQ7C7ti%Y1|2lSWbp4E)Fm!?ypF9UUPoB^SXm;prPeqloM5UMF#H?B4*aN~sPT!j;yPwy9^j!dL*FVHDzC@Pc4ww<*V#%7I?R&l zy;*-%;v{&PGOpvu$W?1~N#5ES>U3qpu&#DEdqJgS4bEoP(#zi$!fo#w_!=by?=Gkb zPo`-KuMETeatYrVhWoj|$ zG;mM|m{S@TSU0Nc=swGCMXzif#k1@fJg+$&Bsokl5_q^p=B|kX3Z`aZo*fr(qwn$9ja_;<1e9a}KmW34J-(m~eR2`@HGh zUiAZB^+R5#Q$>+`<;r=NSBou11quJ_bz3Dxf>X*D~GbYD208<>9mo0*Msk-ViTRi}O z89w7wjYaaNEQN!4t4nbO6~^oST=hvwz$$WjSEjl*Tiu`8xZm1Wyd*o8b9b`@agRET z#AIZtFGg3h$|a?dp^jPF@tY}v?hXv zc9-DDcqOjAt+~R;+Tdq6BQ$###!orAidC_Vlqf)|$6`fSv2ug1o#JyvLgLqT0e_z* zP@Unq-KrY)yctd#9FaZP#keF!u-~Yky4_x=6J@22Ctc#;&AUVS91AXdM45$Mw7)$V zt0;t|u9nvWEN4fIoco~4vj+tU;0ZhLP@Kw1*vd)BUd-_r9O)a2deVGoSlq`Y)V?m! zN**!#HM#8!-nV`RTQK!$Zd_QGsDkPHG=Y?@S+j|QZ_?}!K5F$#r49vi%sVWvXI@O^ z$Yv<`Jb9QGw1Hp=ArIq=l|}^6KHjet!rstQtWgNEP}>)jI6CsaOjWeMU{-Swr7DK* zD}$ZjO(WR5K#~2J>M7WIF8;pMMl+Z@^04yfJ4u#5xW|HTDd9QxcDDjcwI7MybksPL zuu>b%V(up*;4*10LJGM`Z8WpCFB_5-;x9o8@vHs-AEGy?7}rHaj|HzWd@|&HvI0KU zWqj$0)JLutkuaNX3$id`8*vb9gal(A%p-`Gb!7qd&!^5az%>dDOd`wvAo`!kl zb8lg$f+B7pGK(UXOXon+AgHHODx_9~)sJNIvoDmgRteS}yf+(TAta|u4xjFF4l^l$ zm|$Nc6Kq*2@6SwsoPFB&viR1LY5G24u>RI=7anRX9UbTpO%^tuN)xx1KIQB_CdIM#9)k3T}GO88(PW>-YBVyoj!qN}5Ef&-l2 z(KylhrgSv2xD?Wx_}t+5jz(6N3SHXK$ih;-cc#m_I~sYTy_>+8j>hwy@4Sx2*E-(? z9gTb(NwIJ2Xe@WWw{$d4Hec`_;P2>YydXd6g0gLzUvM+ZfFWyl% z#ra;}QTICMyQHJ;_2xVDZZO{7QOEtkZA>@I7?>sA(vCTA*id2gxa=Uvq>efkm-1cI zQ8&%`rghY@wiGPUQTJx&o7qu!Nw8(*sk1BNmEp|4GMxFhZP9{Yl%)%^^6O=3bD^8z zdU@A3XFIRsGa1#q1oGxAPjI*gF_`tnldG-Ea}!%$QB7Q;mPZdzD_z;(H0|t{)M@?* z?nSR(?pv>$s!6YUp!Ne_y3Zz$q*|j?;JO*88_V18uNA7Bw31zjvPNVe*M%ETu5#Tq zL*!n;HACXVvd;83oP%N&tcmD6))XZ$d9uSXt3gyWG`wyzmp)ZAnCRBxnx`i6R7IZ3 z$Wvh+h^TpK`qms@&%GmO#H3+WWzmFG<&TEfflUNB|J3}KMmCQ!snPWVWj?G)sB4d* z9GRm*bycbO)~t;Au$!i;<=U_g{Xr$RDI1Zl8Q&hxg4fyt!ks!1xt#2nf-o~f93o|n zoj|1mttMd2IS9CE1h(}Gbc8Xr3It>a>#aCNGu>=8-vCAk(B94v7R_{bGkukyr41?KY4>McQtnmCuFmCcB>pf)EA$oc)wzvQ+@rrV-a3o&1u$eeA+3r;{4`$}GDwH*Y<_eQ^ z@H++w`fH|Q8ZLGgLV8E5ju4_Vv#fo=V`J8G6_C>YwIoSjmNh=!J@;;e)5!6ty&Aie4i>ltZeq<*(uMKY#uXv9umR7BbUGC{a`a2U;4np_{RrH^(3ht(pFtF zz>k!3ol=`}81XD++wE~I9~b==3}}CHH{_OL*yJ*JLbRa)R&yU%+qCD0xmvhoa7k^+ z7@l+96!W|Dsfk@DOPR+oQz=a+yF0GtqqaM5>MvQ5kQp_0yO_wiRk?c%TO%IU&<$*K z-LPB%zLCU-N%A)~dA;LFL6VKup0b#Vdc6%34c6OG9=cOQw<2_HGZ;ME3C0a~fg5ZW zxVOP}fO{J>Ixs#q%neh`58VZ!yF_kp!!qYIh1kno?3Y{R^3Uu2vif8F!z(?}KfKZm z{Zn~r;+K&3Rq^{u->1)1b0wg?cg)V=V1J-XIWz?ncVDn>&)KuKH-L)rp74F@N3yyO z#~^bkxGxNI+n}GGGx%8;uC$(XfAC$xnf9}(o9@J-xq_P0+d)|br@@%uCp0tq4C4d& zuW++rOrf=1DFosc)@XNA-Mz4z;*;-A)VRQBnw4Z80Z6m6>o&TC-7FY!8W*IyEx5sD z4_Z0s>1l1jc=3f1t}BKnn+T*fIQkobuWfRrv5lPIabU*ZzF=@iF^x?`NEWrBEPfG& zy-*h48%g-9Q3?HX5`ONSgo_Iav-vMn2A_9{t&=zwWJBbr24;ofum(`pCf+i8TL=y7 z0To>yTmWq0%6jViUD{UQxz4Ss?!#Etj8yk;cBzPrf>zzX+Za|iMM4I_!(o`rsQ!b& ze}rMOQP&y#T;cXtYH#}1hFY}D#;aSyd9r#CcGK0NjG7-8y{_{I?@6~E`4Q7;&wqfs zDE1kZt%c5B>uRg#WBQuL8oW}gDphsabtkD97GNyEQ}7k$o1U=;W zB}ahit4N(}?|*;$w%QH{4>tc5_<61Z`^OxSpc)FU;A#qQjp%WagZUoC3i_3V!TTO| z)@&XzB;HEI(+{*kATw{GzqL&gN5<@B4h3Ie@koqRQH1)9r=ehhz;4)l0~_JeK)UUI z3KNtO7W)do3ASkLw^y+yDYyJpb0NoHns<_v8h}E;Cjg8Tp_x!9l1nWq-`m^gXdi?P zcKmtB6ps!S#20f^eF>3Gd(4&ACWOO*0ES(+C!UqRtV=0`Lekq4FB^O=BgnBJrX@L-Vv%iQ^-5PRJ{xu@wn@ zcffJ^!dPXk-QY!J$Ki+U%~m9Y8`(w$9M@_zf~(Vj?KEUX;uPM{%E~Cn{0FqqmMoc9w(^$^@|Rm@V+GxSXNGgP%K#{!sIm-q)_$0{|(ZO@iliqAw8!W5sk6t8eIP7EkbC~KI& z>hI=6Z4ncdM&b)f0=}5n(}9=|O@t|!c!j)4HztZ*GeR!wyG4?v`XzAD_EeD~p;(R6 z7W=ON@Z6pF9-a(UtP-mLP|v=`kqMd7)jW42KNovhFXSjmloc`DUV9$1#BrhZMNZfJ zbv=9lbfIZNV0r$~vKkTWzqxQhusKIKY|Vw z$fvlW+-=2_j=CcL!WB{JX&cXv6)Pcay|!`$zpE3+kLpDHAkdJXh>M7$<|2+3IgU)j zwnai;PmZS5zjCY;G#VCarPk8_NE*hCl}<15aJ4ji`oT08&LnVg<|pk*#$sICdZ07nM)wj`w3)Q!QuzCZS_F#I1hE|zVL5&$Q@1Bb5>rANt(Ya)3kHig*qe~!bPo~emhKV$ zp2Gl6M|QfD%Of4;uf^XR;;GKz%hHH1djAkh0__U@(y~n^yhEE$V&-ApOV*q|7wgyQ;XJZ}bgHvD#zPbKw1s4y!;WcJenyxY1si!hk8MkCO4-f-f zR(>$_SLqUVh^Vr6g?=d$x2nN+OJI0@h$wdfSyY#kP*?4>9C!D*J?a6+j|GEYIvPoQ?}=#bnBK&*kNitTJ3@4oF(mbFFYCW$?srD7WUoXD7Hx8pENw_D}9+W#P{G4g*V>;Fz|rZPsb|k_PprW!)nF5Z_oaA#6q`@X*O~rK@sf{abVVDRY_m&YF`#ix7}^1^6{Ri! zx%^CCu;T@Ai^Mb(yHLI7qI7C}C(b)sslIi}^58 z?anykX6-z1SU{hoXuT^ybSAmkZqmCns$SNNn={={VaEGA-WtlZZFZTT!ie=r!L!NV z>ZGP7m;a6x9}TBBK1CfZNqCL2!;Z zUnnc}xHdeF!7e2tp*%tsgsP}r6y6{Rxxd@#Y;wQ7FW_Q}S+2?@_h z%;fJ?S?&)yJNlP_$#PjQI4&NP<+2w$ zfzO%U+np7jrt%gaa|yR*7WX>e7JMR+!C>9l{d1=TpChpepEG_oyMGS@{n)TK*7cg6 zyYP~UZNaC^p@Gk(9x6^ZcL4yHF5cQwK+-g_J!&J>M~ z-IOpoc2gqfu1ScTYfx$hIo=^*f5hrBwpk4#s|PGptK33Kc7^Q;E8r;(eTX+hb+H4w z!p?F1gE6d%R^~^Cc8Cq zCcMw06haAGYk28|Mw?3xQFJqN&u@qr<_eQbK1}1!g>WYz5y?eYR)%wn&p27RV^1eX zSJ6~JvA9fr;q{D{a*JPf$<*Yz+_2d0XOI^@SJBi*@%;>|2fIC_r{ESJa;aSpkddai z`!XVB7l@2h@vRscS7DT}_%WA~S%MeoHyUa8TA+i^W#5a>H4)Qq$Z?&@HHTB4yN4q) zE$qBD5#e-PH?CZ2=vdyKyS$`#6y41f4Ty^$5es@Ngz;AqE;V$*qC>}uE`Hn<6VF{z zQ5`CYb;g@AVVo+KhaLS#GTiyHj+m$~JGD@h;b)RPMaqgW9A>1JjA|=am?gt?3dgyaJ znXCv9X`B~HH>!BaVnh%~!K&;PCQZEh9o8T3e&6_(j=Hy6)LC~qqb_lEzVsUm%q3;L zR4P|Q>~2PF#}_W`sC%2$YX5|kjBElfXQVskV0lwXfSWUu$*`=WE@?HbhrGACIxkIk z-1v@;x*3G%y}66RQ{HtmJ$p0U6@Hj&!n%g?>34S2y~|3^?7Tu=R}G`T6{EZd?gWHM`>FFWXL?UZ-Fp#8y5suGRNRGr_*xu^rmQGmuPya3y{ABat|S$n&=p0^r=Z?e|OG( zgvv?o%xk4C8zeC%#!bhQOu?OpQaKNwf^weKiGJre?=xYuj%tw zs=H(}W!zOp+*L;0RYu%ZM%-0K+*L;0RYu%FM%*DBm3fqKI+n z@!PsB=ExbSuXgCk_-*S9_!vNM!=tNR0?;etx9NK}@mq9XWWzj%{`UB7|HFX#0?URA z9Pn+QT@t_Ln*!Y60GEFD`uHvS0Lq3pIzZyHSI2L;NdTQLL;S6uy&`_g0s!8Im*>Cn zh6^AM^evx#Yy6gLgtptEP55jn#LqEM8D}kZ zlZgMqG>(NhT6mN+=MkR6eHYm@cT!`#p$LP&A<399 zGhx^Y2neS6dQy;U^gL0@{Hl^=)_fG2&4%!)wVc+gsT zy%Q_w?IARL(3BOk&Uu)tNQ29fh#qvHL$L4Gj zXY=EJzm?CObbrUb6t@N(j&-q5z_Jta+&yz?lRT$JIEI-oo?%#JX+q@;K&&f#>X% z!i2X*32l$X0q>Imdp6HA@Yw4F7ed0|2ZDJZN8@MsGHrd7p3)d7w3q+ww+p_10}4G>+nWKA49>(e~t_iq!Nb+VIyGmKNLJc$adt0g6YbQ zEk=fVtL|>1w7EA9sW72a7rY`EC~*X}M~~Qmp~*8jeH1n+R$7 z8dcrYJM}fO3Pi=1hECPf^nQ55Dfd}LV1Fl)%_0_-i-os37H)k9pI4+uSlg`|gVu_E{4GSr=3N!xU_J?TWUeN~&~piQ*SdlU zHJg@kb@gc133qo0XRftknbFaE)LLNpcI!{Ys{pcUlYNVq|12*BUR7zi9m~?&_5lsv zORgeGSCq+raXCfW7E*_#ONl)d-}VJL%rBxSTtiYe#BIY-oMXe{9tOMvu#wQLG(MTD zH@KwhjZb!8a16fo9t=vb9cb0W%pVAiPKGX*nF(eo5g-7dja$trz5IMOf&2j_)0{GR zz_96Q_XR6O4tLS73Ig4q$$zvm_|SR**kVv0bTt8eGr0+FAfm1vE}dx@Tf9!NRI6k+ zJ6}2`o#Y9$rE9HY9nlJn161R8_{=)7j3$I5EirN$6s((-RMPoLvE(*}kG&`nM4rG= z(}ImPL}&8Z#PUdeGx^Wx?J>uYRj)YFcw-tS*^#;^k5B<*1=mlEq`OTn)A>Qmhs}ct zNGgSDDMuAtJI%C9HNkaOQY)fZh44maCI_ExAmWKygioBT}D&FjJ7 ziwfp*O|CBrmJ*Z=Yd*JJ$jye#gZBM0d}rI4o!Wm`9(?X+)_H-!5FY%c(&X!D4xAP- z-r0Cn6C@1$SE9@V7S<(W-OiR!aGuM=?4kyO)8BB~qy7r*(MK_@D(+PH_ON$Ad(@4M zXwN!Z93qM)Dgt5Z%dTk8-|z)@6I~x+)qfSyM(#%dOncP16trhK(Ga;ANAm0^j!`

    k94h=sdAbw1F#E9yxl^ChUya>Z(p}B`)tWB&WMrt-U#9V}{>RW>wlu~XxM$)S+ zYv@L0tar&zizRztl~8o>X`&5whT+<&ZTcIHTCm}V%|BN70`Olyz{Skq41j*!#L=xo52xF8WCBT=6 z5ynK3hu2!Apfy(D2KU}kBuF(l3G&gO6btfBLm3fdM;ML-xt#EbApf4we^!vMqLC|M zYDAC^Za7CHTZsM>g1m=lO1Kf{96`5p62wSMcSaba1gQ>!4|$tLt_m@K zge!se;|8DldXXUeLqX>My;zXf8p?6^DdGmI1i3fD7$rz)WH}fT=pHbH87LdFs{kJKf2~N6 z8WttUQ~y>h$ln;sh#-F&h9g0Khwz9XzeeakE67*rBU@lz-DA}~sj63;SXB%b9F#yNsqmAEU!=)jc#yA(zv*Wd=<{A!UPyFx+! zf>pJf6=)b=W+)?qTo8sMLCz&SBFF|p=Lk}_H#o+15>Nro9lb{cTF}gLHatfJ`met{ zM>7ZE{Z9zAhSZdF7S1^W-5UzDgeW60N}v)?GcgkA)CgmgKqc~vLX1ke$#scZbJr%C zaD#^Y*|YcP1yQ%oV6);00{W-zlc$~6{4$Qvzuvm69Iv-7?ObP75&0!K=dYXPT&ATC zWMoR|k0bb`B7c_yYrAAGUd52b0zq+?$nCAOT^KMFEsTL_{6yd1Y@Ics|1uwW4T$C$$x^0pFSeO8z`ClWjq_jH#Rc7v&9#8Waq&Q=4(jY z^V66x=^~H6_3-r}{rIg{l4a}rO5$JZR<5^R45r=K(DfFt{b(#0>O?#9jg{dgheIyN z%rVd%hsPCU-R}J*hAr_G_c0e>KBS)D0PEk@_m_NewIe4j{u#&_=C&cJe{sQx)Jhjz zZVUS3K^wvNdP;N5?_*6E>tlnd@1z&MuPd7`ZDm(%F7%N{r5HiskjXk-S_+7_GD8$#>Ft5T%dB^^<=#nR#p}M=OVdU##KF^}E>P9m(?H zuZ${Q7r~s(-X$rFqh!@HFZi*6|0*md7r`~}ZVJ8*IDX&jZANL6WX%-utd2IrRwdQ| z@wvyf^md!X@_rTmm-su)AA1Ny$NJ(u$FE^3{bIc5RC?!0B7%6&zH69;>Io;e7zTJe z-gD#y@6LG7ppaP?4e$1lsxUOS0ORF&&yH)f=S$pC{<@<(&)IxB#tTztPOuB3Zn2zf z<2^4wE&cLDU=RYqX5a0Gum;s`h^op9eii|xxER)9)J4%V`MD)Xqc8Z{sAwuf##!@n z`E&`&y*+3l8pd1(c-AIrBN0`|la{bbLf;VupVbd9aV%vT8^T{q$9oQ^0l9}Pguqo8 zM~Aync6UwZ z={}M!eM&!E#iM4NNI&&r3`D*`Kn@45kvPMAAF-U`J=>J!(r2LfLcHfWDrT4qd`q8; z_dJ824;aA4LoX;BD=rrb<2^l!;j0F)dH^3e)W^?o!SKw(#-+& zl`54wW%m+?_p1oJe#@Az>ZACe(hrBIwYUS1o+?)MgSU-R_T4TRwdE}Y(fxvwo9;IS zKLs4W?{$=l^_Q}Lb^Vr3I~~X46dPraG#l7y^n8>uOV>w~d1>I3Jyhirk+ScTvcGJ~ z?z77=d{jCv-Bv4?4o5n!7M~w?^gWXil+$qDjO8k6 zPEsd8)+H)|@M*%dK5?-kv4v2YQw|T2@WG+gi6;QyA5P~dDSjJ4ilrhRBUO>eUbb;} zVwj#c+c`;8AYV!XzP`93vBT1$lIRo2YZEm9jL7Y#=E`@T%chSQa(zNnp0;E!Da%2$ z=mq=aL7`KjSK4$9M4-RN5)Ge#{_jLksc+rx}U(n%;nY7)`{Lt@uME_0NK%UL1PJRvP203pX)gv&z(Ae5D0-LG_}-za;8B7$#0>s8#5>l!%0^|$c8^<4X+NZXOSXaSx!bD5=hK93^pwENlG z)526Kjm%zTo*=0Bf&yDEMBhF!(;IW4AAt-G< zEf|~pl1*NB{z$Fc>n;mAtBFbVgY+4j)AXkc6yIX;M$NrAN$eIi;Z~^FdWeaa)y2Nx zIw_s1h4+rW#EE#q2UA1MBCDqnk6&!gViez-iGZ&%-+@^|u7=Zo=;+f%y->Zfn3zx9D- zW9yT9>;3L}KfP&^?%?k}5Zjl#0o3fKiJJOnliMMC)28;VF&>#OZ-3>@@mrU{eX6}H zhRr11VscA8x=173c2oTDM@GI^fXP>iSI;t?llbcPq+MSAYQAl-^QIuw#FYh#7stOm z1B&AQ*4cOp5oA?H`0yQZ-G{#i@7XZ1-ABHz=!=+xaH0;oAD7xo)ly|K)n&6nObzs5 zL}01%HegJhFY)r9tgZLA5R`od!JDxPr#)9h8lbO{45uox`JZ$_6g+)M=8{MaL>4_6 zPE`@JB#M!m5pGc!cUkD_lSc~QY_8Lz(*n8o6hmkSiREQtx`@$w39+|_pp@T7NYo91 zy#i&#oz1gx;Hx66?qHg3gPx7U-Q_cXJh_C(JHyCytb3diTjLO2dR|c>4PRtqO2 z2Ij0SJ1z!mL1GCFVhNlqh&h&-uJPo&bZjPnoi-@QrmmL88L2{DxgbqZ9qX$}XX;2A6>w=?l^}Ezt`NazphqXp zJp~no)7M~u%ORbxw6(%qLll{^A`YoDag0EQVDN?8+^`Y9=nK}Y%g|5_> zdU)_+2uEtY0=QJnY7@Ljq5VIiX)#C2bj>u%Di(s)ZV2pn6=iZNiZ+2~?FwN^le!F7 ztPzm%n4&I;8k0-5^xJDdK+(W~b!$LW+#RYdr)VN~5ENQE=dg7~L$hxJ@ zwJv-+E^e!9w%(}Dl&T;HJ|NaC5wz8rMwtZK>gFpm2;Mkfe27wW)NLTqx_M#r4cV~C zTjex135T`5Rg=iJYytAAKKg_+>Ty(ibxoa(UgsPVE*%Tlgp7Qhh^$Vmi#c*{vn;hnZDQwph@ErNim8f(tG8=vO|q=_W8Ix~wLV|n>%LUoWcR={KFi2NF1DRd z7JB(k)vG@z%~4$ch3aAUbTXwcf%ka;wo5x>{QGOhKh zYyx+EbHv8d>#H0eXTGiRRr%N2*w(IKG`=~_zrID2IiY9{BQm9L-05G1x`&>^C!= zu<@&hx$sPezPX7kMYZ{bf(sI}T#;2;R}-Y!E}2{XP_mh%Oh}kSjGpptvoc#AwKk51 zBI_;?La=TIO*Lu|MfR2OWs^nft!3-QFk@rs2p444!+k6Nknuo5#yE;q0V|1cm{Y!0 z!8hMpJj(eB{lO^rX`mYA-u%Z$IjzS=#<$rdIK0cPclo4;7SdXqX-&^6O#3AjT4^=g zmw?0T%=vq}P>SHsXNrUCYPGd9Lw*_VISbx3rZi_Lg{Hmz7Frrjv;i|Az*r>$cbNxp zt-vK@jqbV|$q0uE6}a4i8xW(u2ixuvEp0&0_4(&yd!HlM&@2G?w)cksCO&5x$gy1+ z25mFKE)_h?e1s(N5?X2#Mqt82(VAa5d-mOmg8=Nb0<|P!kmv<2I*I^eWrQJK!B`Yw zD1z`3g>hR#cUkBz58a#1bp(fn>Xw`#R5NsWqaKD>Ee!=yui~;dgjZQ|8dj0YFTMQN z|6CZd6^ZhVlS>;}YjpiTvJkLVVJ+$ZttBVb)lDI(kx}hWO3+Gytp$x*az>q)`oCz& z8P%I>NDF+cVd{1b6h^cMO|&Y#3us$=7r*LMMwAJaw0Om|wQm`T@5gHzgZe?W&*Ha@ z#19%^M+j&$<+OgTeNO?lx8QrC;Ooa{{b2jk1y~UJI`2>hZS6;*aHr_EnOa+47%frS zUkWh_72eja-8vz~x~aRLh(ufa=@6FgG%xZtTGq7@cu>o-pC}LCa_a1q09>EPP?nBa z3j^o-;$O8kYLkJ?tp>w}C+hv+T^!rgX_B`7Rzs$51#$1q@NLsH~z+<9*8&n|!w(N?gMhBX?jaPuh*%=TsP#tMAeM$nO1{8PvE6Mg|a zp8R$zDXHFXcNv8{R=VIF;vt^wT;qbB{T7VINt2+~F%@pVm9e%~x@bcsHT!ooonilB*$D{eUgOY;>5{~(bB0O{c&H5X5-YAH1wxXG zoyt7k9jD%nXlYzo2Nu5zogvC`iM&lN$-G!09(Jj8%N z*5e;FNF#epShfxa*Ag@@=FvkzijX})ZbM$%7L9=6&gIB@aNu!7U$h_3_idx^U-6YI zUS(yF{6H-S4mPkJ3yxeY9_G|)2ff+OL-qxG1#`R4zxiuheoBMLYV*RCqt=&FC`Z$O zILpqb?&FG1Hvey}MA@Uq#{wU6+5FGDfFKYQUi)3kM)LTu^3aIP(~cXh+w->uD-tBq zZIXS#=kS^oY(MO7_)HL{Zw|sNE@g1=Fw$Fv!?9)U^%{JJ4tGIGwWp6q$ zOV|B$KL4h_Ac2SeaFTUf$s`9n|MC!6OD}O{4T0#s3yp1-4!>&KPhP;T|5d5@H@3E) zjHUhl_%|>%;Tuf#{!1ypCzZcudwu?+Px#yF^Vi*z%3t>aAM;IjrdKqj{k?eQOYIKQ z{=WKH*X|(I-ajVo@9gd$)2^GnU1`5BMA{wbJYbWBQ`~+~LcStL(tPPw%E05x{S)iU z`ciFYbXM_Mp6MS<`^O5Yd9Js;zZ{ako(i%qqyDbm-}IvQlT`O`X@;k1UeZz8(Os$b zL$UhmKB&cY4VXg(8vA*?3)4k1??hjAx-LztbC}83((SjoYhnCj{Izt^Sw7A-^WmMO z`AQQT24UE}xT*TO(9|SLF>)2NvJj(|tQfh9 zSyPBn<5rAZ#oSehsSRV~Dux1CS+Ii$W8^BPuMpE5#>iDne<7wNjFC&s-wzVQyUT}H zBw8)Tx!Eg*zLGoOXn3>JnUK%ZD?@BYIzhhlhUhaUO+Ux+0uZA6*gNMtS^MVjcox4=#IpM;#H_HK>`8WR+!W z#+^p}D5vgW#=;U$hUF?R;^-(NbC|ub6lqu`R_X#@h%jVDST54B7F=*$n4~!>lw@dS zXmuWU*#`<(IvIU3yvupqR~L-Yl?HkI(XgDW?1rT==jf@_kH2Vqh_3i>IUc>cP~*Z> zH`HXVt1}i?H!Z7Q@%&9ov-ySe?>E+3mw(94x8dD|bj0ZWmAaa*cEJe!td4&lonlLm zOYi&YWOZlX6_2=IU4t7>{;<`Y`&5=xd(THQZN2JkGw;_I!z7=hIH_c`=` zmiTmJt$Nc$Zw+B7Y`=^Dp2E7)T0vO0pMwtm?-H;rG#%HsbXk~=#D%}oXW>mm;f9L-c1O$Hq=5jc*_jb#@$%G3hJ0^ zh~r5%&ZG20LAB+Hep|$g7lgA4aX`JT4OHn z;lJD*y{gT8YzbE+F8^=?%+zdOwu<^04F!R~bBplU2>Yg9piG(^| zuX>?|nF>w$qELPeN&zxckZ(GODcVqwoE+BnzTnLtj#P(Crw`_DI(y=g=`UzosHOYN zCDVI?SIUJu6nx_<){4Ve1H;XUUDJm(^Q=NP-NTolbk&|&s+fP>RM`MsU|81y*C zhgDe^>L`55zY>M}rXS;KrZ$KStlt(P#=Nc6H1mE&)1{Yw!{NU3JGiNM@|&%O%ebA2 zAB_X}mz4l;|80$PRg@zt{t5C0}41=FENu*Sn&Beb%h>l%~cW|oG z5JBS_2uiP|9+_;SLN+&l$?BetU?})Ch(>{Sa3HuI3YLuSWgvJEG`oCkE%a~V#)f5Z zAozfV)Pc}`f;txpr~a1{DzyB{x2xHN-N3~JGbr&L?&Hy!`7%WDuUVVBThSn?*9OE^6Fd{0DlD8L$A zeW9nt+_m8=3fQq)*nRC%5?E>YtL%QT&BLIq94c^?z6w_#ppreGM$NknpN$6vG~jqX zbz%XFiN31`W*Es@hwr zRd;pT=SeqO_4)hrjT5?u`J(Es`1*@p-#+x(_-)^wO3!xiw7-vUH1SPRS(55;irvE) zj!7^qaq9iv6Z=#CL;gd+UIJ#HDy1`%v6;9|RX?1ne$;=A?{1|0ho^5!P45Boq{Z~5 ztAC%aK9Q;>)@}02RTj!hYUyvZ+aC3P4?dAg`@M?0+0s9h2KqF4rTydZz^AQwvtkkC zPZK?TlVZgZJSvTF-q>Rn5y0l zJu#K4-kt`rCGGD@`P)I)%O1*1Tq)V=#1V*+Q>uEGLSiT7-=BuNWin@lu9!*tZt^Wx zIf}_rTqsV&sju!%``a-k6THJnr>b|R{jG2UtJM$6ELEF`ieG8;ZnyMl2NLDV6;LPQ$XYyBx<~p++ zOjSP!FRAK1gvD#xKa{e}F0#OGNrC)mFYs6WK=mUjdj4EzFFSxE1n6IqiRBv}BQ45wN?*@k2`X^KVk?P%)!$0nF*WDnOyQtOs4^o0h z$yZsBVYzce1}X_0s$ChTs<);6O{%oJi~`9XQz0F`5W%k$zT?Yk=%BtrvCiQ?A}u(m zGPxweCCN-BiOMj2lT{BHfj7}4u>r? zuot`vcC)Yphu!C}g$DMbbFfi~B?elOSfE5lT%tWLk;5LS-Z_0+HB#A%BJCvxI{iX$ zX>~HE`;oY{yqmd%5vN6&u~`Vla(U-s`ZL=K`VP)!o^J06!SnUGy z4SkIZG^-#+ZLI?=hy|ejh(KLFeW|Qb*Wu6KB7*5;7aN)smbFQ~O%SGuE&irdzEy!4 za}%?$RZh>~AfOPvEDd(8lHJSzF)RO%VY20^wk}JA6#xmn`s6mXISHYy+aj_Y=R0qG za%X-1p9B;t7c1r`=BC=V2++3GaH+_)Uis>iM`mC#+}2~@Wr_Lq{xkN`94vB8D5Ra2 z>VAG&z5hae@)b2B$@QxIx+^&exg_Nu)rT_9##7x#r`5+!tA{&6`PrG#_hbY=!ZFn| z^pF8y|7Csf1%tKcr^SxaMxPe!cWqA@?C7-E89M8JU}^tJ`x+0JFHDQQnD!sF55ZWF zzWxd2An*%B+Xo%a#x?frRZ?v|r((y`{zLZc=Gi!aS>S1?)dT_kJ&B|KZjaGLa-)?pxvE!Xgq2Q=XG?}wG;dLLH7VGne3jvgCqamCGeB6l=*ge1) zC}Y0|pZa;iN_Tg7nK70Bx^e>TZY9nCN};s>`x$rJFrzQJXfBrWPvCnRUtTZyU84PY z^MJPoC?5#Qw<}@>!=u8>60>Hwm)&Qqa$P)fPXkiFJ0tA8aa~7?(kdrSE;OWS2-Q$r zf*WZn(V8@*SO!`?^tn(PKL1@~9IQ!7JY#iY3*giUSR+4B^^&Rl`UqL$J4H}$ zn9AQ5K{Yf}5cPWX`5zi|##-yO>iuU!^-oce_5RE08GLR6JTzVhf@pjYX?%djZ%O%k zo&K8YLl@PzBgS*ppQuRv)3KgT=fpAl-h zv{-PSW#bIDK6WN{Qg^2+^p%MYq_4@l=511A9G3IJ+Oy+Wdvb4w0INzjnaAVi&`P+H zgdXz+wkytX2M6`X<3@V$SS}l6saxj}8Cg|#?FIpvZs;NMPghFfXX=kIh>81;ar0Z&wN+R#O~ zskTk7U97ToLTUtiwP^4aT_NS~ifF76^lqEtr}Fni(6xfH&1|?oil9Fdbe+3;m|qh? z*8xq_3@bsd&pTwWW)e*MLDSJ3&6<;E# z|GYKLaKvIziycw3U1V{8Fk&qL95q=Rv0S^2T2FxTS_`IuHiK#kOUq?Qx85F=oiDJJfdtxYR-OPN5POHOFLytWsk zA{Gk#sRy!-BzQL*tEt}wc}*zPX{o(-;TE;+7C5DC3sc=yINA$Q-RKOaZ6JgLY&d6A z`|A)?Bd;}l(N|}w?qQk5Y|?1B+>+kmS`DM1FqkRU5_L0C^SqAtDAA?zhk zpD!feV;QWnIdf4Pe*!RV{7&WN=7H)LR$11CCf_e4rV$1$H2J3m<;={Wg(e>ex-PL6 zX#Gf&KLS)u{znEbH2HM|U$x2ifj`pZDdI}yqHjEErg?6YKcYxA`RAvN4B4*9h7CV3 zj6Z1jPXmq`{vREyp8&~}sJO{*wCQWu*?WV)gTGu0WBLrewgkh%~>Dc|@^idiy-Y?VOp1jv;r8F{9EdMrorY4wL+wqa^(<3C5B@ zUErwdE1KCkp!7sZf`62LI+LvHt`x6!;`9Ze3{YXjl`jhi6?dPma+A$1sH2I|26Djc?i*v>>vvblI37ZN?Z^y!!imPQ>@wekGE4mRxaH;ua{p58t10aiQV`Biwo{zpzQ{||N#!G*uxZ}BVuT-Xd7&^}}p{?oNcVu2akFDWvs_wx6)!V5j9DYfd<%iqx@MMXy>>keu#_H5tQs&@)1pe-xZ3cFaNr?M-QAsy}-=;&O( zR%R;w1USI|Q0sz3#pz)GUx}yvV(ZMjRx%Nc2M3F23TUIJ0BU4}>= z=0e(BDB=dc8Vc2JAh?+t3$0iF6=bCL251wC&TSNlx=f_)PT<|PM$9Ry@vB6V{e zPw{IX*aLs)o|?(1W#QUs@Q#fWN<6+Vljn$>L|MLB#{t1TXJ!hX8e%w*lRRxba;E}+3AaGlUF3edM)?*uAig(?ITeDPf- z9@Lcw3jmAq(}l%|wesHk9Snxq^By;m=aIfP}3LxyH) z32HfkKytj^)Us^O(gw?B%OOh!XB(WA$Z~u-S2EFZ02O|p&)VnQ3qHNi_x--__xE2t zkKD7@p4VP`t+m%)dvCZJSa0PSkL@DSpHugzJ3X)Gu_{@pWNzWN@q0TKI3P~eSf`DL zScKUk?6+F2F2ra5PXo9IZ-4 zjWB82vvGi!-Fk*-BW8}NE*V??tcBD^1&58-jYoe@M9I*gq&(zfX9gjYJa7*B5uMeE zXZt|8H6jQf{36uN%u1#V=+sym;Z0NSO;AM`J3JAhL+-fKx@c8klwzK zhx%3L=#6p;oSg3Mp2o!w({22mQB!icnamulCy>#BM;eKyZa>>|Vz4gqDFTF2i^)Jo zjYk5N&q}14fXN7At;*?;bJ3nVrvVD^^o>JmPAK8)cnXX)@!Qeul6~QYVBjk|&WGd&K?+H=|QlEc$14qUtA!o~rP{1deuHN!Z!)Fd*#W3%=1!p?EOOk2y@N3U>t z7O@IrXGtwmN2|}rDG!zn_=P*gEX475209|1OBwiOx(^UfcO}Y3gxi_n_m(3}_^0?q z^E2?nYZlRiI8J_o8A!(LiFhi~d#FAsAOI>&L^l@{j_fA^z%n8N9_0}ca&_byKpbPy z6edDbVo^kZd*f!sN7PLbjGqCk<2d(gn-%uVttuQ-$k~y0Q@0=CpxSMheQ816-C3nJ z+)IQu#9G6|Wm7pwnFN=_wNtWDVg?-y(s5K-#PIBSkSIW0gR=3=1FelBdu>m-dMzB77z+s2s?>^oum(mn1Tue(N)g^Ge-~t zFt@}bNxZL^U;w#);Si{mG*qDGMP#1m%mTs$x>VWiJg=D0W&%}SM?PRUfH0kmK&hV3 z&4dwztr5M!v%!Q>HE+97HflW|n6N0qaBse}=xqXNETJV6Jt8l~p$gObK_ep;ww`%B z9I2mH_71G*(IJj5Y@uB>+kPF}0xKg}?B8tAu?6}CF?1rMG72aggzX?*b$rH7HlN0V zHKKCC6fngGACdx1?V-UIkP2&uAVc4Wbk^1#b|-M{9-@dnn6t%5N;8PLTR~LAgTXR~ z*!Jifd@84d5Mw&~bru@N(YWgkI$Bqb%nG?n0q>cL30zyO>i3_|5x16|WNhY+{I zEV@QZ=LvLS$^YKslzEl}Ah1oW_^1$hhf6|;n&1q$*8)MEjU z0!Z>E>~k~WNy0$hgl#Zk24Ns?!aguzzZ0gOg^2gOO`woBlAsM_CVxZTwDw;|-bn8w z?*#ol4yNqE$;LBAO>Li=)-?SSj-X}SBe8?F_gWUQvq-M#n`AIS#+tsC{K~%@t=aa; z_O3L>SC$oZ>HT_NY3znxTLQEj;1brD%@_(T11bq=POwzVC==AwV0YSkD z`h1QFDElWAJW10Rap0hwSeuWS{vhtdnl4OO_Yt>A$C^H$9|KBHk0#6QJODPbWn64fKp?hu_Ja65RJ= zA8$vzCxX!-*w=86iW0t^CJDMG*x;KqKO4n*0+}Qfms;A+BzUB@JtELnskNO?%GBB};|OSN7jazZV%Sy7 z+`^PJji#!jqXjDGTB0tY?R<`IWWAip*;C%t4I@P;8jUz(?+Rd(^dId`xgt? z#*bimg9pvTeogkD4|KZ5N$16Pfc!btK+B3A>-Tad0=#b(Ga^6dwzehW+v=p2>xj zU{($LV&-e&y2JfSlOzxJjPPr0K1wYR zm#0$ggYt}`elk7*P+rI)Fo}@Y0fBxRi%TxEZPW~)%yvt|9V9t-U7+@_lu|%a>@O6= z6z5!YXK!8!J>UL9;cfen>Dk}GKcTd9nzPVI$JkOnrpTATIiXyhXY$yb&Zr0b59kl@ z1l`kTGEo*1=y~sDAf3ce;{d=?$XAP|!xYPrf)VVfQS%cV&w?&(L#;~V&UqF`E!pG@ z#KW)r+}y?xs+;*Box|Objm?+F(mN^w&EQHSFwT*Gv^H*yG`_(7pMG_n>jdiTIW8$v zc`j~PjG~N*m&#>Xv>df;pmJp-n-F$*LqHH9eE^{qf~JOQ=Fi3M*CL2NJ~SV>=L%Ll zjo8^^xA$LA z9!>k~rNjQQ*0=7daE!h9cjKLaZ2xb^d*2s0cUK=`{t|Yv)Bvi*qJIcKWsQf4a?O}H#<ay&Un~{{Z|%RzO?t%jytv6YPb^vmM)U76Nii+umSRWN=Ey?tt6seF z>i_S$^OKj!)37&)#?f;uMH=}l_Y3rciTajA9*e{w1vG_IW$q3sKJ6AvUFNJdb=Caf z(!Uf<7t5rWvLX$K%9g&vc;ow07-nFwcI4!xMJ8mQ%pDQ&1P`uHF|uB%iOB^EHLP8D z)&Q0!qx8p8+%BBnfHN)Jn1{SEc_rBz-#7vvXuRZoIpA+N_cB=;&X+;zXxu}EusO!L z+(E@`qGLoVx|U%73XfhNGny#)d$dx8YwLJ;2<^qt7}xelSsn{Wc5D~|v}f~1TMV&Y8*p6#Fq~7I*59zdT$9E{)BubdnLkM1+xYqpxbgdL0XEjwb(J1sgQdv0 zBwbH$#P5<_92U@8IH&;^Aru)!fXFqxCEoFitL#_Ft=I>RR}k%MLz3ZsscIXpVURJF z9jdh_ zs-m{49qfRNg%Qh;D8pDE%W;tnk_O=T=4VZQx@)~QL-tCr!^1t2Z-H~6^fF^?AwP?Z zMdCoR$2K_fKq7Yi9}KJAi5MAK_fITi;yETi>)3Sl=|G$Tx8BGA{2Zg-w1l=V&LR z_6v=aHk0XHZntDl?!TA=6ci*(3PP09sPn1>+ib0W&v>Ck5ZvnLY(4 z=6S`*=*dmAssz$T+3w@^;Izso0Fl zB@E3dloaWWWIA)q$NW)V={<+}$fq({J-N`QGN?ty3#vTacRj3|)v+RDu7Yl4j^&b4 zrdz54zvC;q4vMx|4yoA~j}g%HZPZd}k#KotkrOJOBrNO{hRc_I`x){YFeaKq+iGkX zSu$@j$v2uxxYnBV#-i&0e2$d9e*?(dqc*T`x4i>~KX9G%#-u!w{W)V?8GeONPefG~ z#))kX6tInLngHXCrBx?;2nd=@{tjZ=hw-m*p(ndERVdA#{fR^Z8GuS(A21_cM8w~r z_8v2S8sddH`tjSsjCxSYBn6wtU~8KZz05MJAfNn=jl5Ixm?&if&zpG~NS-tb5?}0D z?jSq?jtSH#{yyaQa>$OOvX67lxEN{K<(cquN8jM!{5KMEofEmXIR1>iTZuY=iRNdxtqRN0kZQ=n8Ro&iX-1EKIZQvN*N(U7&- zQGNdp@et-%2a zU0pQe;@CY?xjaiH6)c<>cm-KVlSwIxipS$(3Y2XXg;|MLjad3Z3*>U@ z-#hcKHFJ8hYq8I`Yr&xhM!?Qf6-ukv2u_k9r@jqk4{_#KGD{t1Aw0yXZv{NrnO{M8 zZ3`YoL?_~)2?2@vS>{X7D@+3tYSC;s2qoUG$_@szhtsy%VcVjNN_g3#nZvfN>eh|R zcHCjx>Y(*aeAP95KU0}SI&840NqID3hU*6yN7G`2!&a`Uz#U?M!7Lc*u$@=c;1LRf zW<^9fY(J^W^nJ)5t*QW1#lY-ydO~YDV8BBfjb5)(J(+D+Cn9MnR}^O1`Z9lmUSLPA z8m28z(Tt1PEdxE7X)O3ae@|#PC)(hm4SA1Q0*|W3kzwJ%BqtnTT{fJk#UUDXvI}UB z=Ni-#YIB14UA6*>W|?VwR85JVq^>B!LFK_68sR_@s)fL^11DR|WJuzYBts&C{zDoV z=Y&&-{D(9{%rqExy5FDT{KH)-zFJ*2LnAab|lB_076D&mDQOZt7Vnh zr+2|AVrN#KP0Px+xrZzbckDZ!l^^P;yIaeRt90ZWL5bZ8(szT;r*iqBjo{VpxV1>j z4PdS;FFM3DyVF;f{A9^Hk%wezD{w0+esRmzWM?$~3<7uK!)fNVkmqgo)`7Sjc(N7_ z9uOoBUu0~t!T=z%f+ab9zL2qam%0ow99(EpL=^cE{vU4xbELctRDD!EMgdzC3xio! z_zKv7Nj=!dhJ)vnQ%#W@zxiNMPwvN8@h){!G#ZL~7Q=a$VxgPOtJo}jFBpgmR+S({ z9xhZ=SLuth8XyI@s~B9;%R=`{Zs|*c4g3sD&uler36LkZ3fO*WylTeori$EIt4W<^ zzrjRdg|;1*Mxbz%m54iAG7XMBTDQ}wc%y^SSenak&7=5w)=?V_pjp(wOnu2m--XMBz9)b>C*MZl z%#R5W+7S^#Ig>|=$c_ee$C5;W8wxKR_Yt`+_%Gfi0~>|$(f2`0hgxrlt!R@{#~jxR%1=x1s-YISN~!G0HpTf4Aqx`7PWII|YZQH8DxeTh z1{wufW{n_d0fh){2x+NG(WMaIgCfO65Z3jO7uqVNv1h4Ns0ibKNfTAZ^nXSYK8pHZ zkc7;wY9tX?{r&dj*haEdde=|IoQdTN#z7m5Ct zs2}4foBATIS@*1NC<&0K(B4`Lp$Q4)^z&>K@_{=Dtb1ftPR|;}0tSV`DySf@nUFB} zcoCB5u^`}eCPXm?cvs-nQk7<5h|s~H2)yX1%28>!kcT3*+dU}qdNA~;L+(LQO1)az zge{gAvcQhu*rBwmr8g1GLc*nxPS+QLWx)aWpsrNl5CIZp;+hlTMQ`J%} zBntgq>4a=RL5RzCTB32KD@V^#Bc*fky4F?KVj)GkR#T(Y`q%H6jFoFj%*9Pgt2-G} zoDj3u<>~x0?k>eLLc6pl21mEP&nm-XcyD6CXX#s7R{7ob`5r)cSS+i+=CtiA>FBqZ zJN6xQW)^#Z!_R%h^&sf*upIo zipZ+4r^QN#G>`Kn))AT>|0T=^TW!wPS2cI+SI+#a;Vk=^3Fv}@-X%M#p)S>0nlg?Y7cOd-E^1xNTqll@_?-`0#DpfwvSt z-U`8&CMSsd;m~OE+F0K03Rohv z1L0bXr%EB5nJ>;7fAC`wuPz(5xp(n1H-tRIpUu=YaowzrqNzvmvNL`G(U#ULY^3W3K2RH!%z!o-TH>NMzY8?k=PO6DEuxsSt@p&@`*7Vjh zQc&vgum$8cQd39Zds0~T8jrw2!U`a(JdR55>zJ?@5N`~AfwLMwO?iO5HDt)-Ui9HC zj|(B!W{_wrk3-8elsUNd!+S|IXIz_^GIh1v@nhZ7s$Lox;@JC5Niy)MgzwVpqPWFYk@>C z?|Wtcay_CtavUnEjzfiS9Qtt_DjY1H3Ux80D(jluPrPUy(WZ96b_ycQuA^BN>meyB z3@ZAACIQN3?}0S4^OiorjuA=33u+XywveFo3Mdai5zF)s#QzI){G0xiicSJ)7uo6V%LM7y3pTl4p6ZaDaub2#zBd!&cra8epL_g85v45E*`j!tncl^>7X* z5?|zz$8&_8Adtkih$|*o0Ur>Mr*zPOR;%5hUE~0sXsnA++BH%nn^Zdqt|(ka!Imt~ z04Tiv>?gl1T%2Nrz-N$5@eObXE&_`8i&|KL3(qYfgd~L)KS6?@rON=COJJ}h% z=YF+t<`SMfv-mq`qDl)zCrwO?S+bvJwP_Zt*p0-6<{Cwei9`suJ7v`*Y?BD!JVQec z3IcpqMJlwgDhkyx1D7HHdxIi&-2cZ0#UH9#0bv+)=z%aO8dagDEpZD77q&#d`O#-+ zgd$8sWAgQeMp>2r9}J2xELqk-5K%R~R%w~a!sxRrDvP3}%~m%mn#v+fiGIuCf7_@? zgQBU$!j=eU0NCnaLHq;i*Li)Psnq^=Y>O}8;EQhojn%bTsFH`%aMbVtG|0|RRAFEa_}-knOS|zh!fkwj;c^Qochzl+)!*;nE|~UhAh(3*D&d4R zn*I;ahv~($oNzwMfrDW9G|uJGhY6DlH}{qqU#zW#SnM~SGY(gac*P&F2@$dj>owNM zr`+1TN+p-f@PClx@SebZ;{N10{^UK|B}3NK}98<$3ae8AUHaO0QWe?$$`jgEnR{Gz9Y# z8zqp>xDpm&#RQO!ouR5v84Y>5zbRl>&3Yv@TL~CX*{GVKTOv$Bt->^4sRl|Bkkcqf z9lCF7v#=#L)74TkHBhAR>8mQKC?t}REuxwLt;I~p<7*1(D3_?RqQRYH^<*A7TPS|% zisf_ZrNY>AC;nkwH-!P3i8q+w^v$t=H_TCqt#a!b4ox7p8bK7o+?=i3N@OACBND4o zB^GIwSY7e+(Elbw#Yt%Ny2^stxAUw%s_j2#{!YSxp&=or82>v1M<;A3#Z+o;0MF=u zP?PAYx#I%4%^Zhv@w^UUaexJhrHvs6Lc!aha-%GC4}t)I5Pl@%17@Xoc)7Xb!uXMj z4`^R-3&2M>KW5+qt`*r48OV)qc;P4~bbLqgd$EE;#4E=(z&nYnu{wC|z%E@@9yW5} zVuX}vM+AQO8)E*3@t1pnQS>K);uA!lh_3Dchy9b?*m{KV54(}4=3uU67-WQ>eqgrs16QzTP8X6Gx`}sUse$n{XDVl>0grU)UWB4h=7$7 zh3S6+7UHn|;LBg!H8Umz?L!Y70e@?NnAF` zL~OfMCcGh{?@-yU4fM?F4F9Rs%E=$PS9GFY!OJtFn3svrRr4gg?QEhAms!E(CsDta zpjQ$BE?emUPp3%jn?K`|Kb%mo#l7TX_-9D9r(F|_=L%-Dgl>Tb{tksv+cN zYN8Gz_bJzeqfZu0x($k=1^P|fxVX!~kC_bH&$96x?zH^{)9MCi@qo=}4^G_u%bEW> zhH@XA!JM|A9TN_FTkf0%59M%fTf?@9$kvE~`E`%WR*WPG`Uyf^`iTU6Kgt3K%N~@F zpdXhA+X;;h0wt)6M?T)$+JnmZ0!(Kdtu!_g)zskktX#(Ih&~YXPD}R*&m5jHK*~u%= zkrHt~U>IWS)KF%ja$#=vi9h@q6e0?5~E`H3z}OuiBfS@5TOqkQ?`=p)8glcbwsy zD>b&vY%-gWM=;;f!r{ci%&j+k{oW8q>no1TZQb7sxs9EHw!n%wd)SmYSn8_RCi{C< z*L?Qg=YL`0n^}===x3NH5wGI4#vzPt>sQWbjBSPl&IW=Dovp9nu={o-#twx{$jjl_ z?5NY^=gwKYYmi5VocdLg{#B$u>f8w489>V?0&qi@X?G12bDEB^Jd*^f$F_jJ7wb4= zxPa-_Du8i^rH%@jMP^KziuswjKnWmXiAcm8;Yeb|hl0JBZMX5XNq!mJg~cN!&!KOp z*UIH^oPP|%76KM;Y79?l`d==PO<26`j|Ba9S516!u9M@d9vn~LBW&pb`qs>UajrUT z@WMpep@CS&qq=>{_|IwU zQ5FtvR$oPM3af}vMhx(T+EoN6u!;y{1O^EvQ~X5{%?NPX_JF&G078>TPk>?gXSy<# z2y?XzE#3*24ox2#$we{z7}yDz@C)=|n0X8wmq0WFaH@bwU+>e2rv!j?zi_29MD_PK zl7TWlbVc35-g=`b8+e#XsdD&O7(wxjkEP;AijUU>&Epg7XEC|Xp20uZXwU8?Um zA&c>I5&!ZCE5^r3e!#?X76x{jj730W&N38@P!NQl2t5KQzbT!=(ISz~6y748DYr#B zQ(lX7ro0yEOnEKRnerOaS;=dNW+kshE@z-T#EM)tWppP?3Re-zFCiJK7hy~_;(azl z31N6Wq9=29^OyvVAK?l%H}vB<+bLL;lO|bT5;*xzzKW9U!oa40-yf%gV=BOq+uQL2 ztvw$<=M!z%76aq8fASMK#8Id1JEZ=}W!nNzQ+yGrb1+{|G8Mw0fo%@k_e_h);dR-z z^0O53obfj9HOx8eu>FV`&z#$_l1c=Lz%_>4{Rb=}bR32fPLFkij&ogJkRP^Ki@+09 z0Q%{iJ>Y2IWt0(48^&}FDUs){rX=d$gQ=h;1(cCabOs%p0V&Ozsa5Q(BBO0yHew5f zvwKZM2GEFmYb5u1XZ~3b_=QB&J5e8xHfQi6_IVPOu+{eq1 z5J6!M+gVtKz~zztEYpM2IP}Y#$OdE}ZI=+g&XnH;zJ$m!q1J2fbs)bS* zbB4keN);>K&f;2w-O+f(^sw(z*dno#wNOEQi77J&cw$>4l0q_(FGgWJOuo-+Rh7hr zWq?c*93C2vbZn6~NAADBcLaz_(Hn3o8`8G{HPB zlPid14WSec!Qlm%3ON?>Hc0Plu9^buLg}n;O|%_Ra+KPp?Lvb7IOOOxG~cH-9<_XRu7ZuQv!73&cF?4AU&paWzFa`0*km_-8B;uHgkUouQ z_+niF0;6tWR?v0k2{ofwA&B-0`b=>ye@DVGi-2OBvQ_|~pG^vGiidne3=a^2DzbK< zClJzmM4 zQm-5DzAsRExI4j}6zBr`(BP|cAJ9*tA}~mRaOt@Zn74qz0>rl2eL%Sd3=tqy;QQ$G zW@Zl+U?_mVumubgU>JaOe=}1y6Cn1Ea7&&K7%o7lzxUA*&P*90zz6^%{lG{8LaVtC z*tSwe2`~ykVA=vk3ozP!AD!dKe>8VeCom)&BH+m3@gjJ0h|xm0Fs%EfJgxV!4@D& z06?wE|;ixpU&LEAmH)XpCuFLxE2U;C^rwI2G(Q5IrhZL8H zh(!GoS8Z4yLDEp4+>_`DZRnzKPsDOu+}5~S0XViHXgw+sHv*u~STQ+mdyzymN!EyG zLWnX{je{IeBZ(PoPSSx50_i+e)ADfO4^x!W*m8A)u?r91V5xV3@p@|=8YM1(65S5Q zm218^EIHK_E-b zg$@QagZ08Kno5>?FebckVm}>ADol7uRYNFvFebX0%1^#13-~p`7UfE2kvFVDXm+qj z8btW1l>y1Q-Q6GOIQ#*e;P3}ABop*bbuTj-F`{mL_)G>?+Qe7J<7Q4$b!O;-oTP>&%TKfSOvxbWdRdG zC%B^|9OoX>p!n)LjeFtw&u9k^B!=?@E-`>DZ=*NNfY6k=_~UXW2~kVsdt5{^xTMpz z1<(;#S*O4O$b~C`5F7$scqK7P*30W{aN&T{b^uwqYNw{W8o$U&+ZdM%H0-UzFY?1S ziok0KfB~}rKK7J{pf~`qjO7U6WSFeC4KUn8&^E{6^pOLvCEKXyb8(>Za^Yk90sWd} zs?uEj>|g_A$$}F#R3dljdsz`rDB)%{@Hc+rPKNF3s}M`-G$$A0l=oN>B80>{VDL=jWSo<|R>sCZZ?qnVD- zqy+5g+u-SZR9PPLP(0!AZMhuYiUJCDA7<+cqXgi|!iqq%dTA@_naUV3LP56?ssz<# zq)ky!$cxfelvLnlSdb%PoQl9`mMV9bo~_g>sT7f^jO2nJ!UXTNsicQhXo`w6Luo3M zr{ZR)&~_D?rSc)f9mEWb3I!o_QK#*oVhMa6g=A*WInA@pAUd)=wP7rL5}&ww6n}BV z*A8BRSt^W?{KMYR5n^wc1RkNN+M)N3Hs1JHos>79u3v=UVyv6URjbQG>*c;w#Z#WvoPXJTWqDwZ?P8Y{ZNm)HOS8b++6nGX6KV(uSxPyTA z7}Eik4uIf{dT4}qI#ey;|Lz*OHvAinKlw&Tu2zG;VYymO=*zhpwdUN>wd`wq)y~yw z<00@mxmq2l%(+?+|BkMUn0mQdJ;c<{)#|%@1?OtP{5$#v#5Bm&8X(4=tJ&SXP<9Ca zj&6vUM!8xe#N3#x-3Z+|R}1Ce(Tx#vQ?7OsVw&V?O`tyKYGM34`ewx3lB?Z<=!?ylgno-QRKZz^bWo0&4toKT&KX!W;kgz_$mxlM zp({DsXZ}7E983dWn|g=O1rjZ>aIw zd}jpyXyIDj-LMMoF}Pi7H6MFHXX9hekV{yGKrkLkdTdGY zu2jlnW7im5XOmNm`;0M_IX@@5N}$OV865}6FMJ1$JJqKHpUtdK@L$7@fO*l%O)k$g z9EpaFtqfNT8MSV&6@aUcV&GQ5vbrR)EUz)3e+jNsF`xlDs`DTJeJXI}%3W5%D=Ts? zpnVQ^ZHRbyPT{T(7~m@x(`yB12;M~mFKFPR3Q;b1pHzva%L=0BJKV!kV^s^b z#hyI{JO?0nXz`Y#=S}DXfT9Mu7YPx^jEQ~WJEU)6j%{cFLDSJ7-sskq{->0zTddkq zCrntCi|N$D9Kk3J449Zj@P&eeoHON!h5`DqtCTdK9X=73T86b|=#CZ8SBj-E7 zUS8*FjGb6osTbs*4$CU9nO?6|C9dYqx}28QTHS8HfokFU5d5*Wj$ED_J{<)W{=-qF z>e4mitrT8j^ElE->M9B6BcWtAW;1m?shg4vJ4RLa%RrA{KDZPJo_*M?&N_+<@_x*^ zTqCWvmUTHW9jEN!-sLsIcCj026C62}_U!sN_vOgiC?p&J1S7b$PJqTYMld!o!e2*9 zRhm^g5{_EyQjri?*zgv9RU;3NEXCU>UU2^EX}W| znRTTG@4oZ&vAH}$y4ald1gKlvq)DSux1+n-2Di_zhZd2{(MGDuXyakVLpU;MH0AhO zfnWOh15hiCAF6~!*EBW~0xhE}2*R9`W@e5#yfBo%ql?P}uhD!nF@@C-YRqksbtN!u zAStZxQcj@s-d4R1cLL@-_L0W%vJmQ8Vpzu(n0~x+v6?b=xwC-Ou1oH;S{Ze0;}>&J zS-)VsGrOeHlccb-TVA9uaJ1fHpZ5{E=m3pp|AY_Tjqe#~i@{Q8i_Mt#Cf;3u`J4^< zDi^(aiE9Di)6vaHpOJOq8k%d*zKndXZr9QuvD)g=&l+`PPLvrf`j%9Bn}C}9>vc8o z-Woz;@zu!H_7I1A916t9RvB*Z2+-snESESRv~|c7;E%0BF8L!s?i-QVYKk!z)ZyKW zoU#YvZI8)qxDz-)xDg4($QV6?58U)1R6l-kmGYiIc~*O>lHYK)XBJB36puFg&H5YE zZne+554AaRE~Yhfc!E2?&lPC3T`;2F09Kigs5M5;H}UFS2ZW&8UN85F{OGz~9)PW^ zkp7+1Nk#aQ*>8E{81Bu{Dsutu3dM*g*$T2^HZ?2W`b#-71Fa5gNi+u0oU z_ySkA?e?6zQ3CIMaR7V3<3)RRM^1Fm%4tFHIpcE-KKUCbgYk|(kYv0h0c!rF{g2re zE(fq6i6{LThvy+Dqn>9aY?*QDX$YQfhJ6vQqQ?C`Y@0oMDdRn^4mNS^Vt(*c<7F#5 zFSw>_@%vWh762e;?euO)=Y#;l@;X^o=F)$eE6}j52}Msz=I^?sq_W##d(KgImFsw> zPQu(H3fXew;MX#bU&zBTJnyea2IGU`pYNBa%}M|t%<*7=ompkJwAtFa@kp^@IsRPF zu`7mygv*ATH`-NqwKmTm$^`k_%=yf`Q8Jh0TlHrbr)89Q`~;<14X#_QaBsr;GfJQT z4~-km@<*t~VJn^eZqBg=G8{&y-X%Q3*3}zNvR6n#5WZKcM&raEeiW5#^5Mt0qLECt zV!YGpkyaeuwU}BldEP5P81y0aK9O7@h#mYxE?x@xog-&&TIZPJl6s3_rvXFyHSJDH zboY=W;FCu|b(M>c0=?j&zoM(*N>>s6c^$?S^2i6{{Q%((eV361BEgy~&UjjVq!>@| z!`(j)>Kh_b9eCd1Hb>UXlz_BbR4Hggh!j=D9%+32l;lb=K35;9#wvW6Hxw2ww(4`Z zopHt@EA2C8S}Dyt10iettn|hSCeeF`7(c0xFk_F(6r$P}ZnZD$Kew-`$`xibQXk<) zU3~mq`$CMfGo&wJ#=q1@xN6^FgsyL&^rwSLmSWtYK2nWa@j+J@2idKdG3*U{!x+{( zSs|_}K2YCut3LG+ZXChKw%(D%=4Rc{b;xch~B>v-6}4CeCD zPjo`eNx9B&ABhLbW>L&VqlXY*kx?7e3+wikoV|hYDnLE4AS0 zUQi<;U>$KKmAE4_Yjd^xd>4i-tQJ?=wu#ts-AyhEcv~ zXk^UA4Ll>Pw43swrIjU%E&Qtf_6y(EOOOz=*O&--V^MKrp}&6)xRPX`6o(s+pd6%R zz&zmwCamIM2Ti<`avxE=W-7OXX_K1`B38?7UqzG`-T|5-bg(-?HAMr@q_Do3>fngJ$`f z)CaZi@wI5Bsuq1xO-=;wL8toqJ2elLv71P;)0iyv*|R5-C$Y1`{-!VX?EVrxj7_o% z1}=~k4YL*ocS@T3(U*U3wmrM9Kh|GD|I}(FoB}^%3monNY%=C=BUu$Fp|Jz8)Ng1w zr6qj3%i|;odYeY#bc3INt9X}3lgKy1szuUY+Ls>;hWXuhRZHT#j}>lDFw0^u>POB8 z+;KZN&iIwn76Wvz(p%hvQz+1Pn9w^-u2-4X7^yLX%8ZXy6qZOlf3CPHZ+A7n&>pov zBQ$sr^ELz&8DdN~OYEia(Lc<1*o45XjN{Nh+!$;^n!Ec%>b)b~eS-AfK|Z>FaHMJ9 zm&&j?WZn02U43z=FV3iAHZyyP%#UFys3FBTM<#>b&PAQjtNN!JznYN8uyXI?aQAUA z9T}E;Sh7Ai**$E8K6r#DX--yNPrDOpbZuky0#!zLH@F&#s1})GMmCq~=KXb*;w060 z3LjNFQl$%V0dik0?j<3{FoKxIF8zC>k7}4bJD(l!Ol4hh+Pc~d;S$V8?!}9!N3U@W zhR*a)fwqZNvJs~UEPEl6srIE*YhRwO8b4Xucl=M)KFNIAs41D#2LD~h=9?M8Akd#x z$SD0O!G4>zE(^77D8!%Zl^bmk^oM4HOyx!{S14R8KFz2CCsMi(R!38b)C zMX3BdkV0i55<#fEZS}%^RpPxv1Rbr|XwM2^Qb$w9}TvwF8ELopjXD^`p znrLk<=vb8-&OjEz#&nLDAT1le1H=ILzVN09SW$gatYqw`rKy3sZX`yxC;T(wsnhTXu|4S&i9=&-dQ7qG)VgvoLh<a5q5CCC7kkQ)&Yy}`(d^e1gsl;E}nr(e#K1<_E-ZfTrW}6hQqD@>S2{vIm zxXzx{RV)MQW^mxZcxas>M-ThwuH$mQPX)l`UPt8yl8E?kErfYe2y?cHhYRQeyYvmZ zgkR#}bNSpt_SFsogfc&cI^|FGL^ctg8#moPTiqqz!g^=o!wzH&FHdh!i zS&Cd$j5Z!34w6xW463BAW2WvU4fh)JGtuBJ-mVBrXS_Y|rN;L<{Li3u`=~VgfapEn zfnk7=8vDP3Q9?gXM)0_4SjY!R?7BI_0Re5x2z)59xUX48y~yaUC{i(j_WppwxXmAk zGeZ4=B%_W$kYbdpp=1H6#uEzFL0dgc>@L01Xcwd` z*L208?cH6QFRErWF4R%^UI!G!lcGvAelfwcxv>E$zK*3D1rnF` zI9m^OOzjQ`Dsg&UY~^UEQpeMr(hA|_*si#2JfreC{N z+VA*)0}}^BJ11>2rVy>1Q#yhV-6;DDUL<c?2~HSK+{32z*teAGjul1V*rh7A^Njvh06>0ZbD>>(%t z=OMWX@@#E|W^#5hW+?<9+CdadHlv$Jv~RyfArtlZOt;D37lGm*-nCHdoeDVDFVKBy zmJG*UoAIN%BD`xA`-*S<0=0q~m+|4}EF!ImrBTz^Qzbo>L*o*b%;2m)OUHjg&x~~N z66E?(lu0OJyrWSqTD%}a3LXUKH0N7t7OV>$DKOxhyE}bB>1cW z_Uwj|W-zvPG2CTFqd+y*<-&;Sm{}p@RRz`a9xxNR2dietZbonFzy3CShBS#FZ)pCq z&-PhORl&`%z`Ty)3Jigp8jn9{D0Rc zu0WVVRtXq5g)v~SO26kK4SELEqBnYd&X`++7)yK9Uotmyt-4L#nMhoa?h$1qsvO<8 zL{dss{fVMf-Dxe7WZ|WVG>ArYrl7A}Q=t~4zhmxbxx!egp%b-2`EEqZ31ES=X z{!Zg`WuTD!A%PD?3si@tqfjRju@*pItJ%svRB1#0J89=4Er=B;3{b241o`$(037(j zp0#N+b8B(bzc<`0lcY9ju5dB7$yddZPTxWP4ID9x!eq3e1jZVvai!eb;FXZoUaR<< z^)9w&*F-EwQ9Ri9K7MJHHN7{~ejV1q+yw;aLP< zrDu_-zS;u78<&UWw0l69(FCQ)^DF6VXA z%9NU}FR{laF3`^zT^93KEumy7M0+a;Oav%)L(UnYNQub=epF-}e)Wtzv~yi)vfm=+ zP*kcaWYtE|w<3F?dZAG9$T+NGxuO5v`;5d2cw5Oz;@4`os$6!Ll+Ap@Z5XTTXXGzE zFeBIZ085wzN|pScT3!Hs4?0w_mwWDAgppV4-}St32a^2HckRpangwKoMK@ykHxP-Q zd!Leo2Ys>WGuGEtF_RDjOR5=T|27X(yXE>|6`5Qu5{2eGgF=<20x}ai)z;Sliv*p8 zD|_CCmym?ZwRuO*RpLSbUT1Bw7VuZA=(_$E6=oC%*uO2No#a{6yZ%O1`JX-6xr1M0 z8dUll9__*uSe5|~jP*59FSl@|8L9yRftUnV18o1^0QwW;8|x-wAx3*ayf3@9-o{>x zhzR#~Mty$$iRlloI44%TvD8%Xa7ryCwPsn#0&0`B+x{sfrhm*(SQ|66Tw6!#+pv}0 zLMC4>%-T~N>K|fZ)~bpj*dJ+{_}d&`Fvn}i;f+KS1ux#_Y^=YvDcB8y9mp)B1-PM<&UK960ba9?cS;?tLBxpgcSXcOQbB52=7SV3a^ZIB98}_Suts z_FeZAk5Ffet0Ubb;p}V^gqU`|#hK-Sl6*f4So8$`W>r?$vxA_edivVnyJMeU7r?mOIbm6t zG1(s?!r_Kvn>!U)NC*=p@;7$G?FcizeF7>iM&6!tQa}SjuYT{M_baQ8F7C+1Z3O zS7o$88KylWtGq_qqgmy((#B_%+tLT&T@S7nW*C3XKPOHMGqNtn*>mnd)h>NNkjhR& znYCVvDb6adZ(myI8S!96RYY0wiY(Ssc8GqXN?7F!1I=9prs*~>U(^ObRRhd>GZi3Q zQV=i&05n7aykii`shsnwL!YAx@$zCyuyE3o^aE5B91EgqrJYyZLFPzt@yJ4#kS|&_ zh*!2s`(!lVL!75Cp0Kgm=kpL0M)PKsu9T}wcLOy_NTrtx+}QHWnM&_IL;``vx@Sz> z-Mbt~AUUMbJB;N%_zIF|HedE;`dlBJ?^M~di3Y-__~5ic*t4HD;mJPu+X5#Vm_E)2 zcYyD}3(AB?`ruB1cQoN4K6pQY-(tcq=UDCUFK{{+S^Nc@;_G`T-xq-9Vv09V@fKEM zJl7SRU^m=t?B9+I%eVp;4ZfJHXx|ZO>`OmWnQsKc%k6~CyNX^pO5feqCmKZrDD*A? z+~iTdf~(Z5p=P5E>q%ujJTHUFZuUMPp$wK&CH0NcPB(zn+IjkJax5#q@gUlzDh~w= zv=gF6w09~d%(gz5Q6T}a@|do8Hhq4oYmqesp2_%DubC{o{bg97Mvl?GsP(Tb}-9X!x&Ttwip#20* zHyi2QJpnCn4<*d#^u(FUlGlMxuGi4Asufk0e?I*vNzDXw$eoN%K|O`HnY;tJemII9 zyB$NkW6sdToRju!*$wE{;K}=-_Xkx$=%{%>sAmXY)EU9srH+vlhbWvbM_0H>`QZsF zd~<@KU?W*=r5t5#PBL99Fn_Of;rt!P{?kj*qBg;U=;zxz`Sf!un~%O#d3pmN#TQq# zzZU&N96Pdlphbt$l8oQRap=rvN^f?!<$cfdlSSigL_$1>1inQdd^-;NMt9-6GLUdJ zDKb8lR3(Sa!7E1NuOGY?=$jFQ_WMh#qK;rZ>Hh=Q6{;71cBXoXDqynb(ie2=-I@F9H``ztx_8*pT@+a zSgE-zpuKmUs=GJp9tAp?hJO?_X*U=zxQW4}YjBPSCVE#e$Nc&fP zZqDruEcXegB*az;xDl*X5VZJ(AMK8`cF_KDO67bfwBbs?pD4LEm_lCK?JDu$Xn()? z2CTUnEI9@IRl%#wr~iPD=UM!$j)IRbEPVLpLke}mjF~sXxyIblw99ijn8s)$^q%8D z2+o~$3rVXFVoNdUS7s3{KF=fCk@Zv<{$ab2{; z<7gnBnAbv~Ygw00X>D?=|zAp*6E)Q+=b9Ms1Ae=j7F9kMOxCu;5ru_u5YL*qF*PwA@ z#oeTJt}S4S_3Q82P#;BrJn_oi9@*aB3fqzqmjqAXWHoGuu~V9V1;bWM(K%X`Jy*&u zGNz+!J}yVP_?lzI;VUze9u#B19Lm|gyx8rYJW&dp5*gfWtE) zpoVHpJPIREjYVV3zVtH(F%NHr-hpVBr&%}Hd-84euLi-@Hm?RuYFWqaII9x~-{{ar zTGlapUmORomyqkI&~lS1UEPY(f7}}1yaH6}AO9G%`rXc~g?s*SvYp_U7}oj?6eb&$ z@Xqlqg5ioB5oz4=s*GYdE$pCdnAmV1&1IudG;t&#an&9Onya$>@L&3Q-G0N2n2Syw zd!mQbW9Y^axSv=YSSSZ3xKdzB477Z9H_E6t6GC@vX~~nq?{q^fz}TiOvTw&Ui!xq; ze<7y8G;JN`8&*j$r571F3OJgt<{891PNf{>FXASsxCBSHis>mB4Kdaf8BZ#3dq?X_ zX;0xIN1Pd8F1Ch4M)`N2JYAbJLxw*a5#W#)8Pf&b5cJMaY|?zGj{1vdQiRAm?l7J< zZcvqg_nihKBOb3j4hMQ#)4fJUdU>UIQj~n?qeosm7VXF^M^$l}eOZAsvy7jx>S#d) z>2;l%R~VcY6qAQ30)8g@QB_2)BNKOJ{ui0eVyD%Y%&I@${ubv^W9V?t6ZWoW^2htl zTeu$1Pd)IDs=`0i*{;P%ryLN}PLk|u>jEq?UcU)WO~$|AnZ+*W8}|x}NO$63=W`cA zk#D}L4Tcw_NYrsD(owRK#&4g6zY$SAvk6JfYdqf=OLtOqRUQ!+V7%%t{OAK>H;zK# z3I4)M-ZJhFWf?RFruF0*r!oHdY&`1Ezucd{u|L0eBvSjvC+4DeTGg=8-Jd^2p_H9k{3OBXvC+4k%E&`pAtjSX52ml$0Qwcf=sFGf$1XEb?pOp=!`UmXsqC{S z#K|T{QRNF9E4m6{;~ARtF{AQEb4<88!h?-i@0k8)+mR9l$6U0uUFgB1+gYcy4z-51 z|E7Q-baDw#W5F4UZ~PTzdwC6x`9qXhG89KUs?d?JBUg9 z(mYI)2iVV{sGl924J}=ED~pUbu_r=5Aa)Ga|LZyiu7ZwXO?Aw;gB`mJV)J#(8b56v z_x?BRF#A_^ot_zG_3u(7`nOj4XB0PN*F<;)(YJ;6q?pQ*mrZ++!&7Sl^7-t$Rpy#+ z&-5P{RtW!K;~yMg()~jR|KI>*@DCmQg9DPmKXmX94*sD7bFbhZ+4v7X_=hJdyT<=u zF35T^c|MNJXmkg^er>)%r6aN8{(DResfT;`4WuyqC43#R%7@w^WP{`lxS@1vX^G~&&SbE?)&yqejeEDhG)clrP&%B$|=X|{oWA*Bvf*)=2sdiz^)cfE4aMwxK z`4`*u{p(=)6WL>$wBLK=)Gu8oJvw&X1Fmka&$2I!9%5J$U`nSH}ImIJjWi z?hn3fwsd>TT6(P)>+A>_xZ$^cuSS=&%`G`~Hg(I?)D}GSB-sM0p2ix=I{^5M^$>tokWceWe6YQ^gp8gF>x$JrfE+*bN^%D34wV;fET zwf6M$jeZ|ygb%o5(c?SPwfEl}erD6ZJ`5fUi5 zHP=75A^6#Kt&X(}cs@0C`h>mj-Lf|Dt_M2pyzt8}ACByL_aCqCts61ySk|uTzaAUV z`@yf96*XENeD^SY=f%AZnv8$!mj&euZ;#x$pyl8fW?h(D_fY%(V_R+h?uLDnb0$2} zxk1C1-Wb|*|Hh5O*S;`#_4MqibB{I1TiiCi^NGFf(-vo?rRG1_;+xyY?Vh!4?Qc6K z%+I^hZ~Tv+KDeUS+b8NQn|sOec%zg%vbGM{)TBxKZH=yVoceM3qsb4wytdt!cNW}z zd)6DnT7O&o+rw>o+a%kOGVc|P-GMA}_{ z)ct8+z1|HzIR4P)tg!>{TNl@=>B?S1I*&iJtnY&9zr1^P++QC(HKksYUf~&6w$^{R zzB}X5_7y$TkIqYWUdW1?)#2=cmTPM+$%s8TR-x%2ZMuHXOW!YN(eXpsC_ z_c5D?h95s``~1?Gaj%bvJ+SN6y31xZski#8h-v34+f_uRcRTm#fcu}GRByzJ{P{2c z_I#h1*|#@X_nHyCDZSR$Sz$NKjTq2jcVSw`I~pA*d3x1H!?q9VF{($Ldr{(xSNlEH zy1n*c-}CSORFW~d={FBNa_a+*kxzc}_W0QP0~dWVqD}t|Gqan{eeRAs61&x?RkUsL zB;%Eb-`UV;RmJ0P9c#7Wo-V1YwW##zw`Z@rTDUASa>S5|M<=*`{>|H^-InRAuJntj zotz)^!iiT$j?bAnywPK={s_Mm^YmSNTQ6C*;ODl_*cUx>)9?*hdmk!#IU{hul?N-n z`eV=WhXS%^XwA;f`*>GnWs~3czde5Bss%l_j9#+)XvLOefyYJ$ecn0$cUSviv;WHK z`|#(-(xSWfd|*;io5!w>c_ja@qSL>xKlRM<&-cH6est{DS$QAXo33oVdTx&z=})hi z+jqyg1JC45i=Nz}bHlCnSK2H&(X#x_9rtdyyf>$I{fR4+@A4Ycw_OVyrFH&#{(DPT zRuI}3JXFWiXTJDec!mUGNop}H(THN+RAIEp6Iapi5s7-?U+1%`r?_XyR&YN+}-%| ztgerBe&tA9Qu+;#z1gSjt!29ojcy!swS9+{Gt0K^>i>Dtp+WBqJMmVo(|Nj~Eq&MX zF{KlxEtolV=g2J&4S#d~-G^7-ykh02k34$jjWzj`Kl$@q$GcvB;Y9m3y&o>=^~j5n zV_sZSvBT3psoP(@8;$+$#Xn-!?iik1yHV=PmxdL3md*^yXmO_FM<+*jP5syCvkx`JwNB(EsJIjEGy0h5ncwv}M5n^Q*WbvLXHcrN+M+9Q*< z?(Y7zt7Jydo@MP~e(8TWHKcdD7T-rTS=-~j{?EPtZgk|XmQzaxANw({ebBOH#UGrX z_~=~kTlc=dr$@JYZ%u8}KVw_jd+#=18;sL^sr_c$mmD|hyEUsi9vi=F;+ls>W+Xp% z!#yv4d+zx9CN=Mz(r>Bb-W131vhl}X&J7vF&6xJc*Th= zKVIE(c+;;>#km$=`*xY_ql)B-k8NDpap;8UQ*Q5eq1V~s$9f#E8}xEL$GBJH=ft&t z<)d3(dvWHB{JbR#Ta^#-6L(>}foHj6}ZrSFs9SUpqp7hzi*tchehJX0g>)A_IY<=gw zol8BBq_3D-`@wNNqL1u9GH=HdWnVp1KVasy=O)je++x?;U*EBGSnP_9Q@34CyW#%e zkl}A#n6velx!E^eTRW{s%W)^$r)^(TaJG~7Z2j9#t?2bk{c$^2O)Ocs*mlpu2kx6O zBse-Y=F-zGA8qvE$%xBOuW^sDt!lgW)!W`bm^|{{xm#*C{bu))t&iV-|K5;YC+ij7 z+wZ`nhbMHtXZiO_zxlZ2)QuHwZ`wC+!1G&|4?4afuU^6(?>u&-;T!cGUk3fKaLdd- z0Yg1a<}OU=@>T7_)8GBrowlW9>55W<<83-|K8^I&1McbRz7ZB-=K(_C!ETwAKc^3 z_Ump#ta$sUPrvH>%AD=(6U)B(q3Hfwhj*O5b!NZZn!i`nzhwKU?U^4(d@*X+51uOMsvi>K>!nU+fq z)*;!wJiTrxrF$M1#Hto9#53zZ=W zY1~tU1n2)JVRk68&`kd;+qX{$=G&|22@zf>l6-?&TV(VneH13xj)C`*^>|G-`bYA9 z2b9wq7mP^I!nqH4QfL#Z`-`V)`mxn$;`{BVt9~onxXuj_x8jmAxdq(58@z7Eo(9wc+8 zP760>Um9Kk;cfA@%dXk=I^je7QCHQyqxF1aI~!@iqK0ViCI4-cFs^74L-O>9&+mNl1oM)H!x zKb&9LtjMVCi!PC{G-fc3F*@vIvK+%fe-?o96CqM>FStFI;ji4%yj8J-Qbt2r+M)YX z&l0kZTSA~;d{y`^Q7%tx)x;(FZz#c0$R_UU4~n~f5Z33?aF4>OWn$+<#Nd9hHW?kH zck(^!m6hs0ZdDqCRxs!JyNe~}Tki+IrS37o6v#$O4(kowFt?{kgzjA4D;S`~m9*-# zrYD|i!!z zuO9v55`qTIjL&K?m@>gxo~$a{@(H;rcwx2;21r){dYi{GCac9Jb^!p!#zflig6gN} z0BrKFnknQB$jX`Fi`Ra(<8Ri@0*z!}a$hhTvOi+P8|^c#8Dn}rQ*in|`(M5-R;w35 zM`u=)NjC4c!_>o=&= z{EBz@cjSBl_fckxdizG0Nn)TGZi?+FXdc|h*@;0mBm6VGIUHx=k8c7MnQy$!Obpb@ zbq@HuHKDI8|E(gRQN|LMtx-?C1Pa75=;XTz0fGd~1WbP#>t{BEPe7?5W>r}Vwa$K1 z_RVqnHG`X`L`s=yo9o*d`1;okHPr5aRy;?dyF}V%gk`q#+bf5F#~TfiFP5Qo@ipbA z^;qp;;MZ<5qKP2Dqk;H)+O z&tPliANij#+0(e~j#2OcNSp&E%Yu&6h3#Wa@IGa|KgZq^){_TJg zWjvaKuda`|YjThHOG0>{q!55`NrVnWAZIBm)+%~|%f(|<|6;7Uw(@?povpK^yGb_} zrqxC)A2F?MJO9FmfO@z8GTk3-vDS5MCaU;|fdK3v(>VJ4MrmpKk8Mb8rOUb4 z#`{neTJw-TLOp&gmfgUWp*?(yUHv?;{d4A}{GEuxw*&{O1tawzSkCrSUQLnfNu4>( zlfrIoNeVdiQE-l@y*+aZ6iK*^IDP~6+eTTiGE45!XyeMM{lu~JvatQIrvXrI#5yi? zll5&@=Ce8Sb@ob@l9V|Rf#XEAu^l#hf@53tuWlgiBU3(*LLb7?a3hqVh1uXPugdam zggJ6c#w;255@W7Mj|+SV0b-VsAI5#@ecHlX`!Kk^)A$eHL*~#ymWmjcdh&?L2-;oL7AmYAFpDH%#q5rPej0(hfb(K!Ts8 zI#lHaO%05+v@_lNyVXUG(ti_k%mn)VKRd_o#wv#L9`!Nx`9DCS^>e)Z;MFuwKamI^ zXj1Z(J;~}}?I7xGvZidbIPFoeCqwGI++v2RDqV71DX(qX+)|D&b<(=b+7}BU=MW+? zf*#cpd4HqbI?P1jfpAaHg1(2=q5su#WZe#I3yFzic+ox@ZlbNKJV;{|CvPYHcVI8s zOp@k2Zbk~2{-*^WEs(LWl*jQb1gL_DHX-Ghf+x+d&oS9RrZFqW(I;52{t;=`7pdgozeQGw+Nz zmWMMJ&K>CRAU7tQl;-yA%air5{#IOsjOG0SR{x6>v&=3RLE?0HikeJe8}Phnm`qe& z<1?c1uh)z7YZbFbv4I`SNiO48GpcJw$X5v>z1K~HAj>PDSbgY14D0GMN25T51K*I3~1ax1+)Ge%6$?E)Z z>zY6#?8H@q*Sb&ac6*9p?OC&6N^k8ZNpuq9Es;xqjUM7zT5$YXT36x@ye;kC)bVn- zCVA_*Br81$Rld!$jQGC`WZmSine)&^?RGCP;a@yG`(!utVl{6qwox${^ICiJ<(${Y z3%%73iDv8|Yp?wbRAXT5XIyiS%lYNPS+Y>8#+g5wPjk41yr-kp6U_Kob|J+Dv%!E= zD#1?FWK;hBMH6UV1c$wUi7!~O{*HfHGm_Qi@yqD2pPN&i>I~bMn}tcwG+PYDJV2yY zJXl`0g@M#98vGH57gBD1yg$i{TMz|Upyx-(V1nCNO-*|$gzHAIFgfFG<=T6iN`#L5 z{r3}|I`1@gp=@JVM`&~+fGiizT`PxVOBhYDC z*^zwj1-Aqf(f&ohm}AT@CSQH<$aTBfvG58W*thwN;N=c1c` z3m+w4Dmur1NTvXPQnqQ_tcOmt%!T4N;B^I3&)rbuiGUax z_Ya4t$(E{VlO`A9PS8R9>|i#?vbzfyj)5fQZSSUsc-7}o%pv6Fd#Jt$ z(kJnP*3Gfgb)**eW1B;Swy~YI6Y=odvsqIyZt#oV@yy==IXK-!kKZ5C=NC||Tz3%f z9?@8rrNiG4|Ln1#$jNR=1wbgw)^6@|jZYh{d#$y(stVv8@w8#r^6%7})-rn!wunM; zXRe4N=b<;WVU!h&t_oL)M?D|fahQL=7?Fl};x+bo+WR%E9aP~#Hji^(Q z3CszsWKahEK!wIBH^nD$b|UYNOf3xrT6m#=pE}Z617%VumBpB?tf6!PtqJ;Ezf}t< zS}h2KfSW;Q91o;$hr!$~bzC~7!zG9>AFoU8Q?Vg*Ki2CbNA|KuJ~*P9(MBc;V!!A8 zKga{@M9Wt3>1$8PXL7IUwQIn8{Vj{f#d4%`wFn7A-?Ois82isj$V~lyc)13ScAj78pUgPB~`ws@ep;c8| z;-r~THw*W5Q`r&r8x9sqHCGB{u;lnluCweb0#h!;G^hub?UIJG0Mi`o6z*Y?_of!@ zNrr01V-SxNKA(pE{LTC9v!?*Tm-{U7!Z2|>o21T&WZCIY1T99vpn`!e)l*C9>5&7| z-L`}Y8g#Kpd#iwdG1Dj16%OnkXJi`N9sG@wTb$HiUCfg)qjWYs)s@MvkN^qnK`t;b zXt3?fpm-vXmdX1vSppr}Xbrg1`!Wo{ra|-CMv>Q`Xzv?2p$o1$OLvW9rMSk|qzj0> z2lE^eHGmn%y)(eR!-$AGd-KEsb?z&7KgObx|i;NXT`17v!8t zU$?M548eIG8m3Rz{AZy6(_+A=4-a)rhx1Lz?cam>EUqaUV~342aYOjh$SHIY7gw)x zl5G@cSkV}_n|5i>J_Untw?m)-!ieU4JygCaBK2L{`;ERiag`;KqQbAVP#4WTy&X27xhw>^KxdKug{SW%`|S z0zS;x6}1qu&)6v4W?&n={+^tXMX=NK9~`3JOI=#N7_^2XduIRZDABHHQ&r+)`ziK3&|Z&wy*al8>)Rn z>2QIB3Jh@Az2nIGy@F(4G>vXh>cz#Ozt4n$29{?`@w(GO3Dpe)ggGW-rWQw>gSX_s zZQkdU_wm)vrz&F9^w3=F{;XN?^OaHu20oQiHIt1ZS8R91j@!o!DPJpMen#A>CG<~l zeks&)yY~#iBA=W zM014#787HsX-biIU7_>n*m6Ma2m023)VJ=juf6U0pDS;Q{$Mv17R4A7Y;5qq=9YSK z(4r0y1bR)*rQ!>lPLZL{#iQ6)<0e-VE4wPg?3WSUh^{eze+_K@KD+%I4YCzEKv-}l zss_zRm)xgm$#)_Z*j0Fkm8QHZvxreRqMnJJ91M1gBH1_E7+jkXyYI)v+x8jA8x4P3 zkmd(VICV&d&8R!73&qFaU68{2K+dpI86$dg283`X-b2q~q7tdWc3bPr-8h`I3j8L8 zQg3vhCM?!aI;K(~hDDiGoCIK=d@nqLkM!sBTz!#4klAZ#^Z|#c7ZdB?pG2DN;y=AM zJ?|3Ac^*RErG7qa!{eU!Hvi4Fn1SRdBDlt9`Sh=T+j_*%o#7SweJ%qdn`uRA0#NH!&J=ca<$wy znU)UA$uN)T$QB!6Mm#rlt_G&7EKoI@XsSm~wwq0^6p;9PAICAAYA+yM{%N>&SjVywn#PSiUb=#Pp;9nqbCMvHuDj$7&< zC35$?U$@1*v+SJ6D(MOnc*Pl5~|yjy{q>c^FWVd zcKjWv^%Eb!PwTAi@qt}J4{u%qU?n!la1(Xc)@MtJ1?U5qwg@HxgC+(1(!kFWk}yCy zJ(Q-x;m{w#kSZB=-0?RP@d>h+62F%QUd->FW1S%|XWPqfj2^fa!3ogi;(Qw8-T$My z(-f(yx(}{Z z{>sQc`_2HK&ZE7g_na(Xdcoauhs%59E>{8HNOg<>D=Vqv07j?@(=T&CI#d?N2_fQa zJl_5`{mPmY<|JrRXdwHb+$GwnL`5nF3)YchQkW%0HFYTIdmAVxJMoYjduHskE)JCc zI;b<%A=lMnm;iu+q0?KVS2GNx&7yicsPiXJJr|&xb`8GRZ{;+w#pW*!@J5(m`f`pZzWNs5B zSP7ePH})eg6rr}3)z1_QtXeb1s-|Am9SHNi=%9uw!94(Zow#4rG%oi#!xi>5><$q? z>e&lUqu#+=yb>IlMy^T8gk@+#xtEO7m8}zEbzDvwRtZLle{=G#q?DevcpNvzly&vv zo_FK?WdRSKT}i#2e-7Y!PADLv@1!3YVys8rx@1L;j&Q^(G3JopnjWY7C09?MOK3f= zRbS~9w3HsP%=bruWt5E@g(7njp!B^nG12hg+Jt3k4^g9SY@a-F!KVWnICbPWf9YE^ zGlGR8q#MfGec=no#XR^AjFAhJ6pIyUYc5jdcRJb_Y|XpF2+3(y{Uq5)o*N(cvrDQr zPR2KVjYsa^+fQ1c_mcs<$aT8k7R^?K9=wE6(fURRkFXywpDu*?t9**DgR5S@)G?!K zDt`gG&vMe^psRzt3RWj|YdQ{xGq{xXP@ij}uEr(M_WiXTX+3}xH8bW3b+-e-L8D;< zi5E6PVf_qX+ypjkF*Akhl_CNnDX&DVpApivn zbMHVf9}RE#Bw`uVM2wD|2TeDXtE6=!@ko8lUI=;ETJ{?;P4HH-0;atjzaZjiEMfUV z7w&Uw&`$`+j{tVjfD`eb?*KrT;?ELG8z4yKbT28K67D|ebm+-W5&q#p{Kb-71)GV_ z$T>P>dPh#lJeGL=p74TW_%qXw{nKw_oRr)uD-(r#v2IbTqXvE}H^)ZHc;7 zPxs^xw4RRm{z|*BW*z3pzI81NFe&e}q`d-Ks%rw?sJe?lM1P?DzEuD7Dtf*hi<`Z2 zO1Dp`%2Di>mWN|YdXu@;hbHVGotk_U@bzv_HiaUOKz#8J|evm{@)B!nsc`0E?ke8 zftKB+sHqZ^TRx!h@aRH?+7l2CYB%Sc@j@)*}avx6aL_J>I zsto3j9h;Y?_-+6ujd+(FijZKy?r$br`3P=K$><`&Cxl^TS`=A1Ghsb9V?g?7!<)^Z zQi?6(8_|N0#i5rcdx!QV+spNvfqH{U0tw#O(N8L04w-c4eJWxbQAK&6r4NKHgji+1 zbh$95(DN5$jNfo=eMHaVlqhC9E&gL~4Hcz6fc0JspW=b@-1i_zY{akdEc&wG}2t(l}&V6r5)K z_^}7e;qf-wve>XqOc>eQ+SOEcnLYW{7`r`3eH77F4?YSBhNPg4jQT1pbT+)`Q&T69 z?V#>{LXU|6dq+Ngl=LR!L5DDkgxHEkDoWQlJaBBHd!d`D1wLNnskusKZ~DRP)|mYv zY)5>L4gS3aW(6I#n&lrKRj7vco$9HKjr&I)l!=588-Ggcbh!SH+2DSL>RhiZDNyWgdXuC2_`E|B1sI<<0Rf=5 z_^tb=in_CjK%2&e&WGmBy2ScGtA3Y_2xO6vvtTE-#q?2A)eSU{BRJB@F&*2(W`#BX z^=MF@)>=9SYyaB(H5BvkzuwkcnpCba6X12X@a0+0npK#%FG*cco3~9ai~*LaW}je> zr1Vu!p#Vv*vqKp<4Wt#{mL$T(_aID!Mx?S#K$tuFTBCM%8(se;SI53YWT3udp?bFR zwj}qmTj?jO$T-sJ;~+d2uGZa7brTYF4{mWF5JQZ@mB9Zl$a!WmDXh@+t+Ot6db8VE=;ua6c|vW+uu~Gf#LUzaarf^kJZnp2es1_ z+YI^G+6%>wN4;07`Q=dJm%%Aj$P487?zT--2K><)^2jW6ohE@}$sEV|Nq+|fvit0l zw^qt=CF$Mw*n0V+*1np(<4ux3ox$b+s6e6glFp3>uQwAOP4tCQOx6jDz*AXCm*4fD zMh>KNK%+=dchjl-lRLavS6Fq=4=_>-p>Cj9C{5 zy{gfGe)CiG{?(1N-jl@au-m55=!b?zq=tBP&ZVBqS)O|^e>-{G1`HkKtDIX)kO zPzC-f!!9Jf$&rNbP}EzAvmTgd{C+moPz5?D8Gh|t=RB)xcP=&~#UvjHO zjO^VFTPxmMZ+E|1Jmo9}do^HjKyq(-KfiGoH(9cuN(@9CP|}A$Q?Q5OQUydZOkyF( ze80Eb&H5tFrd2`jH<*aaC_-9s)=&M`)`#y7q1wWJXfvXg>%apB!E&biT-lLW}#6LtPLrk=AEPF_9ZaY?*u7 z0!}*b;;J^3*3po+Fd)y7T@$4)3z9XVmpveNUCP7(gr)x~N5El9Mr01v*!Gr#qv zZ&~5G9H*96TUijd-pc*5I7yUogw6a++Jd6tzc&r@1?-qgFqj4#&T-+J_q`!R6lpEN z-XR-wJI&B>U!fL@%`S1_R{a2{08EV-d{X(6mh1xILOx12NyH%vu96e0`*x8SwzovO z@g|2HN#614s@Jr@g0%;^_Z|5Yyl^RRb$zS|zDydTLDgrf^w|bP&%#-Ww&ThM~!g_w%8((+DUhNl|kD>EKa8VxBJYquhU7Bxf=BZ@FU zDDtD07>1ok*&c+=-C0?`b4wMJ4DSu#6?{w=R1okod?z{r`oow1tjAY#~`vJGnpZiiQpiG&DFjj9DF_Q+XYlRm8fh#?3q+?mg zNT2A(VV1|8*BYftoq8EaK|u+{?-Nw%<)-Pb^lvH zZ%&~<$mli7;FSUo938k1b2{|MeBS&HS*tTVZ=2`~Bm=D}^&`mJrM{T{nzw@9&iI@_X9JC(}_FOMi1 z&qL2FSQI3v>F!{>i|ma;pqg?5pT|_y^)hAb)g0Jg;eyXPFmk421)OoHuWC1+$6vhM z(u&Q~40X$&+dnXluoy%y1^*NvWi39>gi!Yh)lL-n@V$PRTk_NL@H_N3*i@s>ajk}O zHS{Ku{wKItM}l2jtJB}Xl#o+8(p@oVJz{2h zv+JQ#)Cv@Zlv`s93`5%5Jin60+Lk&Fg#t%vGOQJ)@EpnHC5)>{Pu`V$!DZqJtsAg` zIC}_WROBSe#rokqSU%LIm#uCXvwY!3?A&xilEZ92x588{z|S+B*=+Jec#(pMKX=iU z-5H1{^l=ELDpv_K9PsvK^9+u!_3^)mDW!i5M+X+j+__p9Jy*>9U(|k zPKVe45{2s3)JXXXg!$$k)OJAX7qv$`CJw@0UT84=NThk7F$Vc~Z(rp`W1gq6kf(^~ zpO%1q3>IR!8%aUbFZom^b(LHrTx6zu&ZEAr#Z2_KXda6vgJSp7DL*iJtue>TKG0XG zoLc^;m%Kp?)xee{e@~m|pJv4GXPG_Nf!F3c>jh9AJp zFg?fVUdZ&vKDcVW^rj#AJU&hwJbIwBz5onG@A!v4Obr0D!s0MnzX<-63!oZO?&4CYuUbi86N@)Rrj+>4e&PuVH5T)o7x!2mAnokB zVR-30C+sdRzLVCjEbK?lXM^^{mrVLqS6aRcee~pcshF}|f!-H=+;_oQrtH_F(B4UL zyZs==(=_|ksZ^shy{z1#mC7Wk~J0mptrU)uI0Uv+gr?J82=JpNG!Cf zn5)|pJ`tfL5PPAUMxEX|Ek?jMi}WLn2V8tNfYlJ&p zClM_$ru#LUnsT}$7`+|F?r?Wu<#rf z_X1eHF~*He?%Ta@+?xpni?0l_D>cmWJ=StsP)+v;^u&=%ZHKunnVwamkZCVi>(y{d`1J|*IhQ9k zlX;6gW~5!~H#{Is@%{ZR``e-1sn{}`kJNYY&p@lyLJQJ^vlzf%gm|Ct5UBa^ow~hK zH?KhX{T&nh+zYvaw;J$~1#%dOD)DL&@*~IrM8OU7fE%Ub`z`x-k0jnv=dTRqL|X45 z(%jUXe3^43K!x7XhW#?Tgqxt;IRG2=5Xr2^B`DhVXZ2U_BWp0(h&56 ztmS*Uefx0iKI}F{wrgV?;#8NTP7o(^!()x+qldhj+X+F}Q8P%VO%q__B&QD+3v#e2 zO!S|v?yLqA&(JNVDQV)2bwXJysb;s5+r^e%IT&BS)W^;;(10IAC-T!<2ZqafvuJwT zlJBqGWJd>y^T&Ho>CxU`WOcbv$biLHfuwz;!tSoKhsA<_P76O%objpXZ5$&`<8*0r zy%$%hk5KUz(&5=8q1xJEBN3lSb31}DUKD_7Kx3@c@YqdQ!j~e)FWBQTbncw)&u=HG zuD~l^8@7%ylrrAck7iGPxa2soDx(7n@6dA>MK|Gt$vTDR_eL65isxu9^u5E;ZK*DW z2lA|7gk$l!Nd}?qyPt;(pEmMo7@gXNuJ8{HRJ|$lP;Ao0D445J($G+=qzq5jsmS|1dbVe3Mu_T8uR*C<2KD z#C-yJk9j+HIq5*HZoW7-Gp&$a3QY67_9L9T*#G-A8gbFx(@7ag`}|-!*(G>O@5l*g z$*7?JJR>Bpg4yP55 z6F92?LmbY0rwIqF&NuT`ek5wXh+<7n}%Ke=Lo{{Ps{p@Y{kr|GSX!6Z| zrufiA-v{Op&{zvg--X%q_#_O)H27Dp0l%PD?{?{PBg3Jrm19#A3QTjVClEEf)oWhX zweiyJ>pdbQo>MDv9jXrOOqtYW&mCqRID;xc$5eYS?HXV1rQO!0Kk5rKVazs!wojei zL!`j-ySa`keLFZV4p978Qg>S%Vy$|>e2)rrO(%T387BEVF|RXr$JZxYo%&8S=vg`Ww!!Fk?Vhg z6|LsJmmXI2f;rl@rNp~v^hUMqStbl1En!)z=I6NJ=ozda{yo@?IW@Rn#4v@zL5j1# zs0Lx%-1Rl4`RF0-nB>Ygad0^RpCs5cIKptCHzli&wG^Miz+qoy!$Z)gl%WaMCRyBy zb9at81MJ-IKE~gQ2tDuCo0sq;Uo?)wR>5A%2UC&hTc5A zV|{S557Vd~(qO%kUy!V;RGNFX|L2%6YI5oLeH7O-HO{a97UH!)?C~#|w@|hHQ|Y0H zJ7H@ORxNqDjkt&5`;eguC*dyIf%Puj;`9QQD){f@Fl7OW?$(d}J-N&OkAy~s+0z!^ zdZZmB{|;brdejP_RF@l=JHv3_W|EI?7&PCmhuo?%LDEX$=qwGoZj>4P%SVc@^R;4T z>;6YHH@ga9wffGnT=N+Y=AA^j4u2IC+xR)wzhOLE%&z|fXCXly)TE`t98MzbtB-$E z*&2t2fm#izsV&m?bO-Sbn~KbMrnp7_EW^Db=fc^g0&+9;wQ;|>P5fyuf5nyI0bO=X z)7rK*Mv%)t(F=ZzSUPr75_MrMEU$r=DO}jv*SUej+4sPWK2r#;G>U@}gB>vl%fuBF z9ukg)GWeHY3IK&3+^6nzVkKR+Szrvnbx^s^>YMB+c=;XIsy!EXc$28L9EHC;Z)5?K z#e=X?)5cKGFs(c4ylY7Uva_U04LN(c48GVW zt4fx=E8hY5Wbeae8jL>O(Qa|kk#bhk22@{coJo~G;;36W+Wm3PZVA;6GV9M4-Db)w zse8VCTKmRp(+Ec3&@F9Rq3+{qqnD5Cqp)=z-h&*>6qxlt!ZRGO#mQDSL8@=09c-yl zWij4#AiqYBY;_-dZiYK+?UfYRCwFq^+=8}4LOHVY5QcS5MYxKja(#t_&O^cvH^19) z4KjPm_uzOp`kMbgQhVy)(HQ|keT)Um_?NkavAZ`a&08p@A6=wL?A%eyG?wCIJKk#X zZn!3=lne;t`-38}Jy^Q!6_Z-X-7ApnOO}SS%)ti%gC(}l>hyRc2>Dh?I^RoscO7(q zP!GCb_lxtxaUBT)TVk6J)iai1-pRN_x9kHTN9SEs5_Pn)9L{vf@139TGQ9w5PfB+p zkA!pgg`=#FRrvE3*V)H;lTDXPOubWEbOX`<%B)hh*s0vafOvk3H2(bf(CXOe*aH=K$_!s zaI#Dx)gpxIBkqbTKQRB9krL?Tuwv?_>{6ukU53#|(3Q zC`0~meFQyn47{$%CN0@HrSFm^Wwn%7gy#k=0AUFaxLiRGvD|iL#pQ|qS(5*PX}gPP zCcK(kdFW5Ek7ph<_0+YwqJ4Y5^8scBXg#6gS=yLVnt1`Hjtv=7DQ&nx>=Q;{dy$=ciF{vH6gGzWg-h_ceVwfa)j0`2eC#O#uqGk0pR`Kbv?#)xqhYs!aMk%>fTnZgk7 zf^O|8qFGo@uj^&wIP(^+XRTg`6VnW|3-44Y(sLZg$fa~KQMF8Jt!aO7Da`?X_-5(d z08OAF1A7ZcV&BpO$%V4ZbMQ;pIpNmb#S9O3jUTjYGZ#k2Tx4P)picIKa`(~i?*n`5H+wLdeEK< zct*m)pHyuX6a_rWfp=grKb680RN2^REMAr4g3^23`T(<^80m*ld;WnZ+AZ{4Hy7Ik zSqjgV*!LplNaO2TeC42kJP!2J5fG-u1-FeMlNhnX-u_UYFxgHWTy0GdO7Yx66KPdj zCTs=Aodl5th2ZE4;=0N8DH9X4&D`1Ov&fdT=1%)K_+O0h%;-Vunp*tEP~iGxw-{D|6eN1A8VaiV> zE>$m_ZiY?GPWa0ZMve9fcb0Rs0eQk>5lf--i<^nyHj@1c+Q!T5k+4FS($QLPtR1^< z_Z+EH9p-@N9v{;Zq!2-O&+iku!-p+)4MpFyOE({@jTjB`;&@)~g}C(4j+WyOR}^!O zR=`Ff1s4H0V_`A=iVRQU=iwOIc zKg<xHMvr_`zGSl`v0BV(D_vWa}ajVcCE4h_ar3yFP~Jj>>9bw`y)!1GLvU3(=Pi>t7ys(}xy% zqGf{QP(H{LvsB6csdbNG9}O`_k1ovM&{t)}fx7hvVy`|7X!#`z2vkD}W?cCk{_=aJ zza>)on0;L01i-~$ubKfIzhO0W6cxG`pKo5uZcnf@`NG~F%bF&kXyas)q}>eU*)kIa z-Xq^>&(>g|Ig4XPrBULjWH$vX)6eI z%jjSMjB+0Cvm<;1M1Bbh3gH!HMui!M3O&mvNPX53;@F5eD4h##_L{S(Tt~f#Mfs%* zxOc#2d28To!YA5=6x;sb)ertU(~#2ouut_R~1h{9dgNR7m zJ)AbjqKb7f{hFU?PPdA&z9C*HE&LGqLX0trQG_(ZK+jX$Cv-R2!5cXmc;KDk2RLb1 z=&p~)%z;iPQ--62TZ3=%55oe~I6Vz}Lj<-xf}vcPiu|)A1HJ>velNH)N@&kv*Ea5b zzbT&%-vL@ZSOydG0%B+`VthlO4Y38tduj&{s+zw;PLGfKPU$6W!ae%8$u)|_1OJwj z`{m%yl*8*oIDV&K-eH54W!}z3HJPFIB7D-ian>X@%mJ&8!fBy*DEeb|gRm|H`CgJT z3#wDkqc1ypoy2il>wB_);swz(7!I}#S7=X&mk8FZ!u!_XObH`V^+6S$w* zrM(4i;m3}aOArlwc{C^x6;XWWq7lr1WA2tyTFRC}hojC_hD-&0`c2hRXq2@FvPvK4 zBE*+KwIU1&b&$W*XTrCtLf$Ns*05Ub`53y{U`B4HDyBPXsh+EQ`Af1g4z}Y$mIGbY zn@xNMMQTo@rqq6(TWn^`*V~TS+&}tL*UZL;yI@97w&o!q2nT0qveQO1Dnb%IPp|X6aMRBqe(<085WMXenwS{PaP34IskIiZeQT^g7RV zi4y1gq&a2Je>}q!9K+5lGQP)~dA5Ed_C{vu^qvu$Dc4k`CVG4FMn6D}@HflHzz!Ni z{J4}a6f(o(6otEbDh=o}Eba4b5;?Z7fFORvk$<sGij3qIg*@wNW>iZO$a)*>_)S@s_!Ssscp`b6r^bi9-Bz3M zq5`h-950HjwK)?F|DA)!X|?h_r0M=-=((^?2D^7b%J@%XpCtVfC|VSnXm9wezPCDF zU(*36?5~@Vs%1iDOa&-H{$2wFgR!K?-Z_@$u!m@+u2Ma%_PF#DiW-;9lal)fO_NMr zo)teSysQba=};^w(NuBfW$Oq&T(>ZZ_3uxU97&YoFSrZ4Vy}sMH>}v7C#%gY;1wXkYm)1I|nWzt)L)Z3tv} z+09Hw@N!x)R(D5cHJp$oaou%myaybOLZFA2yvDShYwP_|&VEobRLQauWu^QEz39+^ zaoH8>M!Uur(@i)ewo*AD>OoZd!hKHe4fnjm=qP4x0V_8mbqcm;)}ROCPBaP|bp_At z-ir}Pn!pZ5&OO*pJxgwG{L-0iF{VRI1kYB9iJhspUp}r>M1OpezN`BovF5UN05jqH zP#7o`0Ew6Efi(&BcmH+m-LYu}Q4p(-vG9EF&zz_+?L3tUK#}WT_)!2UK-Rx8tw`;N zhZ~k!&`We(o{4v-Dkz82-aJ3hkJ=96F@3O5yLEnQJcJXTI@@matm%M1usCzNsj+jd(t80Cd9U-@sC)VfiZ6aH@$5#?TV|5nhkpccJjj$u3W}Me3fLz zh#Kd@i9oc7WG1j&qveR(F2{z3@e52{KGlMzVw*kcG1Mvx^j=__&_$NU0>Zj+=Vlvf zI`9>t#7&PCI#w+HjHeP!ptBYCIw2F(ND6;bvVjZW6s43Y7}=^2Q^~!zVte4( z-G;zh@^25HckW(g|IE<|@qO=Gd0$6G%mVj@`Y5VD2Ok0t1qtSo#;A{fXes9DEb2D! znn7{Bn%XE}%;6pvbM;Ze8vasK^p~kWZX^HrU!8QN$+j`r!s1Zl9WIA_1LO=I*+62& z%k^|=cd*|1C^sCIhq_RG7$rJdCY1QrLp?CYnRkKDmR6o&aRdrcdoW%)_MZf+$3C(C zu=&m84Ec|p7jfy;ua^3n22J+%q7opTUcb-)z|D&_A22`W_(z=znVx6|I@Ci?FP>;0 z1PPLm7AjOt2dAK%)sv#GWq`(tMgC#Xi~x`T8^1FUwrz^QSe0}sG|<(-S^Twh;1%L$ z_URJ$<^TeQy$n+Qh$W&vw5%xtF39lzOySX-bDqXoVoPX;iMh;{9Oi}ElVs4N0=r!; zJQr)|I@2oh-I!o`WfP;c-8ESgry^w2}4<6=D3o zy^Uq>6jQ6S~#Jl!slzr_<&R<+@e_SY<8*{US4DjcHk*XBnnY z6|Q-c9+=7eVy?Ml#xyByG1k+r>t#+}0<%;kC1S(l1c4h9#N}b@%N~K;)KSs7vr)A31)1Lkw-3C-J zzHNHqR~cR1f84i@k4=3zc4$iVRtz{L<3PvS^EWME zuH8QiQ z$kYR|EOh`hYqJ=V6GprON>EXD>vey|`s*stR*QtzE2$5|<^q_#geO&+ZP{>In-+sV z>coYRD1wj%yCanPxuuu>62AT~7?HVgNnqNAMu-<K!6 z)fo z`7{hh8J^b|16(fi_!mK_x`>F2cP4Vc+&4UrCl4GP=^N4z#-R7$XoP&!;K1yy6C&`N znTxbS5`C%*mOw&CU1rN0`&|3$)_jDE4bjw^R<6Q_CTHUfBC*TyA-&%}XgmbxVAOd| zYJ$*9%c9XsnC0~mZhQW>U_n)vvOfwyniv*+9?B@=>YF~-%-ECXmrKwM%(!h(n>@&= zOo2Ghu6op5=0!`k4MY4Ugz6aBnN*txJ4(XA0uiw58XOiJXyqizN(%5cY3e=@du$hW z=x*1V_YaO!!XHJKu(Jea37Ghl*Uw2ZZbK1cX-^_Sy{EJ%K`E@@8q&1`HyP8yR05kP z(2~i@Qosi@^RcM!lFO%RrN=i7fF&4OB2+CjHw-uvlJC;hW-Y9e#$yZv$#7Z&Qt{+W z-6deb27KT7ahgFN6uab+6e3$~&a|I{%*I3fEo)tpk!A2nm}MAZ)7dvmDHa>haj8^{ z1rF6wpTeo(VHmn`g|`V&J^9GcTrILlle;s9r-b_G2)*lCx~BV6*r)F0^L_GvSaHf| zmWLct1sZS8I}_Ep;BC4LM)kXvI7iQkfQ~PFAD8l+o00#`5>(M9Zi&1! zzE0Z#&+!ekBR-pbv~lT_b8|CUA^DtU6uno!WDpt*->zMTC6OnC(+jsgtJ>@|pIbe= zuUvIse(mFt0&gDFRG(={TcM}a;c!N7D%+ZZ4<{4o6l8RtxA4nB(r zHJFWip+^l}sa6Ae#G`a%S$3YCY?fyKr%38yG)O)VSa(4%%de>y!Xdl;vuBzwf1z)6 zsKG^|AtY-mks|O)lqbGq{sdSm#%1KK*N^a~IlcdlJ3thwOsMa~Tn{TmDjT_>Hg}oN z7vo5`77ppozhWDWz<3}FapHQA-OZZ}OH(o5gU+ovRIon;YJ?`(Ll6U*lk-He*1)M@ zCxmfFMu4>1iw}ctoBtQzM-!Ul=zfhruGGPiBOb?UJlF3X{khA?#s0gyR|bR`>iB-1 zwH(_yFkcX4mV&ByDU5TY@VD8cqfj!uS|cwCuS{M<_6FrudS6E~J@<48sP&>-qq}|6 zW&reRV{R-|EI!x8Q=8c)KBGKreGLW%O7C9=!tuV%un6nq|`uS#Vvjnk|334D%<6(}ekqtkEMtMS6(>(_RuX1wuhRtu0skse=0B z@(uuVfmI6e>1YT{r92C3XZ&GX3`DMcTa6{bF?B0IL5sj4AtRICRf!t*uLu+^`1)uy zTb9qBnO?DRZzmV&NYYO6;`t1Mq002eemvM1vLG91AQ8aEjdR{?+u(4n6A0UJjNz|z zLRe%fb8t-Co}oz!XVcP;$b=gXs<=M`V)RSb7xF$+Wo@5` zhc3#)7R>4- zG`AdU>KwMKJVbc+r|9Co<}cnU@hh}DZ@U99p@!|t_RWFUY>tuB@dHtsaWd{p2CNSC z#_vN?8Nu9Y%Oc^p2nx8sgsOiVjL`gTz0t!m-Y4V>PVAi$gFGf3oM)?;|4#PKw>-$N zcD|-Bh+yl5{>vy6`-LTm+Kpk)?bB4jZt}W18(>ew{r%x93w`x_?tc>@Exj|SsFAfT zHm_5YR-j^4+$L|wQCiLg> zu&zWn9S@46g5+nm-M4sgnx!Ld>4iB(*j=&#V8~QTihPOtNPp7}*$k-;5T=S>4TIGd zXe^1yrA$%p!0$`z=AJC)dA5#6Uk$|D+91lCO7`U4A>I}6rMUF!;7w|(G7iQ|%Gu9o za9+`W0ZWQzoxpwaN@?)f&5Lll)yl*6DqOi+X}Z!}kEOsf)4?dJaCpb7<8O*s8x#)6`?2CkeunyEQ%r^ab3P`<`^+WAtVSJ|n zzd#KxC(+EWONhZ7Ey&O8v{Of20m53yp9zj-tjeaxkaMyGo;F6$>Stt7Nzmuw%2OJKAdnj;Q`IZY3rgZMFZfsgc~DmJKjOZeC0JkU zCp0w{V%A9M#O`k=D+3VP#w)hbQ!3~1-BE*ay5}Gyb|6KQjS&Dk|Bp77J8{-RH1nl_bSn7d6Hef=LZJ9&UD(URRE=$ z%Zz@y%Xtv!UjOu^(Qyo6lW?F~r{ON1e575cO8|t*0aWKbQ8`Tqk`*z#R`)phAvB}_ z7PCdJVWzg@zkx>>_j%Ih9m`R7Vz!>e)|LPG zr{2?8w~%cZRQI&s!L~~d+yN*nYxP`QO;%JNQsiO96Mx!FqVY)oOTz_ z`u`c03fTP{_6rI4WBx2cNuk*k>iKPNV8c|i>KBh84R_DmfHdoQ$hUnUCTg2isJ%TQ zvw{363m{Ca!G|3epWwsmo~nTqFqL_c`V`@k;gTB#e^a&W>5`A%gLDij%(AgW7O>tb zT1643EDWK6R%lC>BR0U!nVl6+>TxpfB_dM=Nl5O+qrNe+1M!q_P*0^-QnQ$q9YQTW zv?@VooTO#w5~;%+C5oBSUDk9A2q+0%dRB-)2wC)VVM-w%4k&BuJ;CtGG~Akufcs(f zI4RLNwBK&LUOL>e4k1ncv9X18a;}Eq00b@uh&$_UTrJ~~B$DMz*L3x5^Hpte%#6tE zGws&O(B{G>5Q{zyeIDY*yEe>Q4ur)lX-}tpUPO|TsFP7nA=BuK6J+p>DK^4B`rb6L zg|6wxb=0yO(6Mu14Zve4USX}d#7bXMJxM8^PtTf8>K!Y?jkpb^$N?WdY?0ao>Tq4K zK7eJ|3JptfUdtev{FBs6tfR-0_pwA3r2Nq)5bAkWPkka*; zOg^wHtTgwgY7j*!GDlp}1ZD-b?yq^^43b4zAA^Z!pcigvLvbmZ&<-disJS48dMOfHP2l8AKx$lCu=kdXYU*uI$QV zPA|2v3wXyZts=h%IcPBCq3B`fs{YqqV(B{@@p#8{-YDl!_HY1R+6(&e5cR`uFjcQ7rqxR zdX_LLWgG?!-U;xBMD51ytV#jP>#?spv>d%jh&C-KT#LPduNNBdez@8kI|dNv#Cr1~ zlY#s~c2;a!Tmhz5a6WbPL<(D>UU?4!SgBZv*T^@IwRN_no9MS=>Kelj3=I3UE+7A= zIp&q^`xKU8qxFE8t5I>30{^z&+uUfVj1k3KrOqHsRUq2fn%2Y=Zg;}Un^`Sl!6M7d zP`jyUQ?}itv_VN5QSnbKh^6~(v>E^5;6;PPV?zTq#NR0%JuXy5?RuXyk;|9yAcV?~ z09q?M*!HR;=w26mwlc3ZA@tl-9#+;T2ScF?;<0tn^4oW(S6?dV~DDb7JOug&(%c$otFi`bk*~wP~$*qLMsQt`RwA2R>7tGPBayz zTffMtO7Tq*RpqXiYwX4SO-eV^7*wb%kHSoKcpt>mC!Wi3Ib2`^c~B6EY{^2Qo;`%{ zgf@~EG)Z*xlPC)MFRCnaZ~+!!aKh-aqq=`X%!nt$tfTFwj)BcN2QDj~IYQ~;D&=4T zo6~1$B{OA^%!MV?RC&rF1=gDlvsdkbcL<_Sz6(m@`0v4BWbgKb3lGjx*7!GSh*FL&tuvYDZ+KV4 z8X-|E&P@KZm;}NkvJjiC<+Y8{PkPvp!!OD@1<{OYZBrZR2Q3j#)(N_v@`Aa}Z#jG! zEPE9^Bx~e3p~$4O<(wJI-iRY`)Tl(c5t0E5HnR(alBV(` zd-`dn+&eXV0K>`N{MI1a7f(8&FTP)5D09Kv8n&^bAy!eTzh#L4M*kqjISFY=9O)N_ zebOx$mpN?eHBio4?+anVs+uKKIo*IfKf4(3Ir_t2Te%Qv?wa635cT5xWmadWpKR66 zVcT-ptYzX5Y0jUnE`fq+m@R z2^q35%3AV$_o9!(_49$hEAYj1fkl3=uB9afu2eijx~kHM#a3#7+jW=ieY5SrigO^- zQ6J1^?za6Ub`4+<7aeA-cJ0x<^T8gI@k8zzVjaO{mz{!OK77?&=;lk9qmgXVy;BT} z36qWR>f{!{Tb{g>D?QW^IcSm7RS|G=*II0d6$h{&CU!UAS-OC#?8yOtQI1n+8bO0F zuPA}&@o)o|OTpfe+rwO92QjPxY-aiX!+HhPch#t}_g%h{nPT#=Bsnzz<;Z#UdhJ0I zlRf&lNu9N)EGHvEq{O&`M;XgKnGxb-#x0%9g4n<}Z-; zedMa;X`|vNp2>0Lm+{#Uz;??(uE1w8iNXlO@>qH6)1B|8v3UqE z{B0tqHU{5*Vzba}?S8|1Y|i^mA&_Z}1uFS<<7Opyc}#6sI?@_;@uiG6tf*xa{Duu> zQKBn^SJX~=Gf5*t=Hq2+SJtXAw?h@LX~X`@nEuYB`@Tn?klKf}6D=`8`{`n3{?765 zS?ZCd_DuW*dPgwKJ^c?0VI*UrR#`P$J8$u!BvLulHl!BBAP z@Ux}rGaQX5*l&Ob)@Xd_5B0lC)%o|bCuWVTIxm+cJHhA>bazzvU`i{8Z0}Ia8&VTS zq%=2{-{sw5^K~MhA@&#KONkvtw#ZNis=csyxk|8gy@`cI)Svx3 zwjh!2Fg^kCK6Iobldn-Lo=wq6uK$+mG98L(z75=Qq|AT;(qc)GV~JM7cLwGfM8tbT zu_yA3dMuX7JIGMR#Ls;G-N(WsNS%@!oyaBmGdy?(OZQ+zT1SwjNsTP5pt}dS2ed%@ zI*54s> zV;mmM(`>DZifGQor<_uWQ=)R^s^iWq`yQeKIAkl}SOY`JZW{@w1hsvg`mxalGe>m9 zGHrxdG@hR~aePrg%JvQuUu9)4KTz}Wh(vBucB$lk7rkeM(PI;m6Um(&LEveyGfdLh zQGeeo3fi?^Pnmleu{;kP>FPr$#io@!rG5#f$^T||XSgHRlR)Zw`FOKUb03bhtap3k z09yiZMy({T=g2*jg$mFXtQCs61h7LVx;WfA?iEBc_w>iHTF_!1kKaS;wxf2P1&LuY zMh`lowF|v3jFACq+i}TTls|N|O4$K;E8=QrUiMA7Oo^4RtH1oJK_Y7>2i%)`i=^FK zVuShW-?aRr^7?mKTT3hj??TYN@R4-}aewHa$4>Gh%5$8^8=p$%p87X^Cni=E8iWuh zG_XU$6Q%(y35LciR$LPu_VELY6&K3Ff*rU%Eo_#_KJjgjO1~<=JG63-*Gsc^u!0OW zk0JK2(z#WQY;vUv`@iX#>Dvn2D(AWHoK%;P5i$Fn5?6H=`A2B-g!zlzw+yr2hvT@s zobPc_r!xJ)KQ@~<$3K6UpuM{EE3a-5jyw_fy=bfcCiUL8WbotB0{XMyg$TnMoh=kV zdv01B3mlR#16G@ZqZXky`T_GuZSL962N4c9;Y)>B*y=@joz&FJF2NB&@4_iM?6KqQ z^%gdb1k_ez4l+$yk7^B{(#%ozZ83=n$S1n{*09Y0UBqG#Hxp zlHyasqI9xv=TrV13cmm-)Q>|%F>OL3nx7?JBRM1QWMcLMJWz;1tKXl06MtTwx*E)1 zY`0!k_`kJTNF`(H`qQ?mhrowb8=T{8>N&QOToXH$g69SY?`Tp&E|CaxX><+=$C92| zbzZ}pQV+R{>>QwN8%_TGdKandAz^# z;(+3ogbIkzy%z-bQGr$}J)b-#5$G%}vlYHJAss3B!oY2W+s~hP%MSWnnp;!X?Y^Kz z@tW3_2cM4Y+_suoxW%V2pWx#8??r9XOO@{2@t*WNoBwPG^GxGw4>qGYk<{CW9lgH| z%(#{wQYC)NzxUn|$JFqysGG|Z7?>-}2gZi}cD%=b zm6|G0HkRRb2S}UdE z9{$pkmuqe8;=d(=-lYn?^w##AU!QkW%UKkW^Rcdm+s#Q>wm3k#c#KTiMwvSQUzP#w;Y!sA|Yui+?CC zs_YDz&~s>cfIwYmfnVjVgw60FqwYl}0)64M5BeT@VZeL?AcTeX5s^%Z%L`qR%&+Ml)8swO2-~j$ctbj)WnEp*CM4By*f7sf|Yl)cqY$1n@{A#pYR}ZYeV05&$g&K`&B0w%sF91SDm=Jk09V*0&WTl znbYMF;$yqb3xAiW5~}PoWG2M-A&XgAiqK`NG8^f$CM8hx?jl$Nse%e}b^*^F0-jhs zk6HLoEIrn-|9Ax72hDL6y=Z`o&2X02PpZQ(f8H9DOa1625de8I-0K}Z@Si_Az1+5C zoaQ}wq&6og(>op1!=P#J-fN-<$+$DMpWiOqmmPrO@Op>gX@W}Jz71JDQCJ*oSCdZe zYcFGjbThMgw>E9l=Ayit<1=Wqh6Vih6FG@D8Arcn_Z3q(+*KH}lVZhk{$Y@WPHjQa z6LJJmc&oF%mdQZyVQzm!3>}MO4KZ!dE>h9DKS7G(hCcv;%XV65qrA-v_XiDORm7y6 zAz=1z><*#Mhnw?#7_u$mmR}{gL`)FPPc9NfkhWk&=HFMBVvR)bl>*T?c%R8hp#U8n~QA*dc zN2$Lp*SdttkkMt}T;^DcH8i*Z3bKU~lT@M(!?MNK9l=S=z3D^q84>1F%< zoufqwvFICHJFkl?oOquiUGYh8J|Fbhk_Uf~DCmr5XXvK++H_$IT|?&77&n zfh#E@+<#M!n32<_Y0ubpErmuTL;uD9=4S<|eowKNw_L8aw^uSzJ&+KeJW54{BsaWi zt;y2ZM9V2_B$L`WtjoxE9il+BLXMFEHRQjWPGQ4VdT{#xw^QTP@#EwSps+^o6pAed z{c}rKtJMf({XZwu$PCnk3x&>cJ*;w+r3uXVXLt zmDa$W7nwPg7!4$z=?*qwW<;}c8gT>1%m;S8Lh|zwPqOS20GuW<+EjA^Cv}`Kx zLtGh-Lf#D%#!z4mS^`4IU213ur*f$+sI&;>p_wVQy{M%SxsdSL+GJ=6Nz#$Z!P{p) zzLRQ>Om_73x^J$mpb-?(;KpMW*h&i8e|Y*RFo2AZ97!bA2VZ$i4!TzoRF}%mXOZ-S zpgDO<_AG5eztBH&RpV79;zaSp25oMsVGf9g-Kc0s)#M1}6*yEC6<)Tna_83xpf512 z)}2FR!Zl98FMvO}JTpN`jyyxZn+8okd|Hq90j`4$2klOLzW=CD zgAd_$28mC{;rQB}W(f#=%mj{U;rJb~$OVuV1LAv!d0{+HjGlBd1^iQZ3Z1+yH`!E_ zlTUpZ8xDZ9oz8;h=xAOR*qRclTX=uIHJ9QKw*sD94DHf`fVRYKIw8{&?xdxcE{L%tDM{nMtiC!3m)Wo(9ACu-e1Y7#ly+A}wxPHDg zZg?0}yjgOcA?1K$5Z9R1Q3I?Xq)j@@Wpf@_BA_n?6@dHphQ% zKu}BlMnBMXd)Sx@ZNnT~p)E%r@uNFY-FLC8Ca=(WWYv*)XtgT%b0H&gsc2^_8D<}h zusgf&ScB1~+Yy|yI&G1#mnWW4km87u@EF|Gf6B0!U!~>iS=@)8%^mD~VD;Pk(_C46S2F7+B0E%D{WZzNMg|CJJ&yNr@IIfN1tg2c2XyHBhMOg~-6a zOAkT(6CvfaJ5i>12DhW!LmAtiDoW~-*e!0`79wN94)vV*rMAJNt-f>!L7ZHV^eY@H`wO_8xY%>(|^cYLOPq#soN41wz7uhJ`(bkhNi zR_`BqZZi=NA;zJjd2Q^+snyV0Lc=98uQ+i38(?X?iDos;fQp+^V{efGK5u<3SV#`&e9C0j=nv~D3_G;v zdt(>yW+lsZ2FP`q*^)@Iv8;BFMg9mM%(>@!*at~!DRb``@QWf}ajUc~*D`Q{IqJ>x zz~igjE=V5>Tr!5cw05sMWt0dI;AN21mc@6DDP5~OmAyR~ro%RNndC;Yl+yLybtG#j zxmYZ+D~5p0IXStYh$ETsI>-VrOySGwn;+n9f&|yCj%ciEicU&x_$LR7G}9tpSI z#-%ugzb78Y7yqk?-D6xC+T(E>g;Fv7pbu#Jr~SR0tA3q?%67P&aWW@7OLpSx>f8wO z<5x3ga2s1zGuT^<4g5El^|Zsx5Ad9)s2gOPkU8JqJtQb}v4#f%#FV9j0!3_68buPf zlRw*Pjzc+}%?$tP<6*M>!}NOKJWe!#Ch?>%d<~FwGNPGWWw@gV!{8;`zqWWJ-!9v6 z!on;_xEnHGWPaZ_v;}~g8-kOHSQ(7W4Dq5r3Y{h_7$P$b=CDTM8G)-H7yU`o|Xdwf;mz;M?00l?L;TbF>8i%)6$cit~iq!Q1_^70X#W=w;DA z-xO845r`iKsn(xK0H5!_;2+I$ihiwmxl0NX#ac>VmC*n4@S>-c@pRG8@wykCx&b59 zi6HWKdPw@x;dk7z{+_U$f|ki4IcZkuyJui*0cli>Rz$*KbcHwlGi!N)zHDkMi+|`? z_E6Pgv;iA`96oj%5?&h{>d%u)mKIYTI8rpZY2M9<030A!$FGK(Q6lNxsLnOLl{f_B z4VP7g;lT)YUXwK?so!UUi=!?wR|>||wfIhecX_|yKuI#WI;|M@!0jyv)Z5Q%|UJrhNCOMMsXjT#d2zA3$ScWnBCU@ ze2p&N%EkH4HhCOm*Y&%hE_aXaFtU{!u_dhNE~#br#Jo!JQp>dgXEPjg+)Oqj3S(xr$#<u(3Q@@;A+5#RDl>d+FE?8yvkPr@J*mX)Oe;oz}rtg89%yTuoS$);L3 zUO>BLkC+FK!8tTxk#43Ip9C=14GtUnASi$7>L^Sw1K=@1VytUYGPeqXBSdj1`JSw@ zvJA1U`v2@y%%q0+ZbyNKNsTYtwTCQAT`5EgAkA0kM6kwKA$@&te07%f`5}d_6t}Wx z1CK<9jn%wfMZBpK!P6p<+0MLqLS_e^M?z#geRlLMcqj4I5!yaNE6^1i6C)Vt0_U+gKtAZdFW^3pf8G$;3+qId}QKBPYiA(UiIt;t@M4EK2 zY3ns-JKhsV#aQ6b%}hNkK3VepXExIPPC<_w?iC>V%BoV`|0R~a7qu}yjFGjCEi%bo zlu~c0g{*VDYG$Be^INKdLaYeC5Lk6d{Oufx)!!V_5We_ld$o*_Ca3>ad>UOglio6A z1jRKZ0?l+L5MKPiLb1D?`210Bk_N@ET5dxfBCfnY|Nm=txYJer{lZ8w`XVwT$^FMt zYx^1Gk`VuicS$8BncLPpr!4UtVWEXC$qRwpd{ok{B77yCk3~P~o3Yj>z8@@Prhx<$ zwdM!y_~6opLLJ&_)t`zEA_0=+NgIrCuQtg7|N2WS?ho@|VQP+r2CX+{&~(#3XLn4_ z``(CgElbroW@~EoP}0e$+~H5MUJv|OO!9MU?wzlm1qWp_i&zb*DaS6a#bR6DZnMJE zuFrB@+BHN2)ftS2Md5zolV4znvDKw_?!;iKa>QUe(!ce*NiZGjJn>Gi$(1_O9=9Q@H#aKyS&YoUB&QBpw-h3GuDh!i|c*L|+4#gbZ~axp4~gX~f1| z410gY!5O@7oadlPxV?^~iC7P7pH6(BgwQ`-6y7JR5dnk4%#GkP{wYZgqjS4JB(0_N z%9jsGzru#z7|x+*#tDxojYmWnhPX>MK(Ou3Li#{>HydMG(*0=?eT#gg9v^m;W?~#j z7cLC^r(dc)qHf`ZNDxVqGho=v*8&<; z+lK`*J=Hc8V#8KtZEgwmeqBZ4z@sC)`7m;TRPK5@{erF{rq7|92G_-zdIdUz$rU4n zOJC@V5-+D_niqr6&2!AnU46$dFzyysfQq;xgAl9dk5mc!&2SP?4Xf6QtJx%Jdd2o( z2+OXJa=-VWq=fek$%mhW10Ao=6`aQ>&iZ4-b@utYL#11GWh_vU-C*iMtUS&bv+P4| ztme+;>#p)>5b5M&?lM`(qfa9yO~jB)i#~{!_E3tUIOn-3-yj4(Dl5jnsUJRVkbNrB zqqqhB7*-J%0h}wlCYcN>qIQ1Z#{4*kh1tVmdVjqbKQMlvUY;f4<=2 zCYw6}@s~80JM8LDExbMnPWiwUg9WcMC-U`bKrc`V$dY;_BEiMGD@z>OpJYh0PCMwcC`yXzDX!5Y%Yd zE(U$KEdaAvyqj@8Se?W@J>BPMSYA2-Kv#l|8$6yoM;9?6tG1bZr=qY7@`(7tv!h5{ z^CTCUkv@^fhStkDoO#+_9{ki}$Cb6+RP9f!3%Fxz7PVh~Y5bsWWXbW+x(Ii3r7Wot zUvwyzdX|QoSb6hda!_WfESvM1?>+xG zQdoiulzLMSrxXM*qNb@KK)M`106dg-?oNVGUAjE@?EKrH!1J_|NP$!N*G=+BVnK9a z-3j~TP1Yh)^Cgo#gmXk!gv)XB(DJ^i#Wo(Mix|>(a^C{R*QeII3%p^E0;xK>p|;R& z?S+u^n1XJu)+NS^9l+_L9SbXi(a!MkN5nUyE8UWmlgA8z`i`K!9Tk&H9&`%c`11^c z6MYXH+=3bZ%I4jKU>TC{<8Jvya@p4!$DrORzKxtQo4JB}aX9MJB(@GmO)ZjjX4I8C zRP1JtM&seW%yZ^unz-_{#Ap6$(_9WI=E3Pb+A0b$wu>i>J2Kk~grg5auo<}yJJ#U} zAeKv~9pz5f3@LP`&{$MC5TzhS50gwX)F-U_8BHH8tnTfb%IJnbxSD618zJ2c#Qu@$?_mHw2O=~Ix}ryO8)UzOg3eGI>+Tzcj!ZtjOTFaYZsMQCpJ@Hzs_u< z8~n`)fOCBOCd2--{wkWYia;b{p&S3VUi^F{l5T~}lf;X`=K}EoC&!T>bgL6aE59Jb zoaiO0!hSQ5b}^*@$6o?{L!Z9V+~aRj2J+G=G-nUcIZ=XnnL(a&Tc{46tPG#O>E z-Z7jr>dQMS)hL^B#^q|AE68;2=8p2ZUeG5AD3EcTEYHq@i2}3TJ~a&sDK6XncezXc zp8X4CkhxpC2qE@@cj6|}R^9&sg$eLWwXvZrigi|Zk^Y5Jqhc$=K+&9xYE-=K2(VnQ z6QD;P^5{GVAm^vNt{kZsxGD?bV}IfZWviOF`Q4-2r*trTaw!Zm3C z)P5sS2ML~UEBcmzN7^ATpkv7Hw4CAd3SuXf{dbSi_#Avd9LNQggu-qcPTQE7P1Hxi z<%u(XfIUw?L2*zL$EJ8n5COW>z94sYpmZoPa6^=JrdiP5-3u%`kUbLC;|Re~dvR-} z=_3XQ4wSc>YzC}^SuIX^plOWel1i2J%$?a!SR}|=2q;fXitA{{F4J0uws89s8#4l|C!1N7!9;rlEC{_|#1DoV0nLEPMOWgY zJ|>_YsE0G|*7Fc8mHQi$GD`BHaB^r{hD%AxUFJaXdaUuXk>5>EC+-h+yQ-e~(-eY@WlKUATHlGR&VLa85;JkUL}Zp+M_9`!@G z+1-JKo;=rq%U_dJtCwC1dFcmjt7|&X3bV&e5$+2Y^RapqX(Y2L@)qFAc=WyD+A}9>Zj-etG;}L~&4b zs~y|_40)y;he8tezww*qft_IK$xqS%m4%7h7qlPcGXr&;-n;kykqU!RTv%U}$bIGv zQ0rqy)DCl+W(}*sA>yDU^GJtelVdw%kzzb;q1u8ONmaay_o)DHPB=Dy;e!`?P=A-+ zBV#n^Do{nTjcBWpX59;IwYC~FDH6A2F7s{*FExDr4izX6(>Z(2P($D+f(!@2&5ArK z@BYbv(=;IaDL0>RA(nD2Nkz+IzmW2cCPOa#GoSeaGVtAAZ3i$rwJ&81&-fv`d(V;W zp0rOfPzP`?rR)=+bww(1BRrlfu=_BtS5-CTap!k@7B$)$a8?t0vh4OnE+G7T-x*!# zpT5yp$50y&MB~!x3M{`~$(g~cPW~|!uCTgRk|hJjRO}yYNG_`uhyf@BsQrfzbV{CJ z{6?SLk$+~oL!m?}HZ<6@m5V*RSSh{7&`TbmkUU6pGAS5)n6<~Jp=z9`e!!~g#)CP( z=G5Sp9vB#pEA|=%eA82fmPGjr>zJwOp_Ls0Il?kD^U0uQk+bDlx21^YvZ(I~(fDykFz_Z;wX zGNFfveshp_5QH&i2{Tb=UU}Pnqv#o!vH;QA^^VK_YLX!^B1-pJ988;UNs7X^tI#Tu zKXV%GoMoi}uMnw1tBlrr;Ko8Y$O_kXIQmyB>#9>cs0U|?7~8aE5XHe_$DPo!`@!Ok zJJM?=67Ao^wtceIn*)84+CwrB@$j-QnRC8?d!SYLs3)Hv&L@-Y_uiXw$CI0B}Th ztNjXv8J+(|!PK(-rPjSQ>6~1Cu#_d}ZZxkTQ=T^uO08wQ<1ve1CP;iH5^D@`@l2I* z`DV#c6`~3algG}ns3X0GiCGmNhAu_%3klBq;l&JkTPn-@?I+2qHB8tbN!}poCf>9nwx9-# z^WEpKi`7ljTjl1#?H`3z=avSR7FIdYUvMH{vIGN^V5p+7VfaIDfysOhf)WzXmP)n? z5@HwmjvnVU$KmmMCA}&!rSwxF>&>s@nqDIS*MwZ1Z-Y#X^wS6ffr6k?)P1x)H- z{>6wNv`bM_Y(j&6XGPZSB@0HD?90~GUJ=}A&d@KR>OgpD(muS!F&;CfsCJl^fb}m& z7h=O;lM~cR1(zc9l8ZZ_@SfRA_Vh%-7jqm?MM*{&vk8zDzQ)CLOj%xSU^W^u5pY;7 zBG8yPv4r8#1b%8vQb(X$WeZhBD<1ksrK!M3@Y)%aHZml9QzU zb|15~`sqV-NRo7}c1aTrnGmCug*OUDeW>l*_>ZGS9)i$%e_C)^5VlPn?U%;6<|;|u zqt%PEZaVIgOScQmXPscOx`OU-Zi)WHf8)326K=)w@5*n|G@g|hn?-A#h-Rx7B~RV& zz2LNG@d4y!^JRpUX~4car>khAS|JQ1dkKdW5(bc#7&9`AH_=o6;m&hS%V9$d6Aq|Q zUn?Q?eow@%z$dRVgmzvh|lE14_E;MBb+{etVNvUg2SEMHltlXo#b* zs7jSCyj8cTV5cut^wWm@HHWhN6y>JKSEQZz0b8rb@qB^ zit&MdsfT%iD1*Pk$b|`5MX%}y-^)ci$ps&c#;i*2f_X)N+gvD!xeNN2w;HCf(zgOj`%Hv zWgP5q+X1N=(^#`1h$*!~-tJcJa)v@~Ba)S~TR?Gd{T4GA(f5Ily<6M*`C{1uS`1zt za3m988^2BN{SIQ+H3xLjz7hb8^uxmA1e!!uG^d^7p2Rk&k@VgyR+kWPM_(#vkHXN1 z|JWsQVcmwiS0vhxl!kJjD37~}G`&mNnYHQ=>tNA@MvkHz)f)83FdXIJt4dEL6Ge+y zW~GWcNmkwwin?G;Xlm7U*l=loe!uqnQLL$;))G7jqmYNXRAlStYCW>9>w1uyxjI~E zs0;LK0#HTg@t(~B$S0t4do@PyPkfS!nj{h#2n_bN;gP^j-n(uR#DtCGO5F6{;f47w zPuo{N-rb=_)Hg$xH1>C%g`gMmd-W3?jwc22k0-9~bOY}Mqgwi%(MMiy{41EPf8%`s z+w~PUVbNM3D4tS@cqwNdC3ueM8iY}Bax$zOCw)^G`1KIg5k2ay6M4>q zQVWr4%;v*Z2bY$ossaAIV6h!JRw+BD1fWHm7)Py*-PyR+NYD+ezrrp(ef2u4G_TWp zAT9i&Z|x0LW|9E(pA)&&ABR4hamV`?ZI+~SrB1Taa|)-?3^!?KvdYEcG$Eg6zXl5h z=SGm;9=1s7`&lMtmr(#ypv5Es@$J;hSjYx!-Q-3l-oQAmj0k}*GvbQYYmj~$N24c> z4YEJ1Rt-yQ6Wd@$wd9TcrV$=G67QLJqw4?LM0~+&&Ud*$MenR&uc&iTNrEaIIZY_L zp6CdJ6=O)0LaE&X*VoBp@(_}O7K>5ZE4u4gis2GCB%xl=Lv88R-V#GVbEKQf?uvx z++IU#tPyk(z-;v=r7Scg{aysslns2ga5V}{ESeq0`nbq^0*d~|<6__?eFOEs<-Y}p z;P*22Z)_eX6Qy=9BfzHIRVMTva4o}EiFi>8q05VM?sHKrwh;uTUMq>X&`y?4{B*kk zlY@4lo+gIG{I11iVgivqyDs<)<}p>@)R*_ISK{yPjiFgvBe8BUKUmMLU@b`rJyR!K z5SIDgwM&tZKFUP|4tdQbg z>p()7Zmx)cB#i@X*3WQF`AQ~DfPTLebMFGUy#nnsL*h-fkJ&X=DBxiPbc2&#HpsFQ zK~nbKKZ7iG>cLjIM=oycPNWZFWxf>Hqforqv@1r{ns8ScsTKx}f@ zz`Q{Nu4d>1aL+}&wi~1*it23|@xmlb&>9s7RA_r!+I`Z=V)pOMh&4i%E@|xti%-Rr zg$)f&$UNtG6=*0^|5Xr9ds><7wbj5#qg0wG6jhx|zjxRBSf*8>n;l7n8mQN97yt=O zVK6J1)Jwtuy&=(<+M&P1e#lKzf4nr@H+1%2O4p%&9k`akXb94#fRiZCIBvbm;|a}H z{kEkALVn_M?Duz1r1fa(6}(bBwEg*|dI{$6ly7JMhATrYE@SD(6|DZ$H5~q6^cns2Nv=GR|#+iYSA5hT!|C#F6L(-_vUK>lXct&Gw5sQZBJj3L6ZOk6Y^rfQWS#N`kL7^}Q-8`5 zDlsXW^*=bB7AoJD$FKsdX0TsB>&nog+HXvq0>w+KufdxI)JHOSR&QKCg9SD%jWA|3 zwKIfG(~)>MgPK9vtq-$v+35V^ubB|ayvC{t2o-}D2oVntR2uTP0mvhjkQtJ~WkJWG zqmN`Srds96U{8%%hj01$s0d^A4&JVab8!iES zXrw#CHLcK){la0ETxVMEqn<(+;Eu?THli<25?FgG4P1vS9?U3-!Hpq z`x1)dbJOd14?^X9D+MMZxZ%BWbeYc7=Gyeq3BGROQ!XpHQ!exm7{;MAECS4%#ll7` zLiyGMIHIT&Tu=9}7$}RN5P-j~RX|@(b-1zi^C(!oseRG_>j$^lq*qgwJu zrVgFpSIi^bFAkShxpC=&R=kJ;xV&!YnjYEa<~bRkj6cX^1!x0SIifNdRpKa|1S@ru z=)+i{rsd893u8i-1Z!n2;T^o=V@_2^OZQI%MWVJD#|Ns7iKBJmBK5^+nIo#Pa%4XSzRK!frwMxGyhATJo63678VMC7 z)DO)jjT>1EOPUt(lKtI6Es`U@Osui4W3Qr-26yP`9oiv)+4q{~>(2`1Ku#*(&t=vD zuh)vH@E^W07{5Ta@1U*efG@r1Z;`yOY@q|el#JjAgIR|U7f=6ym#fm^UGf34MZ9KY zX1qhQ^$;MhSpGus@(MsM58q2)sNTPWG^y&p1C!9P@B8A5I zw5^i9M>b}^fp1%3yld`0-sm_*rI8Jht2lMXSiN}CSiHUEF|Mp*x!+3OJe(E+Q_>%Zv5W1A zsh|(0jP9V8|5%inp*<*UtOFku!PEZwZH+*8c8C>bIa3y(GoWvB3+xq~Jla;9Y?J*A z3H1uZqpnL&D><66fq5neAd*Wc^vh4L@U;5(px3?oC%xmnXdZ+GVx_=7Jb>XH^^08l}XP?|W z<(!eclixxahi~<9l4h-0cyIr5BX}CiGnOk%UxTVRSOJmZ;|vk#?LyKes&GQPCM-*I!&x6ELLJ4zrF>{{U(0)W1;$Vx z%dk$<*4Ym2DeJ<6Mn_xzi5QtXPdSSIG?;qd;+v#@w!W4@4IZQxROug_7=?ijD^lpk(@%I(l( zC^V7AmxJTtZIcoy>lVX8THv~1Y8jGu$I+Q}YewTuqCrVrx2km0N$?*~Ertb1 z>kiZwpB2H_%?pMz5W~)tAjq1=whVVWK#2QxnGIQ4NNfV?9sSW_g+{xqwuPNmL}A3% zd>x7Kmo^F+!+oLENR=`5#>lHl*JhcKeISY)-8V=OWf?SRFUSy7el7x(zNkEmmBQLZ zVV5ynU{pP50ReTuKQt0sS;Z%D9e*c*lzjNO5ZfAB=BToLXGJs4-Kxwl>`+500k;uo zD%^`%tnm+amMB5L(JEz41qBeIlGITV3f~VAGjTb8tq%}j8H|#ZjAAqJdnL$`YzCh& z&Z4r&$V(t6%2|7|{VwB32&L*H(jKqB=PpY=x$QlwMCOVx#dFmaz-nfCF$b5I8Y9k# z$XH2S4d%f?@pEI4VdZ^0wUw2b>)yJJg*IHCrLsr6j6&%2+_M-1W_nAy63rYIy(%ck z_^aBP^9>WS?mAosWXSGyUva@?t#$-mJSaqwDsclrhbjExkddgC zfWqsuBb~0&)7H;`rQ6oMkZd2Y#q+n@Qrw~f;nd!a=J0LnnRi=w7kRgab5YF0CXS>R zWQf^bG%@ei2jsMn>AI_iC4Or~51MYtS*50&BL+h2;+#b%;|jR~pc6ApI{Wsc_6A51 zD&0}Sg)gmKt^sXNJ~Pd;1T9OZ#f1KOIR=qfejq0<8Glk+ zq0vJOrl#|JzJidhEp&30yppFe?t_zab3=OX2Om;n2_ce&9;1DiHv>tuxT;xdDAXDjc1S z8oSq~AwaKVF@gTSoiLaA)hZKQ%$m|_I>|GM(8QORekwEaV2RLU+klNlp z+0E_i3tD;@RY9FH>mo~1B#2X-Dh>c+2 zEGSNEt*m+$3w?WNi>c2pi)Yi+Za6#)sV(N;BrC+_KM*d4p`R*q)yh4m9Ic1DcDFe2 zH6OS_@~d`9XU&lPuzubvPm=Kcr!E)#ZXYiqlAE>$IB>4_Y|2?ATJ9H8sGRnRXRL+X z<6bKxUl!%*NX0%5W-;rRF-J~I5+lm|suRng5Kkf#f}}gvdryA~Da_aUuVJ)?0-l^e zYp(~S|DS-XSaZON#_cW=!+uTjPEek|7ZF%0K9rY|T>&nT0%ypZQBkPKIohSWb{>_K z+MH(j=@`_wW{ve~OQa^$7jzIZ`X^xCovCJy$7H!vN`t@_1u!FE|2Umx{FlhZSX^GU z3g5+xgR+@Wm^i{O#r&Qf20z-tYA7cwaR~l{l1YJO`}d-%xRk6^Nl)jpf26Izg|H@> zxQ?ld?pv?XBYo5Py38OlsN-x{)ZeUvAQi@zU$t93s`J1Mw!6FND^_l2I_u zK+W$Gb|u#Yiy*F?Z#LT8xom}4@FY##4gh&Vg}>(VWa{4u+?5jOJ#6xuH-|(U)TuS` zZEY;JP-p%v$F$@4)Zd@skoK?^#5KJWOpOV-7@o_x6^aoNtU)LS@ED_*_4HQri7#N_ zzYKa8Fn(j>dN*YgVMlifG%AAy&|dqp4NoovkvsifU&{D!?Z*92jLfMmwF_NjLtJgj^%ROYOgM6+=h zQn?CXzPRY$u%19Jv=1>tIoD@uI4I09M2(G9B_zdNm_qT-r!v08lcDusP2t9I(8$&6 zg9|JDv8RAKy67|PTb9#0o3lT3d0~x)v-)DR{rqXs&#$K7oY$GO)A&CvlpjH)o*=X#_Xx+Lz8CJ z6{1_=mz>Hdj*tAJy;StMH>3>(T`t#oBUkHJJ(uZT`=aZ$>B=}2;i8OW0d#pX_V#wW zGPg@V|F{&7GcB5{*J>h7QdsHweGLf!oWj^qhdK473oRzNI^DediaP|I=_w~US2~ou zt~(}C?=>lgAd}AOpL>C9umk*_V|u={X0ue_A0B$6gx;woKiOQ@c&+iC^R>ZZP)U!q z*ETd(|Ec+OZ|703=qdjg_w0Y^6%*4mQVJX|DY4?Hw!t8GGN?NBr^qY`x+0@&l}&7P zC`#4?kCM~SW`Y;~QGhIiJliyz(X`{DZCuRUV9ZPq3NF@NB>f=^V&NUDrz6pmI18?m zvK;4Lv4dB)_lriULKMcMT13|s+dLA6))qmlr;%u3j9H}Sq{wp3Z`bwtZSrC zaOWUu``m#YG=07~=y`(_GKpy0&8=<%_n{GD+Fs1j^j}x9^X59Ir}oItK!dc^VP2Yt zgS-xJje{DSz=;`vCh478|hB367YEqD+e8J)C)V$i!T*j+lpNaQNxNSsL)I3Kl(U&UX$VK&`Lc-qXDz z+Tn5yG4$Hrc8}=7OMHOuNu||o6p<3BYw1~yeR>C^p-HnXfajvNhmKiJ8<&}9)g4Rz z1|RR4^u=eg{I1h@InahzBUiP8wFk=;7s|4;G94sOwArw%kBTQW2xyc?EpFT z>W~?@!%B_G-u}o8o+3B69Jwd7(vbuU{%od$>8yq$4-*n8vmQ+hljJIFX1Pkb zlbKm-_<_~=nWx^#CaV7W!lNfJ5{e~6eBaF*4Gw&BKem+tvvS@GgWjGAGJHb zQhZL83G1&ul@TO!-R<8Yr+Gyk6d{KZre{hV%;bm*vrN!)GKa~`sICHUh3Y4wLyq$sJYXCHy*!Be6a0-O9rnFZj zM!+GxVBTs>R7+HPkWTUdY7nA5G0P27r%RdS5p|oB{%~Co z{T7&daQ+iq@n=;OU`nMh;i~HxNN4xbSgq5lD09c>*ZpTw+?dR-!-&ioNlVSREwE}X zs;WN5&;;yn)H1058O4&zp&w&9AQi1a1ArEPCKyqOJ0?!BL zHr$Naim5DpqzPvA^&TBZzo4yT@*`&WytZ7Ps)q&)w`?3h7xE;5$u$(F)L&zXfu@ex zsjs+?()dxrKq`EuxxPf&qK940h$B>+;FjxsL&1G0WZP#16*;)8&AZ-V;Xay!@j{oL zrz;>WWx~^qyOw?V>Gx+od&z3cv5(iKT15>V%8ovv|CPU`E8UfnHeT?rIr!0w*7Aeb zCi#X9ufeZ6{Igj)RD7v@d(wf=KSu6d(pI35$t=#CQMh$yK4aJut{?ZB{9ItcM{i0> zcjyJuFGWJSMom)v)1>Zipu()-Z9ztI9zrWlGw~KU^&|ip8Jm$7(8_XC92H?nn8R(Q6`=zyX9mx@~Q*N>J|{@ae`$t7%_Q( zhAw9g>W$$xvu9ZDH1Gko@6pde6Ta;;Cp=sNCYpd=v54PLlcs^`=8pXWg*Re1lAFE~ z3>NZ{M{84@`-12UeDVie@_zqj!t*6?0mG8CzkpL~5q zaWMb`IASJy38;df&*o}>+d4;&L%HmoF~e3kD2B5-rW-bDurC+m6Knulecbq2DN?8V zb;c*WEuJjGhq8Ji!Ln$gadjW|2I8D|1aY}*8y(B73KBS|tktrruDsxSDHEUjTjx%} zrN?4=@q@(xs`gno7c7?RIghBxhSZ_!9$st#-+IHg3P}fwqT5HIqGgd$?$#h|BozmN z)3MQLP`O}%bc_M#v10##^ZK#%10F2P^WCw3@7kx4{HQs#>S49{^9Q%xgQWL;{t@C( z#XxUA2J#2Zr<{j&DK$3Uu-ZXa<%K`^wLPrZ^Ip=aP6D5SVs8fGZ)BzP&ceB}O5-j1 zUzS}J9sn(;!<(V74jaQ0gQ1H{8ei*v?Y(?5#yqs9FCh`B zI?v;GwVMYtI_lMHjKDA8U^%+w*Z3P0ki*h#@t7MBfZ29(wPp`5xc!3&cJuGUOLgAY zi9oBuT|)-81FY^_;NMej&CMk6R z@!S;&qC7w>gFs8#pF&hZzTJ*1mzAwE@wDj>sTYh!SN_K;`%*%z={??eKc(-K{^ zO2OFD3u%#KL9;zj$%+hS_pl{SE!V{);z|n?CjCRaDVz%kvA&1b~p}l}YbgS;3l05U5#{{xZAi%*u%^t%ZW#_u*yg-Albu zvo(zEVy77n3^xBzK}SwsGy%xthHNG}AaNh^I};yUh13w?dKV=o2WqcsUGXSAf#DJl z9wVjKdL7{aV0)oN$M4?Q#{gQu6i5r19@Tc~lkVF6Xk!gwM$tiHX^7fAiNogvvPNk- zYGwM&ixCvf#k3`qwXs+>|3W|;aFfr3N6KsE<6w>Ej}>3uCmBE0_|DI{N)2-gq!9zL z-HHnCPSHH4Z=G>TQb>nX{qQ~#s1{?^NjOyb=d>-ub5wYq4GGdNE(Zmlohg%w`3jg82MPpKQVp4z-hI*;!s-aU7o1!)kd9_)k}Xv z2qc96{ZA$SJmhf@@*#spm6movaz3ss5V?qgUH@H{@jX5iEl1dRpmw9l05OLGCNbK; zZ=!=xfsdd*Ii*{y^) z$Ly#Bq(P9go8o=3f9N2vtHoqXX~*uw8HB+YJ>`=}9Pe{RoaT~X1+}iY$7{j(@I%U> zI`*=8*6h_zBFP1!Rj=+=4T}PfOS%=|zy9DR?j&u zt?*Y+G$bK|A6xd16b;Xm&(w)71hZHSQiSZAF%7C=QzmvMDy@gSj{>7_$khgmT&vQ9 z{6?%!{-TAav3YlIguE4#xdo-3?-tlG&xPFA6>9#GBQt9Ov;->?FUPbT7~_9bDWO#X zWv19>+iz*Xt>M>ZYtVAd3X|pQm^E}8%uq%0W$dN7w38Df&iQ=?+teaTBLJKK%9Wtq zn8C>aVW4%q8IaflZ3LEo`xT;QD|Ek6{$4Ur2$TRuUY=J^oFy;Xb}G4t zTr=%vxzcm9Yz7Rn)#WmW|tsu<;xVLC^b;#!T0C|^Hb@0-x z4^O%1ICbOw1F!R;{`?(?b=aX1Uhnea!7i|-v&E(b#=9#$87&K%Gw%LhGDe6Do+PKX zC(38T@f;5YLEYH%Z|{s0 z*r=1}5fFRNWuXR%n1zH5#dvYHf!?zyRnL79LC6JLUySLS;gcxa`8FT}8ekCKme&X*q2M6Io^wNTm&sIO5&j^QM z3E^p!DNG;%&#G8HkCRc>>m`125nvJYUu<|nTq!ez+vPeN_4!29`u^h-8P+p>%Fx8-3S2M4sc4m! za~>VaseVSM8ZkTsn8sQg;#}u4=sglLQtEn3G24c&WsH0<2<>P_s$3T520850w2MV> zv4**u!Nxu=P3;5&u0}}n#UhuVY@n5PkqR8EOc!&1Y>O^!oeq?hVwZfMRKd6y(}g&3 zmjp6JBK|<6s7r&5Ms9h!zp~{Y*cS0|ZQEoc6;p1uwOM?OyON62co$NnyB-p85phLF2648@=dpf! ztp{}vb3nY$+R=Nh$Hv%<7dUdJvH{@>zw#8EuV>R%HFY3nr7?I*5DMnmdAnK4SUaa_ zrIJ&`OUd?_R_IcCQB~KiuBAO>g@hYeD%A|_8gdh_fQ0|FxgTA+@e?sjBr%Qo^}eiK zDk{8nL+B$jEZwn`RZ6R)7k+uP&ijj!p&4q3VNzFGHG%aj`gCTL0H~HPRy!h~ zZEc}UP9>_-D4&5x{)*4v_;oPqo+X%Om8$TBqS!xuhESsXvmR-kCSQAXAl{|8lORCC z@}_OT>sd4T(=(iNvOXzz5#@%~ym05E(liy6&Gbocrw$y)<7+@S4deHhJC~C!7v9i+ zy*c6+?4oN)Z&3v)qct?2T?9DwG*jj+bL<2BK4qxrzvCI;tcQEquo33_KBKxGF2qxF;u#x0*7%j_sTFsz@O_DYHOp z+aH$1xP7NCQ=NwG!Q) zZU>3{7WtCb)KCkZ;%yNFn;g(zq@-mR$Td;}g?zTOw6dw<9|Q&h=Xi(rK{5K77aL8>TR zo^nu%Efwp>O#Gk~>0J+Pj|Hpm>5-eB(WytP+e{U90!7#Uj1AuYEUs5W74M|=8Q(Al zQV%wQ<9wfWC0AI#h{*-pwrtc`Y#r7YDSFEw{gLGO6hH&Q5qffpwzkWBuW$H<10b5< z{>;XUTs7)`yGs9deR{qX+vn@Orvd|?*i?X^XJj)O!Kn_vR=$3NVrN7o$hbk+Ad8N@ zGEb$r+eig^5;g*|W2Q{qgZhy)AQ(q+hlo;&s;bJXP067nuZj%JkqizZKWZ$;G)fdQ z65k8Lyc^yQqS`_)ZWRTfbPVu8#7m4zbGD^Mzof}ldjpj~S4CY|NCu*LQl&@KMJVX*BhihZ2zW z*DAnC6IkDj`*w?T+K4Rch@t&{pnuo($`!F3KbC`v->P? zE$EEMh1=`kwing`9z4#YBdjxXR*qpoFl*a>6_5SUow#y%wE{=?C*faxWlwAJE=?``wPK)b1_Mz?)a=$U&|< z$rVfh%(A2GI$f^&MzNY656?9cXTgQSo;0cZt$@iE@)OYBh`|e<_qb22$Ty;w`^Jfz zqUYEmnSi&KwzWmM-8sfWF{#6p;Kv4gM38JIazZxC%|=i-sR*q)V|QeHwQG}XqsF{V z>12x^hkK@xrDFTgDD@`U!GYjFomxxS^7iTxF+{dyrTLSIB8wPb}@@(xEBwAQhzN28by@9dF9F-1ykapRPMN@>ylPT)UBM0T)ydsi4LT_gh;dv zFQgW2(TG7!p-=$Gj;eb4mv5{@vnSW{EUX?%hOH3GTcjS z7?h5!*TU(x?ja65e`z)X58>8J zG6i%ki*dd%$p`=;V#W@o zcX(7K`z)t73ipx&zj}`0OPrynps(PuB^K(~kXJvI?~|f}by`Nny#-CCkQWD0;+MpE z${%FQ7<{`8R{N`FONKIz9RLXfS>;l1(i)V6RYUgU9#~nQRxmd^ZKd0ZM=z%GpSQ`i zauvAzkq(-VY<FDA{7A=ZFR3CNhV#;Zg8fcdZ=m z2KRaY`a`ZM+TiIfWfG)8!O%-z8E=0Q9{4mb2T!ZUDH4H1Fn1Judsc>{h)Tn=0mLZB+D!HA~XLRyF&8eGAgVi#z)^uR7xB`A-NoHgVUgOF5~ zfz9{_feaC*Z=>^XQ6E;5`>`JTbSqLr ze9h?et?jyDH1I-lVHzb?9rV6c$qCYc3rDc62GYs`-|kPxUXjb!@I<;15p^?A(l*Oe z-(GcbmK#-QGZMDkRHP-K$gG;yW<~UV=f+0qYn0%XsnJH6ao7YN<@QMEWfL(TY5+4Y z<^$y&P{GGR72f)+^!mxFO>qm&M3-1t4tLE_3TfC+RBZt<0PP_BU}tD2r0fK=Sd&Tf zG|a>HM!n@W#s{E$M@NfAeC72RfRAQ-N;HCrkHTdwus za*V@6IiqhESL$bBc-(sfSfe`|qVN_!4A2~VUkJjM(Gt%8J&d&Xqq3I%W1~HhZG$d=`{8 ziRq7WamXQEBMvcuyL*58zR^`)P-lvj5)lZgpzj}rO==K+)(+Sm zL#Yu!xY=wlbIN>t>oB*o(J9^fAk(uq{#%QMgIpaYwv*9Jzf##!6Vo5c98tjgkfc{( z#x{nzi8!W^dEvm`hbn2RpF=8barp^pTjZf@avKToAcft28^?I^t(3SiHdM%tu77iS=srdwgb` zk=NYyV6hkMn!K&b-Jg4D?Dc0fMnUtK3ojFAsrT`Ru^8)0Asu@DkoPhabUd#H6~v&C z<@se*yTcn#w09cR5SHFcsN`jxpd4xn^4MVTLg$=+^8Gt1WuJ3BJ6yKCwx6zl?6%xp z>soHM?-VCrnNnRuX^vg#-XM132}Uh!8y43ofiWCnGOEE?3GoRzuw$?E8u^Y!jP}i? z`=3HA7IBk1bweX)FV~zOUs|-vDVEzsva2H&SDBgDKMC6h#WHLIuTu6dPF#)w1$fNx zhEU^+tJHG}!6##aewVWuW%oS=obO)C=x^!(vo~Afjr-3@$ddX4+q-E&=%+(2B#xDD z-SkoVP`7${SIbR9Xy~XcYPvP8V8J#s-r%wQOBIl_*z1|^yX@-`7xR`oY{dPT z&L0n?EgwO&SJQNtxwc!j74*Hxhb{5$!sCfL+VgRAJe#|f-ju}>*jpkGU~8pyD_wk$ zR5cE^jqt@hsTnha`qn%?bjgDj_(5E)eSQ!$oZ08Wa0dy#ra4O74%4^LhBa{1HemWI zCj;7cj1;5@59$X>3sc>}MJY|5X|?MeBbZp+%HRNhr^ozB-ws+nr@wmzlhI6i0?mGl zFB$<9#5omm8XSW@o=TAQ;eqO%WiSG!Q2rkPd(g#7F)qSG(@yWRnf?>z6Q(2LL z=4ZTN111y)e+ylPDrY4J=MWe?YQ4&94IaunKD?2IK*1}pp*f=aFDt|2c*TCEzD*Dzv zDhGFaS}?S%30F>?WG+hGN^VjY8L*;L&BRKyATT2)#T~<ygC!i0;sx>@qHFmA}$iTTc1i++=9n zb7gk!ydfiA{lo^EUhnv{r&aiXa@`oI`-sM_i(ta4yFw2@GY{~yqvYoDW+}QYJ#~{% zn3Nj#w#*}>&L0CakNf5aNYIU&08EwJT;${kQ0#aGAiv4lk2zCFA6gcs*W3tQkWlQGr9J zj^{EoRSL!FXKAYL=Eo@JVuaGpCs+DPdUey5KTyGhj z3FeN~ve|`71}!v;I^&x!Qb~5eJE%z?-&+R^X+rE&IOwk7fXAI^7ev2(DtJJzKMwo^ zz$}Il-<~e;va`3LpbuUO@qp|$i6f@0Fq#eY0tLT3_)Us2ENH}mMsy~e4j5Kfm@WxN z7)H=}zTg49cnU}!uelwia^zXlZMM3v;~_ZCVwo{>7q;cj#k-&VZ`3f0;I|OQHkrm- zZqH)kobt~@^T8CkXf;kQ%EdO`7Qkd30V%lRLfsFs;P|SAW`QY`c$eM|BM28!=lCm< zJN(!lXEU)WOrXHnw+J<$bGpk8|Js*o-t0>G%o&9TDF?^I}pQCqmS$Ut6FUTmj!dl_3w|q zzX(QhYignr~VC8rCI&tHL>=*a}j=v10)1{%i_Ta9-&*i;%O1)5wz((ADgtEzFt(-%my2~p3 z5Gbd#&OHO#CJy8oq=P2l1D%M&Y$f;1{aJ<590<}Ajq%{u57hY$A3Jlo0rTXwqVvVV zjMPssI{G^WL#G;_3S4G~j%CR`*X${O2-_o&K2_wb6|^YMD+%LpBTDG8wn8*=`6iz& zw=QPxz6o*U@ZOe_vCxS!;dA=2g))xiRDSntLwE0x>9aG)4ki2%8|~wBbIvlu4~N8+YOEC& z6bBA+r}FY{nVB>{qCLwCN3>*L?^(sTl47YQr4I^pX~3!!45h%mrsJtW4fL)^oCYD) zmpdhVJ}|u&&%y2eM;c3m%r2`sH|54+bN`U_#a`G>CU6+kX297-dI`FRN3kFbr8P#> z<57NI7~I(6F@WH+v)So+p;+b7zJX__ba_9jEl-9(I`X=5L$zGzPgD$$M$lzv_Z}Bt zxdL^_mC`2HO1+tUP1V~m-k`!NTyTfIwV2RS z&moD@52jzC6>U=|iypYlR=CSdpSX$*4=EQS+tNf|?F`Yr0EihBLyKE;9i&J@$$5nD zDa7gXc|U1PVdJC|OcXj4j#jV9GQ`E2;+c0*yl((8K+eB~bSIK|;RRpy8*BypQf?NW z@#G~!+O8(cT(639^l&17l(NwnAzis|9Viy+C&<0(@QjTz5`@p4?*p=*?nPsLle-}V zaE_)oOU%{skKbr}?Od|ez@%A^Fvst~H)ZJfH#;V3&Lz&q>)xB14i_xfD2Gyc1Kqq- z0fki#TSR*^r-KF#eM?F5?ElmjG#($fqGtaNgd}ake6tFr+0gfn;%`ua8RCCTG9wo6 z#XMtDn|4(+4SSujYaw(%_w_>#4RjxNfqNk8Cg{x&~3|%5+~}sZw_Jt z?>lQA8mAJj6P}2iTo!rde2>xcbad=k&S#H z7T=he?PIG+$}g7ReWyfR5~FfJG$e+K-33+Q^^AxQZ%VG1*!j5hlgxZobx>J?TYMjF*r29;O|}ss30O_0%T&GFYxG z(Tz|k?>j1VOq2_-qKGa~xm6dKpoX**o~3a>yGN|koue;V;5%l26IEM3=E>Br{0Ano zZZz&vHkP-nFYJY|`h6zd8fm!lJ10bJwDLej*Dz(!!ty@n=mp8@F4O>uoBtx6AeRNw z%P%bI6yEv|bn6)PuBa3FAIGB4^#8kb{Ch}Xv$hOq78miF_nyuy8xqsA9-ubJ^S^rs zd0%QA>rl_T1fbS3jHDg*WPKKsrAHPZ5R-otXkd0F(Ues7#S)Qgyve6=uc_2w9%EHsZO_y(txE*vq^ms$sp=9yTBgH4y-fP5z> zhXv5};Jg;l#2LbsUB2#;B%HBa9g?$eO+djd8A8*D`7+VmgiM8wd!ZlJCf*2id=s|Z zX2jZNqBgeIIGP*3zJmtK^?u_N&=0@M&E=qFS@vx=sxV&Zv+Kf${$L<)?q*>N{WGBO zK|kBvCy0>7RtzMaioYFXx81E>CO|7@YdXILD^i<`N3s4LZAP0$gcM?FVXB{x-vUVm zwhd9gxI6;Nd&B4)Hz7vj|6VdI5&vXT_UN)7mwRn@uZu@Ifz;;Km5W; z>so$yY#sjH8rn?*+w=UdHC0;fZ`b`%BDrv^QwY^5DvOlW<2Tz4;7wQb@hFQjEcCU( zgMd57ljM&b@7TRz+(BSs`<99??kAm!PWN4Elq`T+V0`_|IXGpF)b4slDLPLyl$dS0 z9>q!Nf!^}M<)v!|>e{o%$Osgs$UmRn&<2nA-+BtpbvyMO!MoLmy!*_0yPx9yt$QYp zMWI&0IpAnEv>aXi7krERCSNNCs(G&_6vf()V90knZZ zer=K^rK(b~+jBDrL+P3^B)&1)E&1oDmEeog_XC9?c$h%wFQvRq!YTgRZ71twdL5Qj z&45C_9e;@kHssaPID~hofiE_Y7KNx%O@3W*Ssk&};~74fh}UAL>c>d(@vE>fr{#nF zQ`TXKoUZ3?m{ip717{}A0cBs>QZG?+->iL2Mi)eWe|OXQ^$>ltpC)Tz zj?U#R=6wV>_o`Dt-A{E9p{tv;a5uVHS5aX)LaO-d35$~ZLCv8>B3U+xOq;=ux*QI1 zHm~E6eyHQ3G(F@@*dJkCJG9POH}1!VkztI-TZvk7xyuPSobew^bl$2VzQAh*_+YRi z(x(yrKC)L~zI0Q9)(lT8t8XRO@k?LoGp!GmY)|5j9h?TQccY5uPE_F&p_IFc^i=4# zFPSvf5sybhq@t>)X#oHZ0+p}SNgWFkj^H9!l$C-a)1-Jfeu z&ITY*avHEH=>#96khHB~-C}*@d*N{t;A@6YT;wF{Z`*89HU|Hk7u=q~|HyE6>oD1|?g!8_FIpQLw1GD8ukrz(WFp<(YZ0&oa!sQLJ<8NH!} z^$POXTJ>S`MRrVK!$u=wXKp`DcTRjI%Oe{t5Udl0qk^Ss5_^c<&70&t{qBpI7UzR? z7W;A4IYNq$Y|(fe0o@sOqG^>V94Bf^*3!45;G8&T?A3{KmyB!gK!}>3w4)g`MViSJ zjDXdm@C;ii09MSOV2JGrCxpR`Z1V zD(ze-!j&foxGmVs~K+3 zJgD1#@lU~*Knuu&B+%33Mfu223Nz|Jcbaw*%Br^;W+1toRU9a1e z`ZQtzhU@ePFPG817g+1Od(tkRSLLSV5nmsAgoa4)JbYEsp0iah_M#VL2jQZE&l``k znrrzf>v|c(w@XHPA{V25(e?n0mJhw%Q>zPz3;^t>J)lj}nrbALBYV(b>;VA;EMf6o zpAeG-(Qr_8uYfQ>+WWJqxyF@0xiA=%eE@OnbPOMr+iql47nFj+B7bq zhqrvrD5CQ{S-cu#^J>&vjK|D9n>`C40(b;7jKk^0N}SZdsV2h|mj^VpkhB$Rb?X!1Y4MH|`S`+r-dSCbO%`KvB`qv$9{1vuA)X|!P%7L~9 zp#=C0!GzGeKc|&!vZ?59k4?+qB!5GoB_20fv`GFvZv)Ctr}&ma_{oK3)E=;S!aMt@ zx_{8iPi)j|>8M`{wsQg!3Y5sMq*Wl{sxu}JMq>Rxm&mjsm#$TC6p5>FspGvQp;ylgpf4d-y^R2V#TN#hrjnjvml4`k88nT?p{8f`h8gfiq zX)D62j&>EA9_zsGzBrr(bv_(#iI7V=cpWQAzYH~yIWfeOSW_~ma+?f+*_%tNp=3blBZ zV7&4AK~VYpsEW387iClMSynsNL}0^$b?BfB+YAYm2&VSDvcC^LnT-5gm_-?43BpKP0IRbS5`Kymgtt#|;^C7(}z4%E(3N&3A zXh_*CkR9>1{pInyCp{dWPZEf*T6zPXp!Wu=X2c`G@-cTAiZ54Y8wAH)HQIbC&W;id zgv)g%vwfef0Ja-%pa(Od{&{a#Qp2`0sso`}sVLNzdrLIZ z^7Tw6RFapD-lF z1R2M>R7QezXm6KkPED-e%x|5vnZ2 zLryBHq|q@d*P+hy1i)xU4Mcj1{zW@2Y7J$B68qv(4uT0AXgi z>!EQWiK&4h6MTnEeEEL6J-{T#9iQa8i~(gg1g=xjX9qSa3;XN3oFvxt;;3k$UfD-d zDi=z2a4FjQSQlx5mmN_$fUFzfcit}koGB-XsjwFwDrJ>K0U*)gCN65Vb#b4s;Chvx zOV)rY;=&3B3fcSl4^4%D^Saw7YDv#)ciI6|FfyJXUvl=&&A7S?YC|^5teL55EH(c_50X_%PTm*5 zbJj`}UG+_}pX@&t}vtAUb8af2Udo6WY+;*7~S{Gar$UpMn z0O@sz84-;3o>sIIp<`p)5|CzBgP2x7z2oXFL3UC~$)#LgbE*j{o~`L+i%?9MT0qgD z@omwefgQb2O@Ujd?T~6qDOQX3Snw9@AHM;>r>3!iTm)%mn(M0xoryAB`+} z%;a(g6~Ys+XpP{(13UAW^6hVd)~RGffTAh2`x_-8vR$q(rIk*$91dV1vsM1de}48T zNC1=jup5F)ITIkM@ii?vDYn_tMbRPeHQocJkGr!aV!kaU&oXO|`~brEd=chSj-qWI zH%yzz9i1o-?>2P?zRrO!DWnNq;9Y|-J~fjyFsQq!H+~9RaiPPmk1HPbR*V9%$ulu@ zP*U(QM5O%AFai5qhP|Ml16J1^U%Ytb14|@wzPjY{?LhX389HrAQpaoSOIABASJ4Q@ zp*axIu?;2x_7*f5jaDq%DlhH5D<+HbKg8ruF;03;W@;y9M|Q$xrMC;@kUlZ^tid{&h=nPLlaJN`wbx92-9GLo zW|_w{&5&YB)HjVjgY%hmGN@An^-Fz`7%ux|XH{!*-GyeW)sxm`{#5=YT#@ap+dYLY z@)D%knWwz=25o0ZqT)9e%0pJ}@$?Gg>|u+7qWz}l-l9GljCF(}OLIIg-rTLGt4`8I zq^qak&UR?_sx_Jfs^zH!3x0$?5Rt8eK0QIke7~TYDXswsoAAs_F zem0eb+_1Ovp$smc9iIqB-Y2Jm-MTry^BPDbhGltbHF;8?`SnF3V8Ho8niGi+iyHhu zO@u=3KDB6LTTbP_u#=p4B)|gQG*tY1wL$8s+>qaxGbG}esEWIkN{KYc2ljTG$-r;%EC6#puOttxl%Dba#(( zT#}U!(uvN4g$ZT}9(vcO@{^R??xIRfFie*qC>t#(cfi`?LI`^;o;#y*+2sEig2X2a z#(a^T6ofbk$B)b&MlWwP1YD_5Mq%>(>Fca!_Q5x`HC}_fx`@#eR%AZO;l(=6%7`N_ z={17s20Xb0>hx1i-=X@mO4%Y?9-aQ5A(RNWx9GcA^%X0Oa^YW1Pi2&P#jPsT3bB)8e!;9aaSX*zl5)YW&mA(Ov zGY$zFz4aJbkzVCG7G-Os_=efmSYe#`>+U$UW`yr|q`dZFhspuQyPm>HG_NnN!{9*= zJMU6A=3RYPY^qTzXk-Cq7U>?U75u)JFj_?iOSMQP(LfSkno$Nvty|{aIiwf&1MQi_ z0!nPVln2sr{?9!KCHJq~Iu99jtt=3eazh;IXn%Lv|F_4;N9Q6Mc7QcZ5bT5dKU%Nr zm4mlEw&e6-GW$g3gVQZ&b%WbzUT+He%@_V4;K`q-C<((L;FH7z~{6Of5iG#dCB_L~sa! zLZCeR{hD6!%7FfX|i8MYc^tCyy+fZ*nEbt z7*8C;L&v#KDV2~3w4{QA?j{{re4LJBoi)YW7tcMeD7UL~g6>D~A^0XK5gl|INlUq<$iRB`iOF&XJVci)*Sh_&dp6TTDxSY)=^&Hw3M`Ha803gu;!F zt|1r^hz&E2jP!yJ&-vRxzoB)|AED(lC*0n!>fG0Bn2xomV8xfvDLLXF-AM6>@sg0T zg*dFuZ`u>)Di3U=VzxdoRFEnJI0r-?hqg&%uf2Dv=9nAb$*>rnaB+e&^&*g; z;y+x;$7@!)RE`fF`S*%#fSf2-DyZ?WVLMc3*OV;-Kt{$i*hk*AJ||O6PJ8#Oh$(j$ zK;FM*&bPC1P;oMAx}TUDI;|u;L4uR5=-|Z2e_M@)t6%P#XSMT2IV<|o`LPPMg;v~` zh(+_t(1|d~m>!ZYWO!dpRyi22y$zajcN^w{o>w9V7x|@MQREi`3}_E|4Eu!tT=-=N zE^VtSsK+uZ$Tg|FMs!aYV{NJj=3S-(C?=>z8hkZ?zOFqn7}EGrJjeY%5t3}==Msb9 zI7`)Q5>|Sn&}jsIz;jD7Kl^8L+K*>1!k~|REKN}WERW^N;>**{MZ9ZQY z64Zrow_QUjJlxE~f!m|m*ag5}Wt}E~DO7p|T|bmY#fWY7R}nr}37e&>YqHV*ts<}k zt1N@_Y2C;Yq+mHvvQ&%dcI{1ZerVHY?$ngE0DDN5bBCL7@5yzSLC!!rARL8n_dt=4 z{p!|I(=gJFSCu_&8LvG*%y-wbOX@3lj=2N9r9usoBnCi?m8{78R{Ts8IJjOeSBcL| z?1tcbIVSKkwv8E!^t)73q( z@zs<8kM?EURe~_m5Qok5o!p2Sj1v#SQ#1kZris9f`I?2_SD5g_yiFw88e9QZfHX!h zNzkQ@L_p$0<4$doDfR)Q=#ahfLt{T%fk2To$?yASkKQAsg7{aT+voJv5;`YLI6R7@ z`+c!s#&7*gka`@lb0@Q1Z0kwj-yCM{P{Sz?R7B3es++B9?4_%=SG=kld*)7u z%`tGc=DwzEGN(ff3C$dZpFM~{Nl<%p5Cq{2X<<^301r2so+&N~ zCh+iBhb0f({QdJ)qMy>d;lLmJ$=g5}Wh8Fh`8B+n#ifK=q}(`3%It4BJrF5Bd$|hQ zGDW|pnHi;C6U6TFYhGGVsXCM3TR#TxeD^LDL#gn>2ABBUVFWHqP8Q;@eRIe|h%bO9CJFZD zMR&Z5NmQ>So}&75lr^D;s&G`q!~D)VR{-@(Ed6B}-6&2`Teg$qlOfONYUGzqMD^jM z>0s?R{{WUwS?2-|4hk<#*h3+TIqpHRZHvCeyyLD`in!`vG&e7$8VZ}S3l>%y+8~4j zzh#}7RQnDXT3sYfp>YIzb0K@%M7)xY-2oWOPuO|1MEZM^-hfa2m|U4uP*W#|@F=Si z+a6Qz^QD5dSWHIpCxh5FvcDkneNC#rqr>tfV7Xar+3Yg}PJdH6Df|#_&sr-rK~uw0 z=CA!j1I2%OR~RjM^GZE}7Oxk^q~Qu(LNm?KCYyi6dz00^6*iy(|x`bvcI5`_;}=hK>b z^#bN(uFH~?OHuFV>)!vE!sVC`FfboBcs9Oa^%oYJ%a{`LFZGbrVpY7uGh)l4*s?P zEQOZogDD+|jg=|oO5HqrEG7f4YXZ?y3zn0SZ#w&IX_Al+n9xxO^VN((A51W2Pbw$v z-;|_CUHo!4^-a!TGLtV_E#0NZOw_#l&gAeJ?NZG{7&{Zxi%(0DnE&WRkiVn$e4*r((_0vTkw7VTT`-y3JimzN3p#P!$Zf&{y!{ z=+L7(6U{DRsP61)K}7IyMuA~acQC`YO+wK>Ar{d&VA+pHqZp-s9>yV149m>D1*qK? z#tf+Q*1h8QmtAL;00y@73$MWs+cA1#kyO+UXd|&7bbV$#nz@qyu{Kp-yXlQMD^Yia zb17r;{7~mCirYtfPi)jiQ#hUEg@d9(%GQy-1(jCj{htBr`nC5eg zOm4m1{~wS7?-Jss&Kpk09+bN*xjZC5wa^8fkABp-pMb6^netg-@jE!Er}%mDK&@a_ zVFfX!t`VVcAE5E(QoqTr!abE~1n&_C2-wNKU3hli-k%D_uHh!ZA^NqK=j<{kCN}}JJ;ZjixY{&BSB0f zeq5I_Wcp~6=4PW`p*imEDF!F0;;DhS`jz3a`|1a9NwSlATj%DST-SJww(l)9ST&Yo zKO&iC@}hdNY2?oyk?X=fE$4YxRAN67%Yx^9q>hcLA5Mm_MDB{>$xrH-Fbh#PG*1UsPfBZQ0#VO=Ckk$IK zNo*JpzB|F3G-%}xgCQLZNz9j`zv=G8`8Jdq-bj>k{aD;Ak4~r)+p4-fF@d0}UQyUB z6~bt=YsdK8Q>Jx|e>FqFO0m(z*yKRVRj_sDxV>jldzX8TkBMWrFSt=w#_S*Ph;0-| zR92~VIwqBllCawRA{uXlw$FUiJ3reL9c5%jt+x9&I325$PyaZzUwrboe{B-SLvn{w zT&N7z6Ym?{xJ$>k&lnkkkaFg~`GTuNQJpJU#5FIp^qe zXo9BZIT!`FP*D|>8&{WbEcu=|k{Fds2uhB@X^mV-TfP#-6mUFJ2OBoqfJgdd94yWm zVlP?{EMTyKi^E{!$Xy^$Ppi^meb0i)(;!fRx+9(9HXoipc9QT5u1E)PIvs0%QhMWs z8d#T*sI=va72FR}8Xs5RQpj#uDNaU>*<@Pe1b@I>d6^8in z;-yj5-mB-EQFIVQx5&6y(*vp55Dp8m08O`2+95*7GqogBF_628rVv)dMa}qiEP1Q4Tv;S<9$0!TtSf&Y5Gh z&Ht*}tUm~gqcj@4i)D=msqy#$s1n{)xN7;lXBC?@ay8(Xgy4(jS%&3P1J8VbBYnu} zhP$HZm?4dF2)x#;*I#h3%sWQIUujotENY8*u4Ai0)-N+9Fb{Mmh3_TRV{u2 z;3<-JpALnXmt~I!KV$Dv_e@FDhx?jACHzYcdExy$|4RdMMm9g_wk3vR+sM*yt!yKo z#%#HZ#%o&S83HtOe<`+kJ>-1JT}EhAM17i+3o0_|o=YLn0%5wwmK*9}L@#)(uj;57 zpTt32xYTusQ_timTqodEF5R6PMKz0I1qQXPk!d8&HhaxWi(3|Q^Hz*cDmP%-rKWSe zkjU_#Ox&P72ya(zQ}C2c;q*g-?5f%x?)m5V+>7i%5?3Z31PgJ3+oeG8|KpjO3z`BF zCw$!@ugd7s4Nu{+;*b;y~|)l($J zgzL6AQBlq+wXyW0{3DG2r&=Z&dAY+A3;!02)y>)>0G8g;s#lU+)!P~75A&m{syqE2 zhz&*~OPVTPGDg4_WKh%?TmyC7E!;rzZFA?Cc%cKWPHe?8HB@J z;&Eg2HG{;k)}Iaz?&v(a@Jsq3j45EcZ*SnfX0ADV)mKC%XCg3BEh)2;u)19kQS^qH zg95o(F9DpWbTk53k&2f-;4Peyj0Dvj2a&a+cEqJ{NdubL9(hZdx8XvNy@~yQ1)+IS zuZ|GzQPra2W?-fXesb9HsE3Ud0W7PF&;b53PeSqJsBLjhn$PeTZAKZ(^*azCQ2)T} zV$j%^&)mcc*nzLvz<_orKLgltcj(*0Tz$rF7_c3@$vc3%=vWT+Zg0$$6HTB*Vi?w9 zJf~Az3K1h;j*+W=8+6KeNbONR;M*G4I50*sJgK(?0))-9xu9uat05Rd*0C#Y`t^}v z)$;8kOrk*U3hJ_mNK`xcVq4$aIhk zR_FY9XR6L5=%-;m2ehc`Le@NK4gWar%w2lr;(SJ}@g0fB!ioJxg9##Opo4e8FWPcl zaV;IswuK$nZF{hs`g00x3dX7Ri!v^m)9r$cEQ8S9fWuI~prR1eg3;S3rP(-ioqd!! z^~&j>vFLo584mvC*4>>23mF67xU8QN0E03*a8vy|#Asr6V;@mK zFM-;H`zc?YmOtoOM`;S+^m4Z*2YFI%YeEUK+dGH6dtn#ju9vxsA5o|_73h{gDuJ7u zz&cs}eG__`jJl5_f(E^`%&ykza&R-ID`~3fG-@-Q|8K&sF34glO&t<7b^EKWdL92o z1R8v%_SIm5(`9e6&yfiGVs6%veO#pv9`DU^+cUby=SQ-1eEJEzd;vUA3iXf`lRQGI zYhhqd#mWz#HnM=zY@1PG$0H4=)0f7nVwn8aonKKeF%q&$Oa$C5N`w8NUIT4{d(2|E z=1Gv`{9=P>J+SFEezST>@?w*MMaH%TumtxC(dc$kyEeEN=8hBG@~qUe1h6$N4M%qy z>;5tbc?O(+WraChw<`ny_Q37b3)hPQn<318dH&4nI&~`STbrfqImz7f`PvDsmC!S2 zyw?2Eq}oy4tC;1B7L73qgxNfzB_rSve9y1XZhoLDz@-@9zqRJ)Vk8nj%%F>kEvqRi zXS`iV-DuM+Z&^~819FW$&!A`OK3#DpVCI1u3V{r40u(?>6pw`uwRUYfb-bk1Tx94W z+{AbT9a8EoCdF?Y0R;|@D}d@5Obff5p&RU~@awf?+aaAVG;rxoIUf{C#2fAkp_8f$ z{XQGh?x$r=6&+53d~WXNW|@KdBkm27w*{z5>}1rckS#4nL@m{NC*PIPP4uC*M!WHG zWQ~wei2W1OWgfJ5sT1`8s59^3mj@x&sjL@j|NNkZTAJ>B${zEhaGB#vP|0fzpS$8t z(yhJ(#o+Y9{C8H_34X+1yJaU*8tutI zHRh}$mt`W|jVA|ywjE47ke~t-@<@qAZZ@L5YPl4gv@wt|K;Q{WoHG7HpVFgz8JF0D zNhcoNbAXS0aaGL~&U&78W{Jkws724}l$8!ngOQ89{$ZGU#;EKbg*_epiu*PKp+QzU@Cj}u`7i!72!{h#U)2%Zg%!!-{x8;QSH9b zv+qAh4==}kk0sk{10gp8vQtU)mK2m*|}lEx@abyl0~Lmu_a*8ELuiHM{ePR zJWDiD9`1N`tQtWt9?91A7^I8VJ|T+yHfbbM3Q_In3Wigg@ZL28W@C-XdCiw78)P*P z5dq;iy(u>ti)2D?!g=&$k)0Xk+GKOWWdaZ*TG+AT2TNVub8#V}o{h`IM9~zh1rel9 zu;}sFfc`?I-IC_q1J9^0nCbk_A{u3>UW>$ttv`S2^!Hq;TWUUc+hS)$@{{`l57Nq4 zQZbswM*WAm%8SQL#|rhL>|6mH^G2Q_i-=j zJXjIGgQR9I>u&va$812>K}c=}Sf8b@LwqZCmXBrN;j?m>TJ9P zO`VOoU#n8`VAUfOx_sV{gdiczvPpR;`@F+$rW|jvZyUE}5r4B?{$&V0_W!;RCX2pW zG`RFV-Z_BnGPkrc93fEcBo2M@kA!K84be#AP3@RN2f-(aND$82&esz@XNCA{s-&+l zuWga8YqZ#U@BDIv2nUy5v(yL{6=8;%;@u{X{=9iiqt(a6gzFR%P8M9n?!g1QN1<)# z8;Lb&sS6NItDm2)!KJwA0l&cOhOs%}O>4> zxT8}f=!-DKj4A)xJJ>Cwp2z2BO!_` z`htu>PYAiI8udfEFdD(WPyhFwJalu=Db-5d zQ}be?cZ1$17C$)F{O%K=`lZ8n%ycI9JC9!VNTX$sVKScU@1NYjhgU>CqS>N4XYmbb z5Kfb+--rki`71UX?Hoyl^g7DUlaa-bb1i)`H2ZAsUzazqmu97TK)|3~NH46R>Mu1{ z-z=VGRlOiYly(dWc0()Ub9owBI~L(jyN1f}mci{BL=Y9(S_DcTLp!moucSA$5p3AI z{c+pJurSS9rtKe-Lbf%slAP$~s!O4hIcpBRJEt+wJ!$M@BVvn<$&C%S7atx11|k&z zQNPN-zOVWX6M$rK?Vt7B0*bZ5Z7{$OvHl=t@JLb5S6bEK(RdK|E*V;k@2&YUbURDE zuZW%uC1eM5AASeyi?xk0F>X$q_$0W*PyH%t!$^qTrDdnOB=G;t9#2q4smt;lq9XTH zr9$qV(v`ZzE&!#2iGn@1t&8`e5`j4we4>|#>Uo3xWzeUkX^Fg`VzQC;o*5?@;4V?!hfP8{Q46H{8X&w_27u<1rI*rv9p#DNoC_f@IzB%ecmDM>x9$ zG#AVI>yzwhBjx9>%@y0XHQA(FE!54VnH&UQi)33=wWGZOQFyO^)}4yO@=KgVLPTTS zsu>EMEGXsQz5O<9S_hR;Lgw@`7f7g9$DMk$GE@&lz=Izs zAlLD;aK=&KHPH@{1tRAw1=|iw(cU@gXvHTzdui?YKl_@SSuR{r_7|(*!YE0kO-KFY zz8q3SHczB^5(ic2`vGSEtCz%4+F$6D<30;~S!ecz0~t%>exk?aP2^Iib4G|$_S~s?xU8LpTE``$<>j6lL1=$ax^%^GPg%hqSP-cs z>ws{D;$Zy@jz~@W?R&V*S;E)59&)LWW4u+U4GVBgG2Yt*O)Ey|GHkpbzs;WfVzH|} zgEO}}-LQ+aIhl-{49lmOs#;t(#DOqh5Ooj9@m^O@?#{m#I>KKD9|(9+W7Av4kwZBW(zQn$wCiO@R)lzb5I4+@(I93j3|DJA|ExvW(3{zH`68f?7rI6a z3h#~rwsujLK^oK&h9q>xp2StJICJvEYFjp1?t5Zh6b7|MSLX*^=`+4~48(089vtHM zFCyh?MsSGdOgAEH)~+$-)($|NGH5oI;ta41^0B0yL%<_PnEgf!F$wt4>zU+dtvjX^hV5X_@=9=0{q~ z1*e4&F922QKW#+HBTi@qf%Jx)uC#sfVk#TCzekM1y4lIJ-e63_=6#gdlBj)HltfvA z=1yCRKN?QqPLYKJa44!i5xdE>6(P9;%7M|!2#Gj77JQl)7^)bd63KxuZirCVp5V$B z^(Ok`cBYXpbB_0{Jax3FJ%j2hSy8H}zDzIlCdRLBwWpcLo$nTN?=&pszyOAdf&L^; z9$QDgIK>U(F`aaY);=wh>mtO5PJ9TwOXTmG-VJUDAwfk$PZR%~YmT`N8*v{jiI!Bk z3V6u!1-aXj2cijM;;bg&ga)(8itI-u3beM^YDgsefA82<9w5Hxvc9`v4Tvzuf!WuY(}_7~elqvqD0D zrGfiU_J=J~Sm}Iy3X8VLjjFz80Ts93bsG~DeJ#oNd5R`N{)X)%oJQcw@EtlI%c0WL|T3O1V0b*u=9e9(e*!?O7$ z0`=TKDYOGC;jmm6F2!WOsL;B@N%qF$itF!>T6Du3GFYSK*Dy%m#0%#ubFo-Z>gkht zAsEvPqKV?yiPZ6L=Gy^yA!7RU;QbF$zb-lDU`Q#S z4x|r%wIb_LYI{m#fPT3%nuPw9@EmW^ROif)34S zQ9jUJ->}ZX?Rpj^bLH8_yKAPZU0{aPzsH_zn!C4h{YHuVB%!f?gyg*c*rL6hm38ij zrO0KUS3;dh3%KTzj5hIInwib^PU-~aZOz%?t+r z&9|~Y1<=Q~vA&-QB$QvU4!J6BE$=e3sm(K;swb%$E7&7pjKK3beaojp3aaEOD_7Fjca+d zrB__$zb5BM$_)p@ka8S3ehDt;X=W})JZP+0B?cb81@&43qvN4IzF(*f)tvV0F=X-w zWFK6e7X7&9{9u)egN^V80A+vrD=M=4z);iL*WZ?{`OK9hMUwe7R@s#FI~a-CdrCv! z)dH0eL#51xQ&2wjL;Zc`nBA!~3{Y$u9@b(#ib}>tOIp%HcO=lnX@oQ6_lP~Avnxqh zz5x(AvSLgcJ*KplHRwJ+7=7x0PDLEBuNPs?KV&#IOdRIrWlmefbnl^F*g*z`GOlL& z`z)z_+B)@ku$a3qb?i6(h1s-70b2fO&hBj!crC|Ons3f2x6;JSEhEJHs*wE+exg2L zv=UN8N0tX46UHK6gZi$= zQEu79{J^oCr)lBGOj!*zfAx8*P%~r7c`!;@|C$uGZz3zES#1LBuQhHg?FRHl?wePd zlYKQ8+E{*h(T@TI#YD=c&Rl#xh1g%sU!#psWkBo7TuF@IWr<>`;Sx}&Ef2&T&%u-% zNA7j|2nxuX@y?Mo-huU4NpOfy?>e&hXDDBqpX!8@bdB^$kc>A~I2*Rul6&(=>04{P z;*(AduLj|@dHBSboE@|HV11`WbwMQ8S<`7lDqbxtiiyDtBwi~k4SgzwF zN?3DR1hSRkcD=9FvpNu{IBBiXjYrGX<8G6)`fuc6vm)D*w%@1m+fkN8Y58L3q6qJ_ zw91;go6{vP$>^3%M)AC14uy+Q3Ebl_=(kmNF?7$;_WD%=Y2WK?U~<;p!_c#myGWAw zd|ZT7w`Cvj)z!&*&Gu;>K$ckw!@_tNlI>82CXtU-jJFf{3plCTugL4Vz(dn%@l@4e ze>V&AU#{Z^+W4prsi>XAcD5m#qJt~{!GU(t*ea}-GB|?yiMlTm0We797-zne*WnXx zK74`{Y$WfsCSCY$WLDjr28bRB^?*3tOL8wRnZ?KGafGxL=>nAgqfpyi*$TFG4BXE)#B6I;c>^Rruuc+{Y z4yntpkyfmZj|&5;yg}7yCXM-Di{oV(*m@c$6$cT{#shr($Qw2UWsBnGzRL)h+YIOr zum%;=KK^Fl))yF13r)s2oi6XnO@vnci>r(6I#F3li9&kNOEGObfA@m5LXMBi-n-@x zInt;v4)FoC10BE;mC2adT*-ES(0`O05?F$ztDH0mu-G3gEyq= zZVX%%XoceE(PqvwVZdmvqMRD_RhWL;D6Gjtx-6el;)<+i(V53E3L`d^^Vlnpl4*Z4HQhU_|u; z@eZP~le!msSEg$)k%g_G6rykT9LZ&+4VfowoYdEyR=XgL?Ah!yy#MY3B}=_$1np~D z%2ptZa${Tfp%!^&^`ujMN%_bJBbWi=Hgfncs-trl8@(XLN_xV*4m^eIpsYa?I$vBnDrb}ZE6{H|zD zGDOBkgk4-&9T|>!8Lks|fFQufoTWQe?#ivYfy<(6ZS5fZ&+oPwx>5;zxWJcaE%9Ky zFshuy$Kp;-|NED>IC6H9T^mp#Imhcacca4J<9RYebs25QE5V;m+dv9$+?4vg%M4Q* zw32frHG=9!A;^aejoAfEm@lPFm-b$BedQ|Mra~~k_ji+IdSn^E2cWTMm&y#92dVni za*y^~qJce*SAqZdXCQTbL`9HLA!2xMss#nlFT%ig9PMkS@GuZL*9#vNpYkze1oPB7CuRV5bO`5@n2x*s<;E1- z9l9-Se)Um?c%$3T@^V_H;I3LiR_c4dzX%dHEQe=1s>bysGWkP;;3n5t79R$s+Ef^` z(hT46Z2`dEP(6b_@}t5RFul9dfwptNL&G}6Z3HhNWO0RkeuSLV?iUG>JmKNSxuIjd z?#VxyBH({=YJm?KGfyeP%r#@a#YIP-7a%xp1}~C=w@2oR`^o~|NiM?7?85y2!ka0A zf(~w??vI)UGKv0+Cnu(R+ zkxzzDZBimgKfE)Rq+$|)JTjk}Y6L&7rp;x{*UFJ&*0Jgl2!QVvgg1JU#H$q zST(`V6+*x&30E&C$4?jP3zO@2cqivtDzIM5tV~dw8zlAj2>$t0sa%cpV*BR{62vK; zG`RZ}+0eirIh3DKx)4;SPY1*iSqc^Q+iIpb%D*%`RAj;Y%;C9Ub@JexAt2~e589b} znY6~3L?h@UR7{sFqj0EfO_3ywjGwLJOOs>=XpUMkt%`y=TQe>5Mg zc}dD!SiozAEf$I6a6GK9RASxa8E#P%#Up!@)x^a|=;BuP9_L(heR7}0M4I=e1Y=t> z&_erS^o+Fl81(0xS zOee~)$smx!LQ#W%fas!nW(B04)1w-N!15{ea{NMMT~*9H%j)~*;8y51Nsf`7Pf)dj zIZ?9qUIS&hoK0`Spi>12Rj9sJ4Y6zy+CrkYSJ_Btaw})u)1($_sRD(3V}3n5Mh$Z- z1IH&6Y7^ubE5N( z1wFBLe}C+Sr7fu*UX%!LLPl79Yc^FKM13TQp3vt=zi)F*KnqcQy@cn`1E7DFmHih_ zVfQ85n9DVx;NVGWr-Lqgm1QjW;M>iO+CW_-tqTPO#JKV!NUFkZLKumsWrL&Lv+634 zwvl`n7Xxx2L8)Mw)&Ps_uAb>#C5lJ=s$g$lYGuE(ckW$v%h%tXla-~ki}p7c0(2;O zWK{zacCCbb4s?!RX+)4i$eY+r7^#I_+Vl5xu)v?YVG~C=F$dyz8@AthAm;| zg+TVF+g?Tyg{mn8^DwfA(W1>Jgg8@4W@bw@SBQ}IR4-+k{{nCDE3RLZBFJUq?)75e ztrmE2ZN>aU-`m`>3sY31yR)C_X$Z@A@8i8=5km_`ki3aCnt|lf*8@$0r?x|$Pp&hD zrih#evuz>S?f(Gah~1GuNWBuD+JLe_=QS3J%cnA@0={^P02KZ(;CdT0v#&qt4BcAi z2-Sa4tq0Z_GRSgDmOzaPoFWgRjfWgI!{Qr;tFr1sXUX8#j8i_5hL1&4tq6{69{{KS z6+y>fW4C>CAPC11gldnRh(=S1%?}D zPEyq@Kuzd3S%33$HGiX}{N&MnY!B=Fu!^iyrDZ9sc19;`_4^kf*Y~X1YcDQlMM`axWIA?L}{B%4xW40mlUYnf?pqrTwPI~2VrB^XMdV7Q=<{% zf!e4Wz8FiykV)iOJ`k^!?bXL&lB|uVtLW_0xRjHbu!6pW{;d|8@GxirEfHO18Fd#+m_eU!q+C{EF#s6D~Qh(rd_+&H*aGCcwANr=v z!bBpm+1Hf88pJ~ve=f*^-LG59587YB6b9d|H?F9sL$GvAb8()buckXL4@I1QL)8_r zLgHusgIG$!QyDD6y+ctTiC+9uiz`$J?wp#a`8zfUZb-urUpE5Ma9)f%R5u{BKvrVR zya{nTEXIo-1;NYeCO?4fUq$#NBsc4;&aG?t^;2tn&Z(lAZ5JDrWh7)92wb@~jVZC_ zo|+xFTToN5aJuqgo^L->)cT6a7JkrbO6%vllop?kys$jk&gKcUVL(U8x)I?zec$zAKMNCF8i4{H{H$Bh` zIrFjd*LKEo61Js`8+xCqC*i`$zrIetm)TtmPy$8|BN0a&cL{&N2@e8%vyKIexq)}oEz1vM$f*lApxHPoT}1v!VT%t_o_BLTDeG|PM(n4+cIyK1h?is z3j>Rwh#_a<7q-u{<^S%UaDsf^N9l*B^>7zCD@~+=>qHKb*VN=HacMsuo#sLgf@-YR z#1X$tBE&-F^XIi3l$}Hz=(N^&=ulJ^y>eYttR?P>;$do)&GF`xASW|FXBZ6)^AdGr z6#QDsr1vs=m%D3LRtYZvVj`%@M{ihZbHEy{XvhM-tP{pXxbjX+1%?AYR@Xy#C6%kk zo!V3jP3R`_JwmlYAcvdlPPVAu_K;bES0Jo<$MhlVmiAAtbF!-B!+9Fa2okbY5HNvJm@y?ieV5X|cdB8XU>={~7@pL=vqg(WaGODK6)w zfxt0!+w}4}D7!Xd^v-$@R29)|boMj&sPo6lkg5JttqnYSd=~m$31;kNYoRh(rUV3p8as zta0#I*MG8>1&u(kWW$)Gj>qS>=J_ll&QV47Y84c*g59ap81JBC$^(hLqij7j?zf)7X>^K9G6_Ru}R-pMYox8amCh@dcRGdz?DHK&xAE$0_E*QRZ1;yWd zu%pvNjlN>quc4dMWvf!l($AX$7+0xB)e+xHK%xTf1C$AIiU=X}26Rbrt^`mClt-Cj z!xE@?Ahf+ggo4-)qjD=8?X~&}*uymW{2ejHFrnOwgK(lrgHoeU(IVgQvL4=_&cyH<0!GysN zsMCQNPawlGB;d$F$l(3K;7Nf#J0N&-It2*3y#!eWXd4jG9sDp!ZK_GUBf>+6Ko@#J zan_y)aGBMhX%sPG{6k)Zwu!M4^OQTP?Qtp|u&>muT2AQqljTf6` zK-E@z<{i}m!Z>xrCoC#l52QHAZiO@6+-$xT{30cZZw#L^KVTlFFg_5&?UZ>wg$yFw z06GKLf4lbyq|ej#7%fH~c=&LY;(us>DcHO7X;xV>Oz&>Pg?=wPFsX){kC<^GM$TWg ztT@5;Ta#N75@sc5ed;ixxfJ;Jyj~go}x`Q zf{Di#bH%w6UESM94cIJeZhgg(bDsXsV6=c9!(;iYjAWSoGEK}g_W5Ur#`pc5D)b7c zUI7cElJZqOt0B#@Xyl2K)04v@@C4=gIsv8B;UTNbio(KpKPcm$`D-HfHH-6U9w`oV zLN(|u77Vf#I%i?Ny-%=p+yTKC)>|dQv?GI5kt%GHmX>UXlV@UJSmwqfj>xzS+X0SQ zRXT}tD8w^K;iE@O@Gy4xHP77z2-vkU=ihgLpe$IRlo$))R&gxAXdKu9Km(Gs6|u+w zT_WxB2f2eHoPQ(0;&4PS^P&!wPQF;d_a(PuRIai5${h~`{GuC&QSDhxT@lb0^WgTG z6=~Biv4BxQ3V%|`GJX}n?BJ*!2n&1A4Nt#{s=95KCM8YBiL#mgWcb@&b+>t|)5>SnQspYUt$Wt*Vid6t$%n<{E2sS;V^`Atz%gQ7ne= zC=Pz0q#-k@d5;Q@$U#tK7H#4>J|j~FxN!v$2U5x2%&^hFgo`}wV_#1jH2Evj9xA%2)j~}n6Fk<%$89l*N|w@57*WawmUYoJ?dJI(AgS0|k~U{W z?zOk~8d#aU`-2Kmui7w+QRT|Mml)8Ev`X?j;?PTc+ccCOL zIVcs)FUJxr&QhUCcEFCLQ$=x8)SX3;!n7C=v1EG`w=(LY2X8K=zj3&mJT9K)5^=Wn zkg7!GQ1bf*kW;<5?RxibrgG7m-wZp45yklGpZ4viO&)aYXS)SOLlFov58p?zl9#&& z%lcO2DPoW52jKG$x^GhS1JPo6oiniazB5n3{+qRXH9?pKXHLUeyN&uxsM>!E7{|jm zg%G6ta#;CVJ}Q$t%ut7YT_?Al#vHckvRN*R7NGx=w99V1Dg(;cf{-lJ+lC#w^^W3a z3m&d%;TX%AMw%=jy=xvb4$ThIfnKi;HXBz(9UKr?>YvS01c(@pcu{6X)QulCCYPzu zfpX&_(7r@nQra^uD@zI3PZSf5XOrdfDqlHjUi0 zcOkL*`EC%LT}@MD^qcn!HmjydqcRlUW{i7#x>lj`-Y!S zl#9R*ANPqYz(C%>qdosIK98;KT@pfT38g-RkvFHmoQD$&YA|c16i07fY-DGqE}S)J zV{!*WiO>2TL;qzpiKPdyN_A+_Vb¥nG_K&L4nj=ZvLasA#||%3fVmT*K|rVD_VL zCo$@0as0TxP8guBu#FuW@*ocqUc**j32oV1qQdyK0`%>+1d;{0a<>~ydR1C zgrGlwoe-0?pY@LS%=c7d2?vPck3&0~y7Mtv#webW+S%$x8^fGmsx!B#3okr1@>=lA zN6y}*f~=wy_v84A@dF}3rhCa?5WxuqRj

    QLjb?Eb3N9f%5aOjl%kr^q!SEwEBl% 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 z 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∓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

    u3ai3axb5wqf-QDmSJMLTK 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%0D{1dGk(Qr_SlOW5?dKJbTvc*o_-o`gQMKtmBm{ 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 hO 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 literal 0 HcmV?d00001 diff --git a/bin/curl/bin/libcurl-x64.dll b/bin/curl/bin/libcurl-x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..c407d6ad2d8c1bd747a0bd6abe938eb0a6e90ded GIT binary patch literal 1020024 zcmd3Pd3;nw*7ofz5Fp`(r4>}9(MA(lOcXVdM7kw`+tPuks5q<&A}A_@-6M_>I(B#9 zdTEI>_^RVNp74MN!i5mq;i|4ZivDi2wih|3WD4Ik2{;@_M)T2GuzH?+uzb zXYQS@`3vs2dBF|0xn|yQ`|WoGTsPk2S`fV5HTQN`$%Lz2x7{)8rr}vx-Q70m@=`^a zRh6ks`PbJ|lD+LyhM(0VC1s%Ucy~ql3Yhg&l)OGD%@#Gv9sFWCMdHoJbUug=3ee=y zE3+}K8K~-N%kGqru#znlWrnIeoPo#rsuCKD?`BoWAW`aiD(_y5@B36`A@ET4smgYs z^=qG}U+t;noTPBYVpXYO`(ODC58Sjcz%q`Rxbd6)clfxJ@)^Tt-4M6|dCi=(*X%k^ zcSgvgl-CVkAS-4cLd80ix8VEP6YI_J44*ISi7{fVN&(>hsWYM;CC@W_p{(~bX``r$ zqTy@XN$TBr=bfxkp2h!A?}nGKt3x^2Vcv=LJaxkZ^8|ik`nTBiZa+!A1$Qo(2@rw@zza$jJh1-`AK(W% z-!$(IR1`e159OJt@Vj5sySziQ|F4o-EbGW9Rk1#LxVxeb^eEnIyc4gv?%J!h@OL@U zZ9e_oGJRw4_lEO3RLZZ5Zd-JHc#lIf29*4{r;@){cYcKYbreXyG5GPjRVALW+61S0 z6CY{1xldF7K2nR;X?kPO)QsYRXk>H^x2C8O3r$uJ#DC@$=(&avwD5+U$?JuKO;Y(8N<$Dul92G!h?c zdMmNG5Lg8N#rhZh35|^|;Z}zl`2qEeF3~zQ@|;MC%vvO)2{m#bzBMC#i0Df}`#@Hi zZq|~o{QB<1mT>x~m#K>5m#F_T2Si?hy5=1iYExGLP_!i%{<0eBFKB69lSm|Hs{>0E z&|F)RY6aS!HN)9oV3d`Ducj^}ocZZP-4&~tb*fRm<0(=nYdyZqH7IH7LY%D}Q7&oz z2^(Z0qq=RjT_DYLG>LB0^bhn8{rX1zl;A`o{a~@GVC)x~UsZNje7c#B@+0QP<>Eo# z$%mC49=!Snv*zbS0_09D&HuVYZ*J;>eiE2mmz>-N^ASLbjZT2tzjFbi1ac>UgpZ}7 zeemu0vlzUb|F-g(0%+i`Z5bD!L9`C_1CztY9KluQ4HW{XTER;|Yf!R+8Vv%2Hr%^O zbmc(4d!WOp5`B&a;#?|$?iihB{rx!T z>DNo#1^Pty2u=69bIiT>bXUxbXm^MQ@(t!2$QSi1SzpuN26z0f2qIXyqPtRkEjn;% z`unRnirRkoFX7C1qB|zEr>0l7B3CoI%N+8QEHF zh5HdyEdjebCqSu%TOk+w!A+X+vimgxF;=+i1h9waJMkD^H={2e)yT!r0sdHe$;-ez z_PDzlnYHDj;toxp=bquyEpyN-4n>GlY5r!ve#ED5H>Yia?A58!Myz~jJ^;--)G$Zc z#V?>(GnUD&V-wx;&5u7z5e;J~F(U4z=qjdx32UgfNuNhR<)=^SfqBTRFTq??Xfv0& zLnzc@&Q_6s#@n^?Ae*Tx+~hoCo_nD&#XVos_ZtCsKr@zX2bo?(Nwz=c-1b+FEB$SJ z`P7p2`V_aO2izXa8wSVe&+{WMrv%J^$t-b~V=y<1Hl1l<4tUuCHQHf}q{1Yy6{%1M zB4U~}u+0p!&$%3PI~Hp6J?hytoJ;R2hjp`1+QFzx=b%<;ev3c$vf!fpUDR*d%!ii(6z1C>E5XEl_l-l0 zbp??E(dTQ?y=vrb!DCB^4;AluTC8suO|RE-EiHGWPo40-rjGx_r;h(#)0eYSyhl=A zHT?kC6|!y~_#su%3QaZoAb~mJq@=#nJeDhZH%Ff#iTrz%`oWC{$y2~e-(#Bh3Y;S4 z5PN;2H5D~54rpS`6<;+|gOiq}G_#6Vv|bDN5O{ZNTM%RO%?s`zIvAxlJd1$z4nH{RPX_z7L~B z9ksMYtO=O5GJQjtzTZ6Dz_}03B*V?{I}X{y+X4~e+~%AnS>t7aH)l=%T+2PA#a?%B z5n21qjhtUH)B&^h9?p+n|E9#ifYenOks9G*>(w{L7vL|4FhA-~m}{VLAy#HQbIm14 z#nVLw=cs5|cSSd~$_>=mlc!FfMk~lW%{#q8gFb5&-3ocIUL;?{oL9XdxhMV>rV>pY5ztEt4D1H_=o z{q6!V3b}b`%%SKFkm;V7rtk*OWQN21t?1I=fX2}& zmule#piIEv2LjIn4+Jygm&;7RE6CqW{i3ew+aq-J{J^P^ZNW3F8uZ@2mb1Jut;ZA_ zP`yJdtY7ectrFr~?l9}`rztRy3v_``pOE3z$7W;23(m3CF7>91-CpN6mdKGh%bt_7 zaMPQBVRW&n`leK|&;zG}bdtP7U~-*6UJV`EdVr8BYR_g!3S*0u7Wb zK<~<%(9?>w9;Hcr_v`ani-sq3_^IC3VRAm%9<%j+xOk8kyOzK(4U?6Va4x+~#egt@ zej_~_CEBCD!>v@obJu$=w;$t!5>6NDF?aKaWjAJP_0~Cax6=O4-7>e1-62nn4B&7yqS?sNB{nG}QvUmh%DTJrlBfm^koKq@W8s3Z{muFzzo?9nC zqmz1Tlvdw*j$>1aqYk!C2+d%pbcAu4|^dsTjsakZi8ZE+OeoH(}3pYB{ zRhgGWHV2%cBgMfV@;8SnE^!pAD`1n=JK`y{ZH{WWZ)=4I)F>@+U;Pg$<6&k(gA<^JIQu0_Rx zOIH(TeSMKPFera>M}}7}S65BUbr6-vwm@3J`r!8k>(%Idz`~Li?^f+yi=>jj`TpsS z(6QoxC%;bL89L?-^v|yo_AcA!pnaWezZ30uO6^|1yNhE}ykE!ON)!dTK9EG;bpP}e z0vwgUSpw`Qyuydl7^q0{)P z2@m+aQwIHZnlF6Z5f~I7O8HOX$CBVT>Z*6l+HX=7@6r-?in{6p^A-C6m}Il?3Gtlf zuA$)hbN2-beU1%UxC!&V(cv%rS-tNb3T|VXTS|+j=Sl4XC4y!oTZ@-@jZcGC;9dFv55J|vhQ$Zs6#zp6Xy_Gg8zeC z>w-OK(afzPpKQ1ymi8R;wbg%pNq)4$yS1%*wAdAC38%0R$$X8h0_M}GT|MBqvgp@p z#0|(kDD>mZEia1&+=)`|qG9Yx`j1vul@u#wg~!#%1Au_XieeC^!dRIRaTu)4J7%zg0DTi&k%T(PC*e;jc!OsB1Ha;ID_eHZ4_M+qVyG zX>^@~-IS{~UEsJM#`H~~k=gvT19WUm^M#vI%L;!|qjx~9!~<)&C$b(Eb*VIx-4eEd z3wSQT=nWY0i)_^Dn$ytH(Yifp8S86z40=)DVqBRPK6+~4wD8fC;CY&HrArI1Pg@OT0|uzGwDl?IUSwvhrq##H z3z3;$*FgR639pX8080cGay<{P-i|6t;8rcXwpFD1)ROzXHG~H)HnnE~Pc9RcbGS@A zz!pXofpD`zN@0>Gx(h(%$=S%n9xczThYD?jnI&Kn+NFS2O;bSZU&X!^zNZp!jQ%0@ zvXS4`=tM-;Jp+istoOp;&ll)5L6rv5!eg_c6m0z4`+8qAXhm;1BtO<8Y0tFnl}q&| zP5;D?KJ~3;P8icxOq23W{->#zZ>PH%Fd7!}vvJ9=@QZU1LPl9V9NT3kx$ot444L(Uif6U{cNqMf1<7(tc?$Y$b z8rPp)XzmTK6%(aKJ|I4F3XacK72ixjd~ztQ4X#iTVZCxT#NxAFUG|u0;};F zw%5Q2vR`3cagMnAJWWec;`6;NRSN8Zv|uI>$Zr7(!OHk=R?~h>IQwAMp)vD_K|aPe z5g^;fcf}JO#`kZydVV>+vFL*11F7SBY zqubQT9x$fHMIWCGMLWBSTXig_$o8(H7s{`kLxQ&458m)kpzaH( zTcUq^_)A#UcRWd)16+akd-YcH#aFSmR=7v#FuOBD1rhG>wsL$E;M z&fpImIfgM}jVR@sH5X>87%R6^m`v%x($`~yWtKV9xYdmMIWJIvu&3(1Ep?8-S(h7W z;rwlf1N3;6e5_ny_&1`lA1S?LBi0lx0m>f_T-|Z>upf*xBX+j~4G)WE(5E1UUhy&h z15u0;<0q8uZ!3dIYL`K%kECcZ-|@w7`C=aU8(UNF>{kP{6yTE@TwpySu(vGk1-k%St3>Y^{?X*1t{eh|fA|>(R(vlG#+O}HZ;b0uxQv`Ny3Vwg@2%R#32a|+|jfB4V>Jg4q_%9dz z6%HH>7&@m7U~=_2VwMvW4AOo+J*dRzdf$TH1Eb20gWKc(0$w8oGMK}&;S@v%#VCIS z>P!igwK=wPssP7WzNr^|Kud58pyY2$Jj_~pqx5QbK@D2IvI{uje_?Kxf*;OoS@I3TkC?+AC$->3JBk@B#S9i5CBaCo zB!PR|EB_JG!^+%a!k-OQJei)0&#q5}BHkSzABM(dDo~;srAkXkVtOh~2`EU*{6|K* z&^-NV^EunH{RdJ-b_&-NxXHn)3io1^9oB<1Z!flaGJDnF0)fuX&yq-$_$#P|_^4hcQ4_vY!&3_CeX}SEv0^ z<##J-3h3`71u67r8ZppVt6Rb7VjrIa)15Bq8PFbnm|-Jmi@`rX_*tHbm0>ye!z<|V z6~YbuPg)S6dzDLZ1c@ZZKZ1|2EiiXj!%AVT!RV)F3rk=AUSW@aR~8F8YKKB(X=P>J z%}v-w@^?=@f3#3MmpKmkvB~#%Lzhhs4k;@Kcy$N4l}Fa3bW0N5fiN?nqJigZiP;J3ctuOINiU@_50W2A_g3JgF9_I|VPWN;JQ zl(E5Y(JvI~#um}N0l+QIiT7&XUvNLcb)2LTgT)3(nrIZJ0yK4?X$jn0)jz8T+ zCD-Uhb{N?-(m+!Acm zL7*Mb;~&5egA-nJ^>e6iH0VImR&YIfRTA)1J zZqtQr3}LWam!e8O$Sql15YVD~Hks3j>0kW=_Q1IkfkjCBV-dkj=IhU%tOcwWcY*a1 zpqCO7^bbuc9_?pf%O;U%&xAzl;elmI~c&o zu$E4Pd|^NC%Wd^lwo+~u`!R6r5X?b9g9oyB%B^pVWKv87BYSJQ3m}k^iLkW1fP}+; z$WoQ}SjW|k_E3JJj39RS^{>okpunydUX`lEPm%eUgR5{vXl_6m>z5geGpHw{qp_xG zO=0RyeuTwE?b^xW;zE2Lph*|k=a}zK>*@L5rP9aH&JgYE0~Vdi9Bhe60_dPIbF`)^ zKJ!D_{<=TT37SyY3u~cQ*zw#MXQ{{*`**Bs#8)%mBu2G9aByT`Q>D%922=~*R-dSA zK-bCj2#4QIOR}*R@MDg}e|jTS^7$=GN|2cyJfmgF3OFhpLBLtQ5QoN~%Y&rLlm{J3 z(~@eG@gqDpVo6QzCr?;^Xp{PlLEe^#TL4z0ThYuHe#`CR-~uJ~Nz`t0W(CYCW0`v? z@_oh%cR%1!28Ujb_+I9A;oFDjJba6l*PB=&fW)sQxPAiMU2Wj{b^v$4r=GV=0Ay-~ z0Lj$j0w_}w>;bhGv=8ADn%+nO(bY$^TCfoli&Kw;@r%yzvZSbp6yk$BkpQ6pRMKs6Oc?p z`z6McuHeD%kB`y7p0 z?FWai{?~JlZE(p7!sr(jwEAORHAjOscO%avd^L781;>rv)!!nkb`(wsysCezUvJS= z|3OVH+gP~OE2xWO<^yY3u05(9KJL>aaBTvcxlM%SFKj|H%cquofi_KrNR8jgipN-S z5-OGzzU(IBsgZQf^h}H#%%siT1aItljQ*(KgHsL5<=E=j9Lx0OZt@zB3*IRM+1QXw zlE?4VWrF6~%vO-(Ck6@9WdfHfYNqAku}ps}tpML%v|uMOufq#0n50AKB@j4&Tlh$N zg-e^c2}d@+hJg+#I>0j0B=Vy`y0}31Di!%Sn>wJW=hYoh&)a-JotAYPPO0%-kIbQU@j>K$655w4=@?gW z5+sh4W^N{dvEPcg3s9k@AzO{U2&*nhxX7-BS5T68Obusvpf4$C%k&l;vzkkB2H7Dm z&b$Ef-V9+B-X4D*2mR8a%;s;tODkEz0)YD&=w(!TyY+qqcge zMI;`VtQXxSk)X=3kvK-bjE%&F{|gcnS{BF8kia?O{9W;ZZT+)C=l)qmE8GG0M(ECV zoPlt+whNI0n@Ej&DQop+npRtR$F#DdA*XfYh%1kbT9mG+%b!GBpT5;sZ>9R?TKo26 zNpZZVt=5;ykD!mGIrhjy0La17bj`6|yLCM__a;5aE~>s9*na0=lBgw~2E^KK_|Fpl z&6;7uE*1YsQI<7E+$-^gncAf;7iR#Ss#MD=kFbhWPUfwB;|hI2m(t5DIf&ItYOIMCjttxm5vc*|GUZ`HKJSf6dha)YL?Tt2`<^7(4z0GGWYm3{c>b6#loawa(6{Ll`2tRX4W~Er;ov~OCGI&Ito^3}fe$nI zK%((s5+69Xd?=^eQ1int?BSVo0goM*+GRMzfQN-SAv?zfi(w?(k}zW7ASPS%2j3Gn zj@|s|7I^Ox!qrb(sgpIC-(qd=q-s@DL~il8K!@icpUo>u11@jJBG+8KC`!~3vyArtTx zubsohSxC%hqW}F>th_QM=tWitS(zzIMV5q^i(^_fyNX~{q{U&3N1n8O3mlURFx0d| zh5uwB4Q3m+I>L{)ftdj?)ixOHxc%gXiSBaqX@EfhhF-Ol_1~=KInBlR8;8HC_?wNt ziTLBOYc2lj@%I7#I@$Yhhs}o@sHu`>2tU$29QhnEEI`KtQn7EFGS~%d!4p4CRom?p zGR?NkeRityc}_NYv;+1oIFh!|GF~)Q&EY(dNSYy4kkpm5@=rsuj)9%_h-}udN#rk*KrFjzsLy38bhYFcTp22urVO z79cmwpJwk@=4g`P!mH(AO4aPH0xtR>CFHO$QRs*}z!yGCqJ4T2Z8Z2*q?6$CI-u+# z6~IGS$jnKdzzLL-;5s8br;~G0_;ZB3X!$KPycTM?TLX9cvAGFhO0=35X`REGs9)Sm zn_DleIT=^f6hD)SRXohyBnpaQ$Sdo>PK#lYAHkj>g~QH6!ofsGgkRVNMukaR_`#yI z+$R0F*rsVjt{SR=^M<`5Ws%f=kYi|jw&R}=$+ih9{wb^zi!-sleT$=C>j%~^PKm4Iz`iJZlt9DGWO1UOU7YXJ>tQ&ZIT$K&)K+sfxbkUDeHGT0 zRmk9Sf}M?~wNR@V*8cc-*}ehR5y58x{F$h8CA&UXmL=44+sbHF6|<}dDqetxf)2pY zw^_NE?hre2D@ngj``z$&3k9dX=f@t6Wbwla+d^~@^DVxyUd$I8f!c-0PB@Ei$Lb8$ zfXfMoC?d47!aaw_C9&e?fVkLkA;OdKwtI2f5FaQ4oUOO9Wcl>5Ir)3rm5bmvoNaW> zQ4k3lHPc|m>l<(`_E245I75JPy++S6tpO@Z_(-q7w$~i-0Ueur6r%?U z)W~h<4~J11YXC|K*C)b9`rNewI)1t4IFi^6Ph8|6Rxhk^)&YEbLlcV9)^J{Z;Zcej zy&2QUI=zwQ*G;PzzU|`0*(e`tmsfHJiSiJ>2_qv}sUIqxWmo!6bYxlx0~Rj81^Cux zrdlJ>NYwYXj4kS}Mh}2b*y&{gsAUzioV-E5;m0WS8y9j&`E{TO!evX;(ywAeJyxyV z4q*u#kT1NLz5fMIYXE^;9yRhmsFQFmoCj`0K4+qzm={c?8o3*V#NJ^Y#W zNWZb+e`gaT-hmhz$}hFczqQN1!8gZ&FajH&JkH>ZNGJSei;5z(d#r=_K{RjYd-*Sc`(?El^ z`Nzvl2M`zBK4V|wDdB8{wIyb(9iewnAhc3Pv3wr Tfix`A@hbgf^Lr-*3#j0sr5 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

    jJ7KKzs-Qc# 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

    %1wm#<6 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

    6Z;%;8O649j2pKTgPaw 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/bin/curl/docs/ALTSVC.md b/bin/curl/docs/ALTSVC.md new file mode 100644 index 00000000..5aca1c95 --- /dev/null +++ b/bin/curl/docs/ALTSVC.md @@ -0,0 +1,59 @@ +# Alt-Svc + +curl features **EXPERIMENTAL** support for the Alt-Svc: HTTP header. + +## Experimental + +Experimental support in curl means: + +1. Experimental features are provided to allow users to try them out and + provide feedback on functionality and API etc before they ship and get + "carved in stone". +2. You must enable the feature when invoking configure as otherwise curl will + not be built with the feature present. +3. We strongly advice against using this feature in production. +4. **We reserve the right to change behavior** of the feature without sticking + to our API/ABI rules as we do for regular features, as long as it is marked + experimental. +5. Experimental features are clearly marked so in documentation. Beware. + +## Enable Alt-Svc in build + +`./configure --enable-alt-svc` + +## Standard + +[RFC 7838](https://tools.ietf.org/html/rfc7838) + +## What works + +- read alt-svc file from disk +- write alt-svc file from disk +- parse `Alt-Svc:` response headers, including `ma`, `clear` and `persist`. +- replaces old entries when new alternatives are received +- unit tests to verify most of this functionality (test 1654) +- act on `Alt-Svc:` response headers +- build conditionally on `configure --enable-alt-svc` only, feature marked as + **EXPERIMENTAL** +- implement `CURLOPT_ALTSVC_CTRL` +- implement `CURLOPT_ALTSVC` +- document `CURLOPT_ALTSVC_CTRL` +- document `CURLOPT_ALTSVC` +- document `--alt-svc` +- add `CURL_VERSION_ALTSVC` +- make `curl -V` show 'alt-svc' as a feature if built-in +- support `curl --alt-svc [file]` to enable caching, using that file +- make `tests/runtests.pl` able to filter tests on the feature `alt-svc` +- actually use the existing in-memory alt-svc cache for outgoing connections +- alt-svc cache expiry +- test 355 and 356 verify curl acting on Alt-Svc, received from header and + loaded from cache. The latter needs a debug build since it enables Alt-Svc + for plain HTTP. + +## What is left + +- handle multiple response headers, when one of them says `clear` (should + override them all) +- using `Age:` value for caching age as per spec +- `CURLALTSVC_IMMEDIATELY` support +- `CURLALTSVC_ALTUSED` support diff --git a/bin/curl/docs/BINDINGS.md b/bin/curl/docs/BINDINGS.md new file mode 100644 index 00000000..b3624b1c --- /dev/null +++ b/bin/curl/docs/BINDINGS.md @@ -0,0 +1,118 @@ +libcurl bindings +================ + + Creative people have written bindings or interfaces for various environments + and programming languages. Using one of these allows you to take advantage of + curl powers from within your favourite language or system. + + This is a list of all known interfaces as of this writing. + + The bindings listed below are not part of the curl/libcurl distribution + archives, but must be downloaded and installed separately. + +[Ada95](https://web.archive.org/web/20070403105909/www.almroth.com/adacurl/index.html) Written by Andreas Almroth + +[Basic](http://scriptbasic.com/) ScriptBasic bindings written by Peter Verhas + +C++: [curlpp](http://curlpp.org/) Written by Jean-Philippe Barrette-LaPierre, +[curlcpp](https://github.com/JosephP91/curlcpp) by Giuseppe Persico and [C++ +Requests](https://github.com/whoshuu/cpr) by Huu Nguyen + +[Ch](https://chcurl.sourceforge.io/) Written by Stephen Nestinger and Jonathan Rogado + +Cocoa: [BBHTTP](https://github.com/brunodecarvalho/BBHTTP) written by Bruno de Carvalho +[curlhandle](https://github.com/karelia/curlhandle) Written by Dan Wood + +[D](https://dlang.org/library/std/net/curl.html) Written by Kenneth Bogert + +[Delphi](https://github.com/Mercury13/curl4delphi) Written by Mikhail Merkuryev + +[Dylan](https://dylanlibs.sourceforge.io/) Written by Chris Double + +[Eiffel](https://room.eiffel.com/library/curl) Written by Eiffel Software + +[Euphoria](https://web.archive.org/web/20050204080544/rays-web.com/eulibcurl.htm) Written by Ray Smith + +[Falcon](http://www.falconpl.org/index.ftd?page_id=prjs&prj_id=curl) + +[Ferite](https://web.archive.org/web/20150102192018/ferite.org/) Written by Paul Querna + +[Gambas](https://gambas.sourceforge.io/) + +[glib/GTK+](https://web.archive.org/web/20100526203452/atterer.net/glibcurl) Written by Richard Atterer + +Go: [go-curl](https://github.com/andelf/go-curl) by ShuYu Wang + +[Guile](http://www.lonelycactus.com/guile-curl.html) Written by Michael L. Gran + +[Harbour](https://github.com/vszakats/harbour-core/tree/master/contrib/hbcurl) Written by Viktor Szakáts + +[Haskell](https://hackage.haskell.org/cgi-bin/hackage-scripts/package/curl) Written by Galois, Inc + +[Java](https://github.com/pjlegato/curl-java) + +[Julia](https://github.com/forio/Curl.jl) Written by Paul Howe + +[Lisp](https://common-lisp.net/project/cl-curl/) Written by Liam Healy + +Lua: [luacurl](http://luacurl.luaforge.net/) by Alexander Marinov, [Lua-cURL](https://github.com/Lua-cURL) by Jürgen Hötzel + +[Mono](https://forge.novell.com/modules/xfmod/project/?libcurl-mono) Written by Jeffrey Phillips + +[.NET](https://sourceforge.net/projects/libcurl-net/) libcurl-net by Jeffrey Phillips + +[node.js](https://github.com/JCMais/node-libcurl) node-libcurl by Jonathan Cardoso Machado + +[Object-Pascal](https://web.archive.org/web/20020610214926/www.tekool.com/opcurl) Free Pascal, Delphi and Kylix binding written by Christophe Espern. + +[OCaml](https://opam.ocaml.org/packages/ocurl/) Written by Lars Nilsson and ygrek + +[Pascal](https://web.archive.org/web/20030804091414/houston.quik.com/jkp/curlpas/) Free Pascal, Delphi and Kylix binding written by Jeffrey Pohlmeyer. + +Perl: [WWW--Curl](https://github.com/szbalint/WWW--Curl) Maintained by Cris +Bailiff and Bálint Szilakszi, +[perl6-net-curl](https://github.com/azawawi/perl6-net-curl) by Ahmad M. Zawawi + +[PHP](https://php.net/curl) Originally written by Sterling Hughes + +[PostgreSQL](https://github.com/pramsey/pgsql-http) - HTTP client for PostgreSQL + +[Python](http://pycurl.io/) PycURL by Kjetil Jacobsen + +[R](https://cran.r-project.org/package=curl) + +[Rexx](https://rexxcurl.sourceforge.io/) Written Mark Hessling + +[Ring](https://ring-lang.sourceforge.io/doc1.3/libcurl.html) RingLibCurl by Mahmoud Fayed + +RPG, support for ILE/RPG on OS/400 is included in source distribution + +Ruby: [curb](https://github.com/taf2/curb) written by Ross Bamford + +[Rust](https://github.com/carllerche/curl-rust) curl-rust - by Carl Lerche + +[Scheme](https://www.metapaper.net/lisovsky/web/curl/) Bigloo binding by Kirill Lisovsky + +[Scilab](https://help.scilab.org/docs/current/fr_FR/getURL.html) binding by Sylvestre Ledru + +[S-Lang](https://www.jedsoft.org/slang/modules/curl.html) by John E Davis + +[Smalltalk](http://www.squeaksource.com/CurlPlugin/) Written by Danil Osipchuk + +[SP-Forth](https://sourceforge.net/p/spf/spf/ci/master/tree/devel/~ac/lib/lin/curl/) Written by Andrey Cherezov + +[SPL](http://www.clifford.at/spl/) Written by Clifford Wolf + +[Tcl](https://web.archive.org/web/20160826011806/mirror.yellow5.com/tclcurl/) Tclcurl by Andrés García + +[Visual Basic](https://sourceforge.net/projects/libcurl-vb/) libcurl-vb by Jeffrey Phillips + +[Visual Foxpro](https://web.archive.org/web/20130730181523/www.ctl32.com.ar/libcurl.asp) by Carlos Alloatti + +[Q](https://q-lang.sourceforge.io/) The libcurl module is part of the default install + +[wxWidgets](https://wxcode.sourceforge.io/components/wxcurl/) Written by Casey O'Donnell + +[XBLite](https://web.archive.org/web/20060426150418/perso.wanadoo.fr/xblite/libraries.html) Written by David Szafranski + +[Xojo](https://github.com/charonn0/RB-libcURL) Written by Andrew Lambert diff --git a/bin/curl/docs/BUG-BOUNTY.md b/bin/curl/docs/BUG-BOUNTY.md new file mode 100644 index 00000000..8ee9ac62 --- /dev/null +++ b/bin/curl/docs/BUG-BOUNTY.md @@ -0,0 +1,106 @@ +# The curl bug bounty + +The curl project runs a bug bounty program in association with +[HackerOne](https://www.hackerone.com) and the [Internet Bug +Bounty](https://internetbugbounty.org). + +# How does it work? + +Start out by posting your suspected security vulnerability directly to [curl's +HackerOne program](https://hackerone.com/curl). + +After you have reported a security issue, it has been deemed credible, and a +patch and advisory has been made public, you may be eligible for a bounty from +this program. + +See all details at [https://hackerone.com/curl](https://hackerone.com/curl) + +This bounty is relying on funds from sponsors. If you use curl professionally, +consider help funding this! See +[https://opencollective.com/curl](https://opencollective.com/curl) for +details. + +# What are the reward amounts? + +The curl projects offer monetary compensation for reported and published +security vulnerabilities. The amount of money that is rewarded depends on how +serious the flaw is determined to be. + +We offer reward money *up to* a certain amount per severity. The curl security +team determines the severity of each reported flaw on a case by case basis and +the exact amount rewarded to the reporter is then decided. + +Check out the current award amounts at [https://hackerone.com/curl](https://hackerone.com/curl) + +# Who is eligible for a reward? + +Everyone and anyone who reports a security problem in a released curl version +that hasn't already been reported can ask for a bounty. + +Vulnerabilities in features that are off by default and documented as +experimental are not eligible for a reward. + +The vulnerability has to be fixed and publicly announced (by the curl project) +before a bug bounty will be considered. + +Bounties need to be requested within twelve months from the publication of the +vulnerability. + +The vulnerabilities must not have been made public before February 1st, 2019. +We do not retroactively pay for old, already known, or published security +problems. + +# Product vulnerabilities only + +This bug bounty only concerns the curl and libcurl products and thus their +respective source codes - when running on existing hardware. It does not +include documentation, websites, or other infrastructure. + +The curl security team will be the sole arbiter if a reported flaw can be +subject to a bounty or not. + +# How are vulnerabilities graded? + +The grading of each reported vulnerability that makes a reward claim will be +performed by the curl security team. The grading will be based on the CVSS +(Common Vulnerability Scoring System) 3.0. + +# How are reward amounts determined? + +The curl security team first gives the vulnerability a score, as mentioned +above, and based on that level we set an amount depending on the specifics of +the individual case. Other sponsors of the program might also get involved and +can raise the amounts depending on the particular issue. + +# What happens if the bounty fund is drained? + +The bounty fund depends on sponsors. If we pay out more bounties than we add, +the fund will eventually drain. If that end up happening, we will simply not +be able to pay out as high bounties as we would like and hope that we can +convince new sponsors to help us top up the fund again. + +# Regarding taxes, etc. on the bounties + +In the event that the individual receiving a curl bug bounty needs to pay +taxes on the reward money, the responsibility lies with the receiver. The +curl project or its security team never actually receive any of this money, +hold the money, or pay out the money. + +## Bonus levels + +In cooperation with [Dropbox](https://www.dropbox.com) the curl bug bounty can +offer the highest levels of rewards if the issue covers one of the interest +areas of theirs - and only if the bug is graded *high* or *critical*. A +non-exhaustive list of vulnerabilities Dropbox is interested in are: + + - RCE + - URL parsing vulnerabilities with demonstrable security impact + +Dropbox would generally hand out rewards for critical vulnerabilities ranging +from 12k-32k USD where RCE is on the upper end of the spectrum. + +URL parsing vulnerabilities with demonstrable security impact might include +incorrectly determining the authority of a URL when a special character is +inserted into the path of the URL (as a hypothetical). This type of +vulnerability would likely yield 6k-12k unless further impact could be +demonstrated. diff --git a/bin/curl/docs/BUGS.txt b/bin/curl/docs/BUGS.txt new file mode 100644 index 00000000..480e0cae --- /dev/null +++ b/bin/curl/docs/BUGS.txt @@ -0,0 +1,302 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +BUGS + + 1. Bugs + 1.1 There are still bugs + 1.2 Where to report + 1.3 Security bugs + 1.4 What to report + 1.5 libcurl problems + 1.6 Who will fix the problems + 1.7 How to get a stack trace + 1.8 Bugs in libcurl bindings + 1.9 Bugs in old versions + + 2. Bug fixing procedure + 2.1 What happens on first filing + 2.2 First response + 2.3 Not reproducible + 2.4 Unresponsive + 2.5 Lack of time/interest + 2.6 KNOWN_BUGS + 2.7 TODO + 2.8 Closing off stalled bugs + +============================================================================== + +1.1 There are still bugs + + Curl and libcurl keep being developed. Adding features and changing code + means that bugs will sneak in, no matter how hard we try not to. + + Of course there are lots of bugs left. And lots of misfeatures. + + To help us make curl the stable and solid product we want it to be, we need + bug reports and bug fixes. + +1.2 Where to report + + If you can't fix a bug yourself and submit a fix for it, try to report an as + detailed report as possible to a curl mailing list to allow one of us to + have a go at a solution. You can optionally also post your bug/problem at + curl's bug tracking system over at + + https://github.com/curl/curl/issues + + Please read the rest of this document below first before doing that! + + If you feel you need to ask around first, find a suitable mailing list and + post there. The lists are available on https://curl.haxx.se/mail/ + +1.3 Security bugs + + If you find a bug or problem in curl or libcurl that you think has a + security impact, for example a bug that can put users in danger or make them + vulnerable if the bug becomes public knowledge, then please report that bug + using our security development process. + + Security related bugs or bugs that are suspected to have a security impact, + should be reported on the curl security tracker at HackerOne: + + https://hackerone.com/curl + + This ensures that the report reaches the curl security team so that they + first can be deal with the report away from the public to minimize the harm + and impact it will have on existing users out there who might be using the + vulnerable versions. + + The curl project's process for handling security related issues is + documented here: + + https://curl.haxx.se/dev/secprocess.html + +1.4 What to report + + When reporting a bug, you should include all information that will help us + understand what's wrong, what you expected to happen and how to repeat the + bad behavior. You therefore need to tell us: + + - your operating system's name and version number + + - what version of curl you're using (curl -V is fine) + + - versions of the used libraries that libcurl is built to use + + - what URL you were working with (if possible), at least which protocol + + and anything and everything else you think matters. Tell us what you + expected to happen, tell use what did happen, tell us how you could make it + work another way. Dig around, try out, test. Then include all the tiny bits + and pieces in your report. You will benefit from this yourself, as it will + enable us to help you quicker and more accurately. + + Since curl deals with networks, it often helps us if you include a protocol + debug dump with your bug report. The output you get by using the -v or + --trace options. + + If curl crashed, causing a core dump (in unix), there is hardly any use to + send that huge file to anyone of us. Unless we have an exact same system + setup as you, we can't do much with it. Instead we ask you to get a stack + trace and send that (much smaller) output to us instead! + + The address and how to subscribe to the mailing lists are detailed in the + MANUAL file. + +1.5 libcurl problems + + When you've written your own application with libcurl to perform transfers, + it is even more important to be specific and detailed when reporting bugs. + + Tell us the libcurl version and your operating system. Tell us the name and + version of all relevant sub-components like for example the SSL library + you're using and what name resolving your libcurl uses. If you use SFTP or + SCP, the libssh2 version is relevant etc. + + Showing us a real source code example repeating your problem is the best way + to get our attention and it will greatly increase our chances to understand + your problem and to work on a fix (if we agree it truly is a problem). + + Lots of problems that appear to be libcurl problems are actually just abuses + of the libcurl API or other malfunctions in your applications. It is advised + that you run your problematic program using a memory debug tool like + valgrind or similar before you post memory-related or "crashing" problems to + us. + +1.6 Who will fix the problems + + If the problems or bugs you describe are considered to be bugs, we want to + have the problems fixed. + + There are no developers in the curl project that are paid to work on bugs. + All developers that take on reported bugs do this on a voluntary basis. We + do it out of an ambition to keep curl and libcurl excellent products and out + of pride. + + But please do not assume that you can just lump over something to us and it + will then magically be fixed after some given time. Most often we need + feedback and help to understand what you've experienced and how to repeat a + problem. Then we may only be able to assist YOU to debug the problem and to + track down the proper fix. + + We get reports from many people every month and each report can take a + considerable amount of time to really go to the bottom with. + +1.7 How to get a stack trace + + First, you must make sure that you compile all sources with -g and that you + don't 'strip' the final executable. Try to avoid optimizing the code as + well, remove -O, -O2 etc from the compiler options. + + Run the program until it cores. + + Run your debugger on the core file, like ' curl core'. + should be replaced with the name of your debugger, in most cases that will + be 'gdb', but 'dbx' and others also occur. + + When the debugger has finished loading the core file and presents you a + prompt, enter 'where' (without the quotes) and press return. + + The list that is presented is the stack trace. If everything worked, it is + supposed to contain the chain of functions that were called when curl + crashed. Include the stack trace with your detailed bug report. It'll help a + lot. + +1.8 Bugs in libcurl bindings + + There will of course pop up bugs in libcurl bindings. You should then + primarily approach the team that works on that particular binding and see + what you can do to help them fix the problem. + + If you suspect that the problem exists in the underlying libcurl, then + please convert your program over to plain C and follow the steps outlined + above. + +1.9 Bugs in old versions + + The curl project typically releases new versions every other month, and we + fix several hundred bugs per year. For a huge table of releases, number of + bug fixes and more, see: https://curl.haxx.se/docs/releases.html + + The developers in the curl project do not have bandwidth or energy enough to + maintain several branches or to spend much time on hunting down problems in + old versions when chances are we already fixed them or at least that they've + changed nature and appearance in later versions. + + When you experience a problem and want to report it, you really SHOULD + include the version number of the curl you're using when you experience the + issue. If that version number shows us that you're using an out-of-date + curl, you should also try out a modern curl version to see if the problem + persists or how/if it has changed in appearance. + + Even if you cannot immediately upgrade your application/system to run the + latest curl version, you can most often at least run a test version or + experimental build or similar, to get this confirmed or not. + + At times people insist that they cannot upgrade to a modern curl version, + but instead they "just want the bug fixed". That's fine, just don't count on + us spending many cycles on trying to identify which single commit, if that's + even possible, that at some point in the past fixed the problem you're now + experiencing. + + Security wise, it is almost always a bad idea to lag behind the current curl + versions by a lot. We keeping discovering and reporting security problems + over time see you can see in this table: + https://curl.haxx.se/docs/vulnerabilities.html + +2. Bug fixing procedure + +2.1 What happens on first filing + + When a new issue is posted in the issue tracker or on the mailing list, the + team of developers first need to see the report. Maybe they took the day + off, maybe they're off in the woods hunting. Have patience. Allow at least a + few days before expecting someone to have responded. + + In the issue tracker you can expect that some labels will be set on the + issue to help categorize it. + +2.2 First response + + If your issue/bug report wasn't perfect at once (and few are), chances are + that someone will ask follow-up questions. Which version did you use? Which + options did you use? How often does the problem occur? How can we reproduce + this problem? Which protocols does it involve? Or perhaps much more specific + and deep diving questions. It all depends on your specific issue. + + You should then respond to these follow-up questions and provide more info + about the problem, so that we can help you figure it out. Or maybe you can + help us figure it out. An active back-and-forth communication is important + and the key for finding a cure and landing a fix. + +2.3 Not reproducible + + For problems that we can't reproduce and can't understand even after having + gotten all the info we need and having studied the source code over again, + are really hard to solve so then we may require further work from you who + actually see or experience the problem. + +2.4 Unresponsive + + If the problem haven't been understood or reproduced, and there's nobody + responding to follow-up questions or questions asking for clarifications or + for discussing possible ways to move forward with the task, we take that as + a strong suggestion that the bug is not important. + + Unimportant issues will be closed as inactive sooner or later as they can't + be fixed. The inactivity period (waiting for responses) should not be + shorter than two weeks but may extend months. + +2.5 Lack of time/interest + + Bugs that are filed and are understood can unfortunately end up in the + "nobody cares enough about it to work on it" category. Such bugs are + perfectly valid problems that *should* get fixed but apparently aren't. We + try to mark such bugs as "KNOWN_BUGS material" after a time of inactivity + and if no activity is noticed after yet some time those bugs are added to + KNOWN_BUGS and are closed in the issue tracker. + +2.6 KNOWN_BUGS + + This is a list of known bugs. Bugs we know exist and that have been pointed + out but that haven't yet been fixed. The reasons for why they haven't been + fixed can involve anything really, but the primary reason is that nobody has + considered these problems to be important enough to spend the necessary time + and effort to have them fixed. + + The KNOWN_BUGS are always up for grabs and we will always love the ones who + bring one of them back to live and offers solutions to them. + + The KNOWN_BUGS document has a sibling document known as TODO. + +2.7 TODO + + Issues that are filed or reported that aren't really bugs but more missing + features or ideas for future improvements and so on are marked as + 'enhancement' or 'feature-request' and will be added to the TODO document + instead and the issue is closed. We don't keep TODO items in the issue + tracker. + + The TODO document is full of ideas and suggestions of what we can add or fix + one day. You're always encouraged and free to grab one of those items and + take up a discussion with the curl development team on how that could be + implemented or provided in the project so that you can work on ticking it + odd that document. + + If the issue is rather a bug and not a missing feature or functionality, it + is listed in KNOWN_BUGS instead. + +2.8 Closing off stalled bugs + + The issue and pull request trackers on https://github.com/curl/curl will + only hold "active" entries (using a non-precise definition of what active + actually is, but they're at least not completely dead). Those that are + abandoned or in other ways dormant will be closed and sometimes added to + TODO and KNOWN_BUGS instead. + + This way, we only have "active" issues open on github. Irrelevant issues and + pull requests will not distract developers or casual visitors. diff --git a/bin/curl/docs/CHECKSRC.md b/bin/curl/docs/CHECKSRC.md new file mode 100644 index 00000000..10e2f4d7 --- /dev/null +++ b/bin/curl/docs/CHECKSRC.md @@ -0,0 +1,162 @@ +# checksrc + +This is the tool we use within the curl project to scan C source code and +check that it adheres to our [Source Code Style guide](CODE_STYLE.md). + +## Usage + + checksrc.pl [options] [file1] [file2] ... + +## Command line options + +`-W[file]` whitelists that file and excludes it from being checked. Helpful +when, for example, one of the files is generated. + +`-D[dir]` directory name to prepend to file names when accessing them. + +`-h` shows the help output, that also lists all recognized warnings + +## What does checksrc warn for? + +checksrc does not check and verify the code against the entire style guide, +but the script is instead an effort to detect the most common mistakes and +syntax mistakes that contributors make before they get accustomed to our code +style. Heck, many of us regulars do the mistakes too and this script helps us +keep the code in shape. + + checksrc.pl -h + +Lists how to use the script and it lists all existing warnings it has and +problems it detects. At the time of this writing, the existing checksrc +warnings are: + +- `ASSIGNWITHINCONDITION`: Assignment within a conditional expression. The + code style mandates the assignment to be done outside of it. + +- `ASTERISKNOSPACE`: A pointer was declared like `char* name` instead of the more + appropriate `char *name` style. The asterisk should sit next to the name. + +- `ASTERISKSPACE`: A pointer was declared like `char * name` instead of the + more appropriate `char *name` style. The asterisk should sit right next to + the name without a space in between. + +- `BADCOMMAND`: There's a bad !checksrc! instruction in the code. See the + **Ignore certain warnings** section below for details. + +- `BANNEDFUNC`: A banned function was used. The functions sprintf, vsprintf, + strcat, strncat, gets are **never** allowed in curl source code. + +- `BRACEELSE`: '} else' on the same line. The else is supposed to be on the + following line. + +- `BRACEPOS`: wrong position for an open brace (`{`). + +- `COMMANOSPACE`: a comma without following space + +- `COPYRIGHT`: the file is missing a copyright statement! + +- `CPPCOMMENTS`: `//` comment detected, that's not C89 compliant + +- `FOPENMODE`: `fopen()` needs a macro for the mode string, use it + +- `INDENTATION`: detected a wrong start column for code. Note that this + warning only checks some specific places and will certainly miss many bad + indentations. + +- `LONGLINE`: A line is longer than 79 columns. + +- `MULTISPACE`: Multiple spaces were found where only one should be used. + +- `NOSPACEEQUALS`: An equals sign was found without preceding space. We prefer + `a = 2` and *not* `a=2`. + +- `OPENCOMMENT`: File ended with a comment (`/*`) still "open". + +- `PARENBRACE`: `){` was used without sufficient space in between. + +- `RETURNNOSPACE`: `return` was used without space between the keyword and the + following value. + +- `SEMINOSPACE`: There was no space (or newline) following a semicolon. + +- `SIZEOFNOPAREN`: Found use of sizeof without parentheses. We prefer + `sizeof(int)` style. + +- `SNPRINTF` - Found use of `snprintf()`. Since we use an internal replacement + with a different return code etc, we prefer `msnprintf()`. + +- `SPACEAFTERPAREN`: there was a space after open parenthesis, `( text`. + +- `SPACEBEFORECLOSE`: there was a space before a close parenthesis, `text )`. + +- `SPACEBEFORECOMMA`: there was a space before a comma, `one , two`. + +- `SPACEBEFOREPAREN`: there was a space before an open parenthesis, `if (`, + where one was not expected + +- `SPACESEMICOLON`: there was a space before semicolon, ` ;`. + +- `TABS`: TAB characters are not allowed! + +- `TRAILINGSPACE`: Trailing white space on the line + +- `UNUSEDIGNORE`: a checksrc inlined warning ignore was asked for but not used, + that's an ignore that should be removed or changed to get used. + +### Extended warnings + +Some warnings are quite computationally expensive to perform, so they are +turned off by default. To enable these warnings, place a `.checksrc` file in +the directory where they should be activated with commands to enable the +warnings you are interested in. The format of the file is to enable one +warning per line like so: `enable ` + +Currently there is one extended warning which can be enabled: + +- `COPYRIGHTYEAR`: the current changeset hasn't updated the copyright year in + the source file + +## Ignore certain warnings + +Due to the nature of the source code and the flaws of the checksrc tool, there +is sometimes a need to ignore specific warnings. checksrc allows a few +different ways to do this. + +### Inline ignore + +You can control what to ignore within a specific source file by providing +instructions to checksrc in the source code itself. You need a magic marker +that is `!checksrc!` followed by the instruction. The instruction can ask to +ignore a specific warning N number of times or you ignore all of them until +you mark the end of the ignored section. + +Inline ignores are only done for that single specific source code file. + +Example + + /* !checksrc! disable LONGLINE all */ + +This will ignore the warning for overly long lines until it is re-enabled with: + + /* !checksrc! enable LONGLINE */ + +If the enabling isn't performed before the end of the file, it will be enabled +automatically for the next file. + +You can also opt to ignore just N violations so that if you have a single long +line you just can't shorten and is agreed to be fine anyway: + + /* !checksrc! disable LONGLINE 1 */ + +... and the warning for long lines will be enabled again automatically after +it has ignored that single warning. The number `1` can of course be changed to +any other integer number. It can be used to make sure only the exact intended +instances are ignored and nothing extra. + +### Directory wide ignore patterns + +This is a method we've transitioned away from. Use inline ignores as far as +possible. + +Make a `checksrc.whitelist` file in the directory of the source code with the +false positive, and include the full offending line into this file. diff --git a/bin/curl/docs/CIPHERS.md b/bin/curl/docs/CIPHERS.md new file mode 100644 index 00000000..0b7ccebf --- /dev/null +++ b/bin/curl/docs/CIPHERS.md @@ -0,0 +1,503 @@ +# Ciphers + +With curl's options +[`CURLOPT_SSL_CIPHER_LIST`](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) +and +[`--ciphers`](https://curl.haxx.se/docs/manpage.html#--ciphers) +users can control which ciphers to consider when negotiating TLS connections. + +TLS 1.3 ciphers are supported since curl 7.61 with options +[`CURLOPT_TLS13_CIPHERS`](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html) +and +[`--tls13-ciphers`](https://curl.haxx.se/docs/manpage.html#--tls13-ciphers) +. + +The names of the known ciphers differ depending on which TLS backend that +libcurl was built to use. This is an attempt to list known cipher names. + +## OpenSSL + +(based on [OpenSSL docs](https://www.openssl.org/docs/man1.1.0/apps/ciphers.html)) + +When specifying multiple cipher names, separate them with colon (`:`). + +### SSL3 cipher suites + +`NULL-MD5` +`NULL-SHA` +`RC4-MD5` +`RC4-SHA` +`IDEA-CBC-SHA` +`DES-CBC3-SHA` +`DH-DSS-DES-CBC3-SHA` +`DH-RSA-DES-CBC3-SHA` +`DHE-DSS-DES-CBC3-SHA` +`DHE-RSA-DES-CBC3-SHA` +`ADH-RC4-MD5` +`ADH-DES-CBC3-SHA` + +### TLS v1.0 cipher suites + +`NULL-MD5` +`NULL-SHA` +`RC4-MD5` +`RC4-SHA` +`IDEA-CBC-SHA` +`DES-CBC3-SHA` +`DHE-DSS-DES-CBC3-SHA` +`DHE-RSA-DES-CBC3-SHA` +`ADH-RC4-MD5` +`ADH-DES-CBC3-SHA` + +### AES ciphersuites from RFC3268, extending TLS v1.0 + +`AES128-SHA` +`AES256-SHA` +`DH-DSS-AES128-SHA` +`DH-DSS-AES256-SHA` +`DH-RSA-AES128-SHA` +`DH-RSA-AES256-SHA` +`DHE-DSS-AES128-SHA` +`DHE-DSS-AES256-SHA` +`DHE-RSA-AES128-SHA` +`DHE-RSA-AES256-SHA` +`ADH-AES128-SHA` +`ADH-AES256-SHA` + +### SEED ciphersuites from RFC4162, extending TLS v1.0 + +`SEED-SHA` +`DH-DSS-SEED-SHA` +`DH-RSA-SEED-SHA` +`DHE-DSS-SEED-SHA` +`DHE-RSA-SEED-SHA` +`ADH-SEED-SHA` + +### GOST ciphersuites, extending TLS v1.0 + +`GOST94-GOST89-GOST89` +`GOST2001-GOST89-GOST89` +`GOST94-NULL-GOST94` +`GOST2001-NULL-GOST94` + +### Elliptic curve cipher suites + +`ECDHE-RSA-NULL-SHA` +`ECDHE-RSA-RC4-SHA` +`ECDHE-RSA-DES-CBC3-SHA` +`ECDHE-RSA-AES128-SHA` +`ECDHE-RSA-AES256-SHA` +`ECDHE-ECDSA-NULL-SHA` +`ECDHE-ECDSA-RC4-SHA` +`ECDHE-ECDSA-DES-CBC3-SHA` +`ECDHE-ECDSA-AES128-SHA` +`ECDHE-ECDSA-AES256-SHA` +`AECDH-NULL-SHA` +`AECDH-RC4-SHA` +`AECDH-DES-CBC3-SHA` +`AECDH-AES128-SHA` +`AECDH-AES256-SHA` + +### TLS v1.2 cipher suites + +`NULL-SHA256` +`AES128-SHA256` +`AES256-SHA256` +`AES128-GCM-SHA256` +`AES256-GCM-SHA384` +`DH-RSA-AES128-SHA256` +`DH-RSA-AES256-SHA256` +`DH-RSA-AES128-GCM-SHA256` +`DH-RSA-AES256-GCM-SHA384` +`DH-DSS-AES128-SHA256` +`DH-DSS-AES256-SHA256` +`DH-DSS-AES128-GCM-SHA256` +`DH-DSS-AES256-GCM-SHA384` +`DHE-RSA-AES128-SHA256` +`DHE-RSA-AES256-SHA256` +`DHE-RSA-AES128-GCM-SHA256` +`DHE-RSA-AES256-GCM-SHA384` +`DHE-DSS-AES128-SHA256` +`DHE-DSS-AES256-SHA256` +`DHE-DSS-AES128-GCM-SHA256` +`DHE-DSS-AES256-GCM-SHA384` +`ECDHE-RSA-AES128-SHA256` +`ECDHE-RSA-AES256-SHA384` +`ECDHE-RSA-AES128-GCM-SHA256` +`ECDHE-RSA-AES256-GCM-SHA384` +`ECDHE-ECDSA-AES128-SHA256` +`ECDHE-ECDSA-AES256-SHA384` +`ECDHE-ECDSA-AES128-GCM-SHA256` +`ECDHE-ECDSA-AES256-GCM-SHA384` +`ADH-AES128-SHA256` +`ADH-AES256-SHA256` +`ADH-AES128-GCM-SHA256` +`ADH-AES256-GCM-SHA384` +`AES128-CCM` +`AES256-CCM` +`DHE-RSA-AES128-CCM` +`DHE-RSA-AES256-CCM` +`AES128-CCM8` +`AES256-CCM8` +`DHE-RSA-AES128-CCM8` +`DHE-RSA-AES256-CCM8` +`ECDHE-ECDSA-AES128-CCM` +`ECDHE-ECDSA-AES256-CCM` +`ECDHE-ECDSA-AES128-CCM8` +`ECDHE-ECDSA-AES256-CCM8` + +### Camellia HMAC-Based ciphersuites from RFC6367, extending TLS v1.2 + +`ECDHE-ECDSA-CAMELLIA128-SHA256` +`ECDHE-ECDSA-CAMELLIA256-SHA384` +`ECDHE-RSA-CAMELLIA128-SHA256` +`ECDHE-RSA-CAMELLIA256-SHA384` + +### TLS 1.3 cipher suites + +(Note these ciphers are set with `CURLOPT_TLS13_CIPHERS` and `--tls13-ciphers`) + +`TLS_AES_256_GCM_SHA384` +`TLS_CHACHA20_POLY1305_SHA256` +`TLS_AES_128_GCM_SHA256` +`TLS_AES_128_CCM_8_SHA256` +`TLS_AES_128_CCM_SHA256` + +## NSS + +### Totally insecure + +`rc4` +`rc4-md5` +`rc4export` +`rc2` +`rc2export` +`des` +`desede3` + +### SSL3/TLS cipher suites + +`rsa_rc4_128_md5` +`rsa_rc4_128_sha` +`rsa_3des_sha` +`rsa_des_sha` +`rsa_rc4_40_md5` +`rsa_rc2_40_md5` +`rsa_null_md5` +`rsa_null_sha` +`fips_3des_sha` +`fips_des_sha` +`fortezza` +`fortezza_rc4_128_sha` +`fortezza_null` + +### TLS 1.0 Exportable 56-bit Cipher Suites + +`rsa_des_56_sha` +`rsa_rc4_56_sha` + +### AES ciphers + +`dhe_dss_aes_128_cbc_sha` +`dhe_dss_aes_256_cbc_sha` +`dhe_rsa_aes_128_cbc_sha` +`dhe_rsa_aes_256_cbc_sha` +`rsa_aes_128_sha` +`rsa_aes_256_sha` + +### ECC ciphers + +`ecdh_ecdsa_null_sha` +`ecdh_ecdsa_rc4_128_sha` +`ecdh_ecdsa_3des_sha` +`ecdh_ecdsa_aes_128_sha` +`ecdh_ecdsa_aes_256_sha` +`ecdhe_ecdsa_null_sha` +`ecdhe_ecdsa_rc4_128_sha` +`ecdhe_ecdsa_3des_sha` +`ecdhe_ecdsa_aes_128_sha` +`ecdhe_ecdsa_aes_256_sha` +`ecdh_rsa_null_sha` +`ecdh_rsa_128_sha` +`ecdh_rsa_3des_sha` +`ecdh_rsa_aes_128_sha` +`ecdh_rsa_aes_256_sha` +`ecdhe_rsa_null` +`ecdhe_rsa_rc4_128_sha` +`ecdhe_rsa_3des_sha` +`ecdhe_rsa_aes_128_sha` +`ecdhe_rsa_aes_256_sha` +`ecdh_anon_null_sha` +`ecdh_anon_rc4_128sha` +`ecdh_anon_3des_sha` +`ecdh_anon_aes_128_sha` +`ecdh_anon_aes_256_sha` + +### HMAC-SHA256 cipher suites + +`rsa_null_sha_256` +`rsa_aes_128_cbc_sha_256` +`rsa_aes_256_cbc_sha_256` +`dhe_rsa_aes_128_cbc_sha_256` +`dhe_rsa_aes_256_cbc_sha_256` +`ecdhe_ecdsa_aes_128_cbc_sha_256` +`ecdhe_rsa_aes_128_cbc_sha_256` + +### AES GCM cipher suites in RFC 5288 and RFC 5289 + +`rsa_aes_128_gcm_sha_256` +`dhe_rsa_aes_128_gcm_sha_256` +`dhe_dss_aes_128_gcm_sha_256` +`ecdhe_ecdsa_aes_128_gcm_sha_256` +`ecdh_ecdsa_aes_128_gcm_sha_256` +`ecdhe_rsa_aes_128_gcm_sha_256` +`ecdh_rsa_aes_128_gcm_sha_256` + +### cipher suites using SHA384 + +`rsa_aes_256_gcm_sha_384` +`dhe_rsa_aes_256_gcm_sha_384` +`dhe_dss_aes_256_gcm_sha_384` +`ecdhe_ecdsa_aes_256_sha_384` +`ecdhe_rsa_aes_256_sha_384` +`ecdhe_ecdsa_aes_256_gcm_sha_384` +`ecdhe_rsa_aes_256_gcm_sha_384` + +### chacha20-poly1305 cipher suites + +`ecdhe_rsa_chacha20_poly1305_sha_256` +`ecdhe_ecdsa_chacha20_poly1305_sha_256` +`dhe_rsa_chacha20_poly1305_sha_256` + +## GSKit + +Ciphers are internally defined as +[numeric codes](https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/apis/gsk_attribute_set_buffer.htm), +but libcurl maps them to the following case-insensitive names. + +### SSL2 cipher suites (insecure: disabled by default) + +`rc2-md5` +`rc4-md5` +`exp-rc2-md5` +`exp-rc4-md5` +`des-cbc-md5` +`des-cbc3-md5` + +### SSL3 cipher suites + +`null-md5` +`null-sha` +`rc4-md5` +`rc4-sha` +`exp-rc2-cbc-md5` +`exp-rc4-md5` +`exp-des-cbc-sha` +`des-cbc3-sha` + +### TLS v1.0 cipher suites + +`null-md5` +`null-sha` +`rc4-md5` +`rc4-sha` +`exp-rc2-cbc-md5` +`exp-rc4-md5` +`exp-des-cbc-sha` +`des-cbc3-sha` +`aes128-sha` +`aes256-sha` + +### TLS v1.1 cipher suites + +`null-md5` +`null-sha` +`rc4-md5` +`rc4-sha` +`exp-des-cbc-sha` +`des-cbc3-sha` +`aes128-sha` +`aes256-sha` + +### TLS v1.2 cipher suites + +`null-md5` +`null-sha` +`null-sha256` +`rc4-md5` +`rc4-sha` +`des-cbc3-sha` +`aes128-sha` +`aes256-sha` +`aes128-sha256` +`aes256-sha256` +`aes128-gcm-sha256` +`aes256-gcm-sha384` + +## WolfSSL + +`RC4-SHA`, +`RC4-MD5`, +`DES-CBC3-SHA`, +`AES128-SHA`, +`AES256-SHA`, +`NULL-SHA`, +`NULL-SHA256`, +`DHE-RSA-AES128-SHA`, +`DHE-RSA-AES256-SHA`, +`DHE-PSK-AES256-GCM-SHA384`, +`DHE-PSK-AES128-GCM-SHA256`, +`PSK-AES256-GCM-SHA384`, +`PSK-AES128-GCM-SHA256`, +`DHE-PSK-AES256-CBC-SHA384`, +`DHE-PSK-AES128-CBC-SHA256`, +`PSK-AES256-CBC-SHA384`, +`PSK-AES128-CBC-SHA256`, +`PSK-AES128-CBC-SHA`, +`PSK-AES256-CBC-SHA`, +`DHE-PSK-AES128-CCM`, +`DHE-PSK-AES256-CCM`, +`PSK-AES128-CCM`, +`PSK-AES256-CCM`, +`PSK-AES128-CCM-8`, +`PSK-AES256-CCM-8`, +`DHE-PSK-NULL-SHA384`, +`DHE-PSK-NULL-SHA256`, +`PSK-NULL-SHA384`, +`PSK-NULL-SHA256`, +`PSK-NULL-SHA`, +`HC128-MD5`, +`HC128-SHA`, +`HC128-B2B256`, +`AES128-B2B256`, +`AES256-B2B256`, +`RABBIT-SHA`, +`NTRU-RC4-SHA`, +`NTRU-DES-CBC3-SHA`, +`NTRU-AES128-SHA`, +`NTRU-AES256-SHA`, +`AES128-CCM-8`, +`AES256-CCM-8`, +`ECDHE-ECDSA-AES128-CCM`, +`ECDHE-ECDSA-AES128-CCM-8`, +`ECDHE-ECDSA-AES256-CCM-8`, +`ECDHE-RSA-AES128-SHA`, +`ECDHE-RSA-AES256-SHA`, +`ECDHE-ECDSA-AES128-SHA`, +`ECDHE-ECDSA-AES256-SHA`, +`ECDHE-RSA-RC4-SHA`, +`ECDHE-RSA-DES-CBC3-SHA`, +`ECDHE-ECDSA-RC4-SHA`, +`ECDHE-ECDSA-DES-CBC3-SHA`, +`AES128-SHA256`, +`AES256-SHA256`, +`DHE-RSA-AES128-SHA256`, +`DHE-RSA-AES256-SHA256`, +`ECDH-RSA-AES128-SHA`, +`ECDH-RSA-AES256-SHA`, +`ECDH-ECDSA-AES128-SHA`, +`ECDH-ECDSA-AES256-SHA`, +`ECDH-RSA-RC4-SHA`, +`ECDH-RSA-DES-CBC3-SHA`, +`ECDH-ECDSA-RC4-SHA`, +`ECDH-ECDSA-DES-CBC3-SHA`, +`AES128-GCM-SHA256`, +`AES256-GCM-SHA384`, +`DHE-RSA-AES128-GCM-SHA256`, +`DHE-RSA-AES256-GCM-SHA384`, +`ECDHE-RSA-AES128-GCM-SHA256`, +`ECDHE-RSA-AES256-GCM-SHA384`, +`ECDHE-ECDSA-AES128-GCM-SHA256`, +`ECDHE-ECDSA-AES256-GCM-SHA384`, +`ECDH-RSA-AES128-GCM-SHA256`, +`ECDH-RSA-AES256-GCM-SHA384`, +`ECDH-ECDSA-AES128-GCM-SHA256`, +`ECDH-ECDSA-AES256-GCM-SHA384`, +`CAMELLIA128-SHA`, +`DHE-RSA-CAMELLIA128-SHA`, +`CAMELLIA256-SHA`, +`DHE-RSA-CAMELLIA256-SHA`, +`CAMELLIA128-SHA256`, +`DHE-RSA-CAMELLIA128-SHA256`, +`CAMELLIA256-SHA256`, +`DHE-RSA-CAMELLIA256-SHA256`, +`ECDHE-RSA-AES128-SHA256`, +`ECDHE-ECDSA-AES128-SHA256`, +`ECDH-RSA-AES128-SHA256`, +`ECDH-ECDSA-AES128-SHA256`, +`ECDHE-RSA-AES256-SHA384`, +`ECDHE-ECDSA-AES256-SHA384`, +`ECDH-RSA-AES256-SHA384`, +`ECDH-ECDSA-AES256-SHA384`, +`ECDHE-RSA-CHACHA20-POLY1305`, +`ECDHE-ECDSA-CHACHA20-POLY1305`, +`DHE-RSA-CHACHA20-POLY1305`, +`ECDHE-RSA-CHACHA20-POLY1305-OLD`, +`ECDHE-ECDSA-CHACHA20-POLY1305-OLD`, +`DHE-RSA-CHACHA20-POLY1305-OLD`, +`ADH-AES128-SHA`, +`QSH`, +`RENEGOTIATION-INFO`, +`IDEA-CBC-SHA`, +`ECDHE-ECDSA-NULL-SHA`, +`ECDHE-PSK-NULL-SHA256`, +`ECDHE-PSK-AES128-CBC-SHA256`, +`PSK-CHACHA20-POLY1305`, +`ECDHE-PSK-CHACHA20-POLY1305`, +`DHE-PSK-CHACHA20-POLY1305`, +`EDH-RSA-DES-CBC3-SHA`, + +## Schannel + +Schannel allows the enabling and disabling of encryption algorithms, but not +specific ciphersuites. They are +[defined](https://docs.microsoft.com/windows/desktop/SecCrypto/alg-id) by +Microsoft. + +`CALG_MD2`, +`CALG_MD4`, +`CALG_MD5`, +`CALG_SHA`, +`CALG_SHA1`, +`CALG_MAC`, +`CALG_RSA_SIGN`, +`CALG_DSS_SIGN`, +`CALG_NO_SIGN`, +`CALG_RSA_KEYX`, +`CALG_DES`, +`CALG_3DES_112`, +`CALG_3DES`, +`CALG_DESX`, +`CALG_RC2`, +`CALG_RC4`, +`CALG_SEAL`, +`CALG_DH_SF`, +`CALG_DH_EPHEM`, +`CALG_AGREEDKEY_ANY`, +`CALG_HUGHES_MD5`, +`CALG_SKIPJACK`, +`CALG_TEK`, +`CALG_CYLINK_MEK`, +`CALG_SSL3_SHAMD5`, +`CALG_SSL3_MASTER`, +`CALG_SCHANNEL_MASTER_HASH`, +`CALG_SCHANNEL_MAC_KEY`, +`CALG_SCHANNEL_ENC_KEY`, +`CALG_PCT1_MASTER`, +`CALG_SSL2_MASTER`, +`CALG_TLS1_MASTER`, +`CALG_RC5`, +`CALG_HMAC`, +`CALG_TLS1PRF`, +`CALG_HASH_REPLACE_OWF`, +`CALG_AES_128`, +`CALG_AES_192`, +`CALG_AES_256`, +`CALG_AES`, +`CALG_SHA_256`, +`CALG_SHA_384`, +`CALG_SHA_512`, +`CALG_ECDH`, +`CALG_ECMQV`, +`CALG_ECDSA`, +`CALG_ECDH_EPHEM`, diff --git a/bin/curl/docs/CODE_OF_CONDUCT.md b/bin/curl/docs/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..1f71c387 --- /dev/null +++ b/bin/curl/docs/CODE_OF_CONDUCT.md @@ -0,0 +1,32 @@ +Contributor Code of Conduct +=========================== + +As contributors and maintainers of this project, we pledge to respect all +people who contribute through reporting issues, posting feature requests, +updating documentation, submitting pull requests or patches, and other +activities. + +We are committed to making participation in this project a harassment-free +experience for everyone, regardless of level of experience, gender, gender +identity and expression, sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, or religion. + +Examples of unacceptable behavior by participants include the use of sexual +language or imagery, derogatory comments or personal attacks, trolling, public +or private harassment, insults, or other unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct. Project maintainers who do not +follow the Code of Conduct may be removed from the project team. + +This code of conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by opening an issue or contacting one or more of the project +maintainers. + +This Code of Conduct is adapted from the [Contributor +Covenant](https://contributor-covenant.org/), version 1.1.0, available at +[https://contributor-covenant.org/version/1/1/0/](https://contributor-covenant.org/version/1/1/0/) diff --git a/bin/curl/docs/CODE_STYLE.md b/bin/curl/docs/CODE_STYLE.md new file mode 100644 index 00000000..0ceb5b9a --- /dev/null +++ b/bin/curl/docs/CODE_STYLE.md @@ -0,0 +1,246 @@ +# curl C code style + +Source code that has a common style is easier to read than code that uses +different styles in different places. It helps making the code feel like one +single code base. Easy-to-read is a very important property of code and helps +making it easier to review when new things are added and it helps debugging +code when developers are trying to figure out why things go wrong. A unified +style is more important than individual contributors having their own personal +tastes satisfied. + +Our C code has a few style rules. Most of them are verified and upheld by the +`lib/checksrc.pl` script. Invoked with `make checksrc` or even by default by +the build system when built after `./configure --enable-debug` has been used. + +It is normally not a problem for anyone to follow the guidelines, as you just +need to copy the style already used in the source code and there are no +particularly unusual rules in our set of rules. + +We also work hard on writing code that are warning-free on all the major +platforms and in general on as many platforms as possible. Code that obviously +will cause warnings will not be accepted as-is. + +## Naming + +Try using a non-confusing naming scheme for your new functions and variable +names. It doesn't necessarily have to mean that you should use the same as in +other places of the code, just that the names should be logical, +understandable and be named according to what they're used for. File-local +functions should be made static. We like lower case names. + +See the [INTERNALS](INTERNALS.md) document on how we name non-exported +library-global symbols. + +## Indenting + +We use only spaces for indentation, never TABs. We use two spaces for each new +open brace. + + if(something_is_true) { + while(second_statement == fine) { + moo(); + } + } + +## Comments + +Since we write C89 code, **//** comments are not allowed. They weren't +introduced in the C standard until C99. We use only **/* comments */**. + + /* this is a comment */ + +## Long lines + +Source code in curl may never be wider than 79 columns and there are two +reasons for maintaining this even in the modern era of very large and high +resolution screens: + +1. Narrower columns are easier to read than very wide ones. There's a reason + newspapers have used columns for decades or centuries. + +2. Narrower columns allow developers to easier show multiple pieces of code + next to each other in different windows. I often have two or three source + code windows next to each other on the same screen - as well as multiple + terminal and debugging windows. + +## Braces + +In if/while/do/for expressions, we write the open brace on the same line as +the keyword and we then set the closing brace on the same indentation level as +the initial keyword. Like this: + + if(age < 40) { + /* clearly a youngster */ + } + +You may omit the braces if they would contain only a one-line statement: + + if(!x) + continue; + +For functions the opening brace should be on a separate line: + + int main(int argc, char **argv) + { + return 1; + } + +## 'else' on the following line + +When adding an **else** clause to a conditional expression using braces, we +add it on a new line after the closing brace. Like this: + + if(age < 40) { + /* clearly a youngster */ + } + else { + /* probably grumpy */ + } + +## No space before parentheses + +When writing expressions using if/while/do/for, there shall be no space +between the keyword and the open parenthesis. Like this: + + while(1) { + /* loop forever */ + } + +## Use boolean conditions + +Rather than test a conditional value such as a bool against TRUE or FALSE, a +pointer against NULL or != NULL and an int against zero or not zero in +if/while conditions we prefer: + + result = do_something(); + if(!result) { + /* something went wrong */ + return result; + } + +## No assignments in conditions + +To increase readability and reduce complexity of conditionals, we avoid +assigning variables within if/while conditions. We frown upon this style: + + if((ptr = malloc(100)) == NULL) + return NULL; + +and instead we encourage the above version to be spelled out more clearly: + + ptr = malloc(100); + if(!ptr) + return NULL; + +## New block on a new line + +We never write multiple statements on the same source line, even for very +short if() conditions. + + if(a) + return TRUE; + else if(b) + return FALSE; + +and NEVER: + + if(a) return TRUE; + else if(b) return FALSE; + +## Space around operators + +Please use spaces on both sides of operators in C expressions. Postfix **(), +[], ->, ., ++, --** and Unary **+, - !, ~, &** operators excluded they should +have no space. + +Examples: + + bla = func(); + who = name[0]; + age += 1; + true = !false; + size += -2 + 3 * (a + b); + ptr->member = a++; + struct.field = b--; + ptr = &address; + contents = *pointer; + complement = ~bits; + empty = (!*string) ? TRUE : FALSE; + +## No parentheses for return values + +We use the 'return' statement without extra parentheses around the value: + + int works(void) + { + return TRUE; + } + +## Parentheses for sizeof arguments + +When using the sizeof operator in code, we prefer it to be written with +parentheses around its argument: + + int size = sizeof(int); + +## Column alignment + +Some statements cannot be completed on a single line because the line would be +too long, the statement too hard to read, or due to other style guidelines +above. In such a case the statement will span multiple lines. + +If a continuation line is part of an expression or sub-expression then you +should align on the appropriate column so that it's easy to tell what part of +the statement it is. Operators should not start continuation lines. In other +cases follow the 2-space indent guideline. Here are some examples from +libcurl: + + if(Curl_pipeline_wanted(handle->multi, CURLPIPE_HTTP1) && + (handle->set.httpversion != CURL_HTTP_VERSION_1_0) && + (handle->set.httpreq == HTTPREQ_GET || + handle->set.httpreq == HTTPREQ_HEAD)) + /* didn't ask for HTTP/1.0 and a GET or HEAD */ + return TRUE; + +If no parenthesis, use the default indent: + + data->set.http_disable_hostname_check_before_authentication = + (0 != va_arg(param, long)) ? TRUE : FALSE; + +Function invoke with an open parenthesis: + + if(option) { + result = parse_login_details(option, strlen(option), + (userp ? &user : NULL), + (passwdp ? &passwd : NULL), + NULL); + } + +Align with the "current open" parenthesis: + + DEBUGF(infof(data, "Curl_pp_readresp_ %d bytes of trailing " + "server response left\n", + (int)clipamount)); + +## Platform dependent code + +Use **#ifdef HAVE_FEATURE** to do conditional code. We avoid checking for +particular operating systems or hardware in the #ifdef lines. The HAVE_FEATURE +shall be generated by the configure script for unix-like systems and they are +hard-coded in the `config-[system].h` files for the others. + +We also encourage use of macros/functions that possibly are empty or defined +to constants when libcurl is built without that feature, to make the code +seamless. Like this example where the **magic()** function works differently +depending on a build-time conditional: + + #ifdef HAVE_MAGIC + void magic(int a) + { + return a + 2; + } + #else + #define magic(x) 1 + #endif + + int content = magic(3); diff --git a/bin/curl/docs/CONTRIBUTE.md b/bin/curl/docs/CONTRIBUTE.md new file mode 100644 index 00000000..978b87d2 --- /dev/null +++ b/bin/curl/docs/CONTRIBUTE.md @@ -0,0 +1,267 @@ +# Contributing to the curl project + +This document is intended to offer guidelines on how to best contribute to the +curl project. This concerns new features as well as corrections to existing +flaws or bugs. + +## Learning curl + +### Join the Community + +Skip over to [https://curl.haxx.se/mail/](https://curl.haxx.se/mail/) and join +the appropriate mailing list(s). Read up on details before you post +questions. Read this file before you start sending patches! We prefer +questions sent to and discussions being held on the mailing list(s), not sent +to individuals. + +Before posting to one of the curl mailing lists, please read up on the +[mailing list etiquette](https://curl.haxx.se/mail/etiquette.html). + +We also hang out on IRC in #curl on irc.freenode.net + +If you're at all interested in the code side of things, consider clicking +'watch' on the [curl repo on github](https://github.com/curl/curl) to be +notified of pull requests and new issues posted there. + +### License and copyright + +When contributing with code, you agree to put your changes and new code under +the same license curl and libcurl is already using unless stated and agreed +otherwise. + +If you add a larger piece of code, you can opt to make that file or set of +files to use a different license as long as they don't enforce any changes to +the rest of the package and they make sense. Such "separate parts" can not be +GPL licensed (as we don't want copyleft to affect users of libcurl) but they +must use "GPL compatible" licenses (as we want to allow users to use libcurl +properly in GPL licensed environments). + +When changing existing source code, you do not alter the copyright of the +original file(s). The copyright will still be owned by the original creator(s) +or those who have been assigned copyright by the original author(s). + +By submitting a patch to the curl project, you are assumed to have the right +to the code and to be allowed by your employer or whatever to hand over that +patch/code to us. We will credit you for your changes as far as possible, to +give credit but also to keep a trace back to who made what changes. Please +always provide us with your full real name when contributing! + +### What To Read + +Source code, the man pages, the [INTERNALS +document](https://curl.haxx.se/dev/internals.html), +[TODO](https://curl.haxx.se/docs/todo.html), +[KNOWN_BUGS](https://curl.haxx.se/docs/knownbugs.html) and the [most recent +changes](https://curl.haxx.se/dev/sourceactivity.html) in git. Just lurking on +the [curl-library mailing +list](https://curl.haxx.se/mail/list.cgi?list=curl-library) will give you a +lot of insights on what's going on right now. Asking there is a good idea too. + +## Write a good patch + +### Follow code style + +When writing C code, follow the +[CODE_STYLE](https://curl.haxx.se/dev/code-style.html) already established in +the project. Consistent style makes code easier to read and mistakes less +likely to happen. Run `make checksrc` before you submit anything, to make sure +you follow the basic style. That script doesn't verify everything, but if it +complains you know you have work to do. + +### Non-clobbering All Over + +When you write new functionality or fix bugs, it is important that you don't +fiddle all over the source files and functions. Remember that it is likely +that other people have done changes in the same source files as you have and +possibly even in the same functions. If you bring completely new +functionality, try writing it in a new source file. If you fix bugs, try to +fix one bug at a time and send them as separate patches. + +### Write Separate Changes + +It is annoying when you get a huge patch from someone that is said to fix 511 +odd problems, but discussions and opinions don't agree with 510 of them - or +509 of them were already fixed in a different way. Then the person merging +this change needs to extract the single interesting patch from somewhere +within the huge pile of source, and that creates a lot of extra work. + +Preferably, each fix that corrects a problem should be in its own patch/commit +with its own description/commit message stating exactly what they correct so +that all changes can be selectively applied by the maintainer or other +interested parties. + +Also, separate changes enable bisecting much better for tracking problems +and regression in the future. + +### Patch Against Recent Sources + +Please try to get the latest available sources to make your patches against. +It makes the lives of the developers so much easier. The very best is if you +get the most up-to-date sources from the git repository, but the latest +release archive is quite OK as well! + +### Documentation + +Writing docs is dead boring and one of the big problems with many open source +projects. But someone's gotta do it! It makes things a lot easier if you +submit a small description of your fix or your new features with every +contribution so that it can be swiftly added to the package documentation. + +The documentation is always made in man pages (nroff formatted) or plain +ASCII files. All HTML files on the web site and in the release archives are +generated from the nroff/ASCII versions. + +### Test Cases + +Since the introduction of the test suite, we can quickly verify that the main +features are working as they're supposed to. To maintain this situation and +improve it, all new features and functions that are added need to be tested +in the test suite. Every feature that is added should get at least one valid +test case that verifies that it works as documented. If every submitter also +posts a few test cases, it won't end up as a heavy burden on a single person! + +If you don't have test cases or perhaps you have done something that is very +hard to write tests for, do explain exactly how you have otherwise tested and +verified your changes. + +## Sharing Your Changes + +### How to get your changes into the main sources + +Ideally you file a [pull request on +github](https://github.com/curl/curl/pulls), but you can also send your plain +patch to [the curl-library mailing +list](https://curl.haxx.se/mail/list.cgi?list=curl-library). + +Either way, your change will be reviewed and discussed there and you will be +expected to correct flaws pointed out and update accordingly, or the change +risks stalling and eventually just getting deleted without action. As a +submitter of a change, you are the owner of that change until it has been merged. + +Respond on the list or on github about the change and answer questions and/or +fix nits/flaws. This is very important. We will take lack of replies as a +sign that you're not very anxious to get your patch accepted and we tend to +simply drop such changes. + +### About pull requests + +With github it is easy to send a [pull +request](https://github.com/curl/curl/pulls) to the curl project to have +changes merged. + +We strongly prefer pull requests to mailed patches, as it makes it a proper +git commit that is easy to merge and they are easy to track and not that easy +to loose in the flood of many emails, like they sometimes do on the mailing +lists. + +Every pull request submitted will automatically be tested in several different +ways. Every pull request is verified for each of the following: + + - ... it still builds, warning-free, on Linux and macOS, with both + clang and gcc + - ... it still builds fine on Windows with several MSVC versions + - ... it still builds with cmake on Linux, with gcc and clang + - ... it follows rudimentary code style rules + - ... the test suite still runs 100% fine + - ... the release tarball (the "dist") still works + - ... it builds fine in-tree as well as out-of-tree + - ... code coverage doesn't shrink drastically + +If the pull-request fails one of these tests, it will show up as a red X and +you are expected to fix the problem. If you don't understand when the issue is +or have other problems to fix the complaint, just ask and other project +members will likely be able to help out. + +When you adjust your pull requests after review, consider squashing the +commits so that we can review the full updated version more easily. + +### Making quality patches + +Make the patch against as recent source versions as possible. + +If you've followed the tips in this document and your patch still hasn't been +incorporated or responded to after some weeks, consider resubmitting it to the +list or better yet: change it to a pull request. + +### Write good commit messages + +A short guide to how to write commit messages in the curl project. + + ---- start ---- + [area]: [short line describing the main effect] + -- empty line -- + [full description, no wider than 72 columns that describe as much as + possible as to why this change is made, and possibly what things + it fixes and everything else that is related] + -- empty line -- + [Closes/Fixes #1234 - if this closes or fixes a github issue] + [Bug: URL to source of the report or more related discussion] + [Reported-by: John Doe - credit the reporter] + [whatever-else-by: credit all helpers, finders, doers] + ---- stop ---- + +Don't forget to use commit --author="" if you commit someone else's work, and +make sure that you have your own user and email setup correctly in git before +you commit + +### Write Access to git Repository + +If you are a very frequent contributor, you may be given push access to the +git repository and then you'll be able to push your changes straight into the +git repo instead of sending changes as pull requests or by mail as patches. + +Just ask if this is what you'd want. You will be required to have posted +several high quality patches first, before you can be granted push access. + +### How To Make a Patch with git + +You need to first checkout the repository: + + git clone https://github.com/curl/curl.git + +You then proceed and edit all the files you like and you commit them to your +local repository: + + git commit [file] + +As usual, group your commits so that you commit all changes at once that +constitute a logical change. + +Once you have done all your commits and you're happy with what you see, you +can make patches out of your changes that are suitable for mailing: + + git format-patch remotes/origin/master + +This creates files in your local directory named NNNN-[name].patch for each +commit. + +Now send those patches off to the curl-library list. You can of course opt to +do that with the 'git send-email' command. + +### How To Make a Patch without git + +Keep a copy of the unmodified curl sources. Make your changes in a separate +source tree. When you think you have something that you want to offer the +curl community, use GNU diff to generate patches. + +If you have modified a single file, try something like: + + diff -u unmodified-file.c my-changed-one.c > my-fixes.diff + +If you have modified several files, possibly in different directories, you +can use diff recursively: + + diff -ur curl-original-dir curl-modified-sources-dir > my-fixes.diff + +The GNU diff and GNU patch tools exist for virtually all platforms, including +all kinds of Unixes and Windows: + +For unix-like operating systems: + + - [https://savannah.gnu.org/projects/patch/](https://savannah.gnu.org/projects/patch/) + - [https://www.gnu.org/software/diffutils/](https://www.gnu.org/software/diffutils/) + +For Windows: + + - [https://gnuwin32.sourceforge.io/packages/patch.htm](https://gnuwin32.sourceforge.io/packages/patch.htm) + - [https://gnuwin32.sourceforge.io/packages/diffutils.htm](https://gnuwin32.sourceforge.io/packages/diffutils.htm) diff --git a/bin/curl/docs/DEPRECATE.md b/bin/curl/docs/DEPRECATE.md new file mode 100644 index 00000000..4f2570ad --- /dev/null +++ b/bin/curl/docs/DEPRECATE.md @@ -0,0 +1,21 @@ +# Items to be removed from future curl releases + +If any of these deprecated features is a cause for concern for you, please +email the curl-library mailing list as soon as possible and explain to us why +this is a problem for you and how your use case can't be satisfied properly +using a work around. + +## HTTP/0.9 + +Supporting this is non-obvious and might even come as a surprise to some +users. Potentially even being a security risk in some cases. + +### State + +curl 7.64.0 introduces options to disable/enable support for this protocol +version. The default remains supported for now. + +### Removal + +The support for HTTP/0.9 will be switched to disabled by default in 6 months, +in the September 2019 release (possibly called curl 7.68.0). diff --git a/bin/curl/docs/FAQ.txt b/bin/curl/docs/FAQ.txt new file mode 100644 index 00000000..c1bc9bea --- /dev/null +++ b/bin/curl/docs/FAQ.txt @@ -0,0 +1,1559 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +FAQ + + 1. Philosophy + 1.1 What is cURL? + 1.2 What is libcurl? + 1.3 What is curl not? + 1.4 When will you make curl do XXXX ? + 1.5 Who makes curl? + 1.6 What do you get for making curl? + 1.7 What about CURL from curl.com? + 1.8 I have a problem who do I mail? + 1.9 Where do I buy commercial support for curl? + 1.10 How many are using curl? + 1.11 Why don't you update ca-bundle.crt + 1.12 I have a problem who can I chat with? + 1.13 curl's ECCN number? + 1.14 How do I submit my patch? + 1.15 How do I port libcurl to my OS? + + 2. Install Related Problems + 2.1 configure doesn't find OpenSSL even when it is installed + 2.1.1 native linker doesn't find OpenSSL + 2.1.2 only the libssl lib is missing + 2.2 Does curl work/build with other SSL libraries? + 2.3 Where can I find a copy of LIBEAY32.DLL? + 2.4 Does curl support SOCKS (RFC 1928) ? + + 3. Usage Problems + 3.1 curl: (1) SSL is disabled, https: not supported + 3.2 How do I tell curl to resume a transfer? + 3.3 Why doesn't my posting using -F work? + 3.4 How do I tell curl to run custom FTP commands? + 3.5 How can I disable the Accept: */* header? + 3.6 Does curl support ASP, XML, XHTML or HTML version Y? + 3.7 Can I use curl to delete/rename a file through FTP? + 3.8 How do I tell curl to follow HTTP redirects? + 3.9 How do I use curl in my favorite programming language? + 3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP? + 3.11 How do I POST with a different Content-Type? + 3.12 Why do FTP specific features over HTTP proxy fail? + 3.13 Why does my single/double quotes fail? + 3.14 Does curl support Javascript or PAC (automated proxy config)? + 3.15 Can I do recursive fetches with curl? + 3.16 What certificates do I need when I use SSL? + 3.17 How do I list the root dir of an FTP server? + 3.18 Can I use curl to send a POST/PUT and not wait for a response? + 3.19 How do I get HTTP from a host using a specific IP address? + 3.20 How to SFTP from my user's home directory? + 3.21 Protocol xxx not supported or disabled in libcurl + 3.22 curl -X gives me HTTP problems + + 4. Running Problems + 4.1 Problems connecting to SSL servers. + 4.2 Why do I get problems when I use & or % in the URL? + 4.3 How can I use {, }, [ or ] to specify multiple URLs? + 4.4 Why do I get downloaded data even though the web page doesn't exist? + 4.5 Why do I get return code XXX from a HTTP server? + 4.5.1 "400 Bad Request" + 4.5.2 "401 Unauthorized" + 4.5.3 "403 Forbidden" + 4.5.4 "404 Not Found" + 4.5.5 "405 Method Not Allowed" + 4.5.6 "301 Moved Permanently" + 4.6 Can you tell me what error code 142 means? + 4.7 How do I keep user names and passwords secret in Curl command lines? + 4.8 I found a bug! + 4.9 Curl can't authenticate to the server that requires NTLM? + 4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! + 4.11 Why does my HTTP range requests return the full document? + 4.12 Why do I get "certificate verify failed" ? + 4.13 Why is curl -R on Windows one hour off? + 4.14 Redirects work in browser but not with curl! + 4.15 FTPS doesn't work + 4.16 My HTTP POST or PUT requests are slow! + 4.17 Non-functional connect timeouts on Windows + 4.18 file:// URLs containing drive letters (Windows, NetWare) + 4.19 Why doesn't curl return an error when the network cable is unplugged? + 4.20 curl doesn't return error for HTTP non-200 responses! + 4.21 Why is there a HTTP/1.1 in my HTTP/2 request? + + 5. libcurl Issues + 5.1 Is libcurl thread-safe? + 5.2 How can I receive all data into a large memory chunk? + 5.3 How do I fetch multiple files with libcurl? + 5.4 Does libcurl do Winsock initing on win32 systems? + 5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ? + 5.6 What about Keep-Alive or persistent connections? + 5.7 Link errors when building libcurl on Windows! + 5.8 libcurl.so.X: open failed: No such file or directory + 5.9 How does libcurl resolve host names? + 5.10 How do I prevent libcurl from writing the response to stdout? + 5.11 How do I make libcurl not receive the whole HTTP response? + 5.12 Can I make libcurl fake or hide my real IP address? + 5.13 How do I stop an ongoing transfer? + 5.14 Using C++ non-static functions for callbacks? + 5.15 How do I get an FTP directory listing? + 5.16 I want a different time-out! + 5.17 Can I write a server with libcurl? + 5.18 Does libcurl use threads? + + 6. License Issues + 6.1 I have a GPL program, can I use the libcurl library? + 6.2 I have a closed-source program, can I use the libcurl library? + 6.3 I have a BSD licensed program, can I use the libcurl library? + 6.4 I have a program that uses LGPL libraries, can I use libcurl? + 6.5 Can I modify curl/libcurl for my program and keep the changes secret? + 6.6 Can you please change the curl/libcurl license to XXXX? + 6.7 What are my obligations when using libcurl in my commercial apps? + + 7. PHP/CURL Issues + 7.1 What is PHP/CURL? + 7.2 Who wrote PHP/CURL? + 7.3 Can I perform multiple requests using the same handle? + 7.4 Does PHP/CURL have dependencies? + +============================================================================== + +1. Philosophy + + 1.1 What is cURL? + + cURL is the name of the project. The name is a play on 'Client for URLs', + originally with URL spelled in uppercase to make it obvious it deals with + URLs. The fact it can also be pronounced 'see URL' also helped, it works as + an abbreviation for "Client URL Request Library" or why not the recursive + version: "Curl URL Request Library". + + The cURL project produces two products: + + libcurl + + A free and easy-to-use client-side URL transfer library, supporting DICT, + FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, + POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP. + + libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, + Kerberos, SPNEGO, HTTP form based upload, proxies, cookies, user+password + authentication, file transfer resume, http proxy tunneling and more! + + libcurl is highly portable, it builds and works identically on numerous + platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HP-UX, + IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOS, Mac + OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS, Symbian, OSF, + Android, Minix, IBM TPF and more... + + libcurl is free, thread-safe, IPv6 compatible, feature rich, well + supported and fast. + + curl + + A command line tool for getting or sending files using URL syntax. + + Since curl uses libcurl, curl supports the same wide range of common + Internet protocols that libcurl does. + + We pronounce curl with an initial k sound. It rhymes with words like girl + and earl. This is a short WAV file to help you: + + https://media.merriam-webster.com/soundc11/c/curl0001.wav + + There are numerous sub-projects and related projects that also use the word + curl in the project names in various combinations, but you should take + notice that this FAQ is directed at the command-line tool named curl (and + libcurl the library), and may therefore not be valid for other curl-related + projects. (There is however a small section for the PHP/CURL in this FAQ.) + + 1.2 What is libcurl? + + libcurl is a reliable and portable library which provides you with an easy + interface to a range of common Internet protocols. + + You can use libcurl for free in your application, be it open source, + commercial or closed-source. + + libcurl is most probably the most portable, most powerful and most often + used C-based multi-platform file transfer library on this planet - be it + open source or commercial. + + 1.3 What is curl not? + + Curl is not a wget clone. That is a common misconception. Never, during + curl's development, have we intended curl to replace wget or compete on its + market. Curl is targeted at single-shot file transfers. + + Curl is not a web site mirroring program. If you want to use curl to mirror + something: fine, go ahead and write a script that wraps around curl to make + it reality (like curlmirror.pl does). + + Curl is not an FTP site mirroring program. Sure, get and send FTP with curl + but if you want systematic and sequential behavior you should write a + script (or write a new program that interfaces libcurl) and do it. + + Curl is not a PHP tool, even though it works perfectly well when used from + or with PHP (when using the PHP/CURL module). + + Curl is not a program for a single operating system. Curl exists, compiles, + builds and runs under a wide range of operating systems, including all + modern Unixes (and a bunch of older ones too), Windows, Amiga, BeOS, OS/2, + OS X, QNX etc. + + 1.4 When will you make curl do XXXX ? + + We love suggestions of what to change in order to make curl and libcurl + better. We do however believe in a few rules when it comes to the future of + curl: + + Curl -- the command line tool -- is to remain a non-graphical command line + tool. If you want GUIs or fancy scripting capabilities, you should look for + another tool that uses libcurl. + + We do not add things to curl that other small and available tools already do + very well at the side. Curl's output can be piped into another program or + redirected to another file for the next program to interpret. + + We focus on protocol related issues and improvements. If you want to do more + magic with the supported protocols than curl currently does, chances are good + we will agree. If you want to add more protocols, we may very well agree. + + If you want someone else to do all the work while you wait for us to + implement it for you, that is not a very friendly attitude. We spend a + considerable time already on maintaining and developing curl. In order to + get more out of us, you should consider trading in some of your time and + effort in return. Simply go to the GitHub repo which resides at + https://github.com/curl/curl, fork the project, and create pull requests + with your proposed changes. + + If you write the code, chances are better that it will get into curl faster. + + 1.5 Who makes curl? + + curl and libcurl are not made by any single individual. Daniel Stenberg is + project leader and main developer, but other persons' submissions are + important and crucial. Anyone can contribute and post their changes and + improvements and have them inserted in the main sources (of course on the + condition that developers agree that the fixes are good). + + The full list of all contributors is found in the docs/THANKS file. + + curl is developed by a community, with Daniel at the wheel. + + 1.6 What do you get for making curl? + + Project cURL is entirely free and open. No person gets paid for developing + curl full time. We do this voluntarily, mostly in our spare time. + Occasionally companies pay individual developers to work on curl, but that's + up to each company and developer. This is not controlled by nor supervised in + any way by the project. + + We still get help from companies. Haxx provides web site, bandwidth, mailing + lists etc, GitHub hosts the primary git repository and other services like + the bug tracker at https://github.com/curl/curl. Also again, some companies + have sponsored certain parts of the development in the past and I hope some + will continue to do so in the future. + + If you want to support our project, consider a donation or a banner-program + or even better: by helping us with coding, documenting or testing etc. + + 1.7 What about CURL from curl.com? + + During the summer of 2001, curl.com was busy advertising their client-side + programming language for the web, named CURL. + + We are in no way associated with curl.com or their CURL programming + language. + + Our project name curl has been in effective use since 1998. We were not the + first computer related project to use the name "curl" and do not claim any + rights to the name. + + We recognize that we will be living in parallel with curl.com and wish them + every success. + + 1.8 I have a problem whom do I mail? + + Please do not mail any single individual unless you really need to. Keep + curl-related questions on a suitable mailing list. All available mailing + lists are listed in the MANUAL document and online at + https://curl.haxx.se/mail/ + + Keeping curl-related questions and discussions on mailing lists allows + others to join in and help, to share their ideas, to contribute their + suggestions and to spread their wisdom. Keeping discussions on public mailing + lists also allows for others to learn from this (both current and future + users thanks to the web based archives of the mailing lists), thus saving us + from having to repeat ourselves even more. Thanks for respecting this. + + If you have found or simply suspect a security problem in curl or libcurl, + mail curl-security at haxx.se (closed list of receivers, mails are not + disclosed) and tell. Then we can produce a fix in a timely manner before the + flaw is announced to the world, thus lessen the impact the problem will have + on existing users. + + 1.9 Where do I buy commercial support for curl? + + curl is fully open source. It means you can hire any skilled engineer to fix + your curl-related problems. + + We list available alternatives on the curl web site: + https://curl.haxx.se/support.html + + 1.10 How many are using curl? + + It is impossible to tell. + + We don't know how many users that knowingly have installed and use curl. + + We don't know how many users that use curl without knowing that they are in + fact using it. + + We don't know how many users that downloaded or installed curl and then + never use it. + + In May 2012 Daniel did a counting game and came up with a number that may + be completely wrong or somewhat accurate. Over 500 million! + + See https://daniel.haxx.se/blog/2012/05/16/300m-users/ + + 1.11 Why don't you update ca-bundle.crt + + The ca cert bundle that used to be shipped with curl was very outdated and + must be replaced with an up-to-date version by anyone who wants to verify + peers. It is no longer provided by curl. The last curl release that ever + shipped a ca cert bundle was curl 7.18.0. + + In the cURL project we've decided not to attempt to keep this file updated + (or even present anymore) since deciding what to add to a ca cert bundle is + an undertaking we've not been ready to accept, and the one we can get from + Mozilla is perfectly fine so there's no need to duplicate that work. + + Today, with many services performed over HTTPS, every operating system + should come with a default ca cert bundle that can be deemed somewhat + trustworthy and that collection (if reasonably updated) should be deemed to + be a lot better than a private curl version. + + If you want the most recent collection of ca certs that Mozilla Firefox + uses, we recommend that you extract the collection yourself from Mozilla + Firefox (by running 'make ca-bundle), or by using our online service setup + for this purpose: https://curl.haxx.se/docs/caextract.html + + 1.12 I have a problem who can I chat with? + + There's a bunch of friendly people hanging out in the #curl channel on the + IRC network irc.freenode.net. If you're polite and nice, chances are good + that you can get -- or provide -- help instantly. + + 1.13 curl's ECCN number? + + The US government restricts exports of software that contains or uses + cryptography. When doing so, the Export Control Classification Number (ECCN) + is used to identify the level of export control etc. + + Apache Software Foundation gives a good explanation of ECCNs at + https://www.apache.org/dev/crypto.html + + We believe curl's number might be ECCN 5D002, another possibility is + 5D992. It seems necessary to write them (the authority that administers ECCN + numbers), asking to confirm. + + Comprehensible explanations of the meaning of such numbers and how to obtain + them (resp.) are here + + https://www.bis.doc.gov/licensing/exportingbasics.htm + https://www.bis.doc.gov/licensing/do_i_needaneccn.html + + An incomprehensible description of the two numbers above is here + https://www.bis.doc.gov/index.php/documents/new-encryption/1653-ccl5-pt2-3 + + 1.14 How do I submit my patch? + + When you have made a patch or a change of whatever sort, and want to submit + that to the project, there are a few different ways we prefer: + + o send a patch to the curl-library mailing list. We're many subscribers + there and there are lots of people who can review patches, comment on them + and "receive" them properly. + + o if your patch changes or fixes a bug, you can also opt to submit a bug + report in the bug tracker and attach your patch there. There are less + people involved there. + + Lots of more details are found in the CONTRIBUTE and INTERNALS docs. + + 1.15 How do I port libcurl to my OS? + + Here's a rough step-by-step: + + 1. copy a suitable lib/config-*.h file as a start to lib/config-[youros].h + + 2. edit lib/config-[youros].h to match your OS and setup + + 3. edit lib/curl_setup.h to include config-[youros].h when your OS is + detected by the preprocessor, in the style others already exist + + 4. compile lib/*.c and make them into a library + + +2. Install Related Problems + + 2.1 configure doesn't find OpenSSL even when it is installed + + This may be because of several reasons. + + 2.1.1 native linker doesn't find openssl + + Affected platforms: + Solaris (native cc compiler) + HPUX (native cc compiler) + SGI IRIX (native cc compiler) + SCO UNIX (native cc compiler) + + When configuring curl, I specify --with-ssl. OpenSSL is installed in + /usr/local/ssl Configure reports SSL in /usr/local/ssl, but fails to find + CRYPTO_lock in -lcrypto + + Cause: The cc for this test places the -L/usr/local/ssl/lib AFTER + -lcrypto, so ld can't find the library. This is due to a bug in the GNU + autoconf tool. + + Workaround: Specifying "LDFLAGS=-L/usr/local/ssl/lib" in front of + ./configure places the -L/usr/local/ssl/lib early enough in the command + line to make things work + + 2.1.2 only the libssl lib is missing + + If all include files and the libcrypto lib is present, with only the + libssl being missing according to configure, this is most likely because + a few functions are left out from the libssl. + + If the function names missing include RSA or RSAREF you can be certain + that this is because libssl requires the RSA and RSAREF libs to build. + + See the INSTALL file section that explains how to add those libs to + configure. Make sure that you remove the config.cache file before you + rerun configure with the new flags. + + 2.2 Does curl work/build with other SSL libraries? + + Curl has been written to use a generic SSL function layer internally, and + that SSL functionality can then be provided by one out of many different SSL + backends. + + curl can be built to use one of the following SSL alternatives: OpenSSL, + libressl, BoringSSL, GnuTLS, wolfSSL, NSS, mbedTLS, MesaLink, Secure + Transport (native iOS/OS X), Schannel (native Windows) or GSKit (native IBM + i). They all have their pros and cons, and we try to maintain a comparison + of them here: https://curl.haxx.se/docs/ssl-compared.html + + 2.3 Where can I find a copy of LIBEAY32.DLL? + + That is an OpenSSL binary built for Windows. + + Curl can be built with OpenSSL to do the SSL stuff. The LIBEAY32.DLL is then + what curl needs on a windows machine to do https:// etc. Check out the curl + web site to find accurate and up-to-date pointers to recent OpenSSL DLLs and + other binary packages. + + 2.4 Does curl support SOCKS (RFC 1928) ? + + Yes, SOCKS 4 and 5 are supported. + + +3. Usage problems + + 3.1 curl: (1) SSL is disabled, https: not supported + + If you get this output when trying to get anything from a https:// server, + it means that the instance of curl/libcurl that you're using was built + without support for this protocol. + + This could've happened if the configure script that was run at build time + couldn't find all libs and include files curl requires for SSL to work. If + the configure script fails to find them, curl is simply built without SSL + support. + + To get the https:// support into a curl that was previously built but that + reports that https:// is not supported, you should dig through the document + and logs and check out why the configure script doesn't find the SSL libs + and/or include files. + + Also, check out the other paragraph in this FAQ labeled "configure doesn't + find OpenSSL even when it is installed". + + 3.2 How do I tell curl to resume a transfer? + + Curl supports resumed transfers both ways on both FTP and HTTP. + Try the -C option. + + 3.3 Why doesn't my posting using -F work? + + You can't arbitrarily use -F or -d, the choice between -F or -d depends on the + HTTP operation you need curl to do and what the web server that will receive + your post expects. + + If the form you're trying to submit uses the type 'multipart/form-data', then + and only then you must use the -F type. In all the most common cases, you + should use -d which then causes a posting with the type + 'application/x-www-form-urlencoded'. + + This is described in some detail in the MANUAL and TheArtOfHttpScripting + documents, and if you don't understand it the first time, read it again + before you post questions about this to the mailing list. Also, try reading + through the mailing list archives for old postings and questions regarding + this. + + 3.4 How do I tell curl to run custom FTP commands? + + You can tell curl to perform optional commands both before and/or after a + file transfer. Study the -Q/--quote option. + + Since curl is used for file transfers, you don't normally use curl to + perform FTP commands without transferring anything. Therefore you must + always specify a URL to transfer to/from even when doing custom FTP + commands, or use -I which implies the "no body" option sent to libcurl. + + 3.5 How can I disable the Accept: */* header? + + You can change all internally generated headers by adding a replacement with + the -H/--header option. By adding a header with empty contents you safely + disable that one. Use -H "Accept:" to disable that specific header. + + 3.6 Does curl support ASP, XML, XHTML or HTML version Y? + + To curl, all contents are alike. It doesn't matter how the page was + generated. It may be ASP, PHP, Perl, shell-script, SSI or plain HTML + files. There's no difference to curl and it doesn't even know what kind of + language that generated the page. + + See also item 3.14 regarding javascript. + + 3.7 Can I use curl to delete/rename a file through FTP? + + Yes. You specify custom FTP commands with -Q/--quote. + + One example would be to delete a file after you have downloaded it: + + curl -O ftp://download.com/coolfile -Q '-DELE coolfile' + + or rename a file after upload: + + curl -T infile ftp://upload.com/dir/ -Q "-RNFR infile" -Q "-RNTO newname" + + 3.8 How do I tell curl to follow HTTP redirects? + + Curl does not follow so-called redirects by default. The Location: header + that informs the client about this is only interpreted if you're using the + -L/--location option. As in: + + curl -L http://redirector.com + + Not all redirects are HTTP ones, see 4.14 + + 3.9 How do I use curl in my favorite programming language? + + There exist many language interfaces/bindings for curl that integrates it + better with various languages. If you are fluid in a script language, you + may very well opt to use such an interface instead of using the command line + tool. + + Find out more about which languages that support curl directly, and how to + install and use them, in the libcurl section of the curl web site: + https://curl.haxx.se/libcurl/ + + All the various bindings to libcurl are made by other projects and people, + outside of the cURL project. The cURL project itself only produces libcurl + with its plain C API. If you don't find anywhere else to ask you can ask + about bindings on the curl-library list too, but be prepared that people on + that list may not know anything about bindings. + + In February 2019, there were interfaces available for the following + languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Delphi, Dylan, Eiffel, + Euphoria, Falcon, Ferite, Gambas, glib/GTK+, Go, Guile, Harbour, Haskell, + Java, Julia, Lisp, Lua, Mono, .NET, node.js, Object-Pascal, OCaml, Pascal, + Perl, PHP, PostgreSQL, Python, R, Rexx, Ring, RPG, Ruby, Rust, Scheme, + Scilab, S-Lang, Smalltalk, SP-Forth, SPL, Tcl, Visual Basic, Visual FoxPro, + Q, wxwidgets, XBLite and Xoho. By the time you read this, additional ones + may have appeared! + + 3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP? + + Curl adheres to the HTTP spec, which basically means you can play with *any* + protocol that is built on top of HTTP. Protocols such as SOAP, WEBDAV and + XML-RPC are all such ones. You can use -X to set custom requests and -H to + set custom headers (or replace internally generated ones). + + Using libcurl is of course just as good and you'd just use the proper + library options to do the same. + + 3.11 How do I POST with a different Content-Type? + + You can always replace the internally generated headers with -H/--header. + To make a simple HTTP POST with text/xml as content-type, do something like: + + curl -d "datatopost" -H "Content-Type: text/xml" [URL] + + 3.12 Why do FTP specific features over HTTP proxy fail? + + Because when you use a HTTP proxy, the protocol spoken on the network will + be HTTP, even if you specify a FTP URL. This effectively means that you + normally can't use FTP specific features such as FTP upload and FTP quote + etc. + + There is one exception to this rule, and that is if you can "tunnel through" + the given HTTP proxy. Proxy tunneling is enabled with a special option (-p) + and is generally not available as proxy admins usually disable tunneling to + ports other than 443 (which is used for HTTPS access through proxies). + + 3.13 Why does my single/double quotes fail? + + To specify a command line option that includes spaces, you might need to + put the entire option within quotes. Like in: + + curl -d " with spaces " url.com + + or perhaps + + curl -d ' with spaces ' url.com + + Exactly what kind of quotes and how to do this is entirely up to the shell + or command line interpreter that you are using. For most unix shells, you + can more or less pick either single (') or double (") quotes. For + Windows/DOS prompts I believe you're forced to use double (") quotes. + + Please study the documentation for your particular environment. Examples in + the curl docs will use a mix of both of these as shown above. You must + adjust them to work in your environment. + + Remember that curl works and runs on more operating systems than most single + individuals have ever tried. + + 3.14 Does curl support Javascript or PAC (automated proxy config)? + + Many web pages do magic stuff using embedded Javascript. Curl and libcurl + have no built-in support for that, so it will be treated just like any other + contents. + + .pac files are a netscape invention and are sometimes used by organizations + to allow them to differentiate which proxies to use. The .pac contents is + just a Javascript program that gets invoked by the browser and that returns + the name of the proxy to connect to. Since curl doesn't support Javascript, + it can't support .pac proxy configuration either. + + Some workarounds usually suggested to overcome this Javascript dependency: + + Depending on the Javascript complexity, write up a script that translates it + to another language and execute that. + + Read the Javascript code and rewrite the same logic in another language. + + Implement a Javascript interpreter, people have successfully used the + Mozilla Javascript engine in the past. + + Ask your admins to stop this, for a static proxy setup or similar. + + 3.15 Can I do recursive fetches with curl? + + No. curl itself has no code that performs recursive operations, such as + those performed by wget and similar tools. + + There exists wrapper scripts with that functionality (for example the + curlmirror perl script), and you can write programs based on libcurl to do + it, but the command line tool curl itself cannot. + + 3.16 What certificates do I need when I use SSL? + + There are three different kinds of "certificates" to keep track of when we + talk about using SSL-based protocols (HTTPS or FTPS) using curl or libcurl. + + CLIENT CERTIFICATE + + The server you communicate with may require that you can provide this in + order to prove that you actually are who you claim to be. If the server + doesn't require this, you don't need a client certificate. + + A client certificate is always used together with a private key, and the + private key has a pass phrase that protects it. + + SERVER CERTIFICATE + + The server you communicate with has a server certificate. You can and should + verify this certificate to make sure that you are truly talking to the real + server and not a server impersonating it. + + CERTIFICATE AUTHORITY CERTIFICATE ("CA cert") + + You often have several CA certs in a CA cert bundle that can be used to + verify a server certificate that was signed by one of the authorities in the + bundle. curl does not come with a CA cert bundle but most curl installs + provide one. You can also override the default. + + The server certificate verification process is made by using a Certificate + Authority certificate ("CA cert") that was used to sign the server + certificate. Server certificate verification is enabled by default in curl + and libcurl and is often the reason for problems as explained in FAQ entry + 4.12 and the SSLCERTS document + (https://curl.haxx.se/docs/sslcerts.html). Server certificates that are + "self-signed" or otherwise signed by a CA that you do not have a CA cert + for, cannot be verified. If the verification during a connect fails, you are + refused access. You then need to explicitly disable the verification to + connect to the server. + + 3.17 How do I list the root dir of an FTP server? + + There are two ways. The way defined in the RFC is to use an encoded slash + in the first path part. List the "/tmp" dir like this: + + curl ftp://ftp.sunet.se/%2ftmp/ + + or the not-quite-kosher-but-more-readable way, by simply starting the path + section of the URL with a slash: + + curl ftp://ftp.sunet.se//tmp/ + + 3.18 Can I use curl to send a POST/PUT and not wait for a response? + + No. + + But you could easily write your own program using libcurl to do such stunts. + + 3.19 How do I get HTTP from a host using a specific IP address? + + For example, you may be trying out a web site installation that isn't yet in + the DNS. Or you have a site using multiple IP addresses for a given host + name and you want to address a specific one out of the set. + + Set a custom Host: header that identifies the server name you want to reach + but use the target IP address in the URL: + + curl --header "Host: www.example.com" http://127.0.0.1/ + + You can also opt to add faked host name entries to curl with the --resolve + option. That has the added benefit that things like redirects will also work + properly. The above operation would instead be done as: + + curl --resolve www.example.com:80:127.0.0.1 http://www.example.com/ + + 3.20 How to SFTP from my user's home directory? + + Contrary to how FTP works, SFTP and SCP URLs specify the exact directory to + work with. It means that if you don't specify that you want the user's home + directory, you get the actual root directory. + + To specify a file in your user's home directory, you need to use the correct + URL syntax which for SFTP might look similar to: + + curl -O -u user:password sftp://example.com/~/file.txt + + and for SCP it is just a different protocol prefix: + + curl -O -u user:password scp://example.com/~/file.txt + + 3.21 Protocol xxx not supported or disabled in libcurl + + When passing on a URL to curl to use, it may respond that the particular + protocol is not supported or disabled. The particular way this error message + is phrased is because curl doesn't make a distinction internally of whether + a particular protocol is not supported (i.e. never got any code added that + knows how to speak that protocol) or if it was explicitly disabled. curl can + be built to only support a given set of protocols, and the rest would then + be disabled or not supported. + + Note that this error will also occur if you pass a wrongly spelled protocol + part as in "htpt://example.com" or as in the less evident case if you prefix + the protocol part with a space as in " http://example.com/". + + 3.22 curl -X gives me HTTP problems + + In normal circumstances, -X should hardly ever be used. + + By default you use curl without explicitly saying which request method to + use when the URL identifies a HTTP transfer. If you just pass in a URL like + "curl http://example.com" it will use GET. If you use -d or -F curl will use + POST, -I will cause a HEAD and -T will make it a PUT. + + If for whatever reason you're not happy with these default choices that curl + does for you, you can override those request methods by specifying -X + [WHATEVER]. This way you can for example send a DELETE by doing "curl -X + DELETE [URL]". + + It is thus pointless to do "curl -XGET [URL]" as GET would be used + anyway. In the same vein it is pointless to do "curl -X POST -d data + [URL]"... But you can make a fun and somewhat rare request that sends a + request-body in a GET request with something like "curl -X GET -d data + [URL]" + + Note that -X doesn't actually change curl's behavior as it only modifies the + actual string sent in the request, but that may of course trigger a + different set of events. + + Accordingly, by using -XPOST on a command line that for example would follow + a 303 redirect, you will effectively prevent curl from behaving + correctly. Be aware. + + +4. Running Problems + + 4.1 Problems connecting to SSL servers. + + It took a very long time before we could sort out why curl had problems to + connect to certain SSL servers when using SSLeay or OpenSSL v0.9+. The + error sometimes showed up similar to: + + 16570:error:1407D071:SSL routines:SSL2_READ:bad mac decode:s2_pkt.c:233: + + It turned out to be because many older SSL servers don't deal with SSLv3 + requests properly. To correct this problem, tell curl to select SSLv2 from + the command line (-2/--sslv2). + + There have also been examples where the remote server didn't like the SSLv2 + request and instead you had to force curl to use SSLv3 with -3/--sslv3. + + 4.2 Why do I get problems when I use & or % in the URL? + + In general unix shells, the & symbol is treated specially and when used, it + runs the specified command in the background. To safely send the & as a part + of a URL, you should quote the entire URL by using single (') or double (") + quotes around it. Similar problems can also occur on some shells with other + characters, including ?*!$~(){}<>\|;`. When in doubt, quote the URL. + + An example that would invoke a remote CGI that uses &-symbols could be: + + curl 'http://www.altavista.com/cgi-bin/query?text=yes&q=curl' + + In Windows, the standard DOS shell treats the percent sign specially and you + need to use TWO percent signs for each single one you want to use in the + URL. + + If you want a literal percent sign to be part of the data you pass in a POST + using -d/--data you must encode it as '%25' (which then also needs the + percent sign doubled on Windows machines). + + 4.3 How can I use {, }, [ or ] to specify multiple URLs? + + Because those letters have a special meaning to the shell, to be used in + a URL specified to curl you must quote them. + + An example that downloads two URLs (sequentially) would be: + + curl '{curl,www}.haxx.se' + + To be able to use those characters as actual parts of the URL (without using + them for the curl URL "globbing" system), use the -g/--globoff option: + + curl -g 'www.site.com/weirdname[].html' + + 4.4 Why do I get downloaded data even though the web page doesn't exist? + + Curl asks remote servers for the page you specify. If the page doesn't exist + at the server, the HTTP protocol defines how the server should respond and + that means that headers and a "page" will be returned. That's simply how + HTTP works. + + By using the --fail option you can tell curl explicitly to not get any data + if the HTTP return code doesn't say success. + + 4.5 Why do I get return code XXX from a HTTP server? + + RFC2616 clearly explains the return codes. This is a short transcript. Go + read the RFC for exact details: + + 4.5.1 "400 Bad Request" + + The request could not be understood by the server due to malformed + syntax. The client SHOULD NOT repeat the request without modifications. + + 4.5.2 "401 Unauthorized" + + The request requires user authentication. + + 4.5.3 "403 Forbidden" + + The server understood the request, but is refusing to fulfill it. + Authorization will not help and the request SHOULD NOT be repeated. + + 4.5.4 "404 Not Found" + + The server has not found anything matching the Request-URI. No indication + is given of whether the condition is temporary or permanent. + + 4.5.5 "405 Method Not Allowed" + + The method specified in the Request-Line is not allowed for the resource + identified by the Request-URI. The response MUST include an Allow header + containing a list of valid methods for the requested resource. + + 4.5.6 "301 Moved Permanently" + + If you get this return code and an HTML output similar to this: + +

    Moved Permanently

    The document has moved here. + + it might be because you request a directory URL but without the trailing + slash. Try the same operation again _with_ the trailing URL, or use the + -L/--location option to follow the redirection. + + 4.6 Can you tell me what error code 142 means? + + All curl error codes are described at the end of the man page, in the + section called "EXIT CODES". + + Error codes that are larger than the highest documented error code means + that curl has exited due to a crash. This is a serious error, and we + appreciate a detailed bug report from you that describes how we could go + ahead and repeat this! + + 4.7 How do I keep user names and passwords secret in Curl command lines? + + This problem has two sides: + + The first part is to avoid having clear-text passwords in the command line + so that they don't appear in 'ps' outputs and similar. That is easily + avoided by using the "-K" option to tell curl to read parameters from a file + or stdin to which you can pass the secret info. curl itself will also + attempt to "hide" the given password by blanking out the option - this + doesn't work on all platforms. + + To keep the passwords in your account secret from the rest of the world is + not a task that curl addresses. You could of course encrypt them somehow to + at least hide them from being read by human eyes, but that is not what + anyone would call security. + + Also note that regular HTTP (using Basic authentication) and FTP passwords + are sent in clear across the network. All it takes for anyone to fetch them + is to listen on the network. Eavesdropping is very easy. Use more secure + authentication methods (like Digest, Negotiate or even NTLM) or consider the + SSL-based alternatives HTTPS and FTPS. + + 4.8 I found a bug! + + It is not a bug if the behavior is documented. Read the docs first. + Especially check out the KNOWN_BUGS file, it may be a documented bug! + + If it is a problem with a binary you've downloaded or a package for your + particular platform, try contacting the person who built the package/archive + you have. + + If there is a bug, read the BUGS document first. Then report it as described + in there. + + 4.9 Curl can't authenticate to the server that requires NTLM? + + NTLM support requires OpenSSL, GnuTLS, mbedTLS, NSS, Secure Transport, or + Microsoft Windows libraries at build-time to provide this functionality. + + NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You + should not use such ones. + + 4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! + + Many web servers allow or demand that the administrator configures the + server properly for these requests to work on the web server. + + Some servers seem to support HEAD only on certain kinds of URLs. + + To fully grasp this, try the documentation for the particular server + software you're trying to interact with. This is not anything curl can do + anything about. + + 4.11 Why does my HTTP range requests return the full document? + + Because the range may not be supported by the server, or the server may + choose to ignore it and return the full document anyway. + + 4.12 Why do I get "certificate verify failed" ? + + You invoke curl 7.10 or later to communicate on a https:// URL and get an + error back looking something similar to this: + + curl: (35) SSL: error:14090086:SSL routines: + SSL3_GET_SERVER_CERTIFICATE:certificate verify failed + + Then it means that curl couldn't verify that the server's certificate was + good. Curl verifies the certificate using the CA cert bundle that comes with + the curl installation. + + To disable the verification (which makes it act like curl did before 7.10), + use -k. This does however enable man-in-the-middle attacks. + + If you get this failure but are having a CA cert bundle installed and used, + the server's certificate is not signed by one of the CA's in the bundle. It + might for example be self-signed. You then correct this problem by obtaining + a valid CA cert for the server. Or again, decrease the security by disabling + this check. + + Details are also in the SSLCERTS file in the release archives, found online + here: https://curl.haxx.se/docs/sslcerts.html + + 4.13 Why is curl -R on Windows one hour off? + + Since curl 7.53.0 this issue should be fixed as long as curl was built with + any modern compiler that allows for a 64-bit curl_off_t type. For older + compilers or prior curl versions it may set a time that appears one hour off. + This happens due to a flaw in how Windows stores and uses file modification + times and it is not easily worked around. For more details read this: + https://www.codeproject.com/Articles/1144/Beating-the-Daylight-Savings-Time-bug-and-getting + + 4.14 Redirects work in browser but not with curl! + + curl supports HTTP redirects well (see item 3.8). Browsers generally support + at least two other ways to perform redirects that curl does not: + + Meta tags. You can write a HTML tag that will cause the browser to redirect + to another given URL after a certain time. + + Javascript. You can write a Javascript program embedded in a HTML page that + redirects the browser to another given URL. + + There is no way to make curl follow these redirects. You must either + manually figure out what the page is set to do, or you write a script that + parses the results and fetches the new URL. + + 4.15 FTPS doesn't work + + curl supports FTPS (sometimes known as FTP-SSL) both implicit and explicit + mode. + + When a URL is used that starts with FTPS://, curl assumes implicit SSL on + the control connection and will therefore immediately connect and try to + speak SSL. FTPS:// connections default to port 990. + + To use explicit FTPS, you use a FTP:// URL and the --ftp-ssl option (or one + of its related flavors). This is the most common method, and the one + mandated by RFC4217. This kind of connection will then of course use the + standard FTP port 21 by default. + + 4.16 My HTTP POST or PUT requests are slow! + + libcurl makes all POST and PUT requests (except for POST requests with a + very tiny request body) use the "Expect: 100-continue" header. This header + allows the server to deny the operation early so that libcurl can bail out + before having to send any data. This is useful in authentication + cases and others. + + However, many servers don't implement the Expect: stuff properly and if the + server doesn't respond (positively) within 1 second libcurl will continue + and send off the data anyway. + + You can disable libcurl's use of the Expect: header the same way you disable + any header, using -H / CURLOPT_HTTPHEADER, or by forcing it to use HTTP 1.0. + + 4.17 Non-functional connect timeouts + + In most Windows setups having a timeout longer than 21 seconds make no + difference, as it will only send 3 TCP SYN packets and no more. The second + packet sent three seconds after the first and the third six seconds after + the second. No more than three packets are sent, no matter how long the + timeout is set. + + See option TcpMaxConnectRetransmissions on this page: + https://support.microsoft.com/en-us/kb/175523/en-us + + Also, even on non-Windows systems there may run a firewall or anti-virus + software or similar that accepts the connection but does not actually do + anything else. This will make (lib)curl to consider the connection connected + and thus the connect timeout won't trigger. + + 4.18 file:// URLs containing drive letters (Windows, NetWare) + + When using curl to try to download a local file, one might use a URL + in this format: + + file://D:/blah.txt + + You'll find that even if D:\blah.txt does exist, curl returns a 'file + not found' error. + + According to RFC 1738 (https://www.ietf.org/rfc/rfc1738.txt), + file:// URLs must contain a host component, but it is ignored by + most implementations. In the above example, 'D:' is treated as the + host component, and is taken away. Thus, curl tries to open '/blah.txt'. + If your system is installed to drive C:, that will resolve to 'C:\blah.txt', + and if that doesn't exist you will get the not found error. + + To fix this problem, use file:// URLs with *three* leading slashes: + + file:///D:/blah.txt + + Alternatively, if it makes more sense, specify 'localhost' as the host + component: + + file://localhost/D:/blah.txt + + In either case, curl should now be looking for the correct file. + + 4.19 Why doesn't curl return an error when the network cable is unplugged? + + Unplugging a cable is not an error situation. The TCP/IP protocol stack + was designed to be fault tolerant, so even though there may be a physical + break somewhere the connection shouldn't be affected, just possibly + delayed. Eventually, the physical break will be fixed or the data will be + re-routed around the physical problem through another path. + + In such cases, the TCP/IP stack is responsible for detecting when the + network connection is irrevocably lost. Since with some protocols it is + perfectly legal for the client to wait indefinitely for data, the stack may + never report a problem, and even when it does, it can take up to 20 minutes + for it to detect an issue. The curl option --keepalive-time enables + keep-alive support in the TCP/IP stack which makes it periodically probe the + connection to make sure it is still available to send data. That should + reliably detect any TCP/IP network failure. + + But even that won't detect the network going down before the TCP/IP + connection is established (e.g. during a DNS lookup) or using protocols that + don't use TCP. To handle those situations, curl offers a number of timeouts + on its own. --speed-limit/--speed-time will abort if the data transfer rate + falls too low, and --connect-timeout and --max-time can be used to put an + overall timeout on the connection phase or the entire transfer. + + A libcurl-using application running in a known physical environment (e.g. + an embedded device with only a single network connection) may want to act + immediately if its lone network connection goes down. That can be achieved + by having the application monitor the network connection on its own using an + OS-specific mechanism, then signaling libcurl to abort (see also item 5.13). + + 4.20 curl doesn't return error for HTTP non-200 responses! + + Correct. Unless you use -f (--fail). + + When doing HTTP transfers, curl will perform exactly what you're asking it + to do and if successful it will not return an error. You can use curl to + test your web server's "file not found" page (that gets 404 back), you can + use it to check your authentication protected web pages (that gets a 401 + back) and so on. + + The specific HTTP response code does not constitute a problem or error for + curl. It simply sends and delivers HTTP as you asked and if that worked, + everything is fine and dandy. The response code is generally providing more + higher level error information that curl doesn't care about. The error was + not in the HTTP transfer. + + If you want your command line to treat error codes in the 400 and up range + as errors and thus return a non-zero value and possibly show an error + message, curl has a dedicated option for that: -f (CURLOPT_FAILONERROR in + libcurl speak). + + You can also use the -w option and the variable %{response_code} to extract + the exact response code that was returned in the response. + + 4.21 Why is there a HTTP/1.1 in my HTTP/2 request? + + If you use verbose to see the HTTP request when you send off a HTTP/2 + request, it will still say 1.1. + + The reason for this is that we first generate the request to send using the + old 1.1 style and show that request in the verbose output, and then we + convert it over to the binary header-compressed HTTP/2 style. The actual + "1.1" part from that request is then not actually used in the transfer. + The binary HTTP/2 headers are not human readable. + +5. libcurl Issues + + 5.1 Is libcurl thread-safe? + + Yes. + + We have written the libcurl code specifically adjusted for multi-threaded + programs. libcurl will use thread-safe functions instead of non-safe ones if + your system has such. Note that you must never share the same handle in + multiple threads. + + There may be some exceptions to thread safety depending on how libcurl was + built. Please review the guidelines for thread safety to learn more: + https://curl.haxx.se/libcurl/c/threadsafe.html + + 5.2 How can I receive all data into a large memory chunk? + + [ See also the examples/getinmemory.c source ] + + You are in full control of the callback function that gets called every time + there is data received from the remote server. You can make that callback do + whatever you want. You do not have to write the received data to a file. + + One solution to this problem could be to have a pointer to a struct that you + pass to the callback function. You set the pointer using the + CURLOPT_WRITEDATA option. Then that pointer will be passed to the callback + instead of a FILE * to a file: + + /* imaginary struct */ + struct MemoryStruct { + char *memory; + size_t size; + }; + + /* imaginary callback function */ + size_t + WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) + { + size_t realsize = size * nmemb; + struct MemoryStruct *mem = (struct MemoryStruct *)data; + + mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1); + if (mem->memory) { + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + } + return realsize; + } + + 5.3 How do I fetch multiple files with libcurl? + + libcurl has excellent support for transferring multiple files. You should + just repeatedly set new URLs with curl_easy_setopt() and then transfer it + with curl_easy_perform(). The handle you get from curl_easy_init() is not + only reusable, but you're even encouraged to reuse it if you can, as that + will enable libcurl to use persistent connections. + + 5.4 Does libcurl do Winsock initialization on win32 systems? + + Yes, if told to in the curl_global_init() call. + + 5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ? + + Yes, but you cannot open a FILE * and pass the pointer to a DLL and have + that DLL use the FILE * (as the DLL and the client application cannot access + each others' variable memory areas). If you set CURLOPT_WRITEDATA you must + also use CURLOPT_WRITEFUNCTION as well to set a function that writes the + file, even if that simply writes the data to the specified FILE *. + Similarly, if you use CURLOPT_READDATA you must also specify + CURLOPT_READFUNCTION. + + 5.6 What about Keep-Alive or persistent connections? + + curl and libcurl have excellent support for persistent connections when + transferring several files from the same server. Curl will attempt to reuse + connections for all URLs specified on the same command line/config file, and + libcurl will reuse connections for all transfers that are made using the + same libcurl handle. + + When you use the easy interface the connection cache is kept within the easy + handle. If you instead use the multi interface, the connection cache will be + kept within the multi handle and will be shared among all the easy handles + that are used within the same multi handle. + + 5.7 Link errors when building libcurl on Windows! + + You need to make sure that your project, and all the libraries (both static + and dynamic) that it links against, are compiled/linked against the same run + time library. + + This is determined by the /MD, /ML, /MT (and their corresponding /M?d) + options to the command line compiler. /MD (linking against MSVCRT dll) seems + to be the most commonly used option. + + When building an application that uses the static libcurl library, you must + add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for + dynamic import symbols. If you're using Visual Studio, you need to instead + add CURL_STATICLIB in the "Preprocessor Definitions" section. + + If you get linker error like "unknown symbol __imp__curl_easy_init ..." you + have linked against the wrong (static) library. If you want to use the + libcurl.dll and import lib, you don't need any extra CFLAGS, but use one of + the import libraries below. These are the libraries produced by the various + lib/Makefile.* files: + + Target: static lib. import lib for libcurl*.dll. + ----------------------------------------------------------- + MingW: libcurl.a libcurldll.a + MSVC (release): libcurl.lib libcurl_imp.lib + MSVC (debug): libcurld.lib libcurld_imp.lib + Borland: libcurl.lib libcurl_imp.lib + + 5.8 libcurl.so.X: open failed: No such file or directory + + This is an error message you might get when you try to run a program linked + with a shared version of libcurl and your run-time linker (ld.so) couldn't + find the shared library named libcurl.so.X. (Where X is the number of the + current libcurl ABI, typically 3 or 4). + + You need to make sure that ld.so finds libcurl.so.X. You can do that + multiple ways, and it differs somewhat between different operating systems, + but they are usually: + + * Add an option to the linker command line that specify the hard-coded path + the run-time linker should check for the lib (usually -R) + + * Set an environment variable (LD_LIBRARY_PATH for example) where ld.so + should check for libs + + * Adjust the system's config to check for libs in the directory where you've + put the dir (like Linux's /etc/ld.so.conf) + + 'man ld.so' and 'man ld' will tell you more details + + 5.9 How does libcurl resolve host names? + + libcurl supports a large a number of different name resolve functions. One + of them is picked at build-time and will be used unconditionally. Thus, if + you want to change name resolver function you must rebuild libcurl and tell + it to use a different function. + + - The non-IPv6 resolver that can use one of four different host name resolve + calls (depending on what your system supports): + + A - gethostbyname() + B - gethostbyname_r() with 3 arguments + C - gethostbyname_r() with 5 arguments + D - gethostbyname_r() with 6 arguments + + - The IPv6-resolver that uses getaddrinfo() + + - The c-ares based name resolver that uses the c-ares library for resolves. + Using this offers asynchronous name resolves. + + - The threaded resolver (default option on Windows). It uses: + + A - gethostbyname() on plain IPv4 hosts + B - getaddrinfo() on IPv6 enabled hosts + + Also note that libcurl never resolves or reverse-lookups addresses given as + pure numbers, such as 127.0.0.1 or ::1. + + 5.10 How do I prevent libcurl from writing the response to stdout? + + libcurl provides a default built-in write function that writes received data + to stdout. Set the CURLOPT_WRITEFUNCTION to receive the data, or possibly + set CURLOPT_WRITEDATA to a different FILE * handle. + + 5.11 How do I make libcurl not receive the whole HTTP response? + + You make the write callback (or progress callback) return an error and + libcurl will then abort the transfer. + + 5.12 Can I make libcurl fake or hide my real IP address? + + No. libcurl operates on a higher level. Besides, faking IP address would + imply sending IP packets with a made-up source address, and then you normally + get a problem with receiving the packet sent back as they would then not be + routed to you! + + If you use a proxy to access remote sites, the sites will not see your local + IP address but instead the address of the proxy. + + Also note that on many networks NATs or other IP-munging techniques are used + that makes you see and use a different IP address locally than what the + remote server will see you coming from. You may also consider using + https://www.torproject.org/ . + + 5.13 How do I stop an ongoing transfer? + + With the easy interface you make sure to return the correct error code from + one of the callbacks, but none of them are instant. There is no function you + can call from another thread or similar that will stop it immediately. + Instead, you need to make sure that one of the callbacks you use returns an + appropriate value that will stop the transfer. Suitable callbacks that you + can do this with include the progress callback, the read callback and the + write callback. + + If you're using the multi interface, you can also stop a transfer by + removing the particular easy handle from the multi stack at any moment you + think the transfer is done or when you wish to abort the transfer. + + 5.14 Using C++ non-static functions for callbacks? + + libcurl is a C library, it doesn't know anything about C++ member functions. + + You can overcome this "limitation" with relative ease using a static + member function that is passed a pointer to the class: + + // f is the pointer to your object. + static size_t YourClass::func(void *buffer, size_t sz, size_t n, void *f) + { + // Call non-static member function. + static_cast(f)->nonStaticFunction(); + } + + // This is how you pass pointer to the static function: + curl_easy_setopt(hcurl, CURLOPT_WRITEFUNCTION, YourClass::func); + curl_easy_setopt(hcurl, CURLOPT_WRITEDATA, this); + + 5.15 How do I get an FTP directory listing? + + If you end the FTP URL you request with a slash, libcurl will provide you + with a directory listing of that given directory. You can also set + CURLOPT_CUSTOMREQUEST to alter what exact listing command libcurl would use + to list the files. + + The follow-up question tends to be how is a program supposed to parse the + directory listing. How does it know what's a file and what's a dir and what's + a symlink etc. If the FTP server supports the MLSD command then it will + return data in a machine-readable format that can be parsed for type. The + types are specified by RFC3659 section 7.5.1. If MLSD is not supported then + you have to work with what you're given. The LIST output format is entirely + at the server's own liking and the NLST output doesn't reveal any types and + in many cases doesn't even include all the directory entries. Also, both LIST + and NLST tend to hide unix-style hidden files (those that start with a dot) + by default so you need to do "LIST -a" or similar to see them. + + Example - List only directories. + ftp.funet.fi supports MLSD and ftp.kernel.org does not: + + curl -s ftp.funet.fi/pub/ -X MLSD | \ + perl -lne 'print if s/(?:^|;)type=dir;[^ ]+ (.+)$/$1/' + + curl -s ftp.kernel.org/pub/linux/kernel/ | \ + perl -lne 'print if s/^d[-rwx]{9}(?: +[^ ]+){7} (.+)$/$1/' + + If you need to parse LIST output in libcurl one such existing + list parser is available at https://cr.yp.to/ftpparse.html Versions of + libcurl since 7.21.0 also provide the ability to specify a wildcard to + download multiple files from one FTP directory. + + 5.16 I want a different time-out! + + Time and time again users realize that CURLOPT_TIMEOUT and + CURLOPT_CONNECTIMEOUT are not sufficiently advanced or flexible to cover all + the various use cases and scenarios applications end up with. + + libcurl offers many more ways to time-out operations. A common alternative + is to use the CURLOPT_LOW_SPEED_LIMIT and CURLOPT_LOW_SPEED_TIME options to + specify the lowest possible speed to accept before to consider the transfer + timed out. + + The most flexible way is by writing your own time-out logic and using + CURLOPT_XFERINFOFUNCTION (perhaps in combination with other callbacks) and + use that to figure out exactly when the right condition is met when the + transfer should get stopped. + + 5.17 Can I write a server with libcurl? + + No. libcurl offers no functions or building blocks to build any kind of + internet protocol server. libcurl is only a client-side library. For server + libraries, you need to continue your search elsewhere but there exist many + good open source ones out there for most protocols you could possibly want a + server for. And there are really good stand-alone ones that have been tested + and proven for many years. There's no need for you to reinvent them! + + 5.18 Does libcurl use threads? + + Put simply: no, libcurl will execute in the same thread you call it in. All + callbacks will be called in the same thread as the one you call libcurl in. + + If you want to avoid your thread to be blocked by the libcurl call, you make + sure you use the non-blocking API which will do transfers asynchronously - + but still in the same single thread. + + libcurl will potentially internally use threads for name resolving, if it + was built to work like that, but in those cases it'll create the child + threads by itself and they will only be used and then killed internally by + libcurl and never exposed to the outside. + +6. License Issues + + Curl and libcurl are released under a MIT/X derivate license. The license is + very liberal and should not impose a problem for your project. This section + is just a brief summary for the cases we get the most questions. (Parts of + this section was much enhanced by Bjorn Reese.) + + We are not lawyers and this is not legal advice. You should probably consult + one if you want true and accurate legal insights without our prejudice. Note + especially that this section concerns the libcurl license only; compiling in + features of libcurl that depend on other libraries (e.g. OpenSSL) may affect + the licensing obligations of your application. + + 6.1 I have a GPL program, can I use the libcurl library? + + Yes! + + Since libcurl may be distributed under the MIT/X derivate license, it can be + used together with GPL in any software. + + 6.2 I have a closed-source program, can I use the libcurl library? + + Yes! + + libcurl does not put any restrictions on the program that uses the library. + + 6.3 I have a BSD licensed program, can I use the libcurl library? + + Yes! + + libcurl does not put any restrictions on the program that uses the library. + + 6.4 I have a program that uses LGPL libraries, can I use libcurl? + + Yes! + + The LGPL license doesn't clash with other licenses. + + 6.5 Can I modify curl/libcurl for my program and keep the changes secret? + + Yes! + + The MIT/X derivate license practically allows you to do almost anything with + the sources, on the condition that the copyright texts in the sources are + left intact. + + 6.6 Can you please change the curl/libcurl license to XXXX? + + No. + + We have carefully picked this license after years of development and + discussions and a large amount of people have contributed with source code + knowing that this is the license we use. This license puts the restrictions + we want on curl/libcurl and it does not spread to other programs or + libraries that use it. It should be possible for everyone to use libcurl or + curl in their projects, no matter what license they already have in use. + + 6.7 What are my obligations when using libcurl in my commercial apps? + + Next to none. All you need to adhere to is the MIT-style license (stated in + the COPYING file) which basically says you have to include the copyright + notice in "all copies" and that you may not use the copyright holder's name + when promoting your software. + + You do not have to release any of your source code. + + You do not have to reveal or make public any changes to the libcurl source + code. + + You do not have to broadcast to the world that you are using libcurl within + your app. + + All we ask is that you disclose "the copyright notice and this permission + notice" somewhere. Most probably like in the documentation or in the section + where other third party dependencies already are mentioned and acknowledged. + + As can be seen here: https://curl.haxx.se/docs/companies.html and elsewhere, + more and more companies are discovering the power of libcurl and take + advantage of it even in commercial environments. + + +7. PHP/CURL Issues + + 7.1 What is PHP/CURL? + + The module for PHP that makes it possible for PHP programs to access curl- + functions from within PHP. + + In the cURL project we call this module PHP/CURL to differentiate it from + curl the command line tool and libcurl the library. The PHP team however + does not refer to it like this (for unknown reasons). They call it plain + CURL (often using all caps) or sometimes ext/curl, but both cause much + confusion to users which in turn gives us a higher question load. + + 7.2 Who wrote PHP/CURL? + + PHP/CURL was initially written by Sterling Hughes. + + 7.3 Can I perform multiple requests using the same handle? + + Yes - at least in PHP version 4.3.8 and later (this has been known to not + work in earlier versions, but the exact version when it started to work is + unknown to me). + + After a transfer, you just set new options in the handle and make another + transfer. This will make libcurl re-use the same connection if it can. + + 7.4 Does PHP/CURL have dependencies? + + PHP/CURL is a module that comes with the regular PHP package. It depends on + and uses libcurl, so you need to have libcurl installed properly before + PHP/CURL can be used. diff --git a/bin/curl/docs/FEATURES.txt b/bin/curl/docs/FEATURES.txt new file mode 100644 index 00000000..68d38fc2 --- /dev/null +++ b/bin/curl/docs/FEATURES.txt @@ -0,0 +1,204 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +FEATURES + +curl tool + - config file support + - multiple URLs in a single command line + - range "globbing" support: [0-13], {one,two,three} + - multiple file upload on a single command line + - custom maximum transfer rate + - redirectable stderr + - metalink support (*13) + +libcurl + - full URL syntax with no length limit + - custom maximum download time + - custom least download speed acceptable + - custom output result after completion + - guesses protocol from host name unless specified + - uses .netrc + - progress bar with time statistics while downloading + - "standard" proxy environment variables support + - compiles on win32 (reported builds on 40+ operating systems) + - selectable network interface for outgoing traffic + - IPv6 support on unix and Windows + - persistent connections + - socks 4 + 5 support, with or without local name resolving + - supports user name and password in proxy environment variables + - operations through proxy "tunnel" (using CONNECT) + - support for large files (>2GB and >4GB) during upload and download + - replaceable memory functions (malloc, free, realloc, etc) + - asynchronous name resolving (*6) + - both a push and a pull style interface + - international domain names (*11) + +HTTP + - HTTP/1.1 compliant (optionally uses 1.0) + - GET + - PUT + - HEAD + - POST + - Pipelining + - multipart formpost (RFC1867-style) + - authentication: Basic, Digest, NTLM (*9) and Negotiate (SPNEGO) (*3) + to server and proxy + - resume (both GET and PUT) + - follow redirects + - maximum amount of redirects to follow + - custom HTTP request + - cookie get/send fully parsed + - reads/writes the netscape cookie file format + - custom headers (replace/remove internally generated headers) + - custom user-agent string + - custom referrer string + - range + - proxy authentication + - time conditions + - via http-proxy + - retrieve file modification date + - Content-Encoding support for deflate and gzip + - "Transfer-Encoding: chunked" support in uploads + - data compression (*12) + - HTTP/2 (*5) + +HTTPS (*1) + - (all the HTTP features) + - using client certificates + - verify server certificate + - via http-proxy + - select desired encryption + - force usage of a specific SSL version (SSLv2 (*7), SSLv3 (*10) or TLSv1) + +FTP + - download + - authentication + - Kerberos 5 (*14) + - active/passive using PORT, EPRT, PASV or EPSV + - single file size information (compare to HTTP HEAD) + - 'type=' URL support + - dir listing + - dir listing names-only + - upload + - upload append + - upload via http-proxy as HTTP PUT + - download resume + - upload resume + - custom ftp commands (before and/or after the transfer) + - simple "range" support + - via http-proxy + - all operations can be tunneled through a http-proxy + - customizable to retrieve file modification date + - no dir depth limit + +FTPS (*1) + - implicit ftps:// support that use SSL on both connections + - explicit "AUTH TLS" and "AUTH SSL" usage to "upgrade" plain ftp:// + connection to use SSL for both or one of the connections + +SCP (*8) + - both password and public key auth + +SFTP (*8) + - both password and public key auth + - with custom commands sent before/after the transfer + +TFTP + - download + - upload + +TELNET + - connection negotiation + - custom telnet options + - stdin/stdout I/O + +LDAP (*2) + - full LDAP URL support + +DICT + - extended DICT URL support + +FILE + - URL support + - upload + - resume + +SMB + - SMBv1 over TCP and SSL + - download + - upload + - authentication with NTLMv1 + +SMTP + - authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9), Kerberos 5 + (*4) and External. + - send e-mails + - mail from support + - mail size support + - mail auth support for trusted server-to-server relaying + - multiple recipients + - via http-proxy + +SMTPS (*1) + - implicit smtps:// support + - explicit "STARTTLS" usage to "upgrade" plain smtp:// connections to use SSL + - via http-proxy + +POP3 + - authentication: Clear Text, APOP and SASL + - SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9), + Kerberos 5 (*4) and External. + - list e-mails + - retrieve e-mails + - enhanced command support for: CAPA, DELE, TOP, STAT, UIDL and NOOP via + custom requests + - via http-proxy + +POP3S (*1) + - implicit pop3s:// support + - explicit "STLS" usage to "upgrade" plain pop3:// connections to use SSL + - via http-proxy + +IMAP + - authentication: Clear Text and SASL + - SASL based authentication: Plain, Login, CRAM-MD5, Digest-MD5, NTLM (*9), + Kerberos 5 (*4) and External. + - list the folders of a mailbox + - select a mailbox with support for verifying the UIDVALIDITY + - fetch e-mails with support for specifying the UID and SECTION + - upload e-mails via the append command + - enhanced command support for: EXAMINE, CREATE, DELETE, RENAME, STATUS, + STORE, COPY and UID via custom requests + - via http-proxy + +IMAPS (*1) + - implicit imaps:// support + - explicit "STARTTLS" usage to "upgrade" plain imap:// connections to use SSL + - via http-proxy + +FOOTNOTES +========= + + *1 = requires a TLS library + *2 = requires OpenLDAP or WinLDAP + *3 = requires a GSS-API implementation (such as Heimdal or MIT Kerberos) or + SSPI (native Windows) + *4 = requires a GSS-API implementation, however, only Windows SSPI is + currently supported + *5 = requires nghttp2 and possibly a recent TLS library + *6 = requires c-ares + *7 = requires OpenSSL, NSS, GSKit, WinSSL or Secure Transport; GnuTLS, for + example, only supports SSLv3 and TLSv1 + *8 = requires libssh2 + *9 = requires OpenSSL, GnuTLS, mbedTLS, NSS, yassl, Secure Transport or SSPI + (native Windows) + *10 = requires an SSL library that supports SSLv3 + *11 = requires libidn or Windows + *12 = requires libz + *13 = requires libmetalink, and either an Apple or Microsoft operating + system, or OpenSSL, or GnuTLS, or NSS + *14 = requires a GSS-API implementation (such as Heimdal or MIT Kerberos) diff --git a/bin/curl/docs/GOVERNANCE.md b/bin/curl/docs/GOVERNANCE.md new file mode 100644 index 00000000..d49358b9 --- /dev/null +++ b/bin/curl/docs/GOVERNANCE.md @@ -0,0 +1,144 @@ +# Decision making in the curl project + +A rough guide to how we make decisions and who does what. + +## BDFL + +This project was started by and has to some extent been pushed forward over +the years with Daniel Stenberg as the driving force. It matches a standard +BDFL (Benevolent Dictator For Life) style project. + +This setup has been used due to convenience and the fact that is has worked +fine this far. It is not because someone thinks of it as a superior project +leadership model. It will also only continue working as long as Daniel manages +to listen in to what the project and the general user population wants and +expects from us. + +## Legal entity + +There is no legal entity. The curl project is just a bunch of people scattered +around the globe with the common goal to produce source code that creates +great products. + +The copyrights in the project are owned by the individuals and organizations +that wrote those parts of the code. + +## Decisions + +The curl project is not a democracy, but everyone is entitled to state their +opinion and may argue for their sake within the community. + +All and any changes that have been done or will be done are eligible to bring +up for discussion, to object to or to praise. Ideally, we find consensus for +the appropriate way forward in any given situation or challenge. + +If there is no obvious consensus, a maintainer who's knowledgeable in the +specific area will take an "executive" decision that they think is the right +for the project. + +## Key roles + +### Maintainers + +A maintainer in the curl project is an individual who has been given +permissions to push commits to one of the git repositories. + +Maintainers are free to push commits to the repositories at their own will. +Maintainers are however expected to listen to feedback from users and any +change that is non-trivial in size or nature *should* be brought to the +project as a PR to allow others to comment/object before merge. + +### Former maintainers + +A maintainer who stops being active in the project will at some point get +their push permissions removed. We do this for security reasons but also to +make sure that we always have the list of maintainers as "the team that push +stuff to curl". + +Getting push permissions removed is not a punishment. Everyone who ever worked +on maintaining curl is considered a hero, for all time hereafter. + +### Security team members + +We have a security team. That's the team of people who are subscribed to the +curl-security mailing list; the receivers of security reports from users and +developers. This list of people will vary over time but should be skilled +developers familiar with the curl project. + +The security team works best when it consists of a small set of active +persons. We invite new members when the team seems to need it, and we also +expect to retire security team members as they "drift off" from the project or +just find themselves unable to perform their duties there. + +### Server admins + +We run a web server, a mailing list and more on the curl project's primary +server. That physical machine is owned and run by Haxx. Daniel is the primary +admin of all things curl related server stuff, but Björn Stenberg and Linus +Feltzing serve as backup admins for when Daniel is gone or unable. + +The primary server is paid for by Haxx. The machine is physically located in a +server bunker in Stockholm Sweden, operated by the company Portlane. + +The web site contents are served to the web via Fastly and Daniel is the +primary curl contact with Fastly. + +### BDFL + +That's Daniel. + +# Maintainers + +A curl maintainer is a project volunteer who has the authority and rights to +merge changes into a git repository in the curl project. + +Anyone can aspire to become a curl maintainer. + +### Duties + +There are no mandatory duties. We hope and wish that maintainers consider +reviewing patches and help merging them, especially when the changes are +within the area of personal expertise and experience. + +### Requirements + +- only merge code that meets our quality and style guide requirements. +- *never* merge code without doing a PR first, unless the change is "trivial" +- if in doubt, ask for input/feedback from others + +### Recommendations + +- please enable 2fa on your github account to reduce risk of malicious source + code tampering +- consider enabling signed git commits for additional verification of changes + +### Merge advice + +When you're merging patches/PRs... + +- make sure the commit messages follow our template +- squash patch sets into a few logical commits even if the PR didn't, if + necessary +- avoid the "merge" button on github, do it "manually" instead to get full + control and full audit trail (github leaves out you as "Committer:") +- remember to credit the reporter and the helpers! + +## Who are maintainers? + +The [list of maintainers](https://github.com/orgs/curl/people). Be aware that +the level of presence and activity in the project vary greatly between +different individuals and over time. + +### Become a maintainer? + +If you think you can help making the project better by shouldering some +maintaining responsibilities, then please get in touch. + +You will be expected to be familiar with the curl project and its ways of +working. You need to have gotten a few quality patches merged as a proof of +this. + +### Stop being a maintainer + +If you (appear to) not be active in the project anymore, you may be removed as +a maintainer. Thank you for your service! diff --git a/bin/curl/docs/HELP-US.md b/bin/curl/docs/HELP-US.md new file mode 100644 index 00000000..aae2b9f5 --- /dev/null +++ b/bin/curl/docs/HELP-US.md @@ -0,0 +1,70 @@ +# How to get started helping out in the curl project + +We are always in need of more help. If you are new to the project and are +looking for ways to contribute and help out, this document aims to give a few +good starting points. + +A good idea is to start by subscribing to the [curl-library mailing +list](https://cool.haxx.se/mailman/listinfo/curl-library) to keep track of the +current discussion topics. + +## Scratch your own itch + +One of the best ways is to start working on any problems or issues you have +found yourself or perhaps got annoyed at in the past. It can be a spelling +error in an error text or a weirdly phrased section in a man page. Hunt it +down and report the bug. Or make your first pull request with a fix for that. + +## Help wanted + +In the issue tracker we occasionally mark bugs with [help +wanted](https://github.com/curl/curl/labels/help%20wanted), as a sign that the +bug is acknowledged to exist and that there's nobody known to work on this +issue for the moment. Those are bugs that are fine to "grab" and provide a +pull request for. The complexity level of these will of course vary, so pick +one that piques your interest. + +## Work on known bugs + +Some bugs are known and haven't yet received attention and work enough to get +fixed. We collect such known existing flaws in the +[KNOWN_BUGS](https://curl.haxx.se/docs/knownbugs.html) page. Many of them link +to the original bug report with some additional details, but some may also +have aged a bit and may require some verification that the bug still exists in +the same way and that what was said about it in the past is still valid. + +## Fix autobuild problems + +On the [autobuilds page](https://curl.haxx.se/dev/builds.html) we show a +collection of test results from the automatic curl build and tests that are +performed by volunteers. Fixing compiler warnings and errors shown there is +something we value greatly. Also, if you own or run systems or architectures +that aren't already tested in the autobuilds, we also appreciate more +volunteers running builds automatically to help us keep curl portable. + +## TODO items + +Ideas for features and functions that we have considered worthwhile to +implement and provide are kept in the +[TODO](https://curl.haxx.se/docs/todo.html) file. Some of the ideas are +rough. Some are well thought out. Some probably aren't really suitable +anymore. + +Before you invest a lot of time on a TODO item, do bring it up for discussion +on the mailing list. For discussion on applicability but also for ideas and +brainstorming on specific ways to do the implementation etc. + +## You decide + +You can also come up with a completely new thing you think we should do. Or +not do. Or fix. Or add to the project. You then either bring it to the mailing +list first to see if people will shoot down the idea at once, or you bring a +first draft of the idea as a pull request and take the discussion there around +the specific implementation. Either way is fine. + +## CONTRIBUTE + +We offer [guidelines](https://curl.haxx.se/dev/contribute.html) that are +suitable to be familiar with before you decide to contribute to curl. If +you're used to open source development, you'll probably not find many +surprises in there. diff --git a/bin/curl/docs/HISTORY.md b/bin/curl/docs/HISTORY.md new file mode 100644 index 00000000..30249071 --- /dev/null +++ b/bin/curl/docs/HISTORY.md @@ -0,0 +1,346 @@ +How curl Became Like This +========================= + +Towards the end of 1996, Daniel Stenberg was spending time writing an IRC bot +for an Amiga related channel on EFnet. He then came up with the idea to make +currency-exchange calculations available to Internet Relay Chat (IRC) +users. All the necessary data were published on the Web; he just needed to +automate their retrieval. + +Daniel simply adopted an existing command-line open-source tool, httpget, that +Brazilian Rafael Sagula had written and recently released version 0.1 of. After +a few minor adjustments, it did just what he needed. + +1997 +---- + +HttpGet 1.0 was released on April 8th 1997 with brand new HTTP proxy support. + +We soon found and fixed support for getting currencies over GOPHER. Once FTP +download support was added, the name of the project was changed and urlget 2.0 +was released in August 1997. The http-only days were already passed. + +1998 +---- + +The project slowly grew bigger. When upload capabilities were added and the +name once again was misleading, a second name change was made and on March 20, +1998 curl 4 was released. (The version numbering from the previous names was +kept.) + +(Unrelated to this project a company called Curl Corporation registered a US +trademark on the name "CURL" on May 18 1998. That company had then already +registered the curl.com domain back in November of the previous year. All this +was revealed to us much later.) + +SSL support was added, powered by the SSLeay library. + +August: first announcement of curl on freshmeat.net. + +October: with the curl 4.9 release and the introduction of cookie support, +curl was no longer released under the GPL license. Now we're at 4000 lines of +code, we switched over to the MPL license to restrict the effects of +"copyleft". + +November: configure script and reported successful compiles on several +major operating systems. The never-quite-understood -F option was added and +curl could now simulate quite a lot of a browser. TELNET support was added. + +Curl 5 was released in December 1998 and introduced the first ever curl man +page. People started making Linux RPM packages out of it. + +1999 +---- + +January: DICT support added. + +OpenSSL took over and SSLeay was abandoned. + +May: first Debian package. + +August: LDAP:// and FILE:// support added. The curl web site gets 1300 visits +weekly. Moved site to curl.haxx.nu. + +September: Released curl 6.0. 15000 lines of code. + +December 28: added the project on Sourceforge and started using its services +for managing the project. + +2000 +---- + +Spring: major internal overhaul to provide a suitable library interface. +The first non-beta release was named 7.1 and arrived in August. This offered +the easy interface and turned out to be the beginning of actually getting +other software and programs to be based on and powered by libcurl. Almost +20000 lines of code. + +June: the curl site moves to "curl.haxx.se" + +August, the curl web site gets 4000 visits weekly. + +The PHP guys adopted libcurl already the same month, when the first ever third +party libcurl binding showed up. CURL has been a supported module in PHP since +the release of PHP 4.0.2. This would soon get followers. More than 16 +different bindings exist at the time of this writing. + +September: kerberos4 support was added. + +November: started the work on a test suite for curl. It was later re-written +from scratch again. The libcurl major SONAME number was set to 1. + +2001 +---- + +January: Daniel released curl 7.5.2 under a new license again: MIT (or +MPL). The MIT license is extremely liberal and can be combined with GPL +in other projects. This would finally put an end to the "complaints" from +people involved in GPLed projects that previously were prohibited from using +libcurl while it was released under MPL only. (Due to the fact that MPL is +deemed "GPL incompatible".) + +March 22: curl supports HTTP 1.1 starting with the release of 7.7. This +also introduced libcurl's ability to do persistent connections. 24000 lines of +code. The libcurl major SONAME number was bumped to 2 due to this overhaul. +The first experimental ftps:// support was added. + +August: curl is bundled in Mac OS X, 10.1. It was already becoming more and +more of a standard utility of Linux distributions and a regular in the BSD +ports collections. The curl web site gets 8000 visits weekly. Curl Corporation +contacted Daniel to discuss "the name issue". After Daniel's reply, they have +never since got back in touch again. + +September: libcurl 7.9 introduces cookie jar and curl_formadd(). During the +forthcoming 7.9.x releases, we introduced the multi interface slowly and +without many whistles. + +2002 +---- + +June: the curl web site gets 13000 visits weekly. curl and libcurl is +35000 lines of code. Reported successful compiles on more than 40 combinations +of CPUs and operating systems. + +To estimate number of users of the curl tool or libcurl library is next to +impossible. Around 5000 downloaded packages each week from the main site gives +a hint, but the packages are mirrored extensively, bundled with numerous OS +distributions and otherwise retrieved as part of other software. + +September: with the release of curl 7.10 it is released under the MIT license +only. + +2003 +---- + +January: Started working on the distributed curl tests. The autobuilds. + +February: the curl site averages at 20000 visits weekly. At any given moment, +there's an average of 3 people browsing the curl.haxx.se site. + +Multiple new authentication schemes are supported: Digest (May), NTLM (June) +and Negotiate (June). + +November: curl 7.10.8 is released. 45000 lines of code. ~55000 unique visitors +to the curl.haxx.se site. Five official web mirrors. + +December: full-fledged SSL for FTP is supported. + +2004 +---- + +January: curl 7.11.0 introduced large file support. + +June: curl 7.12.0 introduced IDN support. 10 official web mirrors. + +This release bumped the major SONAME to 3 due to the removal of the +curl_formparse() function + +August: Curl and libcurl 7.12.1 + + Public curl release number: 82 + Releases counted from the very beginning: 109 + Available command line options: 96 + Available curl_easy_setopt() options: 120 + Number of public functions in libcurl: 36 + Amount of public web site mirrors: 12 + Number of known libcurl bindings: 26 + +2005 +---- + +April: GnuTLS can now optionally be used for the secure layer when curl is +built. + +April: Added the multi_socket() API + +September: TFTP support was added. + +More than 100,000 unique visitors of the curl web site. 25 mirrors. + +December: security vulnerability: libcurl URL Buffer Overflow + +2006 +---- + +January: We dropped support for Gopher. We found bugs in the implementation +that turned out to have been introduced years ago, so with the conclusion that +nobody had found out in all this time we removed it instead of fixing it. + +March: security vulnerability: libcurl TFTP Packet Buffer Overflow + +September: The major SONAME number for libcurl was bumped to 4 due to the +removal of ftp third party transfer support. + +November: Added SCP and SFTP support + +2007 +---- + +February: Added support for the Mozilla NSS library to do the SSL/TLS stuff + +July: security vulnerability: libcurl GnuTLS insufficient cert verification + +2008 +---- + +November: + + Command line options: 128 + curl_easy_setopt() options: 158 + Public functions in libcurl: 58 + Known libcurl bindings: 37 + Contributors: 683 + + 145,000 unique visitors. >100 GB downloaded. + +2009 +---- + +March: security vulnerability: libcurl Arbitrary File Access + +August: security vulnerability: libcurl embedded zero in cert name + +December: Added support for IMAP, POP3 and SMTP + +2010 +---- + +January: Added support for RTSP + +February: security vulnerability: libcurl data callback excessive length + +March: The project switched over to use git (hosted by github) instead of CVS +for source code control + +May: Added support for RTMP + +Added support for PolarSSL to do the SSL/TLS stuff + +August: + + Public curl releases: 117 + Command line options: 138 + curl_easy_setopt() options: 180 + Public functions in libcurl: 58 + Known libcurl bindings: 39 + Contributors: 808 + + Gopher support added (re-added actually, see January 2006) + +2011 +---- + +February: added support for the axTLS backend + +April: added the cyassl backend (later renamed to WolfSSL) + +2012 +---- + + July: Added support for Schannel (native Windows TLS backend) and Darwin SSL + (Native Mac OS X and iOS TLS backend). + + Supports metalink + + October: SSH-agent support. + +2013 +---- + + February: Cleaned up internals to always uses the "multi" non-blocking + approach internally and only expose the blocking API with a wrapper. + + September: First small steps on supporting HTTP/2 with nghttp2. + + October: Removed krb4 support. + + December: Happy eyeballs. + +2014 +---- + + March: first real release supporting HTTP/2 + + September: Web site had 245,000 unique visitors and served 236GB data + +2015 +---- + + June: support for multiplexing with HTTP/2 + + August: support for HTTP/2 server push + + December: Public Suffix List + +2016 +---- + + January: the curl tool defaults to HTTP/2 for HTTPS URLs + + December: curl 7.52.0 introduced support for HTTPS-proxy! + + First TLS 1.3 support + +2017 +---- + + September: Added Multi-SSL support + + The web site serves 3100 GB/month + + Public curl releases: 169 + Command line options: 211 + curl_easy_setopt() options: 249 + Public functions in libcurl: 74 + Contributors: 1609 + + October: SSLKEYLOGFILE support, new MIME API + + November: brotli + +2018 +---- + + January: new SSH backend powered by libssh + + March: starting with the 1803 release of Windows 10, curl is shipped bundled + with Microsoft's operating system. + + July: curl shows headers using bold type face + + October: added DNS-over-HTTPS (DoH) and the URL API + + MesaLink is a new supported TLS backend + + libcurl now does HTTP/2 (and multiplexing) by default on HTTPS URLs + + curl and libcurl are installed in an estimated 5 *billion* instances + world-wide. + + October 31: Curl and libcurl 7.62.0 + + Public curl releases: 177 + Command line options: 219 + curl_easy_setopt() options: 261 + Public functions in libcurl: 80 + Contributors: 1808 diff --git a/bin/curl/docs/HTTP-COOKIES.md b/bin/curl/docs/HTTP-COOKIES.md new file mode 100644 index 00000000..632cb4eb --- /dev/null +++ b/bin/curl/docs/HTTP-COOKIES.md @@ -0,0 +1,113 @@ +# HTTP Cookies + +## Cookie overview + + Cookies are `name=contents` pairs that a HTTP server tells the client to + hold and then the client sends back those to the server on subsequent + requests to the same domains and paths for which the cookies were set. + + Cookies are either "session cookies" which typically are forgotten when the + session is over which is often translated to equal when browser quits, or + the cookies aren't session cookies they have expiration dates after which + the client will throw them away. + + Cookies are set to the client with the Set-Cookie: header and are sent to + servers with the Cookie: header. + + For a very long time, the only spec explaining how to use cookies was the + original [Netscape spec from 1994](https://curl.haxx.se/rfc/cookie_spec.html). + + In 2011, [RFC6265](https://www.ietf.org/rfc/rfc6265.txt) was finally + published and details how cookies work within HTTP. In 2016, an update which + added support for prefixes was + [proposed](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-prefixes-00), + and in 2017, another update was + [drafted](https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01) + to deprecate modification of 'secure' cookies from non-secure origins. Both + of these drafs have been incorporated into a proposal to + [replace](https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-02) + RFC6265. Cookie prefixes and secure cookie modification protection has been + implemented by curl. + +## Cookies saved to disk + + Netscape once created a file format for storing cookies on disk so that they + would survive browser restarts. curl adopted that file format to allow + sharing the cookies with browsers, only to see browsers move away from that + format. Modern browsers no longer use it, while curl still does. + + The netscape cookie file format stores one cookie per physical line in the + file with a bunch of associated meta data, each field separated with + TAB. That file is called the cookiejar in curl terminology. + + When libcurl saves a cookiejar, it creates a file header of its own in which + there is a URL mention that will link to the web version of this document. + +## Cookies with curl the command line tool + + curl has a full cookie "engine" built in. If you just activate it, you can + have curl receive and send cookies exactly as mandated in the specs. + + Command line options: + + `-b, --cookie` + + tell curl a file to read cookies from and start the cookie engine, or if it + isn't a file it will pass on the given string. -b name=var works and so does + -b cookiefile. + + `-j, --junk-session-cookies` + + when used in combination with -b, it will skip all "session cookies" on load + so as to appear to start a new cookie session. + + `-c, --cookie-jar` + + tell curl to start the cookie engine and write cookies to the given file + after the request(s) + +## Cookies with libcurl + + libcurl offers several ways to enable and interface the cookie engine. These + options are the ones provided by the native API. libcurl bindings may offer + access to them using other means. + + `CURLOPT_COOKIE` + + Is used when you want to specify the exact contents of a cookie header to + send to the server. + + `CURLOPT_COOKIEFILE` + + Tell libcurl to activate the cookie engine, and to read the initial set of + cookies from the given file. Read-only. + + `CURLOPT_COOKIEJAR` + + Tell libcurl to activate the cookie engine, and when the easy handle is + closed save all known cookies to the given cookiejar file. Write-only. + + `CURLOPT_COOKIELIST` + + Provide detailed information about a single cookie to add to the internal + storage of cookies. Pass in the cookie as a HTTP header with all the details + set, or pass in a line from a netscape cookie file. This option can also be + used to flush the cookies etc. + + `CURLINFO_COOKIELIST` + + Extract cookie information from the internal cookie storage as a linked + list. + +## Cookies with javascript + + These days a lot of the web is built up by javascript. The webbrowser loads + complete programs that render the page you see. These javascript programs + can also set and access cookies. + + Since curl and libcurl are plain HTTP clients without any knowledge of or + capability to handle javascript, such cookies will not be detected or used. + + Often, if you want to mimic what a browser does on such web sites, you can + record web browser HTTP traffic when using such a site and then repeat the + cookie operations using curl or libcurl. diff --git a/bin/curl/docs/HTTP2.md b/bin/curl/docs/HTTP2.md new file mode 100644 index 00000000..5b4435f8 --- /dev/null +++ b/bin/curl/docs/HTTP2.md @@ -0,0 +1,127 @@ +HTTP/2 with curl +================ + +[HTTP/2 Spec](https://www.rfc-editor.org/rfc/rfc7540.txt) +[http2 explained](https://daniel.haxx.se/http2/) + +Build prerequisites +------------------- + - nghttp2 + - OpenSSL, libressl, BoringSSL, NSS, GnutTLS, mbedTLS, wolfSSL or Schannel + with a new enough version. + +[nghttp2](https://nghttp2.org/) +------------------------------- + +libcurl uses this 3rd party library for the low level protocol handling +parts. The reason for this is that HTTP/2 is much more complex at that layer +than HTTP/1.1 (which we implement on our own) and that nghttp2 is an already +existing and well functional library. + +We require at least version 1.0.0. + +Over an http:// URL +------------------- + +If `CURLOPT_HTTP_VERSION` is set to `CURL_HTTP_VERSION_2_0`, libcurl will +include an upgrade header in the initial request to the host to allow +upgrading to HTTP/2. + +Possibly we can later introduce an option that will cause libcurl to fail if +not possible to upgrade. Possibly we introduce an option that makes libcurl +use HTTP/2 at once over http:// + +Over an https:// URL +-------------------- + +If `CURLOPT_HTTP_VERSION` is set to `CURL_HTTP_VERSION_2_0`, libcurl will use +ALPN (or NPN) to negotiate which protocol to continue with. Possibly introduce +an option that will cause libcurl to fail if not possible to use HTTP/2. + +`CURL_HTTP_VERSION_2TLS` was added in 7.47.0 as a way to ask libcurl to prefer +HTTP/2 for HTTPS but stick to 1.1 by default for plain old HTTP connections. + +ALPN is the TLS extension that HTTP/2 is expected to use. The NPN extension is +for a similar purpose, was made prior to ALPN and is used for SPDY so early +HTTP/2 servers are implemented using NPN before ALPN support is widespread. + +`CURLOPT_SSL_ENABLE_ALPN` and `CURLOPT_SSL_ENABLE_NPN` are offered to allow +applications to explicitly disable ALPN or NPN. + +SSL libs +-------- + +The challenge is the ALPN and NPN support and all our different SSL +backends. You may need a fairly updated SSL library version for it to provide +the necessary TLS features. Right now we support: + + - OpenSSL: ALPN and NPN + - libressl: ALPN and NPN + - BoringSSL: ALPN and NPN + - NSS: ALPN and NPN + - GnuTLS: ALPN + - mbedTLS: ALPN + - Schannel: ALPN + - wolfSSL: ALPN + - Secure Transport: ALPN + +Multiplexing +------------ + +Starting in 7.43.0, libcurl fully supports HTTP/2 multiplexing, which is the +term for doing multiple independent transfers over the same physical TCP +connection. + +To take advantage of multiplexing, you need to use the multi interface and set +`CURLMOPT_PIPELINING` to `CURLPIPE_MULTIPLEX`. With that bit set, libcurl will +attempt to re-use existing HTTP/2 connections and just add a new stream over +that when doing subsequent parallel requests. + +While libcurl sets up a connection to a HTTP server there is a period during +which it doesn't know if it can pipeline or do multiplexing and if you add new +transfers in that period, libcurl will default to start new connections for +those transfers. With the new option `CURLOPT_PIPEWAIT` (added in 7.43.0), you +can ask that a transfer should rather wait and see in case there's a +connection for the same host in progress that might end up being possible to +multiplex on. It favours keeping the number of connections low to the cost of +slightly longer time to first byte transferred. + +Applications +------------ + +We hide HTTP/2's binary nature and convert received HTTP/2 traffic to headers +in HTTP 1.1 style. This allows applications to work unmodified. + +curl tool +--------- + +curl offers the `--http2` command line option to enable use of HTTP/2. + +curl offers the `--http2-prior-knowledge` command line option to enable use of +HTTP/2 without HTTP/1.1 Upgrade. + +Since 7.47.0, the curl tool enables HTTP/2 by default for HTTPS connections. + +curl tool limitations +--------------------- + +The command line tool won't do any HTTP/2 multiplexing even though libcurl +supports it, simply because the curl tool is not written to take advantage of +the libcurl API that's necessary for this (the multi interface). We have an +outstanding TODO item for this and **you** can help us make it happen. + +The command line tool also doesn't support HTTP/2 server push for the same +reason it doesn't do multiplexing: it needs to use the multi interface for +that so that multiplexing is supported. + +HTTP Alternative Services +------------------------- + +Alt-Svc is an extension with a corresponding frame (ALTSVC) in HTTP/2 that +tells the client about an alternative "route" to the same content for the same +origin server that you get the response from. A browser or long-living client +can use that hint to create a new connection asynchronously. For libcurl, we +may introduce a way to bring such clues to the application and/or let a +subsequent request use the alternate route automatically. + +[Detailed in RFC 7838](https://tools.ietf.org/html/rfc7838) diff --git a/bin/curl/docs/INSTALL.md b/bin/curl/docs/INSTALL.md new file mode 100644 index 00000000..d287d55e --- /dev/null +++ b/bin/curl/docs/INSTALL.md @@ -0,0 +1,468 @@ +# how to install curl and libcurl + +## Installing Binary Packages + +Lots of people download binary distributions of curl and libcurl. This +document does not describe how to install curl or libcurl using such a binary +package. This document describes how to compile, build and install curl and +libcurl from source code. + +## Building from git + +If you get your code off a git repository instead of a release tarball, see +the `GIT-INFO` file in the root directory for specific instructions on how to +proceed. + +# Unix + +A normal Unix installation is made in three or four steps (after you've +unpacked the source archive): + + ./configure + make + make test (optional) + make install + +You probably need to be root when doing the last command. + +Get a full listing of all available configure options by invoking it like: + + ./configure --help + +If you want to install curl in a different file hierarchy than `/usr/local`, +specify that when running configure: + + ./configure --prefix=/path/to/curl/tree + +If you have write permission in that directory, you can do 'make install' +without being root. An example of this would be to make a local install in +your own home directory: + + ./configure --prefix=$HOME + make + make install + +The configure script always tries to find a working SSL library unless +explicitly told not to. If you have OpenSSL installed in the default search +path for your compiler/linker, you don't need to do anything special. If you +have OpenSSL installed in `/usr/local/ssl`, you can run configure like: + + ./configure --with-ssl + +If you have OpenSSL installed somewhere else (for example, `/opt/OpenSSL`) and +you have pkg-config installed, set the pkg-config path first, like this: + + env PKG_CONFIG_PATH=/opt/OpenSSL/lib/pkgconfig ./configure --with-ssl + +Without pkg-config installed, use this: + + ./configure --with-ssl=/opt/OpenSSL + +If you insist on forcing a build without SSL support, even though you may +have OpenSSL installed in your system, you can run configure like this: + + ./configure --without-ssl + +If you have OpenSSL installed, but with the libraries in one place and the +header files somewhere else, you have to set the `LDFLAGS` and `CPPFLAGS` +environment variables prior to running configure. Something like this should +work: + + CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" ./configure + +If you have shared SSL libs installed in a directory where your run-time +linker doesn't find them (which usually causes configure failures), you can +provide this option to gcc to set a hard-coded path to the run-time linker: + + LDFLAGS=-Wl,-R/usr/local/ssl/lib ./configure --with-ssl + +## More Options + +To force a static library compile, disable the shared library creation by +running configure like: + + ./configure --disable-shared + +To tell the configure script to skip searching for thread-safe functions, add +an option like: + + ./configure --disable-thread + +If you're a curl developer and use gcc, you might want to enable more debug +options with the `--enable-debug` option. + +curl can be built to use a whole range of libraries to provide various useful +services, and configure will try to auto-detect a decent default. But if you +want to alter it, you can select how to deal with each individual library. + +## Select TLS backend + +The default OpenSSL configure check will also detect and use BoringSSL or +libressl. + + - GnuTLS: `--without-ssl --with-gnutls`. + - wolfSSL: `--without-ssl --with-wolfssl` + - NSS: `--without-ssl --with-nss` + - PolarSSL: `--without-ssl --with-polarssl` + - mbedTLS: `--without-ssl --with-mbedtls` + - schannel: `--without-ssl --with-schannel` + - secure transport: `--without-ssl --with-secure-transport` + - MesaLink: `--without-ssl --with-mesalink` + +# Windows + +## Building Windows DLLs and C run-time (CRT) linkage issues + + As a general rule, building a DLL with static CRT linkage is highly + discouraged, and intermixing CRTs in the same app is something to avoid at + any cost. + + Reading and comprehending Microsoft Knowledge Base articles KB94248 and + KB140584 is a must for any Windows developer. Especially important is full + understanding if you are not going to follow the advice given above. + + - [How To Use the C Run-Time](https://support.microsoft.com/help/94248/how-to-use-the-c-run-time) + - [Run-Time Library Compiler Options](https://docs.microsoft.com/cpp/build/reference/md-mt-ld-use-run-time-library) + - [Potential Errors Passing CRT Objects Across DLL Boundaries](https://docs.microsoft.com/cpp/c-runtime-library/potential-errors-passing-crt-objects-across-dll-boundaries) + +If your app is misbehaving in some strange way, or it is suffering from +memory corruption, before asking for further help, please try first to +rebuild every single library your app uses as well as your app using the +debug multithreaded dynamic C runtime. + + If you get linkage errors read section 5.7 of the FAQ document. + +## MingW32 + +Make sure that MinGW32's bin dir is in the search path, for example: + + set PATH=c:\mingw32\bin;%PATH% + +then run `mingw32-make mingw32` in the root dir. There are other +make targets available to build libcurl with more features, use: + + - `mingw32-make mingw32-zlib` to build with Zlib support; + - `mingw32-make mingw32-ssl-zlib` to build with SSL and Zlib enabled; + - `mingw32-make mingw32-ssh2-ssl-zlib` to build with SSH2, SSL, Zlib; + - `mingw32-make mingw32-ssh2-ssl-sspi-zlib` to build with SSH2, SSL, Zlib + and SSPI support. + +If you have any problems linking libraries or finding header files, be sure +to verify that the provided `Makefile.m32` files use the proper paths, and +adjust as necessary. It is also possible to override these paths with +environment variables, for example: + + set ZLIB_PATH=c:\zlib-1.2.8 + set OPENSSL_PATH=c:\openssl-1.0.2c + set LIBSSH2_PATH=c:\libssh2-1.6.0 + +It is also possible to build with other LDAP SDKs than MS LDAP; currently +it is possible to build with native Win32 OpenLDAP, or with the Novell CLDAP +SDK. If you want to use these you need to set these vars: + + set LDAP_SDK=c:\openldap + set USE_LDAP_OPENLDAP=1 + +or for using the Novell SDK: + + set USE_LDAP_NOVELL=1 + +If you want to enable LDAPS support then set LDAPS=1. + +## Cygwin + +Almost identical to the unix installation. Run the configure script in the +curl source tree root with `sh configure`. Make sure you have the `sh` +executable in `/bin/` or you'll see the configure fail toward the end. + +Run `make` + +## Disabling Specific Protocols in Windows builds + +The configure utility, unfortunately, is not available for the Windows +environment, therefore, you cannot use the various disable-protocol options of +the configure utility on this platform. + +However, you can use the following defines to disable specific +protocols: + + - `HTTP_ONLY` disables all protocols except HTTP + - `CURL_DISABLE_FTP` disables FTP + - `CURL_DISABLE_LDAP` disables LDAP + - `CURL_DISABLE_TELNET` disables TELNET + - `CURL_DISABLE_DICT` disables DICT + - `CURL_DISABLE_FILE` disables FILE + - `CURL_DISABLE_TFTP` disables TFTP + - `CURL_DISABLE_HTTP` disables HTTP + - `CURL_DISABLE_IMAP` disables IMAP + - `CURL_DISABLE_POP3` disables POP3 + - `CURL_DISABLE_SMTP` disables SMTP + +If you want to set any of these defines you have the following options: + + - Modify `lib/config-win32.h` + - Modify `lib/curl_setup.h` + - Modify `winbuild/Makefile.vc` + - Modify the "Preprocessor Definitions" in the libcurl project + +Note: The pre-processor settings can be found using the Visual Studio IDE +under "Project -> Settings -> C/C++ -> General" in VC6 and "Project -> +Properties -> Configuration Properties -> C/C++ -> Preprocessor" in later +versions. + +## Using BSD-style lwIP instead of Winsock TCP/IP stack in Win32 builds + +In order to compile libcurl and curl using BSD-style lwIP TCP/IP stack it is +necessary to make definition of preprocessor symbol `USE_LWIPSOCK` visible to +libcurl and curl compilation processes. To set this definition you have the +following alternatives: + + - Modify `lib/config-win32.h` and `src/config-win32.h` + - Modify `winbuild/Makefile.vc` + - Modify the "Preprocessor Definitions" in the libcurl project + +Note: The pre-processor settings can be found using the Visual Studio IDE +under "Project -> Settings -> C/C++ -> General" in VC6 and "Project -> +Properties -> Configuration Properties -> C/C++ -> Preprocessor" in later +versions. + +Once that libcurl has been built with BSD-style lwIP TCP/IP stack support, in +order to use it with your program it is mandatory that your program includes +lwIP header file `` (or another lwIP header that includes this) +before including any libcurl header. Your program does not need the +`USE_LWIPSOCK` preprocessor definition which is for libcurl internals only. + +Compilation has been verified with [lwIP +1.4.0](https://download.savannah.gnu.org/releases/lwip/lwip-1.4.0.zip) and +[contrib-1.4.0](https://download.savannah.gnu.org/releases/lwip/contrib-1.4.0.zip). + +This BSD-style lwIP TCP/IP stack support must be considered experimental given +that it has been verified that lwIP 1.4.0 still needs some polish, and libcurl +might yet need some additional adjustment, caveat emptor. + +## Important static libcurl usage note + +When building an application that uses the static libcurl library on Windows, +you must add `-DCURL_STATICLIB` to your `CFLAGS`. Otherwise the linker will +look for dynamic import symbols. + +## Legacy Windows and SSL + +Schannel (from Windows SSPI), is the native SSL library in Windows. However, +Schannel in Windows <= XP is unable to connect to servers that +no longer support the legacy handshakes and algorithms used by those +versions. If you will be using curl in one of those earlier versions of +Windows you should choose another SSL backend such as OpenSSL. + +# Apple iOS and macOS + +On modern Apple operating systems, curl can be built to use Apple's SSL/TLS +implementation, Secure Transport, instead of OpenSSL. To build with Secure +Transport for SSL/TLS, use the configure option `--with-darwinssl`. (It is not +necessary to use the option `--without-ssl`.) This feature requires iOS 5.0 or +later, or OS X 10.5 ("Leopard") or later. + +When Secure Transport is in use, the curl options `--cacert` and `--capath` +and their libcurl equivalents, will be ignored, because Secure Transport uses +the certificates stored in the Keychain to evaluate whether or not to trust +the server. This, of course, includes the root certificates that ship with the +OS. The `--cert` and `--engine` options, and their libcurl equivalents, are +currently unimplemented in curl with Secure Transport. + +For macOS users: In OS X 10.8 ("Mountain Lion"), Apple made a major overhaul +to the Secure Transport API that, among other things, added support for the +newer TLS 1.1 and 1.2 protocols. To get curl to support TLS 1.1 and 1.2, you +must build curl on Mountain Lion or later, or by using the equivalent SDK. If +you set the `MACOSX_DEPLOYMENT_TARGET` environmental variable to an earlier +version of macOS prior to building curl, then curl will use the new Secure +Transport API on Mountain Lion and later, and fall back on the older API when +the same curl binary is executed on older cats. For example, running these +commands in curl's directory in the shell will build the code such that it +will run on cats as old as OS X 10.6 ("Snow Leopard") (using bash): + + export MACOSX_DEPLOYMENT_TARGET="10.6" + ./configure --with-darwinssl + make + +# Cross compile + +Download and unpack the curl package. + +`cd` to the new directory. (e.g. `cd curl-7.12.3`) + +Set environment variables to point to the cross-compile toolchain and call +configure with any options you need. Be sure and specify the `--host` and +`--build` parameters at configuration time. The following script is an +example of cross-compiling for the IBM 405GP PowerPC processor using the +toolchain from MonteVista for Hardhat Linux. + + #! /bin/sh + + export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin + export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include" + export AR=ppc_405-ar + export AS=ppc_405-as + export LD=ppc_405-ld + export RANLIB=ppc_405-ranlib + export CC=ppc_405-gcc + export NM=ppc_405-nm + + ./configure --target=powerpc-hardhat-linux + --host=powerpc-hardhat-linux + --build=i586-pc-linux-gnu + --prefix=/opt/hardhat/devkit/ppc/405/target/usr/local + --exec-prefix=/usr/local + +You may also need to provide a parameter like `--with-random=/dev/urandom` to +configure as it cannot detect the presence of a random number generating +device for a target system. The `--prefix` parameter specifies where curl +will be installed. If `configure` completes successfully, do `make` and `make +install` as usual. + +In some cases, you may be able to simplify the above commands to as little as: + + ./configure --host=ARCH-OS + +# REDUCING SIZE + +There are a number of configure options that can be used to reduce the size of +libcurl for embedded applications where binary size is an important factor. +First, be sure to set the `CFLAGS` variable when configuring with any relevant +compiler optimization flags to reduce the size of the binary. For gcc, this +would mean at minimum the -Os option, and potentially the `-march=X`, +`-mdynamic-no-pic` and `-flto` options as well, e.g. + + ./configure CFLAGS='-Os' LDFLAGS='-Wl,-Bsymbolic'... + +Note that newer compilers often produce smaller code than older versions +due to improved optimization. + +Be sure to specify as many `--disable-` and `--without-` flags on the +configure command-line as you can to disable all the libcurl features that you +know your application is not going to need. Besides specifying the +`--disable-PROTOCOL` flags for all the types of URLs your application will not +use, here are some other flags that can reduce the size of the library: + + - `--disable-ares` (disables support for the C-ARES DNS library) + - `--disable-cookies` (disables support for HTTP cookies) + - `--disable-crypto-auth` (disables HTTP cryptographic authentication) + - `--disable-ipv6` (disables support for IPv6) + - `--disable-manual` (disables support for the built-in documentation) + - `--disable-proxy` (disables support for HTTP and SOCKS proxies) + - `--disable-unix-sockets` (disables support for UNIX sockets) + - `--disable-verbose` (eliminates debugging strings and error code strings) + - `--disable-versioned-symbols` (disables support for versioned symbols) + - `--enable-hidden-symbols` (eliminates unneeded symbols in the shared library) + - `--without-libidn` (disables support for the libidn DNS library) + - `--without-librtmp` (disables support for RTMP) + - `--without-ssl` (disables support for SSL/TLS) + - `--without-zlib` (disables support for on-the-fly decompression) + +The GNU compiler and linker have a number of options that can reduce the +size of the libcurl dynamic libraries on some platforms even further. +Specify them by providing appropriate `CFLAGS` and `LDFLAGS` variables on +the configure command-line, e.g. + + CFLAGS="-Os -ffunction-sections -fdata-sections + -fno-unwind-tables -fno-asynchronous-unwind-tables -flto" + LDFLAGS="-Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections" + +Be sure also to strip debugging symbols from your binaries after compiling +using 'strip' (or the appropriate variant if cross-compiling). If space is +really tight, you may be able to remove some unneeded sections of the shared +library using the -R option to objcopy (e.g. the .comment section). + +Using these techniques it is possible to create a basic HTTP-only shared +libcurl library for i386 Linux platforms that is only 113 KiB in size, and an +FTP-only library that is 113 KiB in size (as of libcurl version 7.50.3, using +gcc 5.4.0). + +You may find that statically linking libcurl to your application will result +in a lower total size than dynamically linking. + +Note that the curl test harness can detect the use of some, but not all, of +the `--disable` statements suggested above. Use will cause tests relying on +those features to fail. The test harness can be manually forced to skip the +relevant tests by specifying certain key words on the `runtests.pl` command +line. Following is a list of appropriate key words: + + - `--disable-cookies` !cookies + - `--disable-manual` !--manual + - `--disable-proxy` !HTTP\ proxy !proxytunnel !SOCKS4 !SOCKS5 + +# PORTS + +This is a probably incomplete list of known hardware and operating systems +that curl has been compiled for. If you know a system curl compiles and +runs on, that isn't listed, please let us know! + + - Alpha DEC OSF 4 + - Alpha Digital UNIX v3.2 + - Alpha FreeBSD 4.1, 4.5 + - Alpha Linux 2.2, 2.4 + - Alpha NetBSD 1.5.2 + - Alpha OpenBSD 3.0 + - Alpha OpenVMS V7.1-1H2 + - Alpha Tru64 v5.0 5.1 + - AVR32 Linux + - ARM Android 1.5, 2.1, 2.3, 3.2, 4.x + - ARM INTEGRITY + - ARM iOS + - Cell Linux + - Cell Cell OS + - HP-PA HP-UX 9.X 10.X 11.X + - HP-PA Linux + - HP3000 MPE/iX + - MicroBlaze uClinux + - MIPS IRIX 6.2, 6.5 + - MIPS Linux + - OS/400 + - Pocket PC/Win CE 3.0 + - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2 + - PowerPC Darwin 1.0 + - PowerPC INTEGRITY + - PowerPC Linux + - PowerPC Mac OS 9 + - PowerPC Mac OS X + - SH4 Linux 2.6.X + - SH4 OS21 + - SINIX-Z v5 + - Sparc Linux + - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 + - Sparc SunOS 4.1.X + - StrongARM (and other ARM) RISC OS 3.1, 4.02 + - StrongARM/ARM7/ARM9 Linux 2.4, 2.6 + - StrongARM NetBSD 1.4.1 + - Symbian OS (P.I.P.S.) 9.x + - TPF + - Ultrix 4.3a + - UNICOS 9.0 + - i386 BeOS + - i386 DOS + - i386 eCos 1.3.1 + - i386 Esix 4.1 + - i386 FreeBSD + - i386 HURD + - i386 Haiku OS + - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 + - i386 Mac OS X + - i386 MINIX 3.1 + - i386 NetBSD + - i386 Novell NetWare + - i386 OS/2 + - i386 OpenBSD + - i386 QNX 6 + - i386 SCO unix + - i386 Solaris 2.7 + - i386 Windows 95, 98, ME, NT, 2000, XP, 2003 + - i486 ncr-sysv4.3.03 (NCR MP-RAS) + - ia64 Linux 2.3.99 + - m68k AmigaOS 3 + - m68k Linux + - m68k uClinux + - m68k OpenBSD + - m88k dg-dgux5.4R3.00 + - s390 Linux + - x86_64 Linux + - XScale/PXA250 Linux 2.4 + - Nios II uClinux diff --git a/bin/curl/docs/INSTALL.txt b/bin/curl/docs/INSTALL.txt new file mode 100644 index 00000000..ff260b1b --- /dev/null +++ b/bin/curl/docs/INSTALL.txt @@ -0,0 +1,9 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + How To Compile + +see INSTALL.md diff --git a/bin/curl/docs/INTERNALS.md b/bin/curl/docs/INTERNALS.md new file mode 100644 index 00000000..1563ec51 --- /dev/null +++ b/bin/curl/docs/INTERNALS.md @@ -0,0 +1,1100 @@ +curl internals +============== + + - [Intro](#intro) + - [git](#git) + - [Portability](#Portability) + - [Windows vs Unix](#winvsunix) + - [Library](#Library) + - [`Curl_connect`](#Curl_connect) + - [`multi_do`](#multi_do) + - [`Curl_readwrite`](#Curl_readwrite) + - [`multi_done`](#multi_done) + - [`Curl_disconnect`](#Curl_disconnect) + - [HTTP(S)](#http) + - [FTP](#ftp) + - [Kerberos](#kerberos) + - [TELNET](#telnet) + - [FILE](#file) + - [SMB](#smb) + - [LDAP](#ldap) + - [E-mail](#email) + - [General](#general) + - [Persistent Connections](#persistent) + - [multi interface/non-blocking](#multi) + - [SSL libraries](#ssl) + - [Library Symbols](#symbols) + - [Return Codes and Informationals](#returncodes) + - [AP/ABI](#abi) + - [Client](#client) + - [Memory Debugging](#memorydebug) + - [Test Suite](#test) + - [Asynchronous name resolves](#asyncdns) + - [c-ares](#cares) + - [`curl_off_t`](#curl_off_t) + - [curlx](#curlx) + - [Content Encoding](#contentencoding) + - [`hostip.c` explained](#hostip) + - [Track Down Memory Leaks](#memoryleak) + - [`multi_socket`](#multi_socket) + - [Structs in libcurl](#structs) + - [Curl_easy](#Curl_easy) + - [connectdata](#connectdata) + - [Curl_multi](#Curl_multi) + - [Curl_handler](#Curl_handler) + - [conncache](#conncache) + - [Curl_share](#Curl_share) + - [CookieInfo](#CookieInfo) + + +Intro +===== + + This project is split in two. The library and the client. The client part + uses the library, but the library is designed to allow other applications to + use it. + + The largest amount of code and complexity is in the library part. + + + +git +=== + + All changes to the sources are committed to the git repository as soon as + they're somewhat verified to work. Changes shall be committed as independently + as possible so that individual changes can be easily spotted and tracked + afterwards. + + Tagging shall be used extensively, and by the time we release new archives we + should tag the sources with a name similar to the released version number. + + +Portability +=========== + + We write curl and libcurl to compile with C89 compilers. On 32-bit and up + machines. Most of libcurl assumes more or less POSIX compliance but that's + not a requirement. + + We write libcurl to build and work with lots of third party tools, and we + want it to remain functional and buildable with these and later versions + (older versions may still work but is not what we work hard to maintain): + +Dependencies +------------ + + - OpenSSL 0.9.7 + - GnuTLS 2.11.3 + - zlib 1.1.4 + - libssh2 0.16 + - c-ares 1.6.0 + - libidn2 2.0.0 + - cyassl 2.0.0 + - openldap 2.0 + - MIT Kerberos 1.2.4 + - GSKit V5R3M0 + - NSS 3.14.x + - PolarSSL 1.3.0 + - Heimdal ? + - nghttp2 1.0.0 + +Operating Systems +----------------- + + On systems where configure runs, we aim at working on them all - if they have + a suitable C compiler. On systems that don't run configure, we strive to keep + curl running correctly on: + + - Windows 98 + - AS/400 V5R3M0 + - Symbian 9.1 + - Windows CE ? + - TPF ? + +Build tools +----------- + + When writing code (mostly for generating stuff included in release tarballs) + we use a few "build tools" and we make sure that we remain functional with + these versions: + + - GNU Libtool 1.4.2 + - GNU Autoconf 2.57 + - GNU Automake 1.7 + - GNU M4 1.4 + - perl 5.004 + - roffit 0.5 + - groff ? (any version that supports `groff -Tps -man [in] [out]`) + - ps2pdf (gs) ? + + +Windows vs Unix +=============== + + There are a few differences in how to program curl the Unix way compared to + the Windows way. Perhaps the four most notable details are: + + 1. Different function names for socket operations. + + In curl, this is solved with defines and macros, so that the source looks + the same in all places except for the header file that defines them. The + macros in use are `sclose()`, `sread()` and `swrite()`. + + 2. Windows requires a couple of init calls for the socket stuff. + + That's taken care of by the `curl_global_init()` call, but if other libs + also do it etc there might be reasons for applications to alter that + behaviour. + + 3. The file descriptors for network communication and file operations are + not as easily interchangeable as in Unix. + + We avoid this by not trying any funny tricks on file descriptors. + + 4. When writing data to stdout, Windows makes end-of-lines the DOS way, thus + destroying binary data, although you do want that conversion if it is + text coming through... (sigh) + + We set stdout to binary under windows + + Inside the source code, We make an effort to avoid `#ifdef [Your OS]`. All + conditionals that deal with features *should* instead be in the format + `#ifdef HAVE_THAT_WEIRD_FUNCTION`. Since Windows can't run configure scripts, + we maintain a `curl_config-win32.h` file in lib directory that is supposed to + look exactly like a `curl_config.h` file would have looked like on a Windows + machine! + + Generally speaking: always remember that this will be compiled on dozens of + operating systems. Don't walk on the edge! + + +Library +======= + + (See [Structs in libcurl](#structs) for the separate section describing all + major internal structs and their purposes.) + + There are plenty of entry points to the library, namely each publicly defined + function that libcurl offers to applications. All of those functions are + rather small and easy-to-follow. All the ones prefixed with `curl_easy` are + put in the `lib/easy.c` file. + + `curl_global_init()` and `curl_global_cleanup()` should be called by the + application to initialize and clean up global stuff in the library. As of + today, it can handle the global SSL initing if SSL is enabled and it can init + the socket layer on windows machines. libcurl itself has no "global" scope. + + All printf()-style functions use the supplied clones in `lib/mprintf.c`. This + makes sure we stay absolutely platform independent. + + [ `curl_easy_init()`][2] allocates an internal struct and makes some + initializations. The returned handle does not reveal internals. This is the + `Curl_easy` struct which works as an "anchor" struct for all `curl_easy` + functions. All connections performed will get connect-specific data allocated + that should be used for things related to particular connections/requests. + + [`curl_easy_setopt()`][1] takes three arguments, where the option stuff must + be passed in pairs: the parameter-ID and the parameter-value. The list of + options is documented in the man page. This function mainly sets things in + the `Curl_easy` struct. + + `curl_easy_perform()` is just a wrapper function that makes use of the multi + API. It basically calls `curl_multi_init()`, `curl_multi_add_handle()`, + `curl_multi_wait()`, and `curl_multi_perform()` until the transfer is done + and then returns. + + Some of the most important key functions in `url.c` are called from + `multi.c` when certain key steps are to be made in the transfer operation. + + +Curl_connect() +-------------- + + Analyzes the URL, it separates the different components and connects to the + remote host. This may involve using a proxy and/or using SSL. The + `Curl_resolv()` function in `lib/hostip.c` is used for looking up host + names (it does then use the proper underlying method, which may vary + between platforms and builds). + + When `Curl_connect` is done, we are connected to the remote site. Then it + is time to tell the server to get a document/file. `Curl_do()` arranges + this. + + This function makes sure there's an allocated and initiated `connectdata` + struct that is used for this particular connection only (although there may + be several requests performed on the same connect). A bunch of things are + inited/inherited from the `Curl_easy` struct. + + +multi_do() +--------- + + `multi_do()` makes sure the proper protocol-specific function is called. + The functions are named after the protocols they handle. + + The protocol-specific functions of course deal with protocol-specific + negotiations and setup. They have access to the `Curl_sendf()` (from + `lib/sendf.c`) function to send printf-style formatted data to the remote + host and when they're ready to make the actual file transfer they call the + `Curl_setup_transfer()` function (in `lib/transfer.c`) to setup the + transfer and returns. + + If this DO function fails and the connection is being re-used, libcurl will + then close this connection, setup a new connection and re-issue the DO + request on that. This is because there is no way to be perfectly sure that + we have discovered a dead connection before the DO function and thus we + might wrongly be re-using a connection that was closed by the remote peer. + + +Curl_readwrite() +---------------- + + Called during the transfer of the actual protocol payload. + + During transfer, the progress functions in `lib/progress.c` are called at + frequent intervals (or at the user's choice, a specified callback might get + called). The speedcheck functions in `lib/speedcheck.c` are also used to + verify that the transfer is as fast as required. + + +multi_done() +----------- + + Called after a transfer is done. This function takes care of everything + that has to be done after a transfer. This function attempts to leave + matters in a state so that `multi_do()` should be possible to call again on + the same connection (in a persistent connection case). It might also soon + be closed with `Curl_disconnect()`. + + +Curl_disconnect() +----------------- + + When doing normal connections and transfers, no one ever tries to close any + connections so this is not normally called when `curl_easy_perform()` is + used. This function is only used when we are certain that no more transfers + are going to be made on the connection. It can be also closed by force, or + it can be called to make sure that libcurl doesn't keep too many + connections alive at the same time. + + This function cleans up all resources that are associated with a single + connection. + + +HTTP(S) +======= + + HTTP offers a lot and is the protocol in curl that uses the most lines of + code. There is a special file `lib/formdata.c` that offers all the + multipart post functions. + + base64-functions for user+password stuff (and more) is in `lib/base64.c` + and all functions for parsing and sending cookies are found in + `lib/cookie.c`. + + HTTPS uses in almost every case the same procedure as HTTP, with only two + exceptions: the connect procedure is different and the function used to read + or write from the socket is different, although the latter fact is hidden in + the source by the use of `Curl_read()` for reading and `Curl_write()` for + writing data to the remote server. + + `http_chunks.c` contains functions that understands HTTP 1.1 chunked transfer + encoding. + + An interesting detail with the HTTP(S) request, is the `Curl_add_buffer()` + series of functions we use. They append data to one single buffer, and when + the building is finished the entire request is sent off in one single write. + This is done this way to overcome problems with flawed firewalls and lame + servers. + + +FTP +=== + + The `Curl_if2ip()` function can be used for getting the IP number of a + specified network interface, and it resides in `lib/if2ip.c`. + + `Curl_ftpsendf()` is used for sending FTP commands to the remote server. It + was made a separate function to prevent us programmers from forgetting that + they must be CRLF terminated. They must also be sent in one single `write()` + to make firewalls and similar happy. + + +Kerberos +======== + + Kerberos support is mainly in `lib/krb5.c` and `lib/security.c` but also + `curl_sasl_sspi.c` and `curl_sasl_gssapi.c` for the email protocols and + `socks_gssapi.c` and `socks_sspi.c` for SOCKS5 proxy specifics. + + +TELNET +====== + + Telnet is implemented in `lib/telnet.c`. + + +FILE +==== + + The `file://` protocol is dealt with in `lib/file.c`. + + +SMB +=== + + The `smb://` protocol is dealt with in `lib/smb.c`. + + +LDAP +==== + + Everything LDAP is in `lib/ldap.c` and `lib/openldap.c`. + + +E-mail +====== + + The e-mail related source code is in `lib/imap.c`, `lib/pop3.c` and + `lib/smtp.c`. + + +General +======= + + URL encoding and decoding, called escaping and unescaping in the source code, + is found in `lib/escape.c`. + + While transferring data in `Transfer()` a few functions might get used. + `curl_getdate()` in `lib/parsedate.c` is for HTTP date comparisons (and + more). + + `lib/getenv.c` offers `curl_getenv()` which is for reading environment + variables in a neat platform independent way. That's used in the client, but + also in `lib/url.c` when checking the proxy environment variables. Note that + contrary to the normal unix `getenv()`, this returns an allocated buffer that + must be `free()`ed after use. + + `lib/netrc.c` holds the `.netrc` parser. + + `lib/timeval.c` features replacement functions for systems that don't have + `gettimeofday()` and a few support functions for timeval conversions. + + A function named `curl_version()` that returns the full curl version string + is found in `lib/version.c`. + + +Persistent Connections +====================== + + The persistent connection support in libcurl requires some considerations on + how to do things inside of the library. + + - The `Curl_easy` struct returned in the [`curl_easy_init()`][2] call + must never hold connection-oriented data. It is meant to hold the root data + as well as all the options etc that the library-user may choose. + + - The `Curl_easy` struct holds the "connection cache" (an array of + pointers to `connectdata` structs). + + - This enables the 'curl handle' to be reused on subsequent transfers. + + - When libcurl is told to perform a transfer, it first checks for an already + existing connection in the cache that we can use. Otherwise it creates a + new one and adds that to the cache. If the cache is full already when a new + connection is added, it will first close the oldest unused one. + + - When the transfer operation is complete, the connection is left + open. Particular options may tell libcurl not to, and protocols may signal + closure on connections and then they won't be kept open, of course. + + - When `curl_easy_cleanup()` is called, we close all still opened connections, + unless of course the multi interface "owns" the connections. + + The curl handle must be re-used in order for the persistent connections to + work. + + +multi interface/non-blocking +============================ + + The multi interface is a non-blocking interface to the library. To make that + interface work as well as possible, no low-level functions within libcurl + must be written to work in a blocking manner. (There are still a few spots + violating this rule.) + + One of the primary reasons we introduced c-ares support was to allow the name + resolve phase to be perfectly non-blocking as well. + + The FTP and the SFTP/SCP protocols are examples of how we adapt and adjust + the code to allow non-blocking operations even on multi-stage command- + response protocols. They are built around state machines that return when + they would otherwise block waiting for data. The DICT, LDAP and TELNET + protocols are crappy examples and they are subject for rewrite in the future + to better fit the libcurl protocol family. + + +SSL libraries +============= + + Originally libcurl supported SSLeay for SSL/TLS transports, but that was then + extended to its successor OpenSSL but has since also been extended to several + other SSL/TLS libraries and we expect and hope to further extend the support + in future libcurl versions. + + To deal with this internally in the best way possible, we have a generic SSL + function API as provided by the `vtls/vtls.[ch]` system, and they are the only + SSL functions we must use from within libcurl. vtls is then crafted to use + the appropriate lower-level function calls to whatever SSL library that is in + use. For example `vtls/openssl.[ch]` for the OpenSSL library. + + +Library Symbols +=============== + + All symbols used internally in libcurl must use a `Curl_` prefix if they're + used in more than a single file. Single-file symbols must be made static. + Public ("exported") symbols must use a `curl_` prefix. (There are exceptions, + but they are to be changed to follow this pattern in future versions.) Public + API functions are marked with `CURL_EXTERN` in the public header files so + that all others can be hidden on platforms where this is possible. + + +Return Codes and Informationals +=============================== + + I've made things simple. Almost every function in libcurl returns a CURLcode, + that must be `CURLE_OK` if everything is OK or otherwise a suitable error + code as the `curl/curl.h` include file defines. The very spot that detects an + error must use the `Curl_failf()` function to set the human-readable error + description. + + In aiding the user to understand what's happening and to debug curl usage, we + must supply a fair number of informational messages by using the + `Curl_infof()` function. Those messages are only displayed when the user + explicitly asks for them. They are best used when revealing information that + isn't otherwise obvious. + + +API/ABI +======= + + We make an effort to not export or show internals or how internals work, as + that makes it easier to keep a solid API/ABI over time. See docs/libcurl/ABI + for our promise to users. + + +Client +====== + + `main()` resides in `src/tool_main.c`. + + `src/tool_hugehelp.c` is automatically generated by the `mkhelp.pl` perl + script to display the complete "manual" and the `src/tool_urlglob.c` file + holds the functions used for the URL-"globbing" support. Globbing in the + sense that the `{}` and `[]` expansion stuff is there. + + The client mostly sets up its `config` struct properly, then + it calls the `curl_easy_*()` functions of the library and when it gets back + control after the `curl_easy_perform()` it cleans up the library, checks + status and exits. + + When the operation is done, the `ourWriteOut()` function in `src/writeout.c` + may be called to report about the operation. That function is using the + `curl_easy_getinfo()` function to extract useful information from the curl + session. + + It may loop and do all this several times if many URLs were specified on the + command line or config file. + + +Memory Debugging +================ + + The file `lib/memdebug.c` contains debug-versions of a few functions. + Functions such as `malloc()`, `free()`, `fopen()`, `fclose()`, etc that + somehow deal with resources that might give us problems if we "leak" them. + The functions in the memdebug system do nothing fancy, they do their normal + function and then log information about what they just did. The logged data + can then be analyzed after a complete session, + + `memanalyze.pl` is the perl script present in `tests/` that analyzes a log + file generated by the memory tracking system. It detects if resources are + allocated but never freed and other kinds of errors related to resource + management. + + Internally, definition of preprocessor symbol `DEBUGBUILD` restricts code + which is only compiled for debug enabled builds. And symbol `CURLDEBUG` is + used to differentiate code which is _only_ used for memory + tracking/debugging. + + Use `-DCURLDEBUG` when compiling to enable memory debugging, this is also + switched on by running configure with `--enable-curldebug`. Use + `-DDEBUGBUILD` when compiling to enable a debug build or run configure with + `--enable-debug`. + + `curl --version` will list 'Debug' feature for debug enabled builds, and + will list 'TrackMemory' feature for curl debug memory tracking capable + builds. These features are independent and can be controlled when running + the configure script. When `--enable-debug` is given both features will be + enabled, unless some restriction prevents memory tracking from being used. + + +Test Suite +========== + + The test suite is placed in its own subdirectory directly off the root in the + curl archive tree, and it contains a bunch of scripts and a lot of test case + data. + + The main test script is `runtests.pl` that will invoke test servers like + `httpserver.pl` and `ftpserver.pl` before all the test cases are performed. + The test suite currently only runs on Unix-like platforms. + + You'll find a description of the test suite in the `tests/README` file, and + the test case data files in the `tests/FILEFORMAT` file. + + The test suite automatically detects if curl was built with the memory + debugging enabled, and if it was, it will detect memory leaks, too. + + +Asynchronous name resolves +========================== + + libcurl can be built to do name resolves asynchronously, using either the + normal resolver in a threaded manner or by using c-ares. + + +[c-ares][3] +------ + +### Build libcurl to use a c-ares + +1. ./configure --enable-ares=/path/to/ares/install +2. make + +### c-ares on win32 + + First I compiled c-ares. I changed the default C runtime library to be the + single-threaded rather than the multi-threaded (this seems to be required to + prevent linking errors later on). Then I simply build the areslib project + (the other projects adig/ahost seem to fail under MSVC). + + Next was libcurl. I opened `lib/config-win32.h` and I added a: + `#define USE_ARES 1` + + Next thing I did was I added the path for the ares includes to the include + path, and the libares.lib to the libraries. + + Lastly, I also changed libcurl to be single-threaded rather than + multi-threaded, again this was to prevent some duplicate symbol errors. I'm + not sure why I needed to change everything to single-threaded, but when I + didn't I got redefinition errors for several CRT functions (`malloc()`, + `stricmp()`, etc.) + + +`curl_off_t` +========== + + `curl_off_t` is a data type provided by the external libcurl include + headers. It is the type meant to be used for the [`curl_easy_setopt()`][1] + options that end with LARGE. The type is 64-bit large on most modern + platforms. + + +curlx +===== + + The libcurl source code offers a few functions by source only. They are not + part of the official libcurl API, but the source files might be useful for + others so apps can optionally compile/build with these sources to gain + additional functions. + + We provide them through a single header file for easy access for apps: + `curlx.h` + +`curlx_strtoofft()` +------------------- + A macro that converts a string containing a number to a `curl_off_t` number. + This might use the `curlx_strtoll()` function which is provided as source + code in strtoofft.c. Note that the function is only provided if no + `strtoll()` (or equivalent) function exist on your platform. If `curl_off_t` + is only a 32-bit number on your platform, this macro uses `strtol()`. + +Future +------ + + Several functions will be removed from the public `curl_` name space in a + future libcurl release. They will then only become available as `curlx_` + functions instead. To make the transition easier, we already today provide + these functions with the `curlx_` prefix to allow sources to be built + properly with the new function names. The concerned functions are: + + - `curlx_getenv` + - `curlx_strequal` + - `curlx_strnequal` + - `curlx_mvsnprintf` + - `curlx_msnprintf` + - `curlx_maprintf` + - `curlx_mvaprintf` + - `curlx_msprintf` + - `curlx_mprintf` + - `curlx_mfprintf` + - `curlx_mvsprintf` + - `curlx_mvprintf` + - `curlx_mvfprintf` + + +Content Encoding +================ + +## About content encodings + + [HTTP/1.1][4] specifies that a client may request that a server encode its + response. This is usually used to compress a response using one (or more) + encodings from a set of commonly available compression techniques. These + schemes include `deflate` (the zlib algorithm), `gzip`, `br` (brotli) and + `compress`. A client requests that the server perform an encoding by including + an `Accept-Encoding` header in the request document. The value of the header + should be one of the recognized tokens `deflate`, ... (there's a way to + register new schemes/tokens, see sec 3.5 of the spec). A server MAY honor + the client's encoding request. When a response is encoded, the server + includes a `Content-Encoding` header in the response. The value of the + `Content-Encoding` header indicates which encodings were used to encode the + data, in the order in which they were applied. + + It's also possible for a client to attach priorities to different schemes so + that the server knows which it prefers. See sec 14.3 of RFC 2616 for more + information on the `Accept-Encoding` header. See sec + [3.1.2.2 of RFC 7231][15] for more information on the `Content-Encoding` + header. + +## Supported content encodings + + The `deflate`, `gzip` and `br` content encodings are supported by libcurl. + Both regular and chunked transfers work fine. The zlib library is required + for the `deflate` and `gzip` encodings, while the brotli decoding library is + for the `br` encoding. + +## The libcurl interface + + To cause libcurl to request a content encoding use: + + [`curl_easy_setopt`][1](curl, [`CURLOPT_ACCEPT_ENCODING`][5], string) + + where string is the intended value of the `Accept-Encoding` header. + + Currently, libcurl does support multiple encodings but only + understands how to process responses that use the `deflate`, `gzip` and/or + `br` content encodings, so the only values for [`CURLOPT_ACCEPT_ENCODING`][5] + that will work (besides `identity`, which does nothing) are `deflate`, + `gzip` and `br`. If a response is encoded using the `compress` or methods, + libcurl will return an error indicating that the response could + not be decoded. If `` is NULL no `Accept-Encoding` header is + generated. If `` is a zero-length string, then an `Accept-Encoding` + header containing all supported encodings will be generated. + + The [`CURLOPT_ACCEPT_ENCODING`][5] must be set to any non-NULL value for + content to be automatically decoded. If it is not set and the server still + sends encoded content (despite not having been asked), the data is returned + in its raw form and the `Content-Encoding` type is not checked. + +## The curl interface + + Use the [`--compressed`][6] option with curl to cause it to ask servers to + compress responses using any format supported by curl. + + +`hostip.c` explained +==================== + + The main compile-time defines to keep in mind when reading the `host*.c` + source file are these: + +## `CURLRES_IPV6` + + this host has `getaddrinfo()` and family, and thus we use that. The host may + not be able to resolve IPv6, but we don't really have to take that into + account. Hosts that aren't IPv6-enabled have `CURLRES_IPV4` defined. + +## `CURLRES_ARES` + + is defined if libcurl is built to use c-ares for asynchronous name + resolves. This can be Windows or \*nix. + +## `CURLRES_THREADED` + + is defined if libcurl is built to use threading for asynchronous name + resolves. The name resolve will be done in a new thread, and the supported + asynch API will be the same as for ares-builds. This is the default under + (native) Windows. + + If any of the two previous are defined, `CURLRES_ASYNCH` is defined too. If + libcurl is not built to use an asynchronous resolver, `CURLRES_SYNCH` is + defined. + +## `host*.c` sources + + The `host*.c` sources files are split up like this: + + - `hostip.c` - method-independent resolver functions and utility functions + - `hostasyn.c` - functions for asynchronous name resolves + - `hostsyn.c` - functions for synchronous name resolves + - `asyn-ares.c` - functions for asynchronous name resolves using c-ares + - `asyn-thread.c` - functions for asynchronous name resolves using threads + - `hostip4.c` - IPv4 specific functions + - `hostip6.c` - IPv6 specific functions + + The `hostip.h` is the single united header file for all this. It defines the + `CURLRES_*` defines based on the `config*.h` and `curl_setup.h` defines. + + +Track Down Memory Leaks +======================= + +## Single-threaded + + Please note that this memory leak system is not adjusted to work in more + than one thread. If you want/need to use it in a multi-threaded app. Please + adjust accordingly. + +## Build + + Rebuild libcurl with `-DCURLDEBUG` (usually, rerunning configure with + `--enable-debug` fixes this). `make clean` first, then `make` so that all + files are actually rebuilt properly. It will also make sense to build + libcurl with the debug option (usually `-g` to the compiler) so that + debugging it will be easier if you actually do find a leak in the library. + + This will create a library that has memory debugging enabled. + +## Modify Your Application + + Add a line in your application code: + + `curl_memdebug("dump");` + + This will make the malloc debug system output a full trace of all resource + using functions to the given file name. Make sure you rebuild your program + and that you link with the same libcurl you built for this purpose as + described above. + +## Run Your Application + + Run your program as usual. Watch the specified memory trace file grow. + + Make your program exit and use the proper libcurl cleanup functions etc. So + that all non-leaks are returned/freed properly. + +## Analyze the Flow + + Use the `tests/memanalyze.pl` perl script to analyze the dump file: + + tests/memanalyze.pl dump + + This now outputs a report on what resources that were allocated but never + freed etc. This report is very fine for posting to the list! + + If this doesn't produce any output, no leak was detected in libcurl. Then + the leak is mostly likely to be in your code. + + +`multi_socket` +============== + + Implementation of the `curl_multi_socket` API + + The main ideas of this API are simply: + + 1. The application can use whatever event system it likes as it gets info + from libcurl about what file descriptors libcurl waits for what action + on. (The previous API returns `fd_sets` which is very + `select()`-centric). + + 2. When the application discovers action on a single socket, it calls + libcurl and informs that there was action on this particular socket and + libcurl can then act on that socket/transfer only and not care about + any other transfers. (The previous API always had to scan through all + the existing transfers.) + + The idea is that [`curl_multi_socket_action()`][7] calls a given callback + with information about what socket to wait for what action on, and the + callback only gets called if the status of that socket has changed. + + We also added a timer callback that makes libcurl call the application when + the timeout value changes, and you set that with [`curl_multi_setopt()`][9] + and the [`CURLMOPT_TIMERFUNCTION`][10] option. To get this to work, + Internally, there's an added struct to each easy handle in which we store + an "expire time" (if any). The structs are then "splay sorted" so that we + can add and remove times from the linked list and yet somewhat swiftly + figure out both how long there is until the next nearest timer expires + and which timer (handle) we should take care of now. Of course, the upside + of all this is that we get a [`curl_multi_timeout()`][8] that should also + work with old-style applications that use [`curl_multi_perform()`][11]. + + We created an internal "socket to easy handles" hash table that given + a socket (file descriptor) returns the easy handle that waits for action on + that socket. This hash is made using the already existing hash code + (previously only used for the DNS cache). + + To make libcurl able to report plain sockets in the socket callback, we had + to re-organize the internals of the [`curl_multi_fdset()`][12] etc so that + the conversion from sockets to `fd_sets` for that function is only done in + the last step before the data is returned. I also had to extend c-ares to + get a function that can return plain sockets, as that library too returned + only `fd_sets` and that is no longer good enough. The changes done to c-ares + are available in c-ares 1.3.1 and later. + + +Structs in libcurl +================== + +This section should cover 7.32.0 pretty accurately, but will make sense even +for older and later versions as things don't change drastically that often. + + +## Curl_easy + + The `Curl_easy` struct is the one returned to the outside in the external API + as a `CURL *`. This is usually known as an easy handle in API documentations + and examples. + + Information and state that is related to the actual connection is in the + `connectdata` struct. When a transfer is about to be made, libcurl will + either create a new connection or re-use an existing one. The particular + connectdata that is used by this handle is pointed out by + `Curl_easy->easy_conn`. + + Data and information that regard this particular single transfer is put in + the `SingleRequest` sub-struct. + + When the `Curl_easy` struct is added to a multi handle, as it must be in + order to do any transfer, the `->multi` member will point to the `Curl_multi` + struct it belongs to. The `->prev` and `->next` members will then be used by + the multi code to keep a linked list of `Curl_easy` structs that are added to + that same multi handle. libcurl always uses multi so `->multi` *will* point + to a `Curl_multi` when a transfer is in progress. + + `->mstate` is the multi state of this particular `Curl_easy`. When + `multi_runsingle()` is called, it will act on this handle according to which + state it is in. The mstate is also what tells which sockets to return for a + specific `Curl_easy` when [`curl_multi_fdset()`][12] is called etc. + + The libcurl source code generally use the name `data` for the variable that + points to the `Curl_easy`. + + When doing multiplexed HTTP/2 transfers, each `Curl_easy` is associated with + an individual stream, sharing the same connectdata struct. Multiplexing + makes it even more important to keep things associated with the right thing! + + +## connectdata + + A general idea in libcurl is to keep connections around in a connection + "cache" after they have been used in case they will be used again and then + re-use an existing one instead of creating a new as it creates a significant + performance boost. + + Each `connectdata` identifies a single physical connection to a server. If + the connection can't be kept alive, the connection will be closed after use + and then this struct can be removed from the cache and freed. + + Thus, the same `Curl_easy` can be used multiple times and each time select + another `connectdata` struct to use for the connection. Keep this in mind, + as it is then important to consider if options or choices are based on the + connection or the `Curl_easy`. + + Functions in libcurl will assume that `connectdata->data` points to the + `Curl_easy` that uses this connection (for the moment). + + As a special complexity, some protocols supported by libcurl require a + special disconnect procedure that is more than just shutting down the + socket. It can involve sending one or more commands to the server before + doing so. Since connections are kept in the connection cache after use, the + original `Curl_easy` may no longer be around when the time comes to shut down + a particular connection. For this purpose, libcurl holds a special dummy + `closure_handle` `Curl_easy` in the `Curl_multi` struct to use when needed. + + FTP uses two TCP connections for a typical transfer but it keeps both in + this single struct and thus can be considered a single connection for most + internal concerns. + + The libcurl source code generally use the name `conn` for the variable that + points to the connectdata. + + +## Curl_multi + + Internally, the easy interface is implemented as a wrapper around multi + interface functions. This makes everything multi interface. + + `Curl_multi` is the multi handle struct exposed as `CURLM *` in external + APIs. + + This struct holds a list of `Curl_easy` structs that have been added to this + handle with [`curl_multi_add_handle()`][13]. The start of the list is + `->easyp` and `->num_easy` is a counter of added `Curl_easy`s. + + `->msglist` is a linked list of messages to send back when + [`curl_multi_info_read()`][14] is called. Basically a node is added to that + list when an individual `Curl_easy`'s transfer has completed. + + `->hostcache` points to the name cache. It is a hash table for looking up + name to IP. The nodes have a limited life time in there and this cache is + meant to reduce the time for when the same name is wanted within a short + period of time. + + `->timetree` points to a tree of `Curl_easy`s, sorted by the remaining time + until it should be checked - normally some sort of timeout. Each `Curl_easy` + has one node in the tree. + + `->sockhash` is a hash table to allow fast lookups of socket descriptor for + which `Curl_easy` uses that descriptor. This is necessary for the + `multi_socket` API. + + `->conn_cache` points to the connection cache. It keeps track of all + connections that are kept after use. The cache has a maximum size. + + `->closure_handle` is described in the `connectdata` section. + + The libcurl source code generally use the name `multi` for the variable that + points to the `Curl_multi` struct. + + +## Curl_handler + + Each unique protocol that is supported by libcurl needs to provide at least + one `Curl_handler` struct. It defines what the protocol is called and what + functions the main code should call to deal with protocol specific issues. + In general, there's a source file named `[protocol].c` in which there's a + `struct Curl_handler Curl_handler_[protocol]` declared. In `url.c` there's + then the main array with all individual `Curl_handler` structs pointed to + from a single array which is scanned through when a URL is given to libcurl + to work with. + + `->scheme` is the URL scheme name, usually spelled out in uppercase. That's + "HTTP" or "FTP" etc. SSL versions of the protocol need their own + `Curl_handler` setup so HTTPS separate from HTTP. + + `->setup_connection` is called to allow the protocol code to allocate + protocol specific data that then gets associated with that `Curl_easy` for + the rest of this transfer. It gets freed again at the end of the transfer. + It will be called before the `connectdata` for the transfer has been + selected/created. Most protocols will allocate its private + `struct [PROTOCOL]` here and assign `Curl_easy->req.protop` to point to it. + + `->connect_it` allows a protocol to do some specific actions after the TCP + connect is done, that can still be considered part of the connection phase. + + Some protocols will alter the `connectdata->recv[]` and + `connectdata->send[]` function pointers in this function. + + `->connecting` is similarly a function that keeps getting called as long as + the protocol considers itself still in the connecting phase. + + `->do_it` is the function called to issue the transfer request. What we call + the DO action internally. If the DO is not enough and things need to be kept + getting done for the entire DO sequence to complete, `->doing` is then + usually also provided. Each protocol that needs to do multiple commands or + similar for do/doing need to implement their own state machines (see SCP, + SFTP, FTP). Some protocols (only FTP and only due to historical reasons) has + a separate piece of the DO state called `DO_MORE`. + + `->doing` keeps getting called while issuing the transfer request command(s) + + `->done` gets called when the transfer is complete and DONE. That's after the + main data has been transferred. + + `->do_more` gets called during the `DO_MORE` state. The FTP protocol uses + this state when setting up the second connection. + + `->proto_getsock` + `->doing_getsock` + `->domore_getsock` + `->perform_getsock` + Functions that return socket information. Which socket(s) to wait for which + action(s) during the particular multi state. + + `->disconnect` is called immediately before the TCP connection is shutdown. + + `->readwrite` gets called during transfer to allow the protocol to do extra + reads/writes + + `->defport` is the default report TCP or UDP port this protocol uses + + `->protocol` is one or more bits in the `CURLPROTO_*` set. The SSL versions + have their "base" protocol set and then the SSL variation. Like + "HTTP|HTTPS". + + `->flags` is a bitmask with additional information about the protocol that will + make it get treated differently by the generic engine: + + - `PROTOPT_SSL` - will make it connect and negotiate SSL + + - `PROTOPT_DUAL` - this protocol uses two connections + + - `PROTOPT_CLOSEACTION` - this protocol has actions to do before closing the + connection. This flag is no longer used by code, yet still set for a bunch + of protocol handlers. + + - `PROTOPT_DIRLOCK` - "direction lock". The SSH protocols set this bit to + limit which "direction" of socket actions that the main engine will + concern itself with. + + - `PROTOPT_NONETWORK` - a protocol that doesn't use network (read `file:`) + + - `PROTOPT_NEEDSPWD` - this protocol needs a password and will use a default + one unless one is provided + + - `PROTOPT_NOURLQUERY` - this protocol can't handle a query part on the URL + (?foo=bar) + + +## conncache + + Is a hash table with connections for later re-use. Each `Curl_easy` has a + pointer to its connection cache. Each multi handle sets up a connection + cache that all added `Curl_easy`s share by default. + + +## Curl_share + + The libcurl share API allocates a `Curl_share` struct, exposed to the + external API as `CURLSH *`. + + The idea is that the struct can have a set of its own versions of caches and + pools and then by providing this struct in the `CURLOPT_SHARE` option, those + specific `Curl_easy`s will use the caches/pools that this share handle + holds. + + Then individual `Curl_easy` structs can be made to share specific things + that they otherwise wouldn't, such as cookies. + + The `Curl_share` struct can currently hold cookies, DNS cache and the SSL + session cache. + + +## CookieInfo + + This is the main cookie struct. It holds all known cookies and related + information. Each `Curl_easy` has its own private `CookieInfo` even when + they are added to a multi handle. They can be made to share cookies by using + the share API. + + +[1]: https://curl.haxx.se/libcurl/c/curl_easy_setopt.html +[2]: https://curl.haxx.se/libcurl/c/curl_easy_init.html +[3]: https://c-ares.haxx.se/ +[4]: https://tools.ietf.org/html/rfc7230 "RFC 7230" +[5]: https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html +[6]: https://curl.haxx.se/docs/manpage.html#--compressed +[7]: https://curl.haxx.se/libcurl/c/curl_multi_socket_action.html +[8]: https://curl.haxx.se/libcurl/c/curl_multi_timeout.html +[9]: https://curl.haxx.se/libcurl/c/curl_multi_setopt.html +[10]: https://curl.haxx.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html +[11]: https://curl.haxx.se/libcurl/c/curl_multi_perform.html +[12]: https://curl.haxx.se/libcurl/c/curl_multi_fdset.html +[13]: https://curl.haxx.se/libcurl/c/curl_multi_add_handle.html +[14]: https://curl.haxx.se/libcurl/c/curl_multi_info_read.html +[15]: https://tools.ietf.org/html/rfc7231#section-3.1.2.2 diff --git a/bin/curl/docs/KNOWN_BUGS.txt b/bin/curl/docs/KNOWN_BUGS.txt new file mode 100644 index 00000000..8431baaf --- /dev/null +++ b/bin/curl/docs/KNOWN_BUGS.txt @@ -0,0 +1,759 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + Known Bugs + +These are problems and bugs known to exist at the time of this release. Feel +free to join in and help us correct one or more of these! Also be sure to +check the changelog of the current development status, as one or more of these +problems may have been fixed or changed somewhat since this was written! + + 1. HTTP + 1.1 CURLFORM_CONTENTLEN in an array + 1.2 Disabling HTTP Pipelining + 1.3 STARTTRANSFER time is wrong for HTTP POSTs + 1.4 multipart formposts file name encoding + 1.5 Expect-100 meets 417 + 1.6 Unnecessary close when 401 received waiting for 100 + 1.7 Deflate error after all content was received + 1.8 DoH isn't used for all name resolves when enabled + 1.9 HTTP/2 frames while in the connection pool kill reuse + 1.10 Strips trailing dot from host name + 1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM + + 2. TLS + 2.1 CURLINFO_SSL_VERIFYRESULT has limited support + 2.2 DER in keychain + 2.3 GnuTLS backend skips really long certificate fields + 2.4 DarwinSSL won't import PKCS#12 client certificates without a password + 2.5 Client cert handling with Issuer DN differs between backends + 2.6 CURL_GLOBAL_SSL + 2.7 Client cert (MTLS) issues with Schannel + + 3. Email protocols + 3.1 IMAP SEARCH ALL truncated response + 3.2 No disconnect command + 3.3 SMTP to multiple recipients + 3.4 POP3 expects "CRLF.CRLF" eob for some single-line responses + + 4. Command line + 4.1 -J and -O with %-encoded file names + 4.2 -J with -C - fails + 4.3 --retry and transfer timeouts + 4.4 --upload-file . hang if delay in STDIN + 4.5 Improve --data-urlencode space encoding + + 5. Build and portability issues + 5.2 curl-config --libs contains private details + 5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10 + 5.4 Cannot compile against a static build of OpenLDAP + 5.5 can't handle Unicode arguments in Windows + 5.6 cmake support gaps + 5.7 Visual Studio project gaps + 5.8 configure finding libs in wrong directory + 5.9 Utilize Requires.private directives in libcurl.pc + + 6. Authentication + 6.1 NTLM authentication and unicode + 6.2 MIT Kerberos for Windows build + 6.3 NTLM in system context uses wrong name + 6.4 Negotiate and Kerberos V5 need a fake user name + 6.5 NTLM doesn't support password with § character + 6.6 libcurl can fail to try alternatives with --proxy-any + + 7. FTP + 7.1 FTP without or slow 220 response + 7.2 FTP with CONNECT and slow server + 7.3 FTP with NOBODY and FAILONERROR + 7.4 FTP with ACCT + 7.5 ASCII FTP + 7.6 FTP with NULs in URL parts + 7.7 FTP and empty path parts in the URL + 7.8 Premature transfer end but healthy control channel + 7.9 Passive transfer tries only one IP address + 7.10 Stick to same family over SOCKS proxy + + 8. TELNET + 8.1 TELNET and time limitations don't work + 8.2 Microsoft telnet server + + 9. SFTP and SCP + 9.1 SFTP doesn't do CURLOPT_POSTQUOTE correct + + 10. SOCKS + 10.1 SOCKS proxy connections are done blocking + 10.2 SOCKS don't support timeouts + 10.3 FTPS over SOCKS + 10.4 active FTP over a SOCKS + + 11. Internals + 11.1 Curl leaks .onion hostnames in DNS + 11.2 error buffer not set if connection to multiple addresses fails + 11.3 c-ares deviates from stock resolver on http://1346569778 + 11.4 HTTP test server 'connection-monitor' problems + 11.5 Connection information when using TCP Fast Open + 11.6 slow connect to localhost on Windows + + 12. LDAP and OpenLDAP + 12.1 OpenLDAP hangs after returning results + + 13. TCP/IP + 13.1 --interface for ipv6 binds to unusable IP address + + 14 DICT + 14.1 DICT responses show the underlying protocol + +============================================================================== + +1. HTTP + +1.1 CURLFORM_CONTENTLEN in an array + + It is not possible to pass a 64-bit value using CURLFORM_CONTENTLEN with + CURLFORM_ARRAY, when compiled on 32-bit platforms that support 64-bit + integers. This is because the underlying structure 'curl_forms' uses a dual + purpose char* for storing these values in via casting. For more information + see the now closed related issue: + https://github.com/curl/curl/issues/608 + +1.2 Disabling HTTP Pipelining + + Disabling HTTP Pipelining when there are ongoing transfers can lead to + heap corruption and crash. https://curl.haxx.se/bug/view.cgi?id=1411 + + Similarly, removing a handle when pipelining corrupts data: + https://github.com/curl/curl/issues/2101 + +1.3 STARTTRANSFER time is wrong for HTTP POSTs + + Wrong STARTTRANSFER timer accounting for POST requests Timer works fine with + GET requests, but while using POST the time for CURLINFO_STARTTRANSFER_TIME + is wrong. While using POST CURLINFO_STARTTRANSFER_TIME minus + CURLINFO_PRETRANSFER_TIME is near to zero every time. + + https://github.com/curl/curl/issues/218 + https://curl.haxx.se/bug/view.cgi?id=1213 + +1.4 multipart formposts file name encoding + + When creating multipart formposts. The file name part can be encoded with + something beyond ascii but currently libcurl will only pass in the verbatim + string the app provides. There are several browsers that already do this + encoding. The key seems to be the updated draft to RFC2231: + https://tools.ietf.org/html/draft-reschke-rfc2231-in-http-02 + +1.5 Expect-100 meets 417 + + If an upload using Expect: 100-continue receives an HTTP 417 response, it + ought to be automatically resent without the Expect:. A workaround is for + the client application to redo the transfer after disabling Expect:. + https://curl.haxx.se/mail/archive-2008-02/0043.html + +1.6 Unnecessary close when 401 received waiting for 100 + + libcurl closes the connection if an HTTP 401 reply is received while it is + waiting for the the 100-continue response. + https://curl.haxx.se/mail/lib-2008-08/0462.html + +1.7 Deflate error after all content was received + + There's a situation where we can get an error in a HTTP response that is + compressed, when that error is detected after all the actual body contents + have been received and delivered to the application. This is tricky, but is + ultimately a broken server. + + See https://github.com/curl/curl/issues/2719 + +1.8 DoH isn't used for all name resolves when enabled + + Even if DoH is specified to be used, there are some name resolves that are + done without it. This should be fixed. When the internal function + `Curl_resolver_wait_resolv()` is called, it doesn't use DoH to complete the + resolve as it otherwise should. + + See https://github.com/curl/curl/pull/3857 and + https://github.com/curl/curl/pull/3850 + +1.9 HTTP/2 frames while in the connection pool kill reuse + + If the server sends HTTP/2 frames (like for example an HTTP/2 PING frame) to + curl while the connection is held in curl's connection pool, the socket will + be found readable when considered for reuse and that makes curl think it is + dead and then it will be closed and a new connection gets created instead. + + This is *best* fixed by adding monitoring to connections while they are kept + in the pool so that pings can be responded to appropriately. + +1.10 Strips trailing dot from host name + + When given a URL with a trailing dot for the host name part: + "https://example.com./", libcurl will strip off the dot and use the name + without a dot internally and send it dot-less in HTTP Host: headers and in + the TLS SNI field. For the purpose of resolving the name to an address + the hostname is used as is without any change. + + The HTTP part violates RFC 7230 section 5.4 but the SNI part is accordance + with RFC 6066 section 3. + + URLs using these trailing dots are very rare in the wild and we have not seen + or gotten any real-world problems with such URLs reported. The popular + browsers seem to have stayed with not stripping the dot for both uses (thus + they violate RFC 6066 instead of RFC 7230). + + Daniel took the discussion to the HTTPbis mailing list in March 2016: + https://lists.w3.org/Archives/Public/ietf-http-wg/2016JanMar/0430.html but + there was not major rush or interest to fix this. The impression I get is + that most HTTP people rather not rock the boat now and instead prioritize web + compatibility rather than to strictly adhere to these RFCs. + + Our current approach allows a knowing client to send a custom HTTP header + with the dot added. + + In a few cases there is a difference in name resolving to IP addresses with + a trailing dot, but it can be noted that many HTTP servers will not happily + accept the trailing dot there unless that has been specifically configured + to be a fine virtual host. + + If URLs with trailing dots for host names become more popular or even just + used more than for just plain fun experiments, I'm sure we will have reason + to go back and reconsider. + + See https://github.com/curl/curl/issues/716 for the discussion. + +1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM + + I'm using libcurl to POST form data using a FILE* with the CURLFORM_STREAM + option of curl_formadd(). I've noticed that if the connection drops at just + the right time, the POST is reattempted without the data from the file. It + seems like the file stream position isn't getting reset to the beginning of + the file. I found the CURLOPT_SEEKFUNCTION option and set that with a + function that performs an fseek() on the FILE*. However, setting that didn't + seem to fix the issue or even get called. See + https://github.com/curl/curl/issues/768 + + +2. TLS + +2.1 CURLINFO_SSL_VERIFYRESULT has limited support + + CURLINFO_SSL_VERIFYRESULT is only implemented for the OpenSSL and NSS + backends, so relying on this information in a generic app is flaky. + +2.2 DER in keychain + + Curl doesn't recognize certificates in DER format in keychain, but it works + with PEM. https://curl.haxx.se/bug/view.cgi?id=1065 + +2.3 GnuTLS backend skips really long certificate fields + + libcurl calls gnutls_x509_crt_get_dn() with a fixed buffer size and if the + field is too long in the cert, it'll just return an error and the field will + be displayed blank. + +2.4 DarwinSSL won't import PKCS#12 client certificates without a password + + libcurl calls SecPKCS12Import with the PKCS#12 client certificate, but that + function rejects certificates that do not have a password. + https://github.com/curl/curl/issues/1308 + +2.5 Client cert handling with Issuer DN differs between backends + + When the specified client certificate doesn't match any of the + server-specified DNs, the OpenSSL and GnuTLS backends behave differently. + The github discussion may contain a solution. + + See https://github.com/curl/curl/issues/1411 + +2.6 CURL_GLOBAL_SSL + + Since libcurl 7.57.0, the flag CURL_GLOBAL_SSL is a no-op. The change was + merged in https://github.com/curl/curl/commit/d661b0afb571a + + It was removed since it was + + A) never clear for applications on how to deal with init in the light of + different SSL backends (the option was added back in the days when life + was simpler) + + B) multissl introduced dynamic switching between SSL backends which + emphasized (A) even more + + C) libcurl uses some TLS backend functionality even for non-TLS functions (to + get "good" random) so applications trying to avoid the init for + performance reasons would do wrong anyway + + D) never very carefully documented so all this mostly just happened to work + for some users + + However, in spite of the problems with the feature, there were some users who + apparently depended on this feature and who now claim libcurl is broken for + them. The fix for this situation is not obvious as a downright revert of the + patch is totally ruled out due to those reasons above. + + https://github.com/curl/curl/issues/2276 + +2.7 Client cert (MTLS) issues with Schannel + + See https://github.com/curl/curl/issues/3145 + + +3. Email protocols + +3.1 IMAP SEARCH ALL truncated response + + IMAP "SEARCH ALL" truncates output on large boxes. "A quick search of the + code reveals that pingpong.c contains some truncation code, at line 408, when + it deems the server response to be too large truncating it to 40 characters" + https://curl.haxx.se/bug/view.cgi?id=1366 + +3.2 No disconnect command + + The disconnect commands (LOGOUT and QUIT) may not be sent by IMAP, POP3 and + SMTP if a failure occurs during the authentication phase of a connection. + +3.3 SMTP to multiple recipients + + When sending data to multiple recipients, curl will abort and return failure + if one of the recipients indicate failure (on the "RCPT TO" + command). Ordinary mail programs would proceed and still send to the ones + that can receive data. This is subject for change in the future. + https://curl.haxx.se/bug/view.cgi?id=1116 + +3.4 POP3 expects "CRLF.CRLF" eob for some single-line responses + + You have to tell libcurl not to expect a body, when dealing with one line + response commands. Please see the POP3 examples and test cases which show + this for the NOOP and DELE commands. https://curl.haxx.se/bug/?i=740 + + +4. Command line + +4.1 -J and -O with %-encoded file names + + -J/--remote-header-name doesn't decode %-encoded file names. RFC6266 details + how it should be done. The can of worm is basically that we have no charset + handling in curl and ascii >=128 is a challenge for us. Not to mention that + decoding also means that we need to check for nastiness that is attempted, + like "../" sequences and the like. Probably everything to the left of any + embedded slashes should be cut off. + https://curl.haxx.se/bug/view.cgi?id=1294 + + -O also doesn't decode %-encoded names, and while it has even less + information about the charset involved the process is similar to the -J case. + + Note that we won't add decoding to -O without the user asking for it with + some other means as well, since -O has always been documented to use the name + exactly as specified in the URL. + +4.2 -J with -C - fails + + When using -J (with -O), automatically resumed downloading together with "-C + -" fails. Without -J the same command line works! This happens because the + resume logic is worked out before the target file name (and thus its + pre-transfer size) has been figured out! + https://curl.haxx.se/bug/view.cgi?id=1169 + +4.3 --retry and transfer timeouts + + If using --retry and the transfer timeouts (possibly due to using -m or + -y/-Y) the next attempt doesn't resume the transfer properly from what was + downloaded in the previous attempt but will truncate and restart at the + original position where it was at before the previous failed attempt. See + https://curl.haxx.se/mail/lib-2008-01/0080.html and Mandriva bug report + https://qa.mandriva.com/show_bug.cgi?id=22565 + +4.4 --upload-file . hangs if delay in STDIN + + "(echo start; sleep 1; echo end) | curl --upload-file . http://mywebsite -vv" + + ... causes a hang when it shouldn't. + + See https://github.com/curl/curl/issues/2051 + +4.5 Improve --data-urlencode space encoding + + ASCII space characters in --data-urlencode are currently encoded as %20 + rather than +, which RFC 1866 says should be used. + + See https://github.com/curl/curl/issues/3229 + +5. Build and portability issues + +5.2 curl-config --libs contains private details + + "curl-config --libs" will include details set in LDFLAGS when configure is + run that might be needed only for building libcurl. Further, curl-config + --cflags suffers from the same effects with CFLAGS/CPPFLAGS. + +5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10 + + See https://github.com/curl/curl/issues/2905 + +5.4 Cannot compile against a static build of OpenLDAP + + See https://github.com/curl/curl/issues/2367 + +5.5 can't handle Unicode arguments in Windows + + If a URL or filename can't be encoded using the user's current codepage then + it can only be encoded properly in the Unicode character set. Windows uses + UTF-16 encoding for Unicode and stores it in wide characters, however curl + and libcurl are not equipped for that at the moment. And, except for Cygwin, + Windows can't use UTF-8 as a locale. + + https://curl.haxx.se/bug/?i=345 + https://curl.haxx.se/bug/?i=731 + +5.6 cmake support gaps + + The cmake build setup lacks several features that the autoconf build + offers. This includes: + + - use of correct soname for the shared library build + + - support for several TLS backends are missing + + - the unit tests cause link failures in regular non-static builds + + - no nghttp2 check + + - unusable tool_hugehelp.c with MinGW, see + https://github.com/curl/curl/issues/3125 + +5.7 Visual Studio project gaps + + The Visual Studio projects lack some features that the autoconf and nmake + builds offer, such as the following: + + - support for zlib and nghttp2 + - use of static runtime libraries + - add the test suite components + + In addition to this the following could be implemented: + + - support for other development IDEs + - add PATH environment variables for third-party DLLs + +5.8 configure finding libs in wrong directory + + When the configure script checks for third-party libraries, it adds those + directories to the LDFLAGS variable and then tries linking to see if it + works. When successful, the found directory is kept in the LDFLAGS variable + when the script continues to execute and do more tests and possibly check for + more libraries. + + This can make subsequent checks for libraries wrongly detect another + installation in a directory that was previously added to LDFLAGS by another + library check! + + A possibly better way to do these checks would be to keep the pristine LDFLAGS + even after successful checks and instead add those verified paths to a + separate variable that only after all library checks have been performed gets + appended to LDFLAGS. + +5.9 Utilize Requires.private directives in libcurl.pc + + https://github.com/curl/curl/issues/864 + +6. Authentication + +6.1 NTLM authentication and unicode + + NTLM authentication involving unicode user name or password only works + properly if built with UNICODE defined together with the WinSSL/Schannel + backend. The original problem was mentioned in: + https://curl.haxx.se/mail/lib-2009-10/0024.html + https://curl.haxx.se/bug/view.cgi?id=896 + + The WinSSL/Schannel version verified to work as mentioned in + https://curl.haxx.se/mail/lib-2012-07/0073.html + +6.2 MIT Kerberos for Windows build + + libcurl fails to build with MIT Kerberos for Windows (KfW) due to KfW's + library header files exporting symbols/macros that should be kept private to + the KfW library. See ticket #5601 at https://krbdev.mit.edu/rt/ + +6.3 NTLM in system context uses wrong name + + NTLM authentication using SSPI (on Windows) when (lib)curl is running in + "system context" will make it use wrong(?) user name - at least when compared + to what winhttp does. See https://curl.haxx.se/bug/view.cgi?id=535 + +6.4 Negotiate and Kerberos V5 need a fake user name + + In order to get Negotiate (SPNEGO) authentication to work in HTTP or Kerberos + V5 in the e-mail protocols, you need to provide a (fake) user name (this + concerns both curl and the lib) because the code wrongly only considers + authentication if there's a user name provided by setting + conn->bits.user_passwd in url.c https://curl.haxx.se/bug/view.cgi?id=440 How? + https://curl.haxx.se/mail/lib-2004-08/0182.html A possible solution is to + either modify this variable to be set or introduce a variable such as + new conn->bits.want_authentication which is set when any of the authentication + options are set. + +6.5 NTLM doesn't support password with § character + + https://github.com/curl/curl/issues/2120 + +6.6 libcurl can fail to try alternatives with --proxy-any + + When connecting via a proxy using --proxy-any, a failure to establish an + authentication will cause libcurl to abort trying other options if the + failed method has a higher preference than the alternatives. As an example, + --proxy-any against a proxy which advertise Negotiate and NTLM, but which + fails to set up Kerberos authentication won't proceed to try authentication + using NTLM. + + https://github.com/curl/curl/issues/876 + +7. FTP + +7.1 FTP without or slow 220 response + + If a connection is made to a FTP server but the server then just never sends + the 220 response or otherwise is dead slow, libcurl will not acknowledge the + connection timeout during that phase but only the "real" timeout - which may + surprise users as it is probably considered to be the connect phase to most + people. Brought up (and is being misunderstood) in: + https://curl.haxx.se/bug/view.cgi?id=856 + +7.2 FTP with CONNECT and slow server + + When doing FTP over a socks proxy or CONNECT through HTTP proxy and the multi + interface is used, libcurl will fail if the (passive) TCP connection for the + data transfer isn't more or less instant as the code does not properly wait + for the connect to be confirmed. See test case 564 for a first shot at a test + case. + +7.3 FTP with NOBODY and FAILONERROR + + It seems sensible to be able to use CURLOPT_NOBODY and CURLOPT_FAILONERROR + with FTP to detect if a file exists or not, but it is not working: + https://curl.haxx.se/mail/lib-2008-07/0295.html + +7.4 FTP with ACCT + + When doing an operation over FTP that requires the ACCT command (but not when + logging in), the operation will fail since libcurl doesn't detect this and + thus fails to issue the correct command: + https://curl.haxx.se/bug/view.cgi?id=635 + +7.5 ASCII FTP + + FTP ASCII transfers do not follow RFC959. They don't convert the data + accordingly (not for sending nor for receiving). RFC 959 section 3.1.1.1 + clearly describes how this should be done: + + The sender converts the data from an internal character representation to + the standard 8-bit NVT-ASCII representation (see the Telnet + specification). The receiver will convert the data from the standard + form to his own internal form. + + Since 7.15.4 at least line endings are converted. + +7.6 FTP with NULs in URL parts + + FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 , + , and components, encoded as "%00". The problem is that + curl_unescape does not detect this, but instead returns a shortened C string. + From a strict FTP protocol standpoint, NUL is a valid character within RFC + 959 , so the way to handle this correctly in curl would be to use a + data structure other than a plain C string, one that can handle embedded NUL + characters. From a practical standpoint, most FTP servers would not + meaningfully support NUL characters within RFC 959 , anyway (e.g., + Unix pathnames may not contain NUL). + +7.7 FTP and empty path parts in the URL + + libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that + such parts should be sent to the server as 'CWD ' (without an argument). The + only exception to this rule, is that we knowingly break this if the empty + part is first in the path, as then we use the double slashes to indicate that + the user wants to reach the root dir (this exception SHALL remain even when + this bug is fixed). + +7.8 Premature transfer end but healthy control channel + + When 'multi_done' is called before the transfer has been completed the normal + way, it is considered a "premature" transfer end. In this situation, libcurl + closes the connection assuming it doesn't know the state of the connection so + it can't be reused for subsequent requests. + + With FTP however, this isn't necessarily true but there are a bunch of + situations (listed in the ftp_done code) where it *could* keep the connection + alive even in this situation - but the current code doesn't. Fixing this would + allow libcurl to reuse FTP connections better. + +7.9 Passive transfer tries only one IP address + + When doing FTP operations through a proxy at localhost, the reported spotted + that curl only tried to connect once to the proxy, while it had multiple + addresses and a failed connect on one address should make it try the next. + + After switching to passive mode (EPSV), curl should try all IP addresses for + "localhost". Currently it tries ::1, but it should also try 127.0.0.1. + + See https://github.com/curl/curl/issues/1508 + +7.10 Stick to same family over SOCKS proxy + + When asked to do FTP over a SOCKS proxy, it might connect to the proxy (and + then subsequently to the remote server) using for example IPv4. When doing + the second connection, curl should make sure that the second connection is + using the same IP protocol version as the first connection did and not try + others, since the remote server will only accept the same. + + See https://curl.haxx.se/mail/archive-2018-07/0000.html + +8. TELNET + +8.1 TELNET and time limitations don't work + + When using telnet, the time limitation options don't work. + https://curl.haxx.se/bug/view.cgi?id=846 + +8.2 Microsoft telnet server + + There seems to be a problem when connecting to the Microsoft telnet server. + https://curl.haxx.se/bug/view.cgi?id=649 + + +9. SFTP and SCP + +9.1 SFTP doesn't do CURLOPT_POSTQUOTE correct + + When libcurl sends CURLOPT_POSTQUOTE commands when connected to a SFTP server + using the multi interface, the commands are not being sent correctly and + instead the connection is "cancelled" (the operation is considered done) + prematurely. There is a half-baked (busy-looping) patch provided in the bug + report but it cannot be accepted as-is. See + https://curl.haxx.se/bug/view.cgi?id=748 + + +10. SOCKS + +10.1 SOCKS proxy connections are done blocking + + Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very bad + when used with the multi interface. + +10.2 SOCKS don't support timeouts + + The SOCKS4 connection codes don't properly acknowledge (connect) timeouts. + According to bug #1556528, even the SOCKS5 connect code does not do it right: + https://curl.haxx.se/bug/view.cgi?id=604 + + When connecting to a SOCK proxy, the (connect) timeout is not properly + acknowledged after the actual TCP connect (during the SOCKS "negotiate" + phase). + +10.3 FTPS over SOCKS + + libcurl doesn't support FTPS over a SOCKS proxy. + +10.4 active FTP over a SOCKS + + libcurl doesn't support active FTP over a SOCKS proxy + + +11. Internals + +11.1 Curl leaks .onion hostnames in DNS + + Curl sends DNS requests for hostnames with a .onion TLD. This leaks + information about what the user is attempting to access, and violates this + requirement of RFC7686: https://tools.ietf.org/html/rfc7686 + + Issue: https://github.com/curl/curl/issues/543 + +11.2 error buffer not set if connection to multiple addresses fails + + If you ask libcurl to resolve a hostname like example.com to IPv6 addresses + only. But you only have IPv4 connectivity. libcurl will correctly fail with + CURLE_COULDNT_CONNECT. But the error buffer set by CURLOPT_ERRORBUFFER + remains empty. Issue: https://github.com/curl/curl/issues/544 + +11.3 c-ares deviates from stock resolver on http://1346569778 + + When using the socket resolvers, that URL becomes: + + * Rebuilt URL to: http://1346569778/ + * Trying 80.67.6.50... + + but with c-ares it instead says "Could not resolve: 1346569778 (Domain name + not found)" + + See https://github.com/curl/curl/issues/893 + +11.4 HTTP test server 'connection-monitor' problems + + The 'connection-monitor' feature of the sws HTTP test server doesn't work + properly if some tests are run in unexpected order. Like 1509 and then 1525. + + See https://github.com/curl/curl/issues/868 + +11.5 Connection information when using TCP Fast Open + + CURLINFO_LOCAL_PORT (and possibly a few other) fails when TCP Fast Open is + enabled. + + See https://github.com/curl/curl/issues/1332 + +11.6 slow connect to localhost on Windows + + When connecting to "localhost" on Windows, curl will resolve the name for + both ipv4 and ipv6 and try to connect to both happy eyeballs-style. Something + in there does however make it take 200 milliseconds to succeed - which is the + HAPPY_EYEBALLS_TIMEOUT define exactly. Lowering that define speeds up the + connection, suggesting a problem in the HE handling. + + If we can *know* that we're talking to a local host, we should lower the + happy eyeballs delay timeout for IPv6 (related: hardcode the "localhost" + addresses, mentioned in TODO). Possibly we should reduce that delay for all. + + https://github.com/curl/curl/issues/2281 + +12. LDAP and OpenLDAP + +12.1 OpenLDAP hangs after returning results + + By configuration defaults, openldap automatically chase referrals on + secondary socket descriptors. The OpenLDAP backend is asynchronous and thus + should monitor all socket descriptors involved. Currently, these secondary + descriptors are not monitored, causing openldap library to never receive + data from them. + + As a temporary workaround, disable referrals chasing by configuration. + + The fix is not easy: proper automatic referrals chasing requires a + synchronous bind callback and monitoring an arbitrary number of socket + descriptors for a single easy handle (currently limited to 5). + + Generic LDAP is synchronous: OK. + + See https://github.com/curl/curl/issues/622 and + https://curl.haxx.se/mail/lib-2016-01/0101.html + + +13. TCP/IP + +13.1 --interface for ipv6 binds to unusable IP address + + Since IPv6 provides a lot of addresses with different scope, binding to an + IPv6 address needs to take the proper care so that it doesn't bind to a + locally scoped address as that is bound to fail. + + https://github.com/curl/curl/issues/686 + +14. DICT + +14.1 DICT responses show the underlying protocol + + When getting a DICT response, the protocol parts of DICT aren't stripped off + from the output. + + https://github.com/curl/curl/issues/1809 diff --git a/bin/curl/docs/LICENSE-MIXING.md b/bin/curl/docs/LICENSE-MIXING.md new file mode 100644 index 00000000..e4f6759e --- /dev/null +++ b/bin/curl/docs/LICENSE-MIXING.md @@ -0,0 +1,123 @@ +License Mixing +============== + +libcurl can be built to use a fair amount of various third party libraries, +libraries that are written and provided by other parties that are distributed +using their own licenses. Even libcurl itself contains code that may cause +problems to some. This document attempts to describe what licenses libcurl and +the other libraries use and what possible dilemmas linking and mixing them all +can lead to for end users. + +I am not a lawyer and this is not legal advice! + +One common dilemma is that [GPL](https://www.gnu.org/licenses/gpl.html) +licensed code is not allowed to be linked with code licensed under the +[Original BSD license](https://spdx.org/licenses/BSD-4-Clause.html) (with the +announcement clause). You may still build your own copies that use them all, +but distributing them as binaries would be to violate the GPL license - unless +you accompany your license with an +[exception](https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs). This +particular problem was addressed when the [Modified BSD +license](https://opensource.org/licenses/BSD-3-Clause) was created, which does +not have the announcement clause that collides with GPL. + +## libcurl + + Uses an [MIT style license](https://curl.haxx.se/docs/copyright.html) that is + very liberal. + +## OpenSSL + + (May be used for SSL/TLS support) Uses an Original BSD-style license with an + announcement clause that makes it "incompatible" with GPL. You are not + allowed to ship binaries that link with OpenSSL that includes GPL code + (unless that specific GPL code includes an exception for OpenSSL - a habit + that is growing more and more common). If OpenSSL's licensing is a problem + for you, consider using another TLS library. + +## GnuTLS + + (May be used for SSL/TLS support) Uses the + [LGPL](https://www.gnu.org/licenses/lgpl.html) license. If this is a problem + for you, consider using another TLS library. Also note that GnuTLS itself + depends on and uses other libs (libgcrypt and libgpg-error) and they too are + LGPL- or GPL-licensed. + +## WolfSSL + + (May be used for SSL/TLS support) Uses the GPL license or a proprietary + license. If this is a problem for you, consider using another TLS library. + +## NSS + + (May be used for SSL/TLS support) Is covered by the + [MPL](https://www.mozilla.org/MPL/) license, the GPL license and the LGPL + license. You may choose to license the code under MPL terms, GPL terms, or + LGPL terms. These licenses grant you different permissions and impose + different obligations. You should select the license that best meets your + needs. + +## mbedTLS + + (May be used for SSL/TLS support) Uses the [Apache 2.0 + license](https://opensource.org/licenses/Apache-2.0) or the GPL license. + You may choose to license the code under Apache 2.0 terms or GPL terms. + These licenses grant you different permissions and impose different + obligations. You should select the license that best meets your needs. + +## BoringSSL + + (May be used for SSL/TLS support) As an OpenSSL fork, it has the same + license as that. + +## libressl + + (May be used for SSL/TLS support) As an OpenSSL fork, it has the same + license as that. + +## c-ares + + (Used for asynchronous name resolves) Uses an MIT license that is very + liberal and imposes no restrictions on any other library or part you may link + with. + +## zlib + + (Used for compressed Transfer-Encoding support) Uses an MIT-style license + that shouldn't collide with any other library. + +## MIT Kerberos + + (May be used for GSS support) MIT licensed, that shouldn't collide with any + other parts. + +## Heimdal + + (May be used for GSS support) Heimdal is Original BSD licensed with the + announcement clause. + +## GNU GSS + + (May be used for GSS support) GNU GSS is GPL licensed. Note that you may not + distribute binary curl packages that uses this if you build curl to also link + and use any Original BSD licensed libraries! + +## libidn + + (Used for IDNA support) Uses the GNU Lesser General Public License [3]. LGPL + is a variation of GPL with slightly less aggressive "copyleft". This license + requires more requirements to be met when distributing binaries, see the + license for details. Also note that if you distribute a binary that includes + this library, you must also include the full LGPL license text. Please + properly point out what parts of the distributed package that the license + addresses. + +## OpenLDAP + + (Used for LDAP support) Uses a Modified BSD-style license. Since libcurl uses + OpenLDAP as a shared library only, I have not heard of anyone that ships + OpenLDAP linked with libcurl in an app. + +## libssh2 + + (Used for scp and sftp support) libssh2 uses a Modified BSD-style license. diff --git a/bin/curl/docs/MAIL-ETIQUETTE.txt b/bin/curl/docs/MAIL-ETIQUETTE.txt new file mode 100644 index 00000000..07660a00 --- /dev/null +++ b/bin/curl/docs/MAIL-ETIQUETTE.txt @@ -0,0 +1,285 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +MAIL ETIQUETTE + + 1. About the lists + 1.1 Mailing Lists + 1.2 Netiquette + 1.3 Do Not Mail a Single Individual + 1.4 Subscription Required + 1.5 Moderation of new posters + 1.6 Handling trolls and spam + 1.7 How to unsubscribe + 1.8 I posted, now what? + 1.9 Your emails are public + + 2. Sending mail + 2.1 Reply or New Mail + 2.2 Reply to the List + 2.3 Use a Sensible Subject + 2.4 Do Not Top-Post + 2.5 HTML is not for mails + 2.6 Quoting + 2.7 Digest + 2.8 Please Tell Us How You Solved The Problem! + +============================================================================== + +1. About the lists + + 1.1 Mailing Lists + + The mailing lists we have are all listed and described at + https://curl.haxx.se/mail/ + + Each mailing list is targeted to a specific set of users and subjects, + please use the one or the ones that suit you the most. + + Each mailing list has hundreds up to thousands of readers, meaning that + each mail sent will be received and read by a very large number of people. + People from various cultures, regions, religions and continents. + + 1.2 Netiquette + + Netiquette is a common term for how to behave on the internet. Of course, in + each particular group and subculture there will be differences in what is + acceptable and what is considered good manners. + + This document outlines what we in the curl project consider to be good + etiquette, and primarily this focus on how to behave on and how to use our + mailing lists. + + 1.3 Do Not Mail a Single Individual + + Many people send one question to one person. One person gets many mails, and + there is only one person who can give you a reply. The question may be + something that other people would also like to ask. These other people have + no way to read the reply, but to ask the one person the question. The one + person consequently gets overloaded with mail. + + If you really want to contact an individual and perhaps pay for his or her + services, by all means go ahead, but if it's just another curl question, + take it to a suitable list instead. + + 1.4 Subscription Required + + All curl mailing lists require that you are subscribed to allow a mail to go + through to all the subscribers. + + If you post without being subscribed (or from a different mail address than + the one you are subscribed with), your mail will simply be silently + discarded. You have to subscribe first, then post. + + The reason for this unfortunate and strict subscription policy is of course + to stop spam from pestering the lists. + + 1.5 Moderation of new posters + + Several of the curl mailing lists automatically make all posts from new + subscribers be moderated. This means that after you've subscribed and + sent your first mail to a list, that mail will not be let through to the + list until a mailing list administrator has verified that it is OK and + permits it to get posted. + + Once a first post has been made that proves the sender is actually talking + about curl-related subjects, the moderation "flag" will be switched off and + future posts will go through without being moderated. + + The reason for this moderation policy is that we do suffer from spammers who + actually subscribe and send spam to our lists. + + 1.6 Handling trolls and spam + + Despite our good intentions and hard work to keep spam off the lists and to + maintain a friendly and positive atmosphere, there will be times when spam + and or trolls get through. + + Troll - "someone who posts inflammatory, extraneous, or off-topic messages + in an online community" + + Spam - "use of electronic messaging systems to send unsolicited bulk + messages" + + No matter what, we NEVER EVER respond to trolls or spammers on the list. If + you believe the list admin should do something in particular, contact him/her + off-list. The subject will be taken care of as much as possible to prevent + repeated offenses, but responding on the list to such messages never leads to + anything good and only puts the light even more on the offender: which was + the entire purpose of it getting sent to the list in the first place. + + Don't feed the trolls! + + 1.7 How to unsubscribe + + You can unsubscribe the same way you subscribed in the first place. You go + to the page for the particular mailing list you're subscribed to and you enter + your email address and password and press the unsubscribe button. + + Also, the instructions to unsubscribe are included in the headers of every + mail that is sent out to all curl related mailing lists and there's a footer + in each mail that links to the "admin" page on which you can unsubscribe and + change other options. + + You NEVER EVER email the mailing list requesting someone else to take you off + the list. + + 1.8 I posted, now what? + + If you aren't subscribed with the exact same email address that you used to + send the email, your post will just be silently discarded. + + If you posted for the first time to the mailing list, you first need to wait + for an administrator to allow your email to go through (moderated). This normally + happens very quickly but in case we're asleep, you may have to wait a few + hours. + + Once your email goes through it is sent out to several hundred or even + thousands of recipients. Your email may cover an area that not that many people + know about or are interested in. Or possibly the person who knows about it + is on vacation or under a very heavy work load right now. You may have to wait + for a response and you should not expect to get a response at all, but + hopefully you get an answer within a couple of days. + + You do yourself and all of us a service when you include as many details as + possible already in your first email. Mention your operating system and + environment. Tell us which curl version you're using and tell us what you + did, what happened and what you expected would happen. Preferably, show us + what you did with details enough to allow others to help point out the problem + or repeat the same steps in their locations. + + Failing to include details will only delay responses and make people respond + and ask for more details and you will have to send a follow-up email that + includes them. + + Expect the responses to primarily help YOU debug the issue, or ask YOU + questions that can lead you or others towards a solution or explanation to + whatever you experience. + + If you are a repeat offender to the guidelines outlined in this document, + chances are that people will ignore you at will and your chances to get + responses in the future will greatly diminish. + + 1.9 Your emails are public + + Your email, its contents and all its headers and the details in those + headers will be received by every subscriber of the mailing list that you + send your email to. + + Your email as sent to a curl mailing list will end up in mail archives, on + the curl web site and elsewhere, for others to see and read. Today and in + the future. In addition to the archives, the mail is sent out to thousands + of individuals. There is no way to undo a sent email. + + When sending emails to a curl mailing list, do not include sensitive + information such as user names and passwords; use fake ones, temporary ones + or just remove them completely from the mail. Note that this includes base64 + encoded HTTP Basic auth headers. + + This public nature of the curl mailing lists makes automatically inserted mail + footers about mails being "private" or "only meant for the recipient" or + similar even more silly than usual. Because they are absolutely not private + when sent to a public mailing list. + + +2. Sending mail + + 2.1 Reply or New Mail + + Please do not reply to an existing message as a short-cut to post a message + to the lists. + + Many mail programs and web archivers use information within mails to keep + them together as "threads", as collections of posts that discuss a certain + subject. If you don't intend to reply on the same or similar subject, don't + just hit reply on an existing mail and change subject, create a new mail. + + 2.2 Reply to the List + + When replying to a message from the list, make sure that you do "group + reply" or "reply to all", and not just reply to the author of the single + mail you reply to. + + We're actively discouraging replying back to the single person by setting + the Reply-To: field in outgoing mails back to the mailing list address, + making it harder for people to mail the author directly, if only by mistake. + + 2.3 Use a Sensible Subject + + Please use a subject of the mail that makes sense and that is related to the + contents of your mail. It makes it a lot easier to find your mail afterwards + and it makes it easier to track mail threads and topics. + + 2.4 Do Not Top-Post + + If you reply to a message, don't use top-posting. Top-posting is when you + write the new text at the top of a mail and you insert the previous quoted + mail conversation below. It forces users to read the mail in a backwards + order to properly understand it. + + This is why top posting is so bad (in top posting order): + + A: Because it messes up the order in which people normally read text. + Q: Why is top-posting such a bad thing? + A: Top-posting. + Q: What is the most annoying thing in e-mail? + + Apart from the screwed up read order (especially when mixed together in a + thread when someone responds using the mandated bottom-posting style), it + also makes it impossible to quote only parts of the original mail. + + When you reply to a mail. You let the mail client insert the previous mail + quoted. Then you put the cursor on the first line of the mail and you move + down through the mail, deleting all parts of the quotes that don't add + context for your comments. When you want to add a comment you do so, inline, + right after the quotes that relate to your comment. Then you continue + downwards again. + + When most of the quotes have been removed and you've added your own words, + you're done! + + 2.5 HTML is not for mails + + Please switch off those HTML encoded messages. You can mail all those funny + mails to your friends. We speak plain text mails. + + 2.6 Quoting + + Quote as little as possible. Just enough to provide the context you cannot + leave out. A lengthy description can be found here: + + https://www.netmeister.org/news/learn2quote.html + + 2.7 Digest + + We allow subscribers to subscribe to the "digest" version of the mailing + lists. A digest is a collection of mails lumped together in one single mail. + + Should you decide to reply to a mail sent out as a digest, there are two + things you MUST consider if you really really cannot subscribe normally + instead: + + Cut off all mails and chatter that is not related to the mail you want to + reply to. + + Change the subject name to something sensible and related to the subject, + preferably even the actual subject of the single mail you wanted to reply to + + 2.8 Please Tell Us How You Solved The Problem! + + Many people mail questions to the list, people spend some of their time and + make an effort in providing good answers to these questions. + + If you are the one who asks, please consider responding once more in case + one of the hints was what solved your problems. The guys who write answers + feel good to know that they provided a good answer and that you fixed the + problem. Far too often, the person who asked the question is never heard from + again, and we never get to know if he/she is gone because the problem was + solved or perhaps because the problem was unsolvable! + + Getting the solution posted also helps other users that experience the same + problem(s). They get to see (possibly in the web archives) that the + suggested fixes actually has helped at least one person. diff --git a/bin/curl/docs/README.md b/bin/curl/docs/README.md new file mode 100644 index 00000000..6ee42aad --- /dev/null +++ b/bin/curl/docs/README.md @@ -0,0 +1,12 @@ +![curl logo](https://curl.haxx.se/logo/curl-logo.svg) + +# Documentation + +You'll find a mix of various documentation in this directory and +subdirectories, using several different formats. Some of them are not ideal +for reading directly in your browser. + +If you'd rather see the rendered version of the documentation, check out the +curl web site's [documentation section](https://curl.haxx.se/docs/) for +general curl stuff or the [libcurl section](https://curl.haxx.se/libcurl/) for +libcurl related documentation. diff --git a/bin/curl/docs/RELEASE-PROCEDURE.md b/bin/curl/docs/RELEASE-PROCEDURE.md new file mode 100644 index 00000000..70609fd7 --- /dev/null +++ b/bin/curl/docs/RELEASE-PROCEDURE.md @@ -0,0 +1,98 @@ +curl release procedure - how to do a release +============================================ + +in the source code repo +----------------------- + +- edit `RELEASE-NOTES` to be accurate + +- update `docs/THANKS` + +- make sure all relevant changes are committed on the master branch + +- tag the git repo in this style: `git tag -a curl-7_34_0`. -a annotates the + tag and we use underscores instead of dots in the version number. Make sure + the tag is GPG signed (using -s). + +- run "./maketgz 7.34.0" to build the release tarballs. It is important that + you run this on a machine with the correct set of autotools etc installed + as this is what then will be shipped and used by most users on \*nix like + systems. + +- push the git commits and the new tag + +- gpg sign the 4 tarballs as maketgz suggests + +- upload the 8 resulting files to the primary download directory + +in the curl-www repo +-------------------- + +- edit `Makefile` (version number and date), + +- edit `_newslog.html` (announce the new release) and + +- edit `_changes.html` (insert changes+bugfixes from RELEASE-NOTES) + +- commit all local changes + +- tag the repo with the same name as used for the source repo. + +- make sure all relevant changes are committed and pushed on the master branch + + (the web site then updates its contents automatically) + +on github +--------- + +- edit the newly made release tag so that it is listed as the latest release + +inform +------ + +- send an email to curl-users, curl-announce and curl-library. Insert the + RELEASE-NOTES into the mail. + +celebrate +--------- + +- suitable beverage intake is encouraged for the festivities + +curl release scheduling +======================= + +Basics +------ + +We do releases every 8 weeks on Wednesdays. If critical problems arise, we can +insert releases outside of the schedule or we can move the release date - but +this is very rare. + +Each 8 week release cycle is split in two 4-week periods. + +- During the first 4 weeks after a release, we allow new features and changes + to curl and libcurl. If we accept any such changes, we bump the minor number + used for the next release. + +- During the second 4-week period we do not merge any features or changes, we + then only focus on fixing bugs and polishing things to make a solid coming + release. + +Coming dates +------------ + +Based on the description above, here are some planned release dates (at the +time of this writing): + +- May 22, 2019 +- July 17, 2019 +- September 11, 2019 +- November 6, 2019 +- January 8, 2020 (moved) +- February 27, 2020 +- April 22, 2020 +- June 17, 2020 + +The above (and more) curl-related dates are published in +[iCalendar format](https://calendar.google.com/calendar/ical/c9u5d64odop9js55oltfarjk6g%40group.calendar.google.com/public/basic.ics) +as well. diff --git a/bin/curl/docs/RESOURCES.txt b/bin/curl/docs/RESOURCES.txt new file mode 100644 index 00000000..55f75df7 --- /dev/null +++ b/bin/curl/docs/RESOURCES.txt @@ -0,0 +1,85 @@ + _ _ ____ _ + Project ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + +This document lists documents and standards used by curl. + + RFC 959 - FTP Protocol + + RFC 1635 - How to Use Anonymous FTP + + RFC 1738 - Uniform Resource Locators + + RFC 1777 - Lightweight Directory Access Protocol (LDAP) + + RFC 1808 - Relative Uniform Resource Locators + + RFC 1867 - Form-based File Upload in HTML + + RFC 1950 - ZLIB Compressed Data Format Specification + + RFC 1951 - DEFLATE Compressed Data Format Specification + + RFC 1952 - GZIP File Format Specification + + RFC 1959 - LDAP URL Syntax + + RFC 2045-2049 - Everything you need to know about MIME! (needed for form + based upload) + + RFC 2068 - HTTP 1.1 (obsoleted by RFC 2616) + + RFC 2104 - Keyed-Hashing for Message Authentication + + RFC 2109 - HTTP State Management Mechanism (cookie stuff) + - Also, read Netscape's specification at + https://curl.haxx.se/rfc/cookie_spec.html + + RFC 2183 - The Content-Disposition Header Field + + RFC 2195 - CRAM-MD5 Authentication + + RFC 2229 - A Dictionary Server Protocol + + RFC 2255 - Newer LDAP URL Format + + RFC 2231 - MIME Parameter Value and Encoded Word Extensions: + Character Sets, Languages, and Continuations + + RFC 2388 - "Returning Values from Forms: multipart/form-data" + Use this as an addition to the RFC1867 + + RFC 2396 - "Uniform Resource Identifiers: Generic Syntax and Semantics" This + one obsoletes RFC 1738, but since RFC 1738 is often mentioned + I've left it in this list. + + RFC 2428 - FTP Extensions for IPv6 and NATs + + RFC 2577 - FTP Security Considerations + + RFC 2616 - HTTP 1.1, the latest + + RFC 2617 - HTTP Authentication + + RFC 2718 - Guidelines for new URL Schemes + + RFC 2732 - Format for Literal IPv6 Addresses in URL's + + RFC 2818 - HTTP Over TLS (TLS is the successor to SSL) + + RFC 2821 - Simple Mail Transfer Protocol (SMTP) + + RFC 2964 - Use of HTTP State Management + + RFC 2965 - HTTP State Management Mechanism. Cookies. Obsoletes RFC2109 + + RFC 3207 - SMTP Over TLS + + RFC 4616 - PLAIN Authentication + + RFC 4954 - SMTP Authentication + + RFC 7932 - Brotli Compressed Data Format diff --git a/bin/curl/docs/ROADMAP.md b/bin/curl/docs/ROADMAP.md new file mode 100644 index 00000000..10e7effe --- /dev/null +++ b/bin/curl/docs/ROADMAP.md @@ -0,0 +1,59 @@ +curl the next few years - perhaps +================================= + +Roadmap of things Daniel Stenberg wants to work on next. It is intended to +serve as a guideline for others for information, feedback and possible +participation. + +HTTP/3 +------ + + See the [QUIC and HTTP/3 wiki page](https://github.com/curl/curl/wiki/QUIC). + +ESNI (Encrypted SNI) +-------------------- + + See Daniel's post on [Support of Encrypted + SNI](https://curl.haxx.se/mail/lib-2019-03/0000.html) on the mailing list. + +HSTS +---- + +Complete and merge [the existing PR](https://github.com/curl/curl/pull/2682). + +Parallel transfers for the curl tool +------------------------------------ + +This will require several new command line options to enable and control. + + 1. switch to creating a list of all the transfers first before any transfer + is done + 2. make the transfers using the multi interface + 3. optionally fire up more transfers before the previous has completed + +Option to refuse HTTPS => HTTP redirects +---------------------------------------- + +Possibly as a new bit to `CURLOPT_FOLLOWLOCATION` ? + +Option to let CURLOPT_CUSTOMREQUEST be overridden on redirect +------------------------------------------------------------- + +(This is a common problem for people using `-X` and `-L` together.) + +Possibly as a new bit to `CURLOPT_FOLLOWLOCATION` ? + +Hardcode “localhost” +-------------------- + +No need to resolve it. Avoid a risk where this is resolved over the network +and actually responds with something else than a local address. Some operating +systems already do this. Also: +https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02 + +Consider "menu config"-style build feature selection +---------------------------------------------------- + +Allow easier building of custom libcurl versions with only a selected feature +where the available features are easily browsable and toggle-able ON/OFF or +similar. diff --git a/bin/curl/docs/SECURITY-PROCESS.md b/bin/curl/docs/SECURITY-PROCESS.md new file mode 100644 index 00000000..e844a9a9 --- /dev/null +++ b/bin/curl/docs/SECURITY-PROCESS.md @@ -0,0 +1,132 @@ +curl security process +===================== + +This document describes how security vulnerabilities should be handled in the +curl project. + +Publishing Information +---------------------- + +All known and public curl or libcurl related vulnerabilities are listed on +[the curl web site security page](https://curl.haxx.se/docs/security.html). + +Security vulnerabilities **should not** be entered in the project's public bug +tracker. + +Vulnerability Handling +---------------------- + +The typical process for handling a new security vulnerability is as follows. + +No information should be made public about a vulnerability until it is +formally announced at the end of this process. That means, for example that a +bug tracker entry must NOT be created to track the issue since that will make +the issue public and it should not be discussed on any of the project's public +mailing lists. Also messages associated with any commits should not make any +reference to the security nature of the commit if done prior to the public +announcement. + +- The person discovering the issue, the reporter, reports the vulnerability on + [https://hackerone.com/curl](https://hackerone.com/curl). Issues filed there + reach a handful of selected and trusted people. + +- Messages that do not relate to the reporting or managing of an undisclosed + security vulnerability in curl or libcurl are ignored and no further action + is required. + +- A person in the security team responds to the original report to acknowledge + that a human has seen the report. + +- The security team investigates the report and either rejects it or accepts + it. + +- If the report is rejected, the team writes to the reporter to explain why. + +- If the report is accepted, the team writes to the reporter to let him/her + know it is accepted and that they are working on a fix. + +- The security team discusses the problem, works out a fix, considers the + impact of the problem and suggests a release schedule. This discussion + should involve the reporter as much as possible. + +- The release of the information should be "as soon as possible" and is most + often synchronized with an upcoming release that contains the fix. If the + reporter, or anyone else involved, thinks the next planned release is too + far away, then a separate earlier release should be considered. + +- Write a security advisory draft about the problem that explains what the + problem is, its impact, which versions it affects, solutions or workarounds, + when the release is out and make sure to credit all contributors properly. + Figure out the CWE (Common Weakness Enumeration) number for the flaw. + +- Request a CVE number from + [HackerOne](https://docs.hackerone.com/programs/cve-requests.html) + +- Consider informing + [distros@openwall](https://oss-security.openwall.org/wiki/mailing-lists/distros) + to prepare them about the upcoming public security vulnerability + announcement - attach the advisory draft for information. Note that + 'distros' won't accept an embargo longer than 14 days and they do not care + for Windows-specific flaws. + +- Update the "security advisory" with the CVE number. + +- The security team commits the fix in a private branch. The commit message + should ideally contain the CVE number. This fix is usually also distributed + to the 'distros' mailing list to allow them to use the fix prior to the + public announcement. + +- No more than 48 hours before the release, the private branch is merged into + the master branch and pushed. Once pushed, the information is accessible to + the public and the actual release should follow suit immediately afterwards. + The time between the push and the release is used for final tests and + reviews. + +- The project team creates a release that includes the fix. + +- The project team announces the release and the vulnerability to the world in + the same manner we always announce releases. It gets sent to the + curl-announce, curl-library and curl-users mailing lists. + +- The security web page on the web site should get the new vulnerability + mentioned. + +curl-security (at haxx dot se) +------------------------------ + +This is a private mailing list for discussions on and about curl security +issues. + +Who is on this list? There are a couple of criteria you must meet, and then we +might ask you to join the list or you can ask to join it. It really isn't very +formal. We basically only require that you have a long-term presence in the +curl project and you have shown an understanding for the project and its way +of working. You must've been around for a good while and you should have no +plans in vanishing in the near future. + +We do not make the list of participants public mostly because it tends to vary +somewhat over time and a list somewhere will only risk getting outdated. + +Publishing Security Advisories +------------------------------ + +1. Write up the security advisory, using markdown syntax. Use the same + subtitles as last time to maintain consistency. + +2. Name the advisory file after the allocated CVE id. + +3. Add a line on the top of the array in `curl-www/docs/vuln.pm'. + +4. Put the new advisory markdown file in the curl-www/docs/ directory. Add it + to the git repo. + +5. Run `make` in your local web checkout and verify that things look fine. + +6. On security advisory release day, push the changes on the curl-www + repository's remote master branch. + +Bug Bounty +---------- + +See [BUG-BOUNTY](https://curl.haxx.se/docs/bugbounty.html) for details on the +bug bounty program. diff --git a/bin/curl/docs/SSL-PROBLEMS.md b/bin/curl/docs/SSL-PROBLEMS.md new file mode 100644 index 00000000..aaf7bdb5 --- /dev/null +++ b/bin/curl/docs/SSL-PROBLEMS.md @@ -0,0 +1,87 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +# SSL problems + + First, let's establish that we often refer to TLS and SSL interchangeably as + SSL here. The current protocol is called TLS, it was called SSL a long time + ago. + + There are several known reasons why a connection that involves SSL might + fail. This is a document that attempts to details the most common ones and + how to mitigate them. + +## CA certs + + CA certs are used to digitally verify the server's certificate. You need a + "ca bundle" for this. See lots of more details on this in the SSLCERTS + document. + +## CA bundle missing intermediate certificates + + When using said CA bundle to verify a server cert, you will experience + problems if your CA cert does not have the certificates for the + intermediates in the whole trust chain. + +## Protocol version + + Some broken servers fail to support the protocol negotiation properly that + SSL servers are supposed to handle. This may cause the connection to fail + completely. Sometimes you may need to explicitly select a SSL version to use + when connecting to make the connection succeed. + + An additional complication can be that modern SSL libraries sometimes are + built with support for older SSL and TLS versions disabled! + + All versions of SSL are considered insecure and should be avoided. Use TLS. + +## Ciphers + + Clients give servers a list of ciphers to select from. If the list doesn't + include any ciphers the server wants/can use, the connection handshake + fails. + + curl has recently disabled the user of a whole bunch of seriously insecure + ciphers from its default set (slightly depending on SSL backend in use). + + You may have to explicitly provide an alternative list of ciphers for curl + to use to allow the server to use a WEAK cipher for you. + + Note that these weak ciphers are identified as flawed. For example, this + includes symmetric ciphers with less than 128 bit keys and RC4. + + Schannel in Windows XP is not able to connect to servers that no longer + support the legacy handshakes and algorithms used by those versions, so we + advice against building curl to use Schannel on really old Windows versions. + + References: + + https://tools.ietf.org/html/draft-popov-tls-prohibiting-rc4-01 + +## Allow BEAST + + BEAST is the name of a TLS 1.0 attack that surfaced 2011. When adding means + to mitigate this attack, it turned out that some broken servers out there in + the wild didn't work properly with the BEAST mitigation in place. + + To make such broken servers work, the --ssl-allow-beast option was + introduced. Exactly as it sounds, it re-introduces the BEAST vulnerability + but on the other hand it allows curl to connect to that kind of strange + servers. + +## Disabling certificate revocation checks + + Some SSL backends may do certificate revocation checks (CRL, OCSP, etc) + depending on the OS or build configuration. The --ssl-no-revoke option was + introduced in 7.44.0 to disable revocation checking but currently is only + supported for Schannel (the native Windows SSL library), with an exception + in the case of Windows' Untrusted Publishers blacklist which it seems can't + be bypassed. This option may have broader support to accommodate other SSL + backends in the future. + + References: + + https://curl.haxx.se/docs/ssl-compared.html diff --git a/bin/curl/docs/SSLCERTS.md b/bin/curl/docs/SSLCERTS.md new file mode 100644 index 00000000..2c5be68e --- /dev/null +++ b/bin/curl/docs/SSLCERTS.md @@ -0,0 +1,173 @@ +SSL Certificate Verification +============================ + +SSL is TLS +---------- + +SSL is the old name. It is called TLS these days. + + +Native SSL +---------- + +If libcurl was built with Schannel or Secure Transport support (the native SSL +libraries included in Windows and Mac OS X), then this does not apply to +you. Scroll down for details on how the OS-native engines handle SSL +certificates. If you're not sure, then run "curl -V" and read the results. If +the version string says "WinSSL" in it, then it was built with Schannel +support. + +It is about trust +----------------- + +This system is about trust. In your local CA certificate store you have certs +from *trusted* Certificate Authorities that you then can use to verify that the +server certificates you see are valid. They're signed by one of the CAs you +trust. + +Which CAs do you trust? You can decide to trust the same set of companies your +operating system trusts, or the set one of the known browsers trust. That's +basically trust via someone else you trust. You should just be aware that +modern operating systems and browsers are setup to trust *hundreds* of +companies and recent years several such CAs have been found untrustworthy. + +Certificate Verification +------------------------ + +libcurl performs peer SSL certificate verification by default. This is done +by using a CA certificate store that the SSL library can use to make sure the +peer's server certificate is valid. + +If you communicate with HTTPS, FTPS or other TLS-using servers using +certificates that are signed by CAs present in the store, you can be sure +that the remote server really is the one it claims to be. + +If the remote server uses a self-signed certificate, if you don't install a CA +cert store, if the server uses a certificate signed by a CA that isn't +included in the store you use or if the remote host is an impostor +impersonating your favorite site, and you want to transfer files from this +server, do one of the following: + + 1. Tell libcurl to *not* verify the peer. With libcurl you disable this with + `curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);` + + With the curl command line tool, you disable this with -k/--insecure. + + 2. Get a CA certificate that can verify the remote server and use the proper + option to point out this CA cert for verification when connecting. For + libcurl hackers: `curl_easy_setopt(curl, CURLOPT_CAPATH, capath);` + + With the curl command line tool: --cacert [file] + + 3. Add the CA cert for your server to the existing default CA certificate + store. The default CA certificate store can changed at compile time with the + following configure options: + + --with-ca-bundle=FILE: use the specified file as CA certificate store. CA + certificates need to be concatenated in PEM format into this file. + + --with-ca-path=PATH: use the specified path as CA certificate store. CA + certificates need to be stored as individual PEM files in this directory. + You may need to run c_rehash after adding files there. + + If neither of the two options is specified, configure will try to auto-detect + a setting. It's also possible to explicitly not hardcode any default store + but rely on the built in default the crypto library may provide instead. + You can achieve that by passing both --without-ca-bundle and + --without-ca-path to the configure script. + + If you use Internet Explorer, this is one way to get extract the CA cert + for a particular server: + + - View the certificate by double-clicking the padlock + - Find out where the CA certificate is kept (Certificate> + Authority Information Access>URL) + - Get a copy of the crt file using curl + - Convert it from crt to PEM using the openssl tool: + openssl x509 -inform DES -in yourdownloaded.crt \ + -out outcert.pem -text + - Add the 'outcert.pem' to the CA certificate store or use it stand-alone + as described below. + + If you use the 'openssl' tool, this is one way to get extract the CA cert + for a particular server: + + - `openssl s_client -showcerts -servername server -connect server:443 > cacert.pem` + - type "quit", followed by the "ENTER" key + - The certificate will have "BEGIN CERTIFICATE" and "END CERTIFICATE" + markers. + - If you want to see the data in the certificate, you can do: "openssl + x509 -inform PEM -in certfile -text -out certdata" where certfile is + the cert you extracted from logfile. Look in certdata. + - If you want to trust the certificate, you can add it to your CA + certificate store or use it stand-alone as described. Just remember that + the security is no better than the way you obtained the certificate. + + 4. If you're using the curl command line tool, you can specify your own CA + cert path by setting the environment variable `CURL_CA_BUNDLE` to the path + of your choice. + + If you're using the curl command line tool on Windows, curl will search + for a CA cert file named "curl-ca-bundle.crt" in these directories and in + this order: + 1. application's directory + 2. current working directory + 3. Windows System directory (e.g. C:\windows\system32) + 4. Windows Directory (e.g. C:\windows) + 5. all directories along %PATH% + + 5. Get a better/different/newer CA cert bundle! One option is to extract the + one a recent Firefox browser uses by running 'make ca-bundle' in the curl + build tree root, or possibly download a version that was generated this + way for you: [CA Extract](https://curl.haxx.se/docs/caextract.html) + +Neglecting to use one of the above methods when dealing with a server using a +certificate that isn't signed by one of the certificates in the installed CA +certificate store, will cause SSL to report an error ("certificate verify +failed") during the handshake and SSL will then refuse further communication +with that server. + +Certificate Verification with NSS +--------------------------------- + +If libcurl was built with NSS support, then depending on the OS distribution, +it is probably required to take some additional steps to use the system-wide +CA cert db. RedHat ships with an additional module, libnsspem.so, which +enables NSS to read the OpenSSL PEM CA bundle. On openSUSE you can install +p11-kit-nss-trust which makes NSS use the system wide CA certificate store. NSS +also has a new [database format](https://wiki.mozilla.org/NSS_Shared_DB). + +Starting with version 7.19.7, libcurl automatically adds the 'sql:' prefix to +the certdb directory (either the hardcoded default /etc/pki/nssdb or the +directory configured with SSL_DIR environment variable). To check which certdb +format your distribution provides, examine the default certdb location: +/etc/pki/nssdb; the new certdb format can be identified by the filenames +cert9.db, key4.db, pkcs11.txt; filenames of older versions are cert8.db, +key3.db, secmod.db. + +Certificate Verification with Schannel and Secure Transport +----------------------------------------------------------- + +If libcurl was built with Schannel (Microsoft's native TLS engine) or Secure +Transport (Apple's native TLS engine) support, then libcurl will still perform +peer certificate verification, but instead of using a CA cert bundle, it will +use the certificates that are built into the OS. These are the same +certificates that appear in the Internet Options control panel (under Windows) +or Keychain Access application (under OS X). Any custom security rules for +certificates will be honored. + +Schannel will run CRL checks on certificates unless peer verification is +disabled. Secure Transport on iOS will run OCSP checks on certificates unless +peer verification is disabled. Secure Transport on OS X will run either OCSP +or CRL checks on certificates if those features are enabled, and this behavior +can be adjusted in the preferences of Keychain Access. + +HTTPS proxy +----------- + +Since version 7.52.0, curl can do HTTPS to the proxy separately from the +connection to the server. This TLS connection is handled separately from the +server connection so instead of `--insecure` and `--cacert` to control the +certificate verification, you use `--proxy-insecure` and `--proxy-cacert`. +With these options, you make sure that the TLS connection and the trust of the +proxy can be kept totally separate from the TLS connection to the server. diff --git a/bin/curl/docs/THANKS.txt b/bin/curl/docs/THANKS.txt new file mode 100644 index 00000000..abad9619 --- /dev/null +++ b/bin/curl/docs/THANKS.txt @@ -0,0 +1,1959 @@ + This project has been alive for many years. Countless people have provided + feedback that have improved curl. Here follows a list of people that have + contributed (a-z order). + + If you have contributed but are missing here, please let us know! + +"Captain Basil" +"Spoon Man" +Aaro Koskinen +Aaron Oneal +Aaron Orenstein +Aaron Scarisbrick +Abram Pousada +Adam Barclay +Adam Brown +Adam Coyne +Adam D. Moss +Adam Langley +Adam Light +Adam Marcionek +Adam Piggott +Adam Sampson +Adam Tkac +Adrian Burcea +Adrian Peniak +Adrian Schuur +Adriano Meirelles +Ajit Dhumale +Akhil Kedia +Aki Koskinen +Akos Pasztory +Akshay Vernekar +Alain Danteny +Alan Jenkins +Alan Pinstein +Albert Chin-A-Young +Albert Choy +Alejandro Alvarez Ayllon +Alejandro R. Sedeño +Aleksandar Milivojevic +Aleksey Tulinov +Ales Mlakar +Ales Novak +Alessandro Ghedini +Alessandro Vesely +Alex Baines +Alex Bligh +Alex Chan +Alex Fishman +Alex Gruz +Alex Malinovich +Alex McLellan +Alex Neblett +Alex Nichols +Alex Potapenko +Alex Rousskov +Alex Suykov +Alex Vinnik +Alex aka WindEagle +Alexander Beedie +Alexander Dyagilev +Alexander Elgert +Alexander Klauer +Alexander Kourakos +Alexander Krasnostavsky +Alexander Lazic +Alexander Pepper +Alexander Peslyak +Alexander Sinditskiy +Alexander Traud +Alexander Zhuravlev +Alexey Borzov +Alexey Eremikhin +Alexey Melnichuk +Alexey Pesternikov +Alexey Simak +Alexey Zakhlestin +Alexis Carvalho +Alexis La Goutte +Alfonso Martone +Alfred Gebert +Allen Pulsifer +Alona Rossen +Amol Pattekar +Amr Shahin +Anatol Belski +Anatoli Tubman +Anders Bakken +Anders Gustafsson +Anders Havn +Anders Roxell +Anderson Toshiyuki Sasaki +Andi Jahja +Andre Guibert de Bruet +Andre Heinecke +Andreas Damm +Andreas Farber +Andreas Kostyrka +Andreas Malzahn +Andreas Ntaflos +Andreas Olsson +Andreas Rieke +Andreas Roth +Andreas Schneider +Andreas Schuldei +Andreas Streichardt +Andreas Wurf +Andrei Benea +Andrei Cipu +Andrei Karas +Andrei Kurushin +Andrei Neculau +Andrei Sedoi +Andrei Virtosu +Andrej E Baranov +Andrew Benham +Andrew Biggs +Andrew Bushnell +Andrew Francis +Andrew Fuller +Andrew Krieger +Andrew Kurushin +Andrew Lambert +Andrew Moise +Andrew Robbins +Andrew Wansink +Andrew de los Reyes +Andrey Labunets +Andrii Moiseiev +Andrés García +Andy Cedilnik +Andy Serpa +Andy Tsouladze +Angus Mackay +Anthon Pang +Anthony Avina +Anthony Bryan +Anthony G. Basile +Antoine Aubert +Antoine Calando +Anton Bychkov +Anton Gerasimov +Anton Kalmykov +Anton Malov +Anton Yabchinskiy +Antoni Villalonga +Antonio Larrosa +Antony74 on github +Antti Hätälä +Archangel_SDY on github +Arkadiusz Miskiewicz +Armel Asselin +Arnaud Compan +Arnaud Ebalard +Arnaud Rebillout +Aron Bergman +Artak Galoyan +Arthur Murray +Arve Knudsen +Arvid Norberg +Ashish Shukla +Ask Bjørn Hansen +Askar Safin +Ates Goral +Augustus Saunders +Avery Fay +Axel Tillequin +Ayoub Boudhar +Balaji Parasuram +Balaji S Rao +Balaji Salunke +Balint Szilakszi +Barry Abrahamson +Bart Whiteley +Bas Mevissen +Bas van Schaik +Basuke Suzuki +Ben Boeckel +Ben Darnell +Ben Greear +Ben Kohler +Ben Madsen +Ben Noordhuis +Ben Van Hof +Ben Winslow +Benbuck Nason +Benjamin Gerard +Benjamin Gilbert +Benjamin Johnson +Benjamin Kircher +Benjamin Ritcey +Benjamin Sergeant +Benoit Neil +Benoit Sigoure +Bernard Leak +Bernard Spil +Bernd Mueller +Bernhard Iselborn +Bernhard M. Wiedemann +Bernhard Reutner-Fischer +Bernhard Walle +Bert Huijben +Bertrand Demiddelaer +Bertrand Simonnet +Bill Doyle +Bill Egert +Bill Hoffman +Bill Middlecamp +Bill Nagel +Bill Pyne +Bjoern Sikora +Bjorn Augustsson +Bjorn Reese +Björn Stenberg +Blaise Potard +Bob Relyea +Bob Richmond +Bob Schader +Bogdan Nicula +Brad Burdick +Brad Fitzpatrick +Brad Harder +Brad Hards +Brad King +Brad Spencer +Bradford Bruce +Brandon Casey +Brandon Wang +Brendan Jurd +Brent Beardsley +Brian Akins +Brian Carpenter +Brian Chaplin +Brian Childs +Brian Chrisman +Brian Dessent +Brian E. Gallew +Brian J. Murrell +Brian Prodoehl +Brian R Duffy +Brian Ulm +Brock Noland +Bru Rom +Bruce Mitchener +Bruce Stephens +Bruno Grasselli +Bruno Thomsen +Bruno de Carvalho +Bryan Henderson +Bryan Kemp +Byrial Jensen +Cameron Kaiser +Cameron MacMinn +Camille Moncelier +Caolan McNamara +Carie Pointer +Carlo Cannas +Carlo Teubner +Carlo Wood +Carsten Lange +Casey O'Donnell +Catalin Patulea +Chad Monroe +Chandrakant Bagul +Charles Kerr +Charles Romestant +Chen Prog +Chester Liu +Chih-Chung Chang +Chris "Bob Bob" +Chris Araman +Chris Carlmar +Chris Combes +Chris Conlon +Chris Deidun +Chris Faherty +Chris Flerackers +Chris Gaukroger +Chris Maltby +Chris Mumford +Chris Smowton +Chris Young +Christian Fillion +Christian Grothoff +Christian Heimes +Christian Hägele +Christian Krause +Christian Kurz +Christian Robottom Reis +Christian Schmitz +Christian Stewart +Christian Vogt +Christian Weisgerber +Christophe Demory +Christophe Legry +Christopher Conroy +Christopher Head +Christopher Palow +Christopher R. Palmer +Christopher Stone +Chungtsun Li +Ciprian Badescu +Claes Jakobsson +Clarence Gardner +Claudio Neves +Clemens Gruber +Clifford Wolf +Clint Clayton +Cody Jones +Cody Mack +Colby Ranger +Colin Blair +Colin Hogben +Colin Watson +Colm Buckley +Constantine Sapuntzakis +Cory Benfield +Cory Nelson +Costya Shulyupin +Craig A West +Craig Davison +Craig Markwardt +Craig de Stigter +Cris Bailiff +Cristian Rodríguez +Curt Bogmine +Cyril B +Cyrill Osterwalder +Cédric Connes +Cédric Deltheil +D. Flinkmann +Da-Yoon Chung +Dag Ekengren +Dagobert Michelsen +Dair Grant +Dambaev Alexander +Damian Dixon +Damien Adant +Damien Vielpeau +Dan Becker +Dan Cristian +Dan Donahue +Dan Fandrich +Dan Jacobson +Dan Johnson +Dan Locks +Dan McNulty +Dan Nelson +Dan Petitt +Dan Torop +Dan Zitter +Daniel Bankhead +Daniel Black +Daniel Cater +Daniel Egger +Daniel Gustafsson +Daniel Hwang +Daniel Jeliński +Daniel Johnson +Daniel Kahn Gillmor +Daniel Krügler +Daniel Lee Hwang +Daniel Lublin +Daniel Melani +Daniel Mentz +Daniel Romero +Daniel Schauenberg +Daniel Seither +Daniel Shahaf +Daniel Steinberg +Daniel Stenberg +Daniel Theron +Daniel at touchtunes +Daphne Luong +Dario Nieuwenhuis +Dario Weißer +Darryl House +Darshan Mody +Darío Hereñú +Dave Dribin +Dave Halbakken +Dave Hamilton +Dave May +Dave Reisner +Dave Thompson +Dave Vasilevsky +Davey Shafik +David Bau +David Benjamin +David Binderman +David Blaikie +David Byron +David Cohen +David E. Narváez +David Eriksson +David Garske +David Houlder +David Hull +David J Meyer +David James +David Kalnischkies +David Kierznowski +David Kimdon +David L. +David Lang +David LeBlanc +David Lord +David McCreedy +David Odin +David Phillips +David Rosenstrauch +David Ryskalczyk +David Sanderson +David Schweikert +David Shaw +David Strauss +David Tarendash +David Thiel +David Walser +David Woodhouse +David Wright +David Yan +Dengminwen +Denis Feklushkin +Denis Ollier +Dennis Clarke +Derek Higgins +Desmond O. Chang +Detlef Schmier +Dheeraj Sangamkar +Didier Brisebourg +Diego Bes +Diego Casorran +Dilyan Palauzov +Dima Barsky +Dima Pasechnik +Dima Tisnek +Dimitar Boevski +Dimitre Dimitrov +Dimitrios Apostolou +Dimitrios Siganos +Dimitris Sarris +Dinar +Dirk Eddelbuettel +Dirk Feytons +Dirk Manske +Dmitri Shubin +Dmitri Tikhonov +Dmitriy Sergeyev +Dmitry Bartsevich +Dmitry Eremin-Solenikov +Dmitry Falko +Dmitry Kostjuchenko +Dmitry Kurochkin +Dmitry Mikhirev +Dmitry Popov +Dmitry Rechkin +Dmitry S. Baikov +Dolbneff A.V +Domenico Andreoli +Dominick Meglio +Dominik Hölzl +Dominique Leuenberger +Don J Olmstead +Dongliang Mu +Doron Behar +Doug Kaufman +Doug Porter +Douglas Creager +Douglas E. Wegscheid +Douglas Kilpatrick +Douglas Mencken +Douglas R. Horner +Douglas Steinwand +Dov Murik +Drake Arconis +Duane Cathey +Duncan Mac-Vicar Prett +Dustin Boswell +Dusty Mabe +Duy Phan Thanh +Dwarakanath Yadavalli +Dylan Ellicott +Dylan Salisbury +Dániel Bakai +Early Ehlinger +Earnestly on github +Eason-Yu on github +Ebenezer Ikonne +Ed Morley +Edin Kadribasic +Eduard Bloch +Edward Kimmel +Edward Rudd +Edward Sheldrake +Edward Thomson +Eelco Dolstra +Eetu Ojanen +Egon Eckert +Eldar Zaitov +Eli Schwartz +Elia Tufarolo +Elliot Saba +Ellis Pritchard +Elmira A Semenova +Emanuele Bovisio +Emil Lerner +Emil Romanus +Emiliano Ida +Emmanuel Tychon +Enrico Scholz +Enrik Berkhan +Eramoto Masaya +Eric Cooper +Eric Curtin +Eric Gallager +Eric Hu +Eric Landes +Eric Lavigne +Eric Lubin +Eric Melville +Eric Mertens +Eric Rautman +Eric Rescorla +Eric Ridge +Eric Rosenquist +Eric S. Raymond +Eric Thelin +Eric Vergnaud +Eric Wong +Eric Young +Erick Nuwendam +Erik Jacobsen +Erik Janssen +Erik Johansson +Erik Minekus +Ernest Beinrohr +Ernst Sjöstrand +Erwan Legrand +Erwin Authried +Ethan Glasser Camp +Etienne Simard +Eugene Kotlyarov +Evan Jordan +Even Rouault +Evert Pot +Evgeny Grin +Evgeny Turnaev +Eygene Ryabinkin +Fabian Frank +Fabian Hiernaux +Fabian Keil +Fabian Ruff +Fabrice Fontaine +Fabrizio Ammollo +Fahim Chandurwala +Federico Bianchi +Fedor Karpelevitch +Feist Josselin +Felix Hädicke +Felix Kaiser +Felix Yan +Felix von Leitner +Feng Tu +Fernando Muñoz +Flavio Medeiros +Florian Pritz +Florian Schoppmann +Florian Weimer +Florin Petriuc +Forrest Cahoon +Francisco Moraes +Francisco Sedano +Francois Petitjean +Frank Denis +Frank Gevaerts +Frank Hempel +Frank Keeney +Frank McGeough +Frank Meier +Frank Ticheler +Frank Van Uffelen +František Kučera +François Charlier +Fred Machado +Fred New +Fred Noz +Fred Stluka +Frederic Lepied +Frederik B +Fredrik Thulin +Gabriel Kuri +Gabriel Sjoberg +Garrett Holmstrom +Gary Maxwell +Gaurav Malhotra +Gautam Kachroo +Gautam Mani +Gavrie Philipson +Gaz Iqbal +Gaël Portay +Geeknik Labs +Geoff Beier +Georg Horn +Georg Huettenegger +Georg Lippitsch +Georg Wicherski +Gerd v. Egidy +Gergely Nagy +Gerhard Herre +Gerrit Bruchhäuser +Ghennadi Procopciuc +Giancarlo Formicuccia +Giaslas Georgios +Gil Weber +Gilad +Gilbert Ramirez Jr. +Gilles Blanc +Giorgos Oikonomou +Gisle Vanem +GitYuanQu on github +Giuseppe Attardi +Giuseppe D'Ambrosio +Giuseppe Persico +Glen A Johnson Jr. +Glen Nakamura +Glen Scott +Glenn Sheridan +Google Inc. +Gordon Marler +Gorilla Maguila +Gou Lingfeng +Grant Erickson +Grant Pannell +Greg Hewgill +Greg Morse +Greg Onufer +Greg Pratt +Greg Rowe +Greg Zavertnik +Gregory Nicholls +Gregory Szorc +Grigory Entin +Guenole Bescon +Guido Berhoerster +Guillaume Arluison +Gunter Knauf +Gustaf Hui +Gustavo Grieco +Guy Poizat +GwanYeong Kim +Gwenole Beauchesne +Gökhan Şengün +Götz Babin-Ebell +Hagai Auro +Haibo Huang +Hamish Mackenzie +Han Han +Han Qiao +Hang Kin Lau +Hang Su +Hannes Magnusson +Hanno Böck +Hanno Kranzhoff +Hans Steegers +Hans-Jurgen May +Hardeep Singh +Haris Okanovic +Harold Stuart +Harry Sintonen +Harshal Pradhan +Hauke Duden +He Qin +Heikki Korpela +Heinrich Ko +Heinrich Schaefer +Helge Klein +Helmut K. C. Tessarek +Helwing Lutz +Hendrik Visage +Henri Gomez +Henrik Gaßmann +Henrik Storner +Henry Ludemann +Henry Roeland +Herve Amblard +Hidemoto Nakada +Ho-chi Chen +Hoi-Ho Chan +Hongli Lai +Howard Blaise +Howard Chu +Hubert Kario +Huzaifa Sidhpurwala +Hzhijun +Ian D Allen +Ian Fette +Ian Ford +Ian Gulliver +Ian Lynagh +Ian Turner +Ian Wilkes +Ignacio Vazquez-Abrams +Igor Franchuk +Igor Khristophorov +Igor Novoseltsev +Igor Polyakov +Ihor Karpenko +Iida Yosiaki +Ilguiz Latypov +Ilja van Sprundel +Immanuel Gregoire +Inca R +Ingmar Runge +Ingo Ralf Blum +Ingo Wilken +Irfan Adilovic +Irving Wolfe +Isaac Boukris +Isaiah Norton +Ishan SinghLevett +Ithubg on github +Ivan Avdeev +Ivo Bellin Salarin +Jack Zhang +Jackarain on github +Jacky Lam +Jacob Meuser +Jacob Moshenko +Jactry Zeng +Jad Chamcham +Jaime Fullaondo +Jakub Wilk +Jakub Zakrzewski +James Atwill +James Brown +James Bursa +James Cheng +James Clancy +James Cone +James Dury +James Gallagher +James Griffiths +James Housley +James Knight +James MacMillan +James Slaughter +Jamie Lokier +Jamie Newton +Jamie Wilkinson +Jan Alexander Steffens +Jan Ehrhardt +Jan Koen Annot +Jan Kunder +Jan Schaumann +Jan Schmidt +Jan Van Boghout +Janne Johansson +Jared Jennings +Jared Lundell +Jari Aalto +Jari Sundell +Jason Baietto +Jason Glasgow +Jason Juang +Jason Liu +Jason McDonald +Jason S. Priebe +Javier Barroso +Javier Blazquez +Javier G. Sogo +Javier Sixto +Jay Austin +Jayesh A Shah +Jaz Fresh +Jean Fabrice +Jean Gressmann +Jean Jacques Drouin +Jean-Claude Chauve +Jean-Francois Bertrand +Jean-Francois Durand +Jean-Louis Lemaire +Jean-Marc Ranger +Jean-Noël Rouvignac +Jean-Philippe Barrette-LaPierre +Jeff Connelly +Jeff Hodges +Jeff Johnson +Jeff King +Jeff Lawson +Jeff Phillips +Jeff Pohlmeyer +Jeff Weber +Jeffrey Walton +Jens Rantil +Jens Schleusener +Jeremie Rapin +Jeremy Friesner +Jeremy Huddleston +Jeremy Lin +Jeremy Pearson +Jeremy Tan +Jeroen Koekkoek +Jeroen Ooms +Jerome Muffat-Meridol +Jerome Robert +Jerome Vouillon +Jerry Krinock +Jerry Wu +Jes Badwal +Jesper Jensen +Jesse Chisholm +Jesse Noller +Jesse Tan +Jie He +Jim Drash +Jim Freeman +Jim Fuller +Jim Hollinger +Jim Meyering +Jiri Dvorak +Jiri Hruska +Jiri Jaburek +Jiří Malák +Jocelyn Jaubert +Joe Halpin +Joe Malicki +Joe Mason +Joel Chen +Joel Depooter +Jofell Gallardo +Johan Anderson +Johan Lantz +Johan Nilsson +Johan van Selst +Johannes Bauer +Johannes Ernst +Johannes G. Kristinsson +Johannes Schindelin +John A. Bristor +John Bradshaw +John Butterfield +John Coffey +John Crow +John David Anglin +John DeHelian +John Dennis +John Dunn +John E. Malmberg +John Gardiner Myers +John Hascall +John Janssen +John Joseph Bachir +John Kelly +John Kohl +John Lask +John Levon +John Lightsey +John Marino +John Marshall +John McGowan +John P. McCaskey +John Starks +John Suprock +John V. Chow +John Wanghui +John Weismiller +John Wilkinson +John-Mark Bell +Johnny Luong +Jon DeVree +Jon Grubbs +Jon Nelson +Jon Sargeant +Jon Seymour +Jon Spencer +Jon Torrey +Jon Travis +Jon Turner +Jonas Forsman +Jonas Minnberg +Jonas Schnelli +Jonatan Lander +Jonatan Vela +Jonathan Cardoso Machado +Jonathan Hseu +Jonathan Moerman +Jonathan Nieder +Jongki Suwandi +Joombalaya on github +Joonas Kuorilehto +Jose Alf +Jose Kahan +Josef Wolf +Josh Bialkowski +Josh Kapell +Joshua Kwan +Joshua Swink +Josue Andrade Gomes +Jozef Kralik +Juan Barreto +Juan F. Codagnone +Juan Ignacio Hervás +Juan RP +Judson Bishop +Juergen Wilke +Jukka Pihl +Julian Noble +Julian Ospald +Julian Romero Nieto +Julian Taylor +Julian Z +Julien Chaffraix +Julien Nabet +Julien Royer +Jun-ichiro itojun Hagino +Jurij Smakov +Juro Bystricky +Justin Clift +Justin Ehlert +Justin Fletcher +Justin Karneges +Justin Maggard +János Fekete +Jérémy Rocher +Jörg Mueller-Tolk +Jörn Hartroth +K. R. Walker +Kai Engert +Kai Noda +Kai Sommerfeld +Kai-Uwe Rommel +Kalle Vahlman +Kamil Dudka +Kang Lin +Kang-Jin Lee +Karl Moerder +Karol Pietrzak +Kartik Mahajan +Kaspar Brand +Katie Wang +Katsuhiko YOSHIDA +Kazuho Oku +Kees Cook +Kees Dekker +Keith MacDonald +Keith McGuigan +Keith Mok +Ken Hirsch +Ken Rastatter +Kenny To +Kent Boortz +Keshav Krity +Kevin Baughman +Kevin Fisk +Kevin Ji +Kevin Lussier +Kevin R. Bulgrien +Kevin Reed +Kevin Roth +Kevin Smith +Kim Minjoong +Kim Rinnewitz +Kim Vandry +Kimmo Kinnunen +Kirill Marchuk +Kjell Ericson +Kjetil Jacobsen +Klaus Stein +Klevtsov Vadim +Kobi Gurkan +Konstantin Isakov +Konstantin Kushnir +Kris Kennaway +Krishnendu Majumdar +Krister Johansen +Kristian Gunstone +Kristian Köhntopp +Kristiyan Tsaklev +Kristoffer Gleditsch +Kurt Fankhauser +Kyle J. McKay +Kyle L. Huff +Kyle Sallee +Kyselgov E.N +Lachlan O'Dea +Ladar Levison +Larry Campbell +Larry Fahnoe +Larry Lin +Larry Stefani +Larry Stone +Lars Buitinck +Lars Gustafsson +Lars J. Aas +Lars Johannesen +Lars Nilsson +Lars Torben Wilson +Laurent Bonnans +Laurent Rabret +Lauri Kasanen +Laurie Clark-Michalek +Lawrence Matthews +Lawrence Wagerfield +Legoff Vincent +Lehel Bernadt +Leif W +Leigh Purdie +Leith Bade +Len Krause +Len Marinaccio +Lenaic Lefever +Lenny Rachitsky +Leon Breedt +Leon Winter +Leonardo Rosati +Leonardo Taccari +Liam Healy +Lijo Antony +Linas Vepstas +Lindley French +Ling Thio +Linus Lewandowski +Linus Nielsen Feltzing +Linus Nordberg +Lior Kaplan +Lisa Xu +Liviu Chircu +Liza Alenchery +Lloyd Fournier +Lluís Batlle i Rossell +Loganaden Velvindron +Loic Dachary +Loren Kirkby +Luan Cestari +Luca Altea +Luca Boccassi +Lucas Adamski +Lucas Pardue +Ludek Finstrle +Ludovico Cavedon +Ludwig Nussel +Lukas Ruzicka +Lukasz Czekierda +Luke Amery +Luke Call +Luke Dashjr +Luo Jinghua +Luong Dinh Dung +Luz Paz +Luật Nguyễn +Lyman Epp +Lyndon Hill +MAntoniak on github +Maciej Karpiuk +Maciej Puzio +Maciej W. Rozycki +Mahmoud Samir Fayed +Maks Naumov +Maksim Kuzevanov +Maksim Stsepanenka +Mamoru Tasaka +Mamta Upadhyay +Mandy Wu +Manfred Schwarb +Manuel Massing +Marc Aldorasi +Marc Boucher +Marc Deslauriers +Marc Doughty +Marc Hesse +Marc Hörsken +Marc Kleine-Budde +Marc Renault +Marc Schlatter +Marc-Antoine Perennou +Marcel Raad +Marcel Roelofs +Marcelo Echeverria +Marcelo Juchem +Marcin Adamski +Marcin Gryszkalis +Marcin Konicki +Marco Deckel +Marco G. Salvagno +Marco Maggi +Marcos Diazr +Marcus Hoffmann +Marcus Klein +Marcus Sundberg +Marcus Webster +Marian Klymov +Mario Schroeder +Mark Brand +Mark Butler +Mark Davies +Mark Hamilton +Mark Incley +Mark Karpeles +Mark Lentczner +Mark Nottingham +Mark Salisbury +Mark Snelling +Mark Tully +Mark W. Eichin +Mark Wotton +Markus Duft +Markus Elfring +Markus Koetter +Markus Moeller +Markus Oberhumer +Markus Westerlind +Marquis de Muesli +Martijn Koster +Martin Ankerl +Martin C. Martin +Martin Drasar +Martin Dreher +Martin Frodl +Martin Galvan +Martin Hager +Martin Hedenfalk +Martin Jansen +Martin Kammerhofer +Martin Kepplinger +Martin Lemke +Martin Skinner +Martin Staael +Martin Storsjö +Martin Vejnár +Marty Kuhrt +Maruko +Massimiliano Ziccardi +Massimo Callegari +Mateusz Loskot +Mathias Axelsson +Mathieu Legare +Mats Lidell +Matt Arsenault +Matt Ford +Matt Kraai +Matt McClure +Matt Veenstra +Matt Witherspoon +Matt Wixson +Matteo Bignotti +Matteo Bignottignotti +Matteo Rocco +Matthew Blain +Matthew Clarke +Matthew Hall +Matthew Kerwin +Matthew Whitehead +Matthias Bolte +Mattias Fornander +Matus Uzak +Maurice Barnum +Mauro Iorio +Mauro Rappa +Max Dymond +Max Katsev +Max Khon +Max Savenkov +Maxim Ivanov +Maxim Perenesenko +Maxim Prohorov +Maxime Larocque +Maxime Legros +Mehmet Bozkurt +Mekonikum +Melissa Mears +Mert Yazıcıoğlu +Mettgut Jamalla +Michael Anti +Michael Benedict +Michael Calmer +Michael Cronenworth +Michael Curtis +Michael Day +Michael Felt +Michael Gmelin +Michael Goffioul +Michael Jahn +Michael Jerris +Michael Kalinin +Michael Kaufmann +Michael Kilburn +Michael Kujawa +Michael König +Michael Maltese +Michael Mealling +Michael Mueller +Michael Osipov +Michael Schmid +Michael Smith +Michael Stapelberg +Michael Steuer +Michael Stillwell +Michael Wallner +Michal Bonino +Michal Marek +Michal Trybus +Michał Antoniak +Michał Fita +Michał Górny +Michał Janiszewski +Michał Kowalczyk +Michał Piechowski +Michel Promonet +Michele Bini +Miguel Angel +Miguel Diaz +Mihai Ionescu +Mikael Johansson +Mikael Sennerholm +Mikalai Ananenka +Mike Bytnar +Mike Crowe +Mike Dobbs +Mike Dowell +Mike Giancola +Mike Hasselberg +Mike Henshaw +Mike Hommey +Mike Mio +Mike Power +Mike Protts +Mike Revi +Miklos Nemeth +Miloš Ljumović +Mingliang Zhu +Miroslav Franc +Miroslav Spousta +Mitz Wark +Mohamed Lrhazi +Mohammad AlSaleh +Mohun Biswas +Mostyn Bramley-Moore +Moti Avrahami +Muz Dima +Myk Taylor +NTMan on Github +Nach M. S. +Nagai H +Nate Prewitt +Nathan Coulter +Nathan O'Sullivan +Nathanael Nerode +Nathaniel Waisbrot +Naveen Chandran +Naveen Noel +Neal Poole +Nehal J Wani +Neil Bowers +Neil Dunbar +Neil Kolban +Neil Spring +Nic Roets +Nicholas Maniscalco +Nick Draffen +Nick Gimbrone +Nick Humfrey +Nick Miyake +Nick Zitzmann +Nicklas Avén +Nico Baggus +Nicolas Berloquin +Nicolas Croiset +Nicolas François +Nicolas Grekas +Nicolas Morey-Chaisemartin +Niels van Tongeren +Nikita Schmidt +Nikitinskit Dmitriy +Niklas Angebrand +Nikolai Kondrashov +Nikos Mavrogiannopoulos +Nikos Tsipinakis +Ning Dong +Nir Soffer +Nis Jorgensen +Nobuhiro Ban +Nodak Sodak +Norbert Frese +Norbert Kett +Norbert Novotny +Octavio Schroeder +Ofer +Okhin Vasilij +Ola Mork +Olaf Flebbe +Olaf Stüben +Oleg Pudeyev +Olen Andoni +Oli Kingshott +Oliver Gondža +Oliver Graute +Oliver Kuckertz +Oliver Schindler +Olivier Berger +Olivier Brunel +Omar Ramadan +Orange Tsai +Oren Souroujon +Oren Tirosh +Orgad Shaneh +Ori Avtalion +Oscar Koeroo +Oscar Norlander +Oskar Liljeblad +Oumph on github +P R Schaffner +Palo Markovic +Paolo Mossino +Paolo Piacentini +Paras Sethia +Pascal Gaudette +Pascal Terjan +Pasha Kuznetsov +Pasi Karkkainen +Pat Ray +Patrice Guerin +Patricia Muscalu +Patrick Bihan-Faou +Patrick Dawson +Patrick McManus +Patrick Monnerat +Patrick Rapin +Patrick Schlangen +Patrick Scott +Patrick Smith +Patrick Watson +Patrik Thunstrom +Pau Garcia i Quiles +Paul Donohue +Paul Groke +Paul Harrington +Paul Harris +Paul Howarth +Paul Joyce +Paul Marks +Paul Marquis +Paul Moore +Paul Nolan +Paul Oliver +Paul Querna +Paul Saab +Pavel Cenek +Pavel Gushchin +Pavel Löbl +Pavel Orehov +Pavel Pavlov +Pavel Raiskup +Pavel Rochnyak +Pavol Markovic +Pawel A. Gajda +Pawel Kierski +Pedro Larroy +Pedro Neves +Peng Li +Per Lundberg +Per Malmberg +Pete Lomax +Peter Bray +Peter Forret +Peter Frühberger +Peter Gal +Peter Heuchert +Peter Hjalmarsson +Peter Korsgaard +Peter Lamare +Peter Lamberg +Peter Laser +Peter O'Gorman +Peter Pentchev +Peter Piekarski +Peter Silva +Peter Su +Peter Sylvester +Peter Todd +Peter Varga +Peter Verhas +Peter Wang +Peter Wu +Peter Wullinger +Peteris Krumins +Petr Bahula +Petr Novak +Petr Pisar +Petr Voytsik +Phil Blundell +Phil Crump +Phil Karn +Phil Lisiecki +Phil Pellouchoud +Philip Craig +Philip Gladstone +Philip Langdale +Philip Prindeville +Philipp Waehnert +Philippe Hameau +Philippe Raoult +Philippe Vaucher +Pierre +Pierre Brico +Pierre Chapuis +Pierre Joye +Pierre Ynard +Piotr Dobrogost +Po-Chuan Hsieh +Pooyan McSporran +Poul T Lomholt +Pramod Sharma +Prash Dush +Praveen Pvs +Priyanka Shah +Przemysław Tomaszewski +Puneet Pawaia +Quagmire +Quanah Gibson-Mount +Quinn Slack +R. Dennis Steed +Radu Simionescu +Rafa Muyo +Rafael Antonio +Rafael Sagula +Rafayel Mkrtchyan +Rafaël Carré +Rainer Canavan +Rainer Jung +Rainer Koenig +Rainer Müller +Rajesh Naganathan +Rajkumar Mandal +Ralf S. Engelschall +Ralph Beckmann +Ralph Mitchell +Ran Mozes +Randall S. Becker +Randy Armstrong +Randy McMurchy +Raphael Gozzo +Ravi Pratap +Ray Dassen +Ray Pekowski +Ray Satiro +Razvan Cojocaru +Reed Loden +Reinhard Max +Reinout van Schouwen +Remco van Hooff +Remi Gacogne +Remo E +Renato Botelho +Renaud Allard +Renaud Chaillat +Renaud Duhaut +Renaud Guillard +Renaud Lehoux +Rene Bernhardt +Rene Rebe +Reuven Wachtfogel +Reza Arbab +Ricardo Cadime +Ricardo Gomes +Rich Burridge +Rich Gray +Rich Rauenzahn +Rich Turner +Richard Adams +Richard Alcock +Richard Archer +Richard Atterer +Richard Bramante +Richard Clayton +Richard Cooper +Richard Gorton +Richard Gray +Richard Hosking +Richard Hsu +Richard Michael +Richard Moore +Richard Prescott +Richard Silverman +Richard van den Berg +Richy Kim +Rick Deist +Rick Jones +Rick Richardson +Rick Welykochy +Ricki Hirner +Ricky Leverence +Ricky-Tigg on github +Rider Linden +Rikard Falkeborn +Rob Cotrone +Rob Crittenden +Rob Davies +Rob Jones +Rob Sanders +Rob Stanzel +Rob Ward +Robert A. Monat +Robert B. Harris +Robert D. Young +Robert Foreman +Robert Iakobashvili +Robert Kolcun +Robert Linden +Robert Olson +Robert Prag +Robert Schumann +Robert Weaver +Robert Wruck +Robin Cornelius +Robin Johnson +Robin Kay +Robson Braga Araujo +Rod Widdowson +Rodger Combs +Rodney Simmons +Rodric Glaser +Rodrigo Silva +Roger Leigh +Roland Blom +Roland Krikava +Roland Zimmermann +Rolland Dudemaine +Romain Coltel +Romain Fliedel +Romain Geissler +Roman Koifman +Roman Mamedov +Romulo A. Ceccon +Ron Eldor +Ron Parker +Ron Zapp +Ronnie Mose +Rosimildo da Silva +Roy Bellingan +Roy Shan +Rune Kleveland +Ruslan Baratov +Ruslan Gazizov +Rutger Hofman +Ruurd Beerstra +Ryan Braud +Ryan Chan +Ryan Nelson +Ryan Schmidt +Ryan Scott +Ryan Winograd +Ryuichi KAWAMATA +Rémy Léone +S. Moonesamy +SBKarr on github +Salah-Eddin Shaban +Salvador Dávila +Salvatore Sorrentino +Sam Deane +Sam Hurst +Sam Roth +Sam Schanken +Sampo Kellomaki +Samuel Díaz García +Samuel Listopad +Samuel Surtees +Samuel Thibault +Sander Gates +Sandor Feldi +Santhana Todatry +Saqib Ali +Sara Golemon +Saran Neti +Sascha Swiercy +Saul good +Saurav Babu +Scott Bailey +Scott Barrett +Scott Cantor +Scott Davis +Scott McCreary +Sean Boudreau +Sean Burford +Sean MacLennan +Sean Miller +Sebastiaan van Erk +Sebastian Mundry +Sebastian Pohlschmidt +Sebastian Rasmussen +Senthil Raja Velu +Sergei Kuzmin +Sergei Nikulov +Sergey Tatarincev +Sergii Kavunenko +Sergii Pylypenko +Sergio Ballestrero +Sergio Barresi +Sergio Borghese +Serj Kalichev +Seshubabu Pasam +Seth Mos +Sevan Janiyan +Sh Diao +Shachaf Ben-Kiki +Shao Shuchao +Sharad Gupta +Shard +Shaun Jackman +Shawn Landden +Shawn Poulson +Shine Fan +Shiraz Kanga +Shlomi Fish +Shmulik Regev +Siddhartha Prakash Jain +Sidney San Martín +Siegfried Gyuricsko +Simon Dick +Simon H. +Simon Josefsson +Simon Legner +Simon Liu +Simon Warta +Somnath Kundu +Song Ma +Sonia Subramanian +Spacen Jasset +Spiridonoff A.V +Spork Schivago +Stadler Stephan +Stan van de Burgt +Stanislav Ivochkin +Stanislav Zidek +Stefan Agner +Stefan Bühler +Stefan Eissing +Stefan Esser +Stefan Grether +Stefan Kanthak +Stefan Krause +Stefan Neis +Stefan Teleman +Stefan Tomanek +Stefan Ulrich +Steinar H. Gunderson +Stepan Broz +Stephan Bergmann +Stephan Lagerholm +Stephan Mühlstrasser +Stephen Brokenshire +Stephen Collyer +Stephen Kick +Stephen More +Stephen Toub +Sterling Hughes +Steve Brokenshire +Steve Green +Steve H Truong +Steve Havelka +Steve Holme +Steve Lhomme +Steve Little +Steve Marx +Steve Oliphant +Steve Roskowski +Steve Walch +Steven Bazyl +Steven G. Johnson +Steven Gu +Steven M. Schweda +Steven Parkes +Stoned Elipot +Stuart Henderson +Sune Ahlgren +Sunny Purushe +Sven Anders +Sven Blumenstein +Sven Neuhaus +Sven Wegener +Svyatoslav Mishyn +Sylvestre Ledru +Symeon Paraschoudis +Sébastien Willemijns +T. Bharath +T. Yamada +TJ Saunders +Tae Hyoung Ahn +Tae Wong +Taiyu Len +Taneli Vähäkangas +Tanguy Fautre +Tatsuhiro Tsujikawa +Teemu Yli-Elsila +Temprimus +Terri Oda +Terry Wu +TheAssassin on github +Theodore Dubois +Thomas Braun +Thomas Glanzmann +Thomas J. Moore +Thomas Klausner +Thomas L. Shinnick +Thomas Lopatic +Thomas Petazzoni +Thomas Ruecker +Thomas Schwinge +Thomas Tonino +Thomas van Hesteren +Thorsten Schöning +Tiit Pikma +Till Maas +Tim Ansell +Tim Baker +Tim Bartley +Tim Chen +Tim Costello +Tim Harder +Tim Heckman +Tim Mcdonough +Tim Newsome +Tim Rühsen +Tim Sneddon +Tim Stack +Tim Starling +Tim Tassonis +Tim Verhoeven +Timo Sirainen +Timotej Lazar +Timothe Litt +Timothy Polich +Tinus van den Berg +Tobias Blomberg +Tobias Hintze +Tobias Lindgren +Tobias Markus +Tobias Rundström +Tobias Stoeckmann +Toby Peterson +Todd A Ouska +Todd Kaufmann +Todd Kulesza +Todd Short +Todd Vierling +Tom Benoist +Tom Donovan +Tom Grace +Tom Lee +Tom Mattison +Tom Moers +Tom Mueller +Tom Regner +Tom Seddon +Tom Sparrow +Tom Wright +Tom Zerucha +Tom van der Woerdt +Tomas Hoger +Tomas Jakobsson +Tomas Mlcoch +Tomas Mraz +Tomas Pospisek +Tomas Szepe +Tomas Tomecek +Tomasz Kojm +Tomasz Lacki +Tommie Gannert +Tommy Tam +Ton Voon +Toni Moreno +Tony Kelman +Toon Verwaest +Tor Arntsen +Torben Dannhauer +Torsten Foertsch +Toshio Kuratomi +Toshiyuki Maezawa +Traian Nicolescu +Travis Burtrum +Travis Obenhaus +Troels Walsted Hansen +Troy Engel +Tseng Jun +Tuomo Rinne +Tupone Alfredo +Tyler Hall +Török Edwin +Ulf Härnhammar +Ulf Samuelsson +Ulrich Doehner +Ulrich Telle +Ulrich Zadow +Valentin David +Vasiliy Faronov +Vasy Okhin +Venkat Akella +Venkataramana Mokkapati +Vicente Garcia +Victor Snezhko +Vijay Panghal +Vikram Saxena +Viktor Szakats +Ville Skyttä +Vilmos Nebehaj +Vincas Razma +Vincent Bronner +Vincent Le Normand +Vincent Penquerc'h +Vincent Sanders +Vincent Torri +Vlad Grachov +Vlad Ureche +Vladimir Grishchenko +Vladimir Kotal +Vladimir Lazarenko +Vojtech Janota +Vojtech Minarik +Vojtěch Král +Volker Schmid +Vsevolod Novikov +W. Mark Kubacki +Waldek Kozba +Walter J. Mack +Ward Willats +Warren Menzer +Wayne Haigh +Wenchao Li +Wenxiang Qian +Werner Koch +Wesley Laxton +Wesley Miaw +Wez Furlong +Wham Bang +Wilfredo Sanchez +Will Dietz +Willem Sparreboom +William A. Rowe Jr +William Ahern +Wojciech Zwiefka +Wouter Van Rooy +Wu Yongzheng +Wyatt O'Day +Xavier Bouchoux +XhstormR on github +Xiangbin Li +XmiliaH on github +Yaakov Selkowitz +Yang Tse +Yarram Sunil +Yasuharu Yamada +Yasuhiro Matsumoto +Yehezkel Horowitz +Yehoshua Hershberg +Yi Huang +Yiming Jing +Yingwei Liu +Yonggang Luo +Yousuke Kimoto +Yu Xin +Yukihiro Kawada +Yun SangHo +Yuriy Sosov +Yves Arrouye +Yves Lejeune +Zachary Seguin +Zdenek Pavlas +Zekun Ni +Zenju on github +Zero King +Zhao Yisha +Zhaoyang Wu +Zhibiao Wu +Zhouyihai Ding +Zmey Petroff +Zvi Har'El +accountantM on github +adnn on github +afrind on github +ahodesuka on github +anshnd on github +arainchik on github +asavah on github +baumanj on github +bobmitchell1956 on github +bsammon on github +buzo-ffm on github +cbartl on github +cclauss on github +clbr on github +cmfrolick on github +d912e3 on github +daboul on github +dasimx on github +destman on github +dkjjr89 on github +dnivras on github +dpull on github +dtmsecurity on github +eXeC64 on github +elelel on github +elephoenix on github +guitared on github +hsiao yi +imilli on github +infinnovation-dev on github +iz8mbw on github +jakirkham on github +jasal82 on github +jnbr on github +jonrumsey on github +joshhe on github +jungle-boogie on github +jveazey on github +ka7 on github +kreshano on github +l00p3r on Hackerone +lijian996 on github +lukaszgn on github +madblobfish on github +marc-groundctl on github +masbug on github +mccormickt12 on github +mkzero on github +moohoorama on github +nedres on github +neex on github +neheb on github +nevv on HackerOne/curl +nianxuejie on github +niner on github +nk +nopjmp on github +olesteban on github +omau on github +ovidiu-benea on github +patelvivekv1993 on github +pszemus on github +silveja1 on github +steelman on github +steini2000 on github +stootill on github +swalkaus at yahoo.com +tarek112 on github +tholin on github +tommink[at]post.pl +tonystz on Github +tpaukrt on github +vanillajonathan on github +wesinator on github +wmsch on github +wncboy on github +youngchopin on github +zelinchen on github +zzq1015 on github +İsmail Dönmez +Łukasz Domeradzki +Štefan Kremeň +Никита Дорохин diff --git a/bin/curl/docs/TODO.txt b/bin/curl/docs/TODO.txt new file mode 100644 index 00000000..912eefc1 --- /dev/null +++ b/bin/curl/docs/TODO.txt @@ -0,0 +1,1324 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + Things that could be nice to do in the future + + Things to do in project curl. Please tell us what you think, contribute and + send us patches that improve things! + + Be aware that these are things that we could do, or have once been considered + things we could do. If you want to work on any of these areas, please + consider bringing it up for discussions first on the mailing list so that we + all agree it is still a good idea for the project! + + All bugs documented in the KNOWN_BUGS document are subject for fixing! + + 1. libcurl + 1.1 TFO support on Windows + 1.2 More data sharing + 1.3 struct lifreq + 1.4 signal-based resolver timeouts + 1.5 get rid of PATH_MAX + 1.6 Modified buffer size approach + 1.7 Support HTTP/2 for HTTP(S) proxies + 1.8 CURLOPT_RESOLVE for any port number + 1.9 Cache negative name resolves + 1.10 auto-detect proxy + 1.11 minimize dependencies with dynamically loaded modules + 1.12 updated DNS server while running + 1.13 c-ares and CURLOPT_OPENSOCKETFUNCTION + 1.14 Typesafe curl_easy_setopt() + 1.15 Monitor connections in the connection pool + 1.16 Try to URL encode given URL + 1.17 Add support for IRIs + 1.18 try next proxy if one doesn't work + 1.20 SRV and URI DNS records + 1.21 Have the URL API offer IDN decoding + 1.22 CURLINFO_PAUSE_STATE + 1.23 Offer API to flush the connection pool + 1.24 TCP Fast Open for windows + 1.25 Expose tried IP addresses that failed + 1.26 CURL_REFUSE_CLEARTEXT + 1.27 hardcode the "localhost" addresses + 1.28 FD_CLOEXEC + 1.29 Upgrade to websockets + 1.30 config file parsing + + 2. libcurl - multi interface + 2.1 More non-blocking + 2.2 Better support for same name resolves + 2.3 Non-blocking curl_multi_remove_handle() + 2.4 Split connect and authentication process + 2.5 Edge-triggered sockets should work + 2.6 multi upkeep + + 3. Documentation + 3.2 Provide cmake config-file + + 4. FTP + 4.1 HOST + 4.2 Alter passive/active on failure and retry + 4.3 Earlier bad letter detection + 4.4 REST for large files + 4.5 ASCII support + 4.6 GSSAPI via Windows SSPI + 4.7 STAT for LIST without data connection + 4.8 Option to ignore private IP addresses in PASV response + + 5. HTTP + 5.1 Better persistency for HTTP 1.0 + 5.2 support FF3 sqlite cookie files + 5.3 Rearrange request header order + 5.4 Allow SAN names in HTTP/2 server push + 5.5 auth= in URLs + 5.6 Refuse "downgrade" redirects + 5.7 QUIC + + 6. TELNET + 6.1 ditch stdin + 6.2 ditch telnet-specific select + 6.3 feature negotiation debug data + + 7. SMTP + 7.1 Pipelining + 7.2 Enhanced capability support + 7.3 Add CURLOPT_MAIL_CLIENT option + + 8. POP3 + 8.1 Pipelining + 8.2 Enhanced capability support + + 9. IMAP + 9.1 Enhanced capability support + + 10. LDAP + 10.1 SASL based authentication mechanisms + + 11. SMB + 11.1 File listing support + 11.2 Honor file timestamps + 11.3 Use NTLMv2 + 11.4 Create remote directories + + 12. New protocols + 12.1 RSYNC + + 13. SSL + 13.1 Disable specific versions + 13.2 Provide mutex locking API + 13.3 Support in-memory certs/ca certs/keys + 13.4 Cache/share OpenSSL contexts + 13.5 Export session ids + 13.6 Provide callback for cert verification + 13.7 improve configure --with-ssl + 13.8 Support DANE + 13.9 Configurable loading of OpenSSL configuration file + 13.10 Support Authority Information Access certificate extension (AIA) + 13.11 Support intermediate & root pinning for PINNEDPUBLICKEY + 13.12 Support HSTS + 13.13 Support HPKP + 13.14 Support the clienthello extension + + 14. GnuTLS + 14.1 SSL engine stuff + 14.2 check connection + + 15. WinSSL/SChannel + 15.1 Add support for client certificate authentication + 15.3 Add support for the --ciphers option + 15.4 Add option to disable client certificate auto-send + + 16. SASL + 16.1 Other authentication mechanisms + 16.2 Add QOP support to GSSAPI authentication + 16.3 Support binary messages (i.e.: non-base64) + + 17. SSH protocols + 17.1 Multiplexing + 17.2 SFTP performance + 17.3 Support better than MD5 hostkey hash + 17.4 Support CURLOPT_PREQUOTE + + 18. Command line tool + 18.1 sync + 18.2 glob posts + 18.3 prevent file overwriting + 18.4 simultaneous parallel transfers + 18.5 UTF-8 filenames in Content-Disposition + 18.6 warning when setting an option + 18.8 offer color-coded HTTP header output + 18.9 Choose the name of file in braces for complex URLs + 18.10 improve how curl works in a windows console window + 18.11 Windows: set attribute 'archive' for completed downloads + 18.12 keep running, read instructions from pipe/socket + 18.13 support metalink in http headers + 18.14 --fail without --location should treat 3xx as a failure + 18.15 --retry should resume + 18.16 send only part of --data + 18.17 consider file name from the redirected URL with -O ? + 18.18 retry on network is unreachable + 18.19 expand ~/ in config files + 18.20 host name sections in config files + + 19. Build + 19.1 roffit + 19.2 Enable PIE and RELRO by default + 19.3 cmake test suite improvements + + 20. Test suite + 20.1 SSL tunnel + 20.2 nicer lacking perl message + 20.3 more protocols supported + 20.4 more platforms supported + 20.5 Add support for concurrent connections + 20.6 Use the RFC6265 test suite + 20.7 Support LD_PRELOAD on macOS + + 21. Next SONAME bump + 21.1 http-style HEAD output for FTP + 21.2 combine error codes + 21.3 extend CURLOPT_SOCKOPTFUNCTION prototype + + 22. Next major release + 22.1 cleanup return codes + 22.2 remove obsolete defines + 22.3 size_t + 22.4 remove several functions + 22.5 remove CURLOPT_FAILONERROR + 22.7 remove progress meter from libcurl + 22.8 remove 'curl_httppost' from public + +============================================================================== + +1. libcurl + +1.1 TFO support on Windows + + TCP Fast Open is supported on several platforms but not on Windows. Work on + this was once started but never finished. + + See https://github.com/curl/curl/pull/3378 + +1.2 More data sharing + + curl_share_* functions already exist and work, and they can be extended to + share more. For example, enable sharing of the ares channel. + +1.3 struct lifreq + + Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and + SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete. + To support IPv6 interface addresses for network interfaces properly. + +1.4 signal-based resolver timeouts + + libcurl built without an asynchronous resolver library uses alarm() to time + out DNS lookups. When a timeout occurs, this causes libcurl to jump from the + signal handler back into the library with a sigsetjmp, which effectively + causes libcurl to continue running within the signal handler. This is + non-portable and could cause problems on some platforms. A discussion on the + problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html + + Also, alarm() provides timeout resolution only to the nearest second. alarm + ought to be replaced by setitimer on systems that support it. + +1.5 get rid of PATH_MAX + + Having code use and rely on PATH_MAX is not nice: + https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html + + Currently the SSH based code uses it a bit, but to remove PATH_MAX from there + we need libssh2 to properly tell us when we pass in a too small buffer and + its current API (as of libssh2 1.2.7) doesn't. + +1.6 Modified buffer size approach + + Current libcurl allocates a fixed 16K size buffer for download and an + additional 16K for upload. They are always unconditionally part of the easy + handle. If CRLF translations are requested, an additional 32K "scratch + buffer" is allocated. A total of 64K transfer buffers in the worst case. + + First, while the handles are not actually in use these buffers could be freed + so that lingering handles just kept in queues or whatever waste less memory. + + Secondly, SFTP is a protocol that needs to handle many ~30K blocks at once + since each need to be individually acked and therefore libssh2 must be + allowed to send (or receive) many separate ones in parallel to achieve high + transfer speeds. A current libcurl build with a 16K buffer makes that + impossible, but one with a 512K buffer will reach MUCH faster transfers. But + allocating 512K unconditionally for all buffers just in case they would like + to do fast SFTP transfers at some point is not a good solution either. + + Dynamically allocate buffer size depending on protocol in use in combination + with freeing it after each individual transfer? Other suggestions? + +1.7 Support HTTP/2 for HTTP(S) proxies + + Support for doing HTTP/2 to HTTP and HTTPS proxies is still missing. + + See https://github.com/curl/curl/issues/3570 + +1.8 CURLOPT_RESOLVE for any port number + + This option allows applications to set a replacement IP address for a given + host + port pair. Consider making support for providing a replacement address + for the host name on all port numbers. + + See https://github.com/curl/curl/issues/1264 + +1.9 Cache negative name resolves + + A name resolve that has failed is likely to fail when made again within a + short period of time. Currently we only cache positive responses. + +1.10 auto-detect proxy + + libcurl could be made to detect the system proxy setup automatically and use + that. On Windows, macOS and Linux desktops for example. + + The pull-request to use libproxy for this was deferred due to doubts on the + reliability of the dependency and how to use it: + https://github.com/curl/curl/pull/977 + + libdetectproxy is a (C++) library for detecting the proxy on Windows + https://github.com/paulharris/libdetectproxy + +1.11 minimize dependencies with dynamically loaded modules + + We can create a system with loadable modules/plug-ins, where these modules + would be the ones that link to 3rd party libs. That would allow us to avoid + having to load ALL dependencies since only the necessary ones for this + app/invoke/used protocols would be necessary to load. See + https://github.com/curl/curl/issues/349 + +1.12 updated DNS server while running + + If /etc/resolv.conf gets updated while a program using libcurl is running, it + is may cause name resolves to fail unless res_init() is called. We should + consider calling res_init() + retry once unconditionally on all name resolve + failures to mitigate against this. Firefox works like that. Note that Windows + doesn't have res_init() or an alternative. + + https://github.com/curl/curl/issues/2251 + +1.13 c-ares and CURLOPT_OPENSOCKETFUNCTION + + curl will create most sockets via the CURLOPT_OPENSOCKETFUNCTION callback and + close them with the CURLOPT_CLOSESOCKETFUNCTION callback. However, c-ares + does not use those functions and instead opens and closes the sockets + itself. This means that when curl passes the c-ares socket to the + CURLMOPT_SOCKETFUNCTION it isn't owned by the application like other sockets. + + See https://github.com/curl/curl/issues/2734 + +1.14 Typesafe curl_easy_setopt() + + One of the most common problems in libcurl using applications is the lack of + type checks for curl_easy_setopt() which happens because it accepts varargs + and thus can take any type. + + One possible solution to this is to introduce a few different versions of the + setopt version for the different kinds of data you can set. + + curl_easy_set_num() - sets a long value + + curl_easy_set_large() - sets a curl_off_t value + + curl_easy_set_ptr() - sets a pointer + + curl_easy_set_cb() - sets a callback PLUS its callback data + +1.15 Monitor connections in the connection pool + + libcurl's connection cache or pool holds a number of open connections for the + purpose of possible subsequent connection reuse. It may contain a few up to a + significant amount of connections. Currently, libcurl leaves all connections + as they are and first when a connection is iterated over for matching or + reuse purpose it is verified that it is still alive. + + Those connections may get closed by the server side for idleness or they may + get a HTTP/2 ping from the peer to verify that they're still alive. By adding + monitoring of the connections while in the pool, libcurl can detect dead + connections (and close them) better and earlier, and it can handle HTTP/2 + pings to keep such ones alive even when not actively doing transfers on them. + +1.16 Try to URL encode given URL + + Given a URL that for example contains spaces, libcurl could have an option + that would try somewhat harder than it does now and convert spaces to %20 and + perhaps URL encoded byte values over 128 etc (basically do what the redirect + following code already does). + + https://github.com/curl/curl/issues/514 + +1.17 Add support for IRIs + + IRIs (RFC 3987) allow localized, non-ascii, names in the URL. To properly + support this, curl/libcurl would need to translate/encode the given input + from the input string encoding into percent encoded output "over the wire". + + To make that work smoothly for curl users even on Windows, curl would + probably need to be able to convert from several input encodings. + +1.18 try next proxy if one doesn't work + + Allow an application to specify a list of proxies to try, and failing to + connect to the first go on and try the next instead until the list is + exhausted. Browsers support this feature at least when they specify proxies + using PACs. + + https://github.com/curl/curl/issues/896 + +1.20 SRV and URI DNS records + + Offer support for resolving SRV and URI DNS records for libcurl to know which + server to connect to for various protocols (including HTTP!). + +1.21 Have the URL API offer IDN decoding + + Similar to how URL decoding/encoding is done, we could have URL functions to + convert IDN host names to punycode (probably not the reverse). + https://github.com/curl/curl/issues/3232 + +1.22 CURLINFO_PAUSE_STATE + + Return information about the transfer's current pause state, in both + directions. https://github.com/curl/curl/issues/2588 + +1.23 Offer API to flush the connection pool + + Sometimes applications want to flush all the existing connections kept alive. + An API could allow a forced flush or just a forced loop that would properly + close all connections that have been closed by the server already. + +1.24 TCP Fast Open for windows + + libcurl supports the CURLOPT_TCP_FASTOPEN option since 7.49.0 for Linux and + Mac OS. Windows supports TCP Fast Open starting with Windows 10, version 1607 + and we should add support for it. + +1.25 Expose tried IP addresses that failed + + When libcurl fails to connect to a host, it should be able to offer the + application the list of IP addresses that were used in the attempt. + + https://github.com/curl/curl/issues/2126 + +1.26 CURL_REFUSE_CLEARTEXT + + An environment variable that when set will make libcurl refuse to use any + cleartext network protocol. That's all non-encrypted ones (FTP, HTTP, Gopher, + etc). By adding the check to libcurl and not just curl, this environment + variable can then help users to block all libcurl-using programs from + accessing the network using unsafe protocols. + + The variable could be given some sort of syntax or different levels and be + used to also allow for example users to refuse libcurl to do transfers with + HTTPS certificate checks disabled. + + It could also automatically refuse usernames in URLs when set + (see CURLOPT_DISALLOW_USERNAME_IN_URL) + +1.27 hardcode the "localhost" addresses + + There's this new spec getting adopted that says "localhost" should always and + unconditionally be a local address and not get resolved by a DNS server. A + fine way for curl to fix this would be to simply hard-code the response to + 127.0.0.1 and/or ::1 (depending on what IP versions that are requested). This + is what the browsers probably will do with this hostname. + + https://bugzilla.mozilla.org/show_bug.cgi?id=1220810 + + https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02 + +1.28 FD_CLOEXEC + + It sets the close-on-exec flag for the file descriptor, which causes the file + descriptor to be automatically (and atomically) closed when any of the + exec-family functions succeed. Should probably be set by default? + + https://github.com/curl/curl/issues/2252 + +1.29 Upgrade to websockets + + libcurl could offer a smoother path to get to a websocket connection. + See https://github.com/curl/curl/issues/3523 + + Michael Kaufmann suggestion here: + https://curl.haxx.se/video/curlup-2017/2017-03-19_05_Michael_Kaufmann_Websocket_support_for_curl.mp4 + +1.30 config file parsing + + Consider providing an API, possibly in a separate companion library, for + parsing a config file like curl's -K/--config option to allow applications to + get the same ability to read curl options from files. + + See https://github.com/curl/curl/issues/3698 + +2. libcurl - multi interface + +2.1 More non-blocking + + Make sure we don't ever loop because of non-blocking sockets returning + EWOULDBLOCK or similar. Blocking cases include: + + - Name resolves on non-windows unless c-ares or the threaded resolver is used + - SOCKS proxy handshakes + - file:// transfers + - TELNET transfers + - The "DONE" operation (post transfer protocol-specific actions) for the + protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task. + +2.2 Better support for same name resolves + + If a name resolve has been initiated for name NN and a second easy handle + wants to resolve that name as well, make it wait for the first resolve to end + up in the cache instead of doing a second separate resolve. This is + especially needed when adding many simultaneous handles using the same host + name when the DNS resolver can get flooded. + +2.3 Non-blocking curl_multi_remove_handle() + + The multi interface has a few API calls that assume a blocking behavior, like + add_handle() and remove_handle() which limits what we can do internally. The + multi API need to be moved even more into a single function that "drives" + everything in a non-blocking manner and signals when something is done. A + remove or add would then only ask for the action to get started and then + multi_perform() etc still be called until the add/remove is completed. + +2.4 Split connect and authentication process + + The multi interface treats the authentication process as part of the connect + phase. As such any failures during authentication won't trigger the relevant + QUIT or LOGOFF for protocols such as IMAP, POP3 and SMTP. + +2.5 Edge-triggered sockets should work + + The multi_socket API should work with edge-triggered socket events. One of + the internal actions that need to be improved for this to work perfectly is + the 'maxloops' handling in transfer.c:readwrite_data(). + +2.6 multi upkeep + + In libcurl 7.62.0 we introduced curl_easy_upkeep. It unfortunately only works + on easy handles. We should introduces a version of that for the multi handle, + and also consider doing "upkeep" automatically on connections in the + connection pool when the multi handle is in used. + + See https://github.com/curl/curl/issues/3199 + +3. Documentation + +3.2 Provide cmake config-file + + A config-file package is a set of files provided by us to allow applications + to write cmake scripts to find and use libcurl easier. See + https://github.com/curl/curl/issues/885 + +4. FTP + +4.1 HOST + + HOST is a command for a client to tell which host name to use, to offer FTP + servers named-based virtual hosting: + + https://tools.ietf.org/html/rfc7151 + +4.2 Alter passive/active on failure and retry + + When trying to connect passively to a server which only supports active + connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the + connection. There could be a way to fallback to an active connection (and + vice versa). https://curl.haxx.se/bug/feature.cgi?id=1754793 + +4.3 Earlier bad letter detection + + Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the + process to avoid doing a resolve and connect in vain. + +4.4 REST for large files + + REST fix for servers not behaving well on >2GB requests. This should fail if + the server doesn't set the pointer to the requested index. The tricky + (impossible?) part is to figure out if the server did the right thing or not. + +4.5 ASCII support + + FTP ASCII transfers do not follow RFC959. They don't convert the data + accordingly. + +4.6 GSSAPI via Windows SSPI + + In addition to currently supporting the SASL GSSAPI mechanism (Kerberos V5) + via third-party GSS-API libraries, such as Heimdal or MIT Kerberos, also add + support for GSSAPI authentication via Windows SSPI. + +4.7 STAT for LIST without data connection + + Some FTP servers allow STAT for listing directories instead of using LIST, + and the response is then sent over the control connection instead of as the + otherwise usedw data connection: https://www.nsftools.com/tips/RawFTP.htm#STAT + + This is not detailed in any FTP specification. + +4.8 Option to ignore private IP addresses in PASV response + + Some servers respond with and some other FTP client implementations can + ignore private (RFC 1918 style) IP addresses when received in PASV responses. + To consider for libcurl as well. See https://github.com/curl/curl/issues/1455 + +5. HTTP + +5.1 Better persistency for HTTP 1.0 + + "Better" support for persistent connections over HTTP 1.0 + https://curl.haxx.se/bug/feature.cgi?id=1089001 + +5.2 support FF3 sqlite cookie files + + Firefox 3 is changing from its former format to a a sqlite database instead. + We should consider how (lib)curl can/should support this. + https://curl.haxx.se/bug/feature.cgi?id=1871388 + +5.3 Rearrange request header order + + Server implementors often make an effort to detect browser and to reject + clients it can detect to not match. One of the last details we cannot yet + control in libcurl's HTTP requests, which also can be exploited to detect + that libcurl is in fact used even when it tries to impersonate a browser, is + the order of the request headers. I propose that we introduce a new option in + which you give headers a value, and then when the HTTP request is built it + sorts the headers based on that number. We could then have internally created + headers use a default value so only headers that need to be moved have to be + specified. + +5.4 Allow SAN names in HTTP/2 server push + + curl only allows HTTP/2 push promise if the provided :authority header value + exactly matches the host name given in the URL. It could be extended to allow + any name that would match the Subject Alternative Names in the server's TLS + certificate. + + See https://github.com/curl/curl/pull/3581 + +5.5 auth= in URLs + + Add the ability to specify the preferred authentication mechanism to use by + using ;auth= in the login part of the URL. + + For example: + + http://test:pass;auth=NTLM@example.com would be equivalent to specifying --user + test:pass;auth=NTLM or --user test:pass --ntlm from the command line. + + Additionally this should be implemented for proxy base URLs as well. + +5.6 Refuse "downgrade" redirects + + See https://github.com/curl/curl/issues/226 + + Consider a way to tell curl to refuse to "downgrade" protocol with a redirect + and/or possibly a bit that refuses redirect to change protocol completely. + +5.7 QUIC + + The standardization process of QUIC has been taken to the IETF and can be + followed on the [IETF QUIC Mailing + list](https://www.ietf.org/mailman/listinfo/quic). I'd like us to get on the + bandwagon. Ideally, this would be done with a separate library/project to + handle the binary/framing layer in a similar fashion to how HTTP/2 is + implemented. This, to allow other projects to benefit from the work and to + thus broaden the interest and chance of others to participate. + + +6. TELNET + +6.1 ditch stdin + +Reading input (to send to the remote server) on stdin is a crappy solution for +library purposes. We need to invent a good way for the application to be able +to provide the data to send. + +6.2 ditch telnet-specific select + + Move the telnet support's network select() loop go away and merge the code + into the main transfer loop. Until this is done, the multi interface won't + work for telnet. + +6.3 feature negotiation debug data + + Add telnet feature negotiation data to the debug callback as header data. + + +7. SMTP + +7.1 Pipelining + + Add support for pipelining emails. + +7.2 Enhanced capability support + + Add the ability, for an application that uses libcurl, to obtain the list of + capabilities returned from the EHLO command. + +7.3 Add CURLOPT_MAIL_CLIENT option + + Rather than use the URL to specify the mail client string to present in the + HELO and EHLO commands, libcurl should support a new CURLOPT specifically for + specifying this data as the URL is non-standard and to be honest a bit of a + hack ;-) + + Please see the following thread for more information: + https://curl.haxx.se/mail/lib-2012-05/0178.html + + +8. POP3 + +8.1 Pipelining + + Add support for pipelining commands. + +8.2 Enhanced capability support + + Add the ability, for an application that uses libcurl, to obtain the list of + capabilities returned from the CAPA command. + +9. IMAP + +9.1 Enhanced capability support + + Add the ability, for an application that uses libcurl, to obtain the list of + capabilities returned from the CAPABILITY command. + +10. LDAP + +10.1 SASL based authentication mechanisms + + Currently the LDAP module only supports ldap_simple_bind_s() in order to bind + to an LDAP server. However, this function sends username and password details + using the simple authentication mechanism (as clear text). However, it should + be possible to use ldap_bind_s() instead specifying the security context + information ourselves. + +11. SMB + +11.1 File listing support + +Add support for listing the contents of a SMB share. The output should probably +be the same as/similar to FTP. + +11.2 Honor file timestamps + +The timestamp of the transferred file should reflect that of the original file. + +11.3 Use NTLMv2 + +Currently the SMB authentication uses NTLMv1. + +11.4 Create remote directories + +Support for creating remote directories when uploading a file to a directory +that doesn't exist on the server, just like --ftp-create-dirs. + +12. New protocols + +12.1 RSYNC + + There's no RFC for the protocol or an URI/URL format. An implementation + should most probably use an existing rsync library, such as librsync. + +13. SSL + +13.1 Disable specific versions + + Provide an option that allows for disabling specific SSL versions, such as + SSLv2 https://curl.haxx.se/bug/feature.cgi?id=1767276 + +13.2 Provide mutex locking API + + Provide a libcurl API for setting mutex callbacks in the underlying SSL + library, so that the same application code can use mutex-locking + independently of OpenSSL or GnutTLS being used. + +13.3 Support in-memory certs/ca certs/keys + + You can specify the private and public keys for SSH/SSL as file paths. Some + programs want to avoid using files and instead just pass them as in-memory + data blobs. There's probably a challenge to make this work across the + plethory of different TLS and SSH backends that curl supports. + https://github.com/curl/curl/issues/2310 + +13.4 Cache/share OpenSSL contexts + + "Look at SSL cafile - quick traces look to me like these are done on every + request as well, when they should only be necessary once per SSL context (or + once per handle)". The major improvement we can rather easily do is to make + sure we don't create and kill a new SSL "context" for every request, but + instead make one for every connection and re-use that SSL context in the same + style connections are re-used. It will make us use slightly more memory but + it will libcurl do less creations and deletions of SSL contexts. + + Technically, the "caching" is probably best implemented by getting added to + the share interface so that easy handles who want to and can reuse the + context specify that by sharing with the right properties set. + + https://github.com/curl/curl/issues/1110 + +13.5 Export session ids + + Add an interface to libcurl that enables "session IDs" to get + exported/imported. Cris Bailiff said: "OpenSSL has functions which can + serialise the current SSL state to a buffer of your choice, and recover/reset + the state from such a buffer at a later date - this is used by mod_ssl for + apache to implement and SSL session ID cache". + +13.6 Provide callback for cert verification + + OpenSSL supports a callback for customised verification of the peer + certificate, but this doesn't seem to be exposed in the libcurl APIs. Could + it be? There's so much that could be done if it were! + +13.7 improve configure --with-ssl + + make the configure --with-ssl option first check for OpenSSL, then GnuTLS, + then NSS... + +13.8 Support DANE + + DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL + keys and certs over DNS using DNSSEC as an alternative to the CA model. + https://www.rfc-editor.org/rfc/rfc6698.txt + + An initial patch was posted by Suresh Krishnaswamy on March 7th 2013 + (https://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple + approach. See Daniel's comments: + https://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the + correct library to base this development on. + + Björn Stenberg wrote a separate initial take on DANE that was never + completed. + +13.9 Configurable loading of OpenSSL configuration file + + libcurl calls the OpenSSL function CONF_modules_load_file() in openssl.c, + Curl_ossl_init(). "We regard any changes in the OpenSSL configuration as a + security risk or at least as unnecessary." + + Please add a configuration switch or something similar to disable the + CONF_modules_load_file() call. + + See https://github.com/curl/curl/issues/2724 + +13.10 Support Authority Information Access certificate extension (AIA) + + AIA can provide various things like CRLs but more importantly information + about intermediate CA certificates that can allow validation path to be + fulfilled when the HTTPS server doesn't itself provide them. + + Since AIA is about downloading certs on demand to complete a TLS handshake, + it is probably a bit tricky to get done right. + + See https://github.com/curl/curl/issues/2793 + +13.11 Support intermediate & root pinning for PINNEDPUBLICKEY + + CURLOPT_PINNEDPUBLICKEY does not consider the hashes of intermediate & root + certificates when comparing the pinned keys. Therefore it is not compatible + with "HTTP Public Key Pinning" as there also intermediate and root certificates + can be pinned. This is very useful as it prevents webadmins from "locking + themself out of their servers". + + Adding this feature would make curls pinning 100% compatible to HPKP and allow + more flexible pinning. + +13.12 Support HSTS + + "HTTP Strict Transport Security" is TOFU (trust on first use), time-based + features indicated by a HTTP header send by the webserver. It is widely used + in browsers and it's purpose is to prevent insecure HTTP connections after + a previous HTTPS connection. It protects against SSLStripping attacks. + + Doc: https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security + RFC 6797: https://tools.ietf.org/html/rfc6797 + +13.13 Support HPKP + + "HTTP Public Key Pinning" is TOFU (trust on first use), time-based + features indicated by a HTTP header send by the webserver. It's purpose is + to prevent Man-in-the-middle attacks by trusted CAs by allowing webadmins + to specify which CAs/certificates/public keys to trust when connection to + their websites. + + It can be build based on PINNEDPUBLICKEY. + + Wikipedia: https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning + OWASP: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning + Doc: https://developer.mozilla.org/de/docs/Web/Security/Public_Key_Pinning + RFC: https://tools.ietf.org/html/draft-ietf-websec-key-pinning-21 + +13.14 Support the clienthello extension + + Certain stupid networks and middle boxes have a problem with SSL handshake + pakets that are within a certain size range because how that sets some bits + that previously (in older TLS version) were not set. The clienthello + extension adds padding to avoid that size range. + + https://tools.ietf.org/html/rfc7685 + https://github.com/curl/curl/issues/2299 + +14. GnuTLS + +14.1 SSL engine stuff + + Is this even possible? + +14.2 check connection + + Add a way to check if the connection seems to be alive, to correspond to the + SSL_peak() way we use with OpenSSL. + +15. WinSSL/SChannel + +15.1 Add support for client certificate authentication + + WinSSL/SChannel currently makes use of the OS-level system and user + certificate and private key stores. This does not allow the application + or the user to supply a custom client certificate using curl or libcurl. + + Therefore support for the existing -E/--cert and --key options should be + implemented by supplying a custom certificate to the SChannel APIs, see: + - Getting a Certificate for Schannel + https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx + +15.3 Add support for the --ciphers option + + The cipher suites used by WinSSL/SChannel are configured on an OS-level + instead of an application-level. This does not allow the application or + the user to customize the configured cipher suites using curl or libcurl. + + Therefore support for the existing --ciphers option should be implemented + by mapping the OpenSSL/GnuTLS cipher suites to the SChannel APIs, see + - Specifying Schannel Ciphers and Cipher Strengths + https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx + +15.4 Add option to disable client certificate auto-send + + Microsoft says "By default, Schannel will, with no notification to the client, + attempt to locate a client certificate and send it to the server." That could + be considered a privacy violation and unexpected. + + Some Windows users have come to expect that default behavior and to change the + default to make it consistent with other SSL backends would be a breaking + change. An option should be added that can be used to disable the default + Schannel auto-send behavior. + + https://github.com/curl/curl/issues/2262 + +16. SASL + +16.1 Other authentication mechanisms + + Add support for other authentication mechanisms such as OLP, + GSS-SPNEGO and others. + +16.2 Add QOP support to GSSAPI authentication + + Currently the GSSAPI authentication only supports the default QOP of auth + (Authentication), whilst Kerberos V5 supports both auth-int (Authentication + with integrity protection) and auth-conf (Authentication with integrity and + privacy protection). + +16.3 Support binary messages (i.e.: non-base64) + + Mandatory to support LDAP SASL authentication. + + +17. SSH protocols + +17.1 Multiplexing + + SSH is a perfectly fine multiplexed protocols which would allow libcurl to do + multiple parallel transfers from the same host using the same connection, + much in the same spirit as HTTP/2 does. libcurl however does not take + advantage of that ability but will instead always create a new connection for + new transfers even if an existing connection already exists to the host. + + To fix this, libcurl would have to detect an existing connection and "attach" + the new transfer to the existing one. + +17.2 SFTP performance + + libcurl's SFTP transfer performance is sub par and can be improved, mostly by + the approach mentioned in "1.6 Modified buffer size approach". + +17.3 Support better than MD5 hostkey hash + + libcurl offers the CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 option for verifying the + server's key. MD5 is generally being deprecated so we should implement + support for stronger hashing algorithms. libssh2 itself is what provides this + underlying functionality and it supports at least SHA-1 as an alternative. + SHA-1 is also being deprecated these days so we should consider working with + libssh2 to instead offer support for SHA-256 or similar. + +17.4 Support CURLOPT_PREQUOTE + + The two other QUOTE options are supported for SFTP, but this was left out for + unknown reasons! + +18. Command line tool + +18.1 sync + + "curl --sync http://example.com/feed[1-100].rss" or + "curl --sync http://example.net/{index,calendar,history}.html" + + Downloads a range or set of URLs using the remote name, but only if the + remote file is newer than the local file. A Last-Modified HTTP date header + should also be used to set the mod date on the downloaded file. + +18.2 glob posts + + Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'. + This is easily scripted though. + +18.3 prevent file overwriting + + Add an option that prevents curl from overwriting existing local files. When + used, and there already is an existing file with the target file name + (either -O or -o), a number should be appended (and increased if already + existing). So that index.html becomes first index.html.1 and then + index.html.2 etc. + +18.4 simultaneous parallel transfers + + The client could be told to use maximum N simultaneous parallel transfers and + then just make sure that happens. It should of course not make more than one + connection to the same remote host. This would require the client to use the + multi interface. https://curl.haxx.se/bug/feature.cgi?id=1558595 + + Using the multi interface would also allow properly using parallel transfers + with HTTP/2 and supporting HTTP/2 server push from the command line. + +18.5 UTF-8 filenames in Content-Disposition + + RFC 6266 documents how UTF-8 names can be passed to a client in the + Content-Disposition header, and curl does not support this. + + https://github.com/curl/curl/issues/1888 + +18.6 warning when setting an option + + Display a warning when libcurl returns an error when setting an option. + This can be useful to tell when support for a particular feature hasn't been + compiled into the library. + +18.8 offer color-coded HTTP header output + + By offering different color output on the header name and the header + contents, they could be made more readable and thus help users working on + HTTP services. + +18.9 Choose the name of file in braces for complex URLs + + When using braces to download a list of URLs and you use complicated names + in the list of alternatives, it could be handy to allow curl to use other + names when saving. + + Consider a way to offer that. Possibly like + {partURL1:name1,partURL2:name2,partURL3:name3} where the name following the + colon is the output name. + + See https://github.com/curl/curl/issues/221 + +18.10 improve how curl works in a windows console window + + If you pull the scrollbar when transferring with curl in a Windows console + window, the transfer is interrupted and can get disconnected. This can + probably be improved. See https://github.com/curl/curl/issues/322 + +18.11 Windows: set attribute 'archive' for completed downloads + + The archive bit (FILE_ATTRIBUTE_ARCHIVE, 0x20) separates files that shall be + backed up from those that are either not ready or have not changed. + + Downloads in progress are neither ready to be backed up, nor should they be + opened by a different process. Only after a download has been completed it's + sensible to include it in any integer snapshot or backup of the system. + + See https://github.com/curl/curl/issues/3354 + +18.12 keep running, read instructions from pipe/socket + + Provide an option that makes curl not exit after the last URL (or even work + without a given URL), and then make it read instructions passed on a pipe or + over a socket to make further instructions so that a second subsequent curl + invoke can talk to the still running instance and ask for transfers to get + done, and thus maintain its connection pool, DNS cache and more. + +18.13 support metalink in http headers + + Curl has support for downloading a metalink xml file, processing it, and then + downloading the target of the metalink. This is done via the --metalink option. + It would be nice if metalink also supported downloading via metalink + information that is stored in HTTP headers (RFC 6249). Theoretically this could + also be supported with the --metalink option. + + See https://tools.ietf.org/html/rfc6249 + + See also https://lists.gnu.org/archive/html/bug-wget/2015-06/msg00034.html for + an implematation of this in wget. + +18.14 --fail without --location should treat 3xx as a failure + + To allow a command line like this to detect a redirect and consider it a + failure: + + curl -v --fail -O https://example.com/curl-7.48.0.tar.gz + + ... --fail must treat 3xx responses as failures too. The least problematic + way to implement this is probably to add that new logic in the command line + tool only and not in the underlying CURLOPT_FAILONERROR logic. + +18.15 --retry should resume + + When --retry is used and curl actually retries transfer, it should use the + already transferred data and do a resumed transfer for the rest (when + possible) so that it doesn't have to transfer the same data again that was + already transferred before the retry. + + See https://github.com/curl/curl/issues/1084 + +18.16 send only part of --data + + When the user only wants to send a small piece of the data provided with + --data or --data-binary, like when that data is a huge file, consider a way + to specify that curl should only send a piece of that. One suggested syntax + would be: "--data-binary @largefile.zip!1073741823-2147483647". + + See https://github.com/curl/curl/issues/1200 + +18.17 consider file name from the redirected URL with -O ? + + When a user gives a URL and uses -O, and curl follows a redirect to a new + URL, the file name is not extracted and used from the newly redirected-to URL + even if the new URL may have a much more sensible file name. + + This is clearly documented and helps for security since there's no surprise + to users which file name that might get overwritten. But maybe a new option + could allow for this or maybe -J should imply such a treatment as well as -J + already allows for the server to decide what file name to use so it already + provides the "may overwrite any file" risk. + + This is extra tricky if the original URL has no file name part at all since + then the current code path will error out with an error message, and we can't + *know* already at that point if curl will be redirected to a URL that has a + file name... + + See https://github.com/curl/curl/issues/1241 + +18.18 retry on network is unreachable + + The --retry option retries transfers on "transient failures". We later added + --retry-connrefused to also retry for "connection refused" errors. + + Suggestions have been brought to also allow retry on "network is unreachable" + errors and while totally reasonable, maybe we should consider a way to make + this more configurable than to add a new option for every new error people + want to retry for? + + https://github.com/curl/curl/issues/1603 + +18.19 expand ~/ in config files + + For example .curlrc could benefit from being able to do this. + + See https://github.com/curl/curl/issues/2317 + +18.20 host name sections in config files + + config files would be more powerful if they could set different + configurations depending on used URLs, host name or possibly origin. Then a + default .curlrc could a specific user-agent only when doing requests against + a certain site. + + +19. Build + +19.1 roffit + + Consider extending 'roffit' to produce decent ASCII output, and use that + instead of (g)nroff when building src/tool_hugehelp.c + +19.2 Enable PIE and RELRO by default + + Especially when having programs that execute curl via the command line, PIE + renders the exploitation of memory corruption vulnerabilities a lot more + difficult. This can be attributed to the additional information leaks being + required to conduct a successful attack. RELRO, on the other hand, masks + different binary sections like the GOT as read-only and thus kills a handful + of techniques that come in handy when attackers are able to arbitrarily + overwrite memory. A few tests showed that enabling these features had close + to no impact, neither on the performance nor on the general functionality of + curl. + +19.3 cmake test suite improvements + + The cmake build doesn't support 'make show' so it doesn't know which tests + are in the makefile or not (making appveyor builds do many false warnings + about it) nor does it support running the test suite if building out-of-tree. + + See https://github.com/curl/curl/issues/3109 + +20. Test suite + +20.1 SSL tunnel + + Make our own version of stunnel for simple port forwarding to enable HTTPS + and FTP-SSL tests without the stunnel dependency, and it could allow us to + provide test tools built with either OpenSSL or GnuTLS + +20.2 nicer lacking perl message + + If perl wasn't found by the configure script, don't attempt to run the tests + but explain something nice why it doesn't. + +20.3 more protocols supported + + Extend the test suite to include more protocols. The telnet could just do FTP + or http operations (for which we have test servers). + +20.4 more platforms supported + + Make the test suite work on more platforms. OpenBSD and Mac OS. Remove + fork()s and it should become even more portable. + +20.5 Add support for concurrent connections + + Tests 836, 882 and 938 were designed to verify that separate connections aren't + used when using different login credentials in protocols that shouldn't re-use + a connection under such circumstances. + + Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent + connections. The read while() loop seems to loop until it receives a disconnect + from the client, where it then enters the waiting for connections loop. When + the client opens a second connection to the server, the first connection hasn't + been dropped (unless it has been forced - which we shouldn't do in these tests) + and thus the wait for connections loop is never entered to receive the second + connection. + +20.6 Use the RFC6265 test suite + + A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at + https://github.com/abarth/http-state/tree/master/tests + + It'd be really awesome if someone would write a script/setup that would run + curl with that test suite and detect deviances. Ideally, that would even be + incorporated into our regular test suite. + +20.7 Support LD_PRELOAD on macOS + + LD_RELOAD doesn't work on macOS, but there are tests which require it to run + properly. Look into making the preload support in runtests.pl portable such + that it uses DYLD_INSERT_LIBRARIES on macOS. + +21. Next SONAME bump + +21.1 http-style HEAD output for FTP + + #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers + from being output in NOBODY requests over FTP + +21.2 combine error codes + + Combine some of the error codes to remove duplicates. The original + numbering should not be changed, and the old identifiers would be + macroed to the new ones in an CURL_NO_OLDIES section to help with + backward compatibility. + + Candidates for removal and their replacements: + + CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND + + CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND + + CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR + + CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT + + CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT + + CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL + + CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND + + CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED + +21.3 extend CURLOPT_SOCKOPTFUNCTION prototype + + The current prototype only provides 'purpose' that tells what the + connection/socket is for, but not any protocol or similar. It makes it hard + for applications to differentiate on TCP vs UDP and even HTTP vs FTP and + similar. + +22. Next major release + +22.1 cleanup return codes + + curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a + CURLMcode. These should be changed to be the same. + +22.2 remove obsolete defines + + remove obsolete defines from curl/curl.h + +22.3 size_t + + make several functions use size_t instead of int in their APIs + +22.4 remove several functions + + remove the following functions from the public API: + + curl_getenv + + curl_mprintf (and variations) + + curl_strequal + + curl_strnequal + + They will instead become curlx_ - alternatives. That makes the curl app + still capable of using them, by building with them from source. + + These functions have no purpose anymore: + + curl_multi_socket + + curl_multi_socket_all + +22.5 remove CURLOPT_FAILONERROR + + Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird + internally. Let the app judge success or not for itself. + +22.7 remove progress meter from libcurl + + The internally provided progress meter output doesn't belong in the library. + Basically no application wants it (apart from curl) but instead applications + can and should do their own progress meters using the progress callback. + + The progress callback should then be bumped as well to get proper 64bit + variable types passed to it instead of doubles so that big files work + correctly. + +22.8 remove 'curl_httppost' from public + + curl_formadd() was made to fill in a public struct, but the fact that the + struct is public is never really used by application for their own advantage + but instead often restricts how the form functions can or can't be modified. + + Changing them to return a private handle will benefit the implementation and + allow us much greater freedoms while still maintaining a solid API and ABI. diff --git a/bin/curl/docs/TheArtOfHttpScripting.txt b/bin/curl/docs/TheArtOfHttpScripting.txt new file mode 100644 index 00000000..c5b67ca1 --- /dev/null +++ b/bin/curl/docs/TheArtOfHttpScripting.txt @@ -0,0 +1,758 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + +The Art Of Scripting HTTP Requests Using Curl + + 1. HTTP Scripting + 1.1 Background + 1.2 The HTTP Protocol + 1.3 See the Protocol + 1.4 See the Timing + 1.5 See the Response + 2. URL + 2.1 Spec + 2.2 Host + 2.3 Port number + 2.4 User name and password + 2.5 Path part + 3. Fetch a page + 3.1 GET + 3.2 HEAD + 3.3 Multiple URLs in a single command line + 3.4 Multiple HTTP methods in a single command line + 4. HTML forms + 4.1 Forms explained + 4.2 GET + 4.3 POST + 4.4 File Upload POST + 4.5 Hidden Fields + 4.6 Figure Out What A POST Looks Like + 5. HTTP upload + 5.1 PUT + 6. HTTP Authentication + 6.1 Basic Authentication + 6.2 Other Authentication + 6.3 Proxy Authentication + 6.4 Hiding credentials + 7. More HTTP Headers + 7.1 Referer + 7.2 User Agent + 8. Redirects + 8.1 Location header + 8.2 Other redirects + 9. Cookies + 9.1 Cookie Basics + 9.2 Cookie options + 10. HTTPS + 10.1 HTTPS is HTTP secure + 10.2 Certificates + 11. Custom Request Elements + 11.1 Modify method and headers + 11.2 More on changed methods + 12. Web Login + 12.1 Some login tricks + 13. Debug + 13.1 Some debug tricks + 14. References + 14.1 Standards + 14.2 Sites + +============================================================================== + +1. HTTP Scripting + + 1.1 Background + + This document assumes that you're familiar with HTML and general networking. + + The increasing amount of applications moving to the web has made "HTTP + Scripting" more frequently requested and wanted. To be able to automatically + extract information from the web, to fake users, to post or upload data to + web servers are all important tasks today. + + Curl is a command line tool for doing all sorts of URL manipulations and + transfers, but this particular document will focus on how to use it when + doing HTTP requests for fun and profit. I'll assume that you know how to + invoke 'curl --help' or 'curl --manual' to get basic information about it. + + Curl is not written to do everything for you. It makes the requests, it gets + the data, it sends data and it retrieves the information. You probably need + to glue everything together using some kind of script language or repeated + manual invokes. + + 1.2 The HTTP Protocol + + HTTP is the protocol used to fetch data from web servers. It is a very simple + protocol that is built upon TCP/IP. The protocol also allows information to + get sent to the server from the client using a few different methods, as will + be shown here. + + HTTP is plain ASCII text lines being sent by the client to a server to + request a particular action, and then the server replies a few text lines + before the actual requested content is sent to the client. + + The client, curl, sends a HTTP request. The request contains a method (like + GET, POST, HEAD etc), a number of request headers and sometimes a request + body. The HTTP server responds with a status line (indicating if things went + well), response headers and most often also a response body. The "body" part + is the plain data you requested, like the actual HTML or the image etc. + + 1.3 See the Protocol + + Using curl's option --verbose (-v as a short option) will display what kind + of commands curl sends to the server, as well as a few other informational + texts. + + --verbose is the single most useful option when it comes to debug or even + understand the curl<->server interaction. + + Sometimes even --verbose is not enough. Then --trace and --trace-ascii offer + even more details as they show EVERYTHING curl sends and receives. Use it + like this: + + curl --trace-ascii debugdump.txt http://www.example.com/ + + 1.4 See the Timing + + Many times you may wonder what exactly is taking all the time, or you just + want to know the amount of milliseconds between two points in a + transfer. For those, and other similar situations, the --trace-time option + is what you need. It'll prepend the time to each trace output line: + + curl --trace-ascii d.txt --trace-time http://example.com/ + + 1.5 See the Response + + By default curl sends the response to stdout. You need to redirect it + somewhere to avoid that, most often that is done with -o or -O. + +2. URL + + 2.1 Spec + + The Uniform Resource Locator format is how you specify the address of a + particular resource on the Internet. You know these, you've seen URLs like + https://curl.haxx.se or https://yourbank.com a million times. RFC 3986 is the + canonical spec. And yeah, the formal name is not URL, it is URI. + + 2.2 Host + + The host name is usually resolved using DNS or your /etc/hosts file to an IP + address and that's what curl will communicate with. Alternatively you specify + the IP address directly in the URL instead of a name. + + For development and other trying out situations, you can point to a different + IP address for a host name than what would otherwise be used, by using curl's + --resolve option: + + curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/ + + 2.3 Port number + + Each protocol curl supports operates on a default port number, be it over TCP + or in some cases UDP. Normally you don't have to take that into + consideration, but at times you run test servers on other ports or + similar. Then you can specify the port number in the URL with a colon and a + number immediately following the host name. Like when doing HTTP to port + 1234: + + curl http://www.example.org:1234/ + + The port number you specify in the URL is the number that the server uses to + offer its services. Sometimes you may use a local proxy, and then you may + need to specify that proxy's port number separately for what curl needs to + connect to locally. Like when using a HTTP proxy on port 4321: + + curl --proxy http://proxy.example.org:4321 http://remote.example.org/ + + 2.4 User name and password + + Some services are setup to require HTTP authentication and then you need to + provide name and password which is then transferred to the remote site in + various ways depending on the exact authentication protocol used. + + You can opt to either insert the user and password in the URL or you can + provide them separately: + + curl http://user:password@example.org/ + + or + + curl -u user:password http://example.org/ + + You need to pay attention that this kind of HTTP authentication is not what + is usually done and requested by user-oriented web sites these days. They + tend to use forms and cookies instead. + + 2.5 Path part + + The path part is just sent off to the server to request that it sends back + the associated response. The path is what is to the right side of the slash + that follows the host name and possibly port number. + +3. Fetch a page + + 3.1 GET + + The simplest and most common request/operation made using HTTP is to GET a + URL. The URL could itself refer to a web page, an image or a file. The client + issues a GET request to the server and receives the document it asked for. + If you issue the command line + + curl https://curl.haxx.se + + you get a web page returned in your terminal window. The entire HTML document + that that URL holds. + + All HTTP replies contain a set of response headers that are normally hidden, + use curl's --include (-i) option to display them as well as the rest of the + document. + + 3.2 HEAD + + You can ask the remote server for ONLY the headers by using the --head (-I) + option which will make curl issue a HEAD request. In some special cases + servers deny the HEAD method while others still work, which is a particular + kind of annoyance. + + The HEAD method is defined and made so that the server returns the headers + exactly the way it would do for a GET, but without a body. It means that you + may see a Content-Length: in the response headers, but there must not be an + actual body in the HEAD response. + + 3.3 Multiple URLs in a single command line + + A single curl command line may involve one or many URLs. The most common case + is probably to just use one, but you can specify any amount of URLs. Yes + any. No limits. You'll then get requests repeated over and over for all the + given URLs. + + Example, send two GETs: + + curl http://url1.example.com http://url2.example.com + + If you use --data to POST to the URL, using multiple URLs means that you send + that same POST to all the given URLs. + + Example, send two POSTs: + + curl --data name=curl http://url1.example.com http://url2.example.com + + + 3.4 Multiple HTTP methods in a single command line + + Sometimes you need to operate on several URLs in a single command line and do + different HTTP methods on each. For this, you'll enjoy the --next option. It + is basically a separator that separates a bunch of options from the next. All + the URLs before --next will get the same method and will get all the POST + data merged into one. + + When curl reaches the --next on the command line, it'll sort of reset the + method and the POST data and allow a new set. + + Perhaps this is best shown with a few examples. To send first a HEAD and then + a GET: + + curl -I http://example.com --next http://example.com + + To first send a POST and then a GET: + + curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html + + +4. HTML forms + + 4.1 Forms explained + + Forms are the general way a web site can present a HTML page with fields for + the user to enter data in, and then press some kind of 'OK' or 'Submit' + button to get that data sent to the server. The server then typically uses + the posted data to decide how to act. Like using the entered words to search + in a database, or to add the info in a bug tracking system, display the entered + address on a map or using the info as a login-prompt verifying that the user + is allowed to see what it is about to see. + + Of course there has to be some kind of program on the server end to receive + the data you send. You cannot just invent something out of the air. + + 4.2 GET + + A GET-form uses the method GET, as specified in HTML like: + +
    + + +
    + + In your favorite browser, this form will appear with a text box to fill in + and a press-button labeled "OK". If you fill in '1905' and press the OK + button, your browser will then create a new URL to get for you. The URL will + get "junk.cgi?birthyear=1905&press=OK" appended to the path part of the + previous URL. + + If the original form was seen on the page "www.hotmail.com/when/birth.html", + the second page you'll get will become + "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK". + + Most search engines work this way. + + To make curl do the GET form post for you, just enter the expected created + URL: + + curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK" + + 4.3 POST + + The GET method makes all input field names get displayed in the URL field of + your browser. That's generally a good thing when you want to be able to + bookmark that page with your given data, but it is an obvious disadvantage + if you entered secret information in one of the fields or if there are a + large amount of fields creating a very long and unreadable URL. + + The HTTP protocol then offers the POST method. This way the client sends the + data separated from the URL and thus you won't see any of it in the URL + address field. + + The form would look very similar to the previous one: + +
    + + +
    + + And to use curl to post this form with the same data filled in as before, we + could do it like: + + curl --data "birthyear=1905&press=%20OK%20" \ + http://www.example.com/when.cgi + + This kind of POST will use the Content-Type + application/x-www-form-urlencoded and is the most widely used POST kind. + + The data you send to the server MUST already be properly encoded, curl will + not do that for you. For example, if you want the data to contain a space, + you need to replace that space with %20 etc. Failing to comply with this + will most likely cause your data to be received wrongly and messed up. + + Recent curl versions can in fact url-encode POST data for you, like this: + + curl --data-urlencode "name=I am Daniel" http://www.example.com + + If you repeat --data several times on the command line, curl will + concatenate all the given data pieces - and put a '&' symbol between each + data segment. + + 4.4 File Upload POST + + Back in late 1995 they defined an additional way to post data over HTTP. It + is documented in the RFC 1867, why this method sometimes is referred to as + RFC1867-posting. + + This method is mainly designed to better support file uploads. A form that + allows a user to upload a file could be written like this in HTML: + +
    + + +
    + + This clearly shows that the Content-Type about to be sent is + multipart/form-data. + + To post to a form like this with curl, you enter a command line like: + + curl --form upload=@localfilename --form press=OK [URL] + + 4.5 Hidden Fields + + A very common way for HTML based applications to pass state information + between pages is to add hidden fields to the forms. Hidden fields are + already filled in, they aren't displayed to the user and they get passed + along just as all the other fields. + + A similar example form with one visible field, one hidden field and one + submit button could look like: + +
    + + + +
    + + To POST this with curl, you won't have to think about if the fields are + hidden or not. To curl they're all the same: + + curl --data "birthyear=1905&press=OK&person=daniel" [URL] + + 4.6 Figure Out What A POST Looks Like + + When you're about fill in a form and send to a server by using curl instead + of a browser, you're of course very interested in sending a POST exactly the + way your browser does. + + An easy way to get to see this, is to save the HTML page with the form on + your local disk, modify the 'method' to a GET, and press the submit button + (you could also change the action URL if you want to). + + You will then clearly see the data get appended to the URL, separated with a + '?'-letter as GET forms are supposed to. + +5. HTTP upload + + 5.1 PUT + + Perhaps the best way to upload data to a HTTP server is to use PUT. Then + again, this of course requires that someone put a program or script on the + server end that knows how to receive a HTTP PUT stream. + + Put a file to a HTTP server with curl: + + curl --upload-file uploadfile http://www.example.com/receive.cgi + +6. HTTP Authentication + + 6.1 Basic Authentication + + HTTP Authentication is the ability to tell the server your username and + password so that it can verify that you're allowed to do the request you're + doing. The Basic authentication used in HTTP (which is the type curl uses by + default) is *plain* *text* based, which means it sends username and password + only slightly obfuscated, but still fully readable by anyone that sniffs on + the network between you and the remote server. + + To tell curl to use a user and password for authentication: + + curl --user name:password http://www.example.com + + 6.2 Other Authentication + + The site might require a different authentication method (check the headers + returned by the server), and then --ntlm, --digest, --negotiate or even + --anyauth might be options that suit you. + + 6.3 Proxy Authentication + + Sometimes your HTTP access is only available through the use of a HTTP + proxy. This seems to be especially common at various companies. A HTTP proxy + may require its own user and password to allow the client to get through to + the Internet. To specify those with curl, run something like: + + curl --proxy-user proxyuser:proxypassword curl.haxx.se + + If your proxy requires the authentication to be done using the NTLM method, + use --proxy-ntlm, if it requires Digest use --proxy-digest. + + If you use any one of these user+password options but leave out the password + part, curl will prompt for the password interactively. + + 6.4 Hiding credentials + + Do note that when a program is run, its parameters might be possible to see + when listing the running processes of the system. Thus, other users may be + able to watch your passwords if you pass them as plain command line + options. There are ways to circumvent this. + + It is worth noting that while this is how HTTP Authentication works, very + many web sites will not use this concept when they provide logins etc. See + the Web Login chapter further below for more details on that. + +7. More HTTP Headers + + 7.1 Referer + + A HTTP request may include a 'referer' field (yes it is misspelled), which + can be used to tell from which URL the client got to this particular + resource. Some programs/scripts check the referer field of requests to verify + that this wasn't arriving from an external site or an unknown page. While + this is a stupid way to check something so easily forged, many scripts still + do it. Using curl, you can put anything you want in the referer-field and + thus more easily be able to fool the server into serving your request. + + Use curl to set the referer field with: + + curl --referer http://www.example.come http://www.example.com + + 7.2 User Agent + + Very similar to the referer field, all HTTP requests may set the User-Agent + field. It names what user agent (client) that is being used. Many + applications use this information to decide how to display pages. Silly web + programmers try to make different pages for users of different browsers to + make them look the best possible for their particular browsers. They usually + also do different kinds of javascript, vbscript etc. + + At times, you will see that getting a page with curl will not return the same + page that you see when getting the page with your browser. Then you know it + is time to set the User Agent field to fool the server into thinking you're + one of those browsers. + + To make curl look like Internet Explorer 5 on a Windows 2000 box: + + curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL] + + Or why not look like you're using Netscape 4.73 on an old Linux box: + + curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL] + +8. Redirects + + 8.1 Location header + + When a resource is requested from a server, the reply from the server may + include a hint about where the browser should go next to find this page, or a + new page keeping newly generated output. The header that tells the browser + to redirect is Location:. + + Curl does not follow Location: headers by default, but will simply display + such pages in the same manner it displays all HTTP replies. It does however + feature an option that will make it attempt to follow the Location: pointers. + + To tell curl to follow a Location: + + curl --location http://www.example.com + + If you use curl to POST to a site that immediately redirects you to another + page, you can safely use --location (-L) and --data/--form together. Curl will + only use POST in the first request, and then revert to GET in the following + operations. + + 8.2 Other redirects + + Browser typically support at least two other ways of redirects that curl + doesn't: first the html may contain a meta refresh tag that asks the browser + to load a specific URL after a set number of seconds, or it may use + javascript to do it. + +9. Cookies + + 9.1 Cookie Basics + + The way the web browsers do "client side state control" is by using + cookies. Cookies are just names with associated contents. The cookies are + sent to the client by the server. The server tells the client for what path + and host name it wants the cookie sent back, and it also sends an expiration + date and a few more properties. + + When a client communicates with a server with a name and path as previously + specified in a received cookie, the client sends back the cookies and their + contents to the server, unless of course they are expired. + + Many applications and servers use this method to connect a series of requests + into a single logical session. To be able to use curl in such occasions, we + must be able to record and send back cookies the way the web application + expects them. The same way browsers deal with them. + + 9.2 Cookie options + + The simplest way to send a few cookies to the server when getting a page with + curl is to add them on the command line like: + + curl --cookie "name=Daniel" http://www.example.com + + Cookies are sent as common HTTP headers. This is practical as it allows curl + to record cookies simply by recording headers. Record cookies with curl by + using the --dump-header (-D) option like: + + curl --dump-header headers_and_cookies http://www.example.com + + (Take note that the --cookie-jar option described below is a better way to + store cookies.) + + Curl has a full blown cookie parsing engine built-in that comes in use if you + want to reconnect to a server and use cookies that were stored from a + previous connection (or hand-crafted manually to fool the server into + believing you had a previous connection). To use previously stored cookies, + you run curl like: + + curl --cookie stored_cookies_in_file http://www.example.com + + Curl's "cookie engine" gets enabled when you use the --cookie option. If you + only want curl to understand received cookies, use --cookie with a file that + doesn't exist. Example, if you want to let curl understand cookies from a + page and follow a location (and thus possibly send back cookies it received), + you can invoke it like: + + curl --cookie nada --location http://www.example.com + + Curl has the ability to read and write cookie files that use the same file + format that Netscape and Mozilla once used. It is a convenient way to share + cookies between scripts or invokes. The --cookie (-b) switch automatically + detects if a given file is such a cookie file and parses it, and by using the + --cookie-jar (-c) option you'll make curl write a new cookie file at the end + of an operation: + + curl --cookie cookies.txt --cookie-jar newcookies.txt \ + http://www.example.com + +10. HTTPS + + 10.1 HTTPS is HTTP secure + + There are a few ways to do secure HTTP transfers. By far the most common + protocol for doing this is what is generally known as HTTPS, HTTP over + SSL. SSL encrypts all the data that is sent and received over the network and + thus makes it harder for attackers to spy on sensitive information. + + SSL (or TLS as the latest version of the standard is called) offers a + truckload of advanced features to allow all those encryptions and key + infrastructure mechanisms encrypted HTTP requires. + + Curl supports encrypted fetches when built to use a TLS library and it can be + built to use one out of a fairly large set of libraries - "curl -V" will show + which one your curl was built to use (if any!). To get a page from a HTTPS + server, simply run curl like: + + curl https://secure.example.com + + 10.2 Certificates + + In the HTTPS world, you use certificates to validate that you are the one + you claim to be, as an addition to normal passwords. Curl supports client- + side certificates. All certificates are locked with a pass phrase, which you + need to enter before the certificate can be used by curl. The pass phrase + can be specified on the command line or if not, entered interactively when + curl queries for it. Use a certificate with curl on a HTTPS server like: + + curl --cert mycert.pem https://secure.example.com + + curl also tries to verify that the server is who it claims to be, by + verifying the server's certificate against a locally stored CA cert + bundle. Failing the verification will cause curl to deny the connection. You + must then use --insecure (-k) in case you want to tell curl to ignore that + the server can't be verified. + + More about server certificate verification and ca cert bundles can be read + in the SSLCERTS document, available online here: + + https://curl.haxx.se/docs/sslcerts.html + + At times you may end up with your own CA cert store and then you can tell + curl to use that to verify the server's certificate: + + curl --cacert ca-bundle.pem https://example.com/ + + +11. Custom Request Elements + +11.1 Modify method and headers + + Doing fancy stuff, you may need to add or change elements of a single curl + request. + + For example, you can change the POST request to a PROPFIND and send the data + as "Content-Type: text/xml" (instead of the default Content-Type) like this: + + curl --data "" --header "Content-Type: text/xml" \ + --request PROPFIND url.com + + You can delete a default header by providing one without content. Like you + can ruin the request by chopping off the Host: header: + + curl --header "Host:" http://www.example.com + + You can add headers the same way. Your server may want a "Destination:" + header, and you can add it: + + curl --header "Destination: http://nowhere" http://example.com + + 11.2 More on changed methods + + It should be noted that curl selects which methods to use on its own + depending on what action to ask for. -d will do POST, -I will do HEAD and so + on. If you use the --request / -X option you can change the method keyword + curl selects, but you will not modify curl's behavior. This means that if you + for example use -d "data" to do a POST, you can modify the method to a + PROPFIND with -X and curl will still think it sends a POST. You can change + the normal GET to a POST method by simply adding -X POST in a command line + like: + + curl -X POST http://example.org/ + + ... but curl will still think and act as if it sent a GET so it won't send any + request body etc. + + +12. Web Login + + 12.1 Some login tricks + + While not strictly just HTTP related, it still causes a lot of people problems + so here's the executive run-down of how the vast majority of all login forms + work and how to login to them using curl. + + It can also be noted that to do this properly in an automated fashion, you + will most certainly need to script things and do multiple curl invokes etc. + + First, servers mostly use cookies to track the logged-in status of the + client, so you will need to capture the cookies you receive in the + responses. Then, many sites also set a special cookie on the login page (to + make sure you got there through their login page) so you should make a habit + of first getting the login-form page to capture the cookies set there. + + Some web-based login systems feature various amounts of javascript, and + sometimes they use such code to set or modify cookie contents. Possibly they + do that to prevent programmed logins, like this manual describes how to... + Anyway, if reading the code isn't enough to let you repeat the behavior + manually, capturing the HTTP requests done by your browsers and analyzing the + sent cookies is usually a working method to work out how to shortcut the + javascript need. + + In the actual
    tag for the login, lots of sites fill-in random/session + or otherwise secretly generated hidden tags and you may need to first capture + the HTML code for the login form and extract all the hidden fields to be able + to do a proper login POST. Remember that the contents need to be URL encoded + when sent in a normal POST. + +13. Debug + + 13.1 Some debug tricks + + Many times when you run curl on a site, you'll notice that the site doesn't + seem to respond the same way to your curl requests as it does to your + browser's. + + Then you need to start making your curl requests more similar to your + browser's requests: + + * Use the --trace-ascii option to store fully detailed logs of the requests + for easier analyzing and better understanding + + * Make sure you check for and use cookies when needed (both reading with + --cookie and writing with --cookie-jar) + + * Set user-agent to one like a recent popular browser does + + * Set referer like it is set by the browser + + * If you use POST, make sure you send all the fields and in the same order as + the browser does it. + + A very good helper to make sure you do this right, is the LiveHTTPHeader tool + that lets you view all headers you send and receive with Mozilla/Firefox + (even when using HTTPS). Chrome features similar functionality out of the box + among the developer's tools. + + A more raw approach is to capture the HTTP traffic on the network with tools + such as ethereal or tcpdump and check what headers that were sent and + received by the browser. (HTTPS makes this technique inefficient.) + +14. References + + 14.1 Standards + + RFC 7230 is a must to read if you want in-depth understanding of the HTTP + protocol + + RFC 3986 explains the URL syntax + + RFC 1867 defines the HTTP post upload format + + RFC 6525 defines how HTTP cookies work + + 14.2 Sites + + https://curl.haxx.se is the home of the curl project diff --git a/bin/curl/docs/VERSIONS.txt b/bin/curl/docs/VERSIONS.txt new file mode 100644 index 00000000..72a45474 --- /dev/null +++ b/bin/curl/docs/VERSIONS.txt @@ -0,0 +1,56 @@ +Version Numbers and Releases +============================ + + Curl is not only curl. Curl is also libcurl. They're actually individually + versioned, but they mostly follow each other rather closely. + + The version numbering is always built up using the same system: + + X.Y.Z + + - X is main version number + - Y is release number + - Z is patch number + +## Bumping numbers + + One of these numbers will get bumped in each new release. The numbers to the + right of a bumped number will be reset to zero. If Z is zero, it may not be + included in the version number. + + The main version number will get bumped when *really* big, world colliding + changes are made. The release number is bumped when changes are performed or + things/features are added. The patch number is bumped when the changes are + mere bugfixes. + + It means that after release 1.2.3, we can release 2.0 if something really big + has been made, 1.3 if not that big changes were made or 1.2.4 if mostly bugs + were fixed. + + Bumping, as in increasing the number with 1, is unconditionally only + affecting one of the numbers (except the ones to the right of it, that may be + set to zero). 1 becomes 2, 3 becomes 4, 9 becomes 10, 88 becomes 89 and 99 + becomes 100. So, after 1.2.9 comes 1.2.10. After 3.99.3, 3.100 might come. + + All original curl source release archives are named according to the libcurl + version (not according to the curl client version that, as said before, might + differ). + + As a service to any application that might want to support new libcurl + features while still being able to build with older versions, all releases + have the libcurl version stored in the curl/curlver.h file using a static + numbering scheme that can be used for comparison. The version number is + defined as: + + #define LIBCURL_VERSION_NUM 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal. All three number fields are always represented using two digits + (eight bits each). 1.2 would appear as "0x010200" while version 9.11.7 + appears as "0x090b07". + + This 6-digit hexadecimal number is always a greater number in a more recent + release. It makes comparisons with greater than and less than work. + + This number is also available as three separate defines: + `LIBCURL_VERSION_MAJOR`, `LIBCURL_VERSION_MINOR` and `LIBCURL_VERSION_PATCH`. diff --git a/bin/curl/docs/libcurl/ABI.txt b/bin/curl/docs/libcurl/ABI.txt new file mode 100644 index 00000000..c7c91420 --- /dev/null +++ b/bin/curl/docs/libcurl/ABI.txt @@ -0,0 +1,68 @@ +ABI - Application Binary Interface +================================== + + "ABI" describes the low-level interface between an application program and a + library. Calling conventions, function arguments, return values, struct + sizes/defines and more. + + [Wikipedia has a longer description](https://en.wikipedia.org/wiki/Application_binary_interface) + +Upgrades +-------- + + In the vast majority of all cases, a typical libcurl upgrade does not break + the ABI at all. Your application can remain using libcurl just as before, + only with less bugs and possibly with added new features. You need to read + the release notes, and if they mention an ABI break/soname bump, you may have + to verify that your application still builds fine and uses libcurl as it now + is defined to work. + +Version Numbers +--------------- + + In libcurl land, you really can't tell by the libcurl version number if that + libcurl is binary compatible or not with another libcurl version. + +Soname Bumps +------------ + + Whenever there are changes done to the library that will cause an ABI + breakage, that may require your application to get attention or possibly be + changed to adhere to new things, we will bump the soname. Then the library + will get a different output name and thus can in fact be installed in + parallel with an older installed lib (on most systems). Thus, old + applications built against the previous ABI version will remain working and + using the older lib, while newer applications build and use the newer one. + + During the first seven years of libcurl releases, there have only been four + ABI breakages. + + We are determined to bump the SONAME as rarely as possible. Ideally, we + never do it again. + +Downgrades +---------- + + Going to an older libcurl version from one you're currently using can be a + tricky thing. Mostly we add features and options to newer libcurls as that + won't break ABI or hamper existing applications. This has the implication + that going backwards may get you in a situation where you pick a libcurl that + doesn't support the options your application needs. Or possibly you even + downgrade so far so you cross an ABI break border and thus a different + soname, and then your application may need to adapt to the modified ABI. + +History +------- + + The previous major library soname number bumps (breaking backwards + compatibility) have happened the following times: + + 0 - libcurl 7.1, August 2000 + + 1 - libcurl 7.5 December 2000 + + 2 - libcurl 7.7 March 2001 + + 3 - libcurl 7.12.0 June 2004 + + 4 - libcurl 7.16.0 October 2006 diff --git a/bin/curl/docs/libcurl/symbols-in-versions.txt b/bin/curl/docs/libcurl/symbols-in-versions.txt new file mode 100644 index 00000000..715badf9 --- /dev/null +++ b/bin/curl/docs/libcurl/symbols-in-versions.txt @@ -0,0 +1,946 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + This document lists defines and other symbols present in libcurl, together + with exact information about the first libcurl version that provides the + symbol, the first version in which the symbol was marked as deprecated and + for a few symbols the last version that featured it. The names appear in + alphabetical order. + + Name Introduced Deprecated Removed + +CURLALTSVC_ALTUSED 7.64.1 +CURLALTSVC_H1 7.64.1 +CURLALTSVC_H2 7.64.1 +CURLALTSVC_H3 7.64.1 +CURLALTSVC_IMMEDIATELY 7.64.1 +CURLALTSVC_READONLYFILE 7.64.1 +CURLAUTH_ANY 7.10.6 +CURLAUTH_ANYSAFE 7.10.6 +CURLAUTH_BASIC 7.10.6 +CURLAUTH_BEARER 7.61.0 +CURLAUTH_DIGEST 7.10.6 +CURLAUTH_DIGEST_IE 7.19.3 +CURLAUTH_GSSAPI 7.55.0 +CURLAUTH_GSSNEGOTIATE 7.10.6 7.38.0 +CURLAUTH_NEGOTIATE 7.38.0 +CURLAUTH_NONE 7.10.6 +CURLAUTH_NTLM 7.10.6 +CURLAUTH_NTLM_WB 7.22.0 +CURLAUTH_ONLY 7.21.3 +CURLCLOSEPOLICY_CALLBACK 7.7 +CURLCLOSEPOLICY_LEAST_RECENTLY_USED 7.7 +CURLCLOSEPOLICY_LEAST_TRAFFIC 7.7 +CURLCLOSEPOLICY_NONE 7.7 +CURLCLOSEPOLICY_OLDEST 7.7 +CURLCLOSEPOLICY_SLOWEST 7.7 +CURLE_ABORTED_BY_CALLBACK 7.1 +CURLE_AGAIN 7.18.2 +CURLE_ALREADY_COMPLETE 7.7.2 +CURLE_BAD_CALLING_ORDER 7.1 7.17.0 +CURLE_BAD_CONTENT_ENCODING 7.10 +CURLE_BAD_DOWNLOAD_RESUME 7.10 +CURLE_BAD_FUNCTION_ARGUMENT 7.1 +CURLE_BAD_PASSWORD_ENTERED 7.4.2 7.17.0 +CURLE_CHUNK_FAILED 7.21.0 +CURLE_CONV_FAILED 7.15.4 +CURLE_CONV_REQD 7.15.4 +CURLE_COULDNT_CONNECT 7.1 +CURLE_COULDNT_RESOLVE_HOST 7.1 +CURLE_COULDNT_RESOLVE_PROXY 7.1 +CURLE_FAILED_INIT 7.1 +CURLE_FILESIZE_EXCEEDED 7.10.8 +CURLE_FILE_COULDNT_READ_FILE 7.1 +CURLE_FTP_ACCEPT_FAILED 7.24.0 +CURLE_FTP_ACCEPT_TIMEOUT 7.24.0 +CURLE_FTP_ACCESS_DENIED 7.1 +CURLE_FTP_BAD_DOWNLOAD_RESUME 7.1 7.1 +CURLE_FTP_BAD_FILE_LIST 7.21.0 +CURLE_FTP_CANT_GET_HOST 7.1 +CURLE_FTP_CANT_RECONNECT 7.1 7.17.0 +CURLE_FTP_COULDNT_GET_SIZE 7.1 7.17.0 +CURLE_FTP_COULDNT_RETR_FILE 7.1 +CURLE_FTP_COULDNT_SET_ASCII 7.1 7.17.0 +CURLE_FTP_COULDNT_SET_BINARY 7.1 7.17.0 +CURLE_FTP_COULDNT_SET_TYPE 7.17.0 +CURLE_FTP_COULDNT_STOR_FILE 7.1 +CURLE_FTP_COULDNT_USE_REST 7.1 +CURLE_FTP_PARTIAL_FILE 7.1 7.1 +CURLE_FTP_PORT_FAILED 7.1 +CURLE_FTP_PRET_FAILED 7.20.0 +CURLE_FTP_QUOTE_ERROR 7.1 7.17.0 +CURLE_FTP_SSL_FAILED 7.11.0 7.17.0 +CURLE_FTP_USER_PASSWORD_INCORRECT 7.1 7.17.0 +CURLE_FTP_WEIRD_227_FORMAT 7.1 +CURLE_FTP_WEIRD_PASS_REPLY 7.1 +CURLE_FTP_WEIRD_PASV_REPLY 7.1 +CURLE_FTP_WEIRD_SERVER_REPLY 7.1 +CURLE_FTP_WEIRD_USER_REPLY 7.1 7.17.0 +CURLE_FTP_WRITE_ERROR 7.1 7.17.0 +CURLE_FUNCTION_NOT_FOUND 7.1 +CURLE_GOT_NOTHING 7.9.1 +CURLE_HTTP2 7.38.0 +CURLE_HTTP2_STREAM 7.49.0 +CURLE_HTTP_NOT_FOUND 7.1 +CURLE_HTTP_PORT_FAILED 7.3 7.12.0 +CURLE_HTTP_POST_ERROR 7.1 +CURLE_HTTP_RANGE_ERROR 7.1 7.17.0 +CURLE_HTTP_RETURNED_ERROR 7.10.3 +CURLE_INTERFACE_FAILED 7.12.0 +CURLE_LDAP_CANNOT_BIND 7.1 +CURLE_LDAP_INVALID_URL 7.10.8 +CURLE_LDAP_SEARCH_FAILED 7.1 +CURLE_LIBRARY_NOT_FOUND 7.1 7.17.0 +CURLE_LOGIN_DENIED 7.13.1 +CURLE_MALFORMAT_USER 7.1 7.17.0 +CURLE_NOT_BUILT_IN 7.21.5 +CURLE_NO_CONNECTION_AVAILABLE 7.30.0 +CURLE_OK 7.1 +CURLE_OPERATION_TIMEDOUT 7.10.2 +CURLE_OPERATION_TIMEOUTED 7.1 7.17.0 +CURLE_OUT_OF_MEMORY 7.1 +CURLE_PARTIAL_FILE 7.1 +CURLE_PEER_FAILED_VERIFICATION 7.17.1 +CURLE_QUOTE_ERROR 7.17.0 +CURLE_RANGE_ERROR 7.17.0 +CURLE_READ_ERROR 7.1 +CURLE_RECURSIVE_API_CALL 7.59.0 +CURLE_RECV_ERROR 7.10 +CURLE_REMOTE_ACCESS_DENIED 7.17.0 +CURLE_REMOTE_DISK_FULL 7.17.0 +CURLE_REMOTE_FILE_EXISTS 7.17.0 +CURLE_REMOTE_FILE_NOT_FOUND 7.16.1 +CURLE_RTSP_CSEQ_ERROR 7.20.0 +CURLE_RTSP_SESSION_ERROR 7.20.0 +CURLE_SEND_ERROR 7.10 +CURLE_SEND_FAIL_REWIND 7.12.3 +CURLE_SHARE_IN_USE 7.9.6 7.17.0 +CURLE_SSH 7.16.1 +CURLE_SSL_CACERT 7.10 7.62.0 +CURLE_SSL_CACERT_BADFILE 7.16.0 +CURLE_SSL_CERTPROBLEM 7.10 +CURLE_SSL_CIPHER 7.10 +CURLE_SSL_CONNECT_ERROR 7.1 +CURLE_SSL_CRL_BADFILE 7.19.0 +CURLE_SSL_ENGINE_INITFAILED 7.12.3 +CURLE_SSL_ENGINE_NOTFOUND 7.9.3 +CURLE_SSL_ENGINE_SETFAILED 7.9.3 +CURLE_SSL_INVALIDCERTSTATUS 7.41.0 +CURLE_SSL_ISSUER_ERROR 7.19.0 +CURLE_SSL_PEER_CERTIFICATE 7.8 7.17.1 +CURLE_SSL_PINNEDPUBKEYNOTMATCH 7.39.0 +CURLE_SSL_SHUTDOWN_FAILED 7.16.1 +CURLE_TELNET_OPTION_SYNTAX 7.7 +CURLE_TFTP_DISKFULL 7.15.0 7.17.0 +CURLE_TFTP_EXISTS 7.15.0 7.17.0 +CURLE_TFTP_ILLEGAL 7.15.0 +CURLE_TFTP_NOSUCHUSER 7.15.0 +CURLE_TFTP_NOTFOUND 7.15.0 +CURLE_TFTP_PERM 7.15.0 +CURLE_TFTP_UNKNOWNID 7.15.0 +CURLE_TOO_MANY_REDIRECTS 7.5 +CURLE_UNKNOWN_OPTION 7.21.5 +CURLE_UNKNOWN_TELNET_OPTION 7.7 +CURLE_UNSUPPORTED_PROTOCOL 7.1 +CURLE_UPLOAD_FAILED 7.16.3 +CURLE_URL_MALFORMAT 7.1 +CURLE_URL_MALFORMAT_USER 7.1 7.17.0 +CURLE_USE_SSL_FAILED 7.17.0 +CURLE_WEIRD_SERVER_REPLY 7.51.0 +CURLE_WRITE_ERROR 7.1 +CURLFILETYPE_DEVICE_BLOCK 7.21.0 +CURLFILETYPE_DEVICE_CHAR 7.21.0 +CURLFILETYPE_DIRECTORY 7.21.0 +CURLFILETYPE_DOOR 7.21.0 +CURLFILETYPE_FILE 7.21.0 +CURLFILETYPE_NAMEDPIPE 7.21.0 +CURLFILETYPE_SOCKET 7.21.0 +CURLFILETYPE_SYMLINK 7.21.0 +CURLFILETYPE_UNKNOWN 7.21.0 +CURLFINFOFLAG_KNOWN_FILENAME 7.21.0 +CURLFINFOFLAG_KNOWN_FILETYPE 7.21.0 +CURLFINFOFLAG_KNOWN_GID 7.21.0 +CURLFINFOFLAG_KNOWN_HLINKCOUNT 7.21.0 +CURLFINFOFLAG_KNOWN_PERM 7.21.0 +CURLFINFOFLAG_KNOWN_SIZE 7.21.0 +CURLFINFOFLAG_KNOWN_TIME 7.21.0 +CURLFINFOFLAG_KNOWN_UID 7.21.0 +CURLFORM_ARRAY 7.9.1 7.56.0 +CURLFORM_ARRAY_END 7.9.1 7.9.5 7.9.6 +CURLFORM_ARRAY_START 7.9.1 7.9.5 7.9.6 +CURLFORM_BUFFER 7.9.8 7.56.0 +CURLFORM_BUFFERLENGTH 7.9.8 7.56.0 +CURLFORM_BUFFERPTR 7.9.8 7.56.0 +CURLFORM_CONTENTHEADER 7.9.3 7.56.0 +CURLFORM_CONTENTLEN 7.46.0 7.56.0 +CURLFORM_CONTENTSLENGTH 7.9 7.56.0 +CURLFORM_CONTENTTYPE 7.9 7.56.0 +CURLFORM_COPYCONTENTS 7.9 7.56.0 +CURLFORM_COPYNAME 7.9 7.56.0 +CURLFORM_END 7.9 7.56.0 +CURLFORM_FILE 7.9 7.56.0 +CURLFORM_FILECONTENT 7.9.1 7.56.0 +CURLFORM_FILENAME 7.9.6 7.56.0 +CURLFORM_NAMELENGTH 7.9 7.56.0 +CURLFORM_NOTHING 7.9 7.56.0 +CURLFORM_PTRCONTENTS 7.9 7.56.0 +CURLFORM_PTRNAME 7.9 7.56.0 +CURLFORM_STREAM 7.18.2 7.56.0 +CURLFTPAUTH_DEFAULT 7.12.2 +CURLFTPAUTH_SSL 7.12.2 +CURLFTPAUTH_TLS 7.12.2 +CURLFTPMETHOD_DEFAULT 7.15.3 +CURLFTPMETHOD_MULTICWD 7.15.3 +CURLFTPMETHOD_NOCWD 7.15.3 +CURLFTPMETHOD_SINGLECWD 7.15.3 +CURLFTPSSL_ALL 7.11.0 7.17.0 +CURLFTPSSL_CCC_ACTIVE 7.16.2 +CURLFTPSSL_CCC_NONE 7.16.2 +CURLFTPSSL_CCC_PASSIVE 7.16.1 +CURLFTPSSL_CONTROL 7.11.0 7.17.0 +CURLFTPSSL_NONE 7.11.0 7.17.0 +CURLFTPSSL_TRY 7.11.0 7.17.0 +CURLFTP_CREATE_DIR 7.19.4 +CURLFTP_CREATE_DIR_NONE 7.19.4 +CURLFTP_CREATE_DIR_RETRY 7.19.4 +CURLGSSAPI_DELEGATION_FLAG 7.22.0 +CURLGSSAPI_DELEGATION_NONE 7.22.0 +CURLGSSAPI_DELEGATION_POLICY_FLAG 7.22.0 +CURLHEADER_SEPARATE 7.37.0 +CURLHEADER_UNIFIED 7.37.0 +CURLINFO_ACTIVESOCKET 7.45.0 +CURLINFO_APPCONNECT_TIME 7.19.0 +CURLINFO_APPCONNECT_TIME_T 7.61.0 +CURLINFO_CERTINFO 7.19.1 +CURLINFO_CONDITION_UNMET 7.19.4 +CURLINFO_CONNECT_TIME 7.4.1 +CURLINFO_CONNECT_TIME_T 7.61.0 +CURLINFO_CONTENT_LENGTH_DOWNLOAD 7.6.1 +CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 7.55.0 +CURLINFO_CONTENT_LENGTH_UPLOAD 7.6.1 +CURLINFO_CONTENT_LENGTH_UPLOAD_T 7.55.0 +CURLINFO_CONTENT_TYPE 7.9.4 +CURLINFO_COOKIELIST 7.14.1 +CURLINFO_DATA_IN 7.9.6 +CURLINFO_DATA_OUT 7.9.6 +CURLINFO_DOUBLE 7.4.1 +CURLINFO_EFFECTIVE_URL 7.4 +CURLINFO_END 7.9.6 +CURLINFO_FILETIME 7.5 +CURLINFO_FILETIME_T 7.59.0 +CURLINFO_FTP_ENTRY_PATH 7.15.4 +CURLINFO_HEADER_IN 7.9.6 +CURLINFO_HEADER_OUT 7.9.6 +CURLINFO_HEADER_SIZE 7.4.1 +CURLINFO_HTTPAUTH_AVAIL 7.10.8 +CURLINFO_HTTP_CODE 7.4.1 7.10.8 +CURLINFO_HTTP_CONNECTCODE 7.10.7 +CURLINFO_HTTP_VERSION 7.50.0 +CURLINFO_LASTONE 7.4.1 +CURLINFO_LASTSOCKET 7.15.2 +CURLINFO_LOCAL_IP 7.21.0 +CURLINFO_LOCAL_PORT 7.21.0 +CURLINFO_LONG 7.4.1 +CURLINFO_MASK 7.4.1 +CURLINFO_NAMELOOKUP_TIME 7.4.1 +CURLINFO_NAMELOOKUP_TIME_T 7.61.0 +CURLINFO_NONE 7.4.1 +CURLINFO_NUM_CONNECTS 7.12.3 +CURLINFO_OFF_T 7.55.0 +CURLINFO_OS_ERRNO 7.12.2 +CURLINFO_PRETRANSFER_TIME 7.4.1 +CURLINFO_PRETRANSFER_TIME_T 7.61.0 +CURLINFO_PRIMARY_IP 7.19.0 +CURLINFO_PRIMARY_PORT 7.21.0 +CURLINFO_PRIVATE 7.10.3 +CURLINFO_PROTOCOL 7.52.0 +CURLINFO_PROXYAUTH_AVAIL 7.10.8 +CURLINFO_PROXY_SSL_VERIFYRESULT 7.52.0 +CURLINFO_PTR 7.54.1 +CURLINFO_REDIRECT_COUNT 7.9.7 +CURLINFO_REDIRECT_TIME 7.9.7 +CURLINFO_REDIRECT_TIME_T 7.61.0 +CURLINFO_REDIRECT_URL 7.18.2 +CURLINFO_REQUEST_SIZE 7.4.1 +CURLINFO_RESPONSE_CODE 7.10.8 +CURLINFO_RTSP_CLIENT_CSEQ 7.20.0 +CURLINFO_RTSP_CSEQ_RECV 7.20.0 +CURLINFO_RTSP_SERVER_CSEQ 7.20.0 +CURLINFO_RTSP_SESSION_ID 7.20.0 +CURLINFO_SCHEME 7.52.0 +CURLINFO_SIZE_DOWNLOAD 7.4.1 +CURLINFO_SIZE_DOWNLOAD_T 7.55.0 +CURLINFO_SIZE_UPLOAD 7.4.1 +CURLINFO_SIZE_UPLOAD_T 7.55.0 +CURLINFO_SLIST 7.12.3 +CURLINFO_SOCKET 7.45.0 +CURLINFO_SPEED_DOWNLOAD 7.4.1 +CURLINFO_SPEED_DOWNLOAD_T 7.55.0 +CURLINFO_SPEED_UPLOAD 7.4.1 +CURLINFO_SPEED_UPLOAD_T 7.55.0 +CURLINFO_SSL_DATA_IN 7.12.1 +CURLINFO_SSL_DATA_OUT 7.12.1 +CURLINFO_SSL_ENGINES 7.12.3 +CURLINFO_SSL_VERIFYRESULT 7.5 +CURLINFO_STARTTRANSFER_TIME 7.9.2 +CURLINFO_STARTTRANSFER_TIME_T 7.61.0 +CURLINFO_STRING 7.4.1 +CURLINFO_TEXT 7.9.6 +CURLINFO_TLS_SESSION 7.34.0 7.48.0 +CURLINFO_TLS_SSL_PTR 7.48.0 +CURLINFO_TOTAL_TIME 7.4.1 +CURLINFO_TOTAL_TIME_T 7.61.0 +CURLINFO_TYPEMASK 7.4.1 +CURLIOCMD_NOP 7.12.3 +CURLIOCMD_RESTARTREAD 7.12.3 +CURLIOE_FAILRESTART 7.12.3 +CURLIOE_OK 7.12.3 +CURLIOE_UNKNOWNCMD 7.12.3 +CURLKHMATCH_MISMATCH 7.19.6 +CURLKHMATCH_MISSING 7.19.6 +CURLKHMATCH_OK 7.19.6 +CURLKHSTAT_DEFER 7.19.6 +CURLKHSTAT_FINE 7.19.6 +CURLKHSTAT_FINE_ADD_TO_FILE 7.19.6 +CURLKHSTAT_REJECT 7.19.6 +CURLKHTYPE_DSS 7.19.6 +CURLKHTYPE_ECDSA 7.58.0 +CURLKHTYPE_ED25519 7.58.0 +CURLKHTYPE_RSA 7.19.6 +CURLKHTYPE_RSA1 7.19.6 +CURLKHTYPE_UNKNOWN 7.19.6 +CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 7.30.0 +CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 7.30.0 +CURLMOPT_MAXCONNECTS 7.16.3 +CURLMOPT_MAX_HOST_CONNECTIONS 7.30.0 +CURLMOPT_MAX_PIPELINE_LENGTH 7.30.0 +CURLMOPT_MAX_TOTAL_CONNECTIONS 7.30.0 +CURLMOPT_PIPELINING 7.16.0 +CURLMOPT_PIPELINING_SERVER_BL 7.30.0 +CURLMOPT_PIPELINING_SITE_BL 7.30.0 +CURLMOPT_PUSHDATA 7.44.0 +CURLMOPT_PUSHFUNCTION 7.44.0 +CURLMOPT_SOCKETDATA 7.15.4 +CURLMOPT_SOCKETFUNCTION 7.15.4 +CURLMOPT_TIMERDATA 7.16.0 +CURLMOPT_TIMERFUNCTION 7.16.0 +CURLMSG_DONE 7.9.6 +CURLMSG_NONE 7.9.6 +CURLM_ADDED_ALREADY 7.32.1 +CURLM_BAD_EASY_HANDLE 7.9.6 +CURLM_BAD_HANDLE 7.9.6 +CURLM_BAD_SOCKET 7.15.4 +CURLM_CALL_MULTI_PERFORM 7.9.6 +CURLM_CALL_MULTI_SOCKET 7.15.5 +CURLM_INTERNAL_ERROR 7.9.6 +CURLM_OK 7.9.6 +CURLM_OUT_OF_MEMORY 7.9.6 +CURLM_RECURSIVE_API_CALL 7.59.0 +CURLM_UNKNOWN_OPTION 7.15.4 +CURLOPTTYPE_FUNCTIONPOINT 7.1 +CURLOPTTYPE_LONG 7.1 +CURLOPTTYPE_OBJECTPOINT 7.1 +CURLOPTTYPE_OFF_T 7.11.0 +CURLOPTTYPE_STRINGPOINT 7.46.0 +CURLOPT_ABSTRACT_UNIX_SOCKET 7.53.0 +CURLOPT_ACCEPTTIMEOUT_MS 7.24.0 +CURLOPT_ACCEPT_ENCODING 7.21.6 +CURLOPT_ADDRESS_SCOPE 7.19.0 +CURLOPT_ALTSVC 7.64.1 +CURLOPT_ALTSVC_CTRL 7.64.1 +CURLOPT_APPEND 7.17.0 +CURLOPT_AUTOREFERER 7.1 +CURLOPT_BUFFERSIZE 7.10 +CURLOPT_CAINFO 7.4.2 +CURLOPT_CAPATH 7.9.8 +CURLOPT_CERTINFO 7.19.1 +CURLOPT_CHUNK_BGN_FUNCTION 7.21.0 +CURLOPT_CHUNK_DATA 7.21.0 +CURLOPT_CHUNK_END_FUNCTION 7.21.0 +CURLOPT_CLOSEFUNCTION 7.7 7.11.1 7.15.5 +CURLOPT_CLOSEPOLICY 7.7 7.16.1 +CURLOPT_CLOSESOCKETDATA 7.21.7 +CURLOPT_CLOSESOCKETFUNCTION 7.21.7 +CURLOPT_CONNECTTIMEOUT 7.7 +CURLOPT_CONNECTTIMEOUT_MS 7.16.2 +CURLOPT_CONNECT_ONLY 7.15.2 +CURLOPT_CONNECT_TO 7.49.0 +CURLOPT_CONV_FROM_NETWORK_FUNCTION 7.15.4 +CURLOPT_CONV_FROM_UTF8_FUNCTION 7.15.4 +CURLOPT_CONV_TO_NETWORK_FUNCTION 7.15.4 +CURLOPT_COOKIE 7.1 +CURLOPT_COOKIEFILE 7.1 +CURLOPT_COOKIEJAR 7.9 +CURLOPT_COOKIELIST 7.14.1 +CURLOPT_COOKIESESSION 7.9.7 +CURLOPT_COPYPOSTFIELDS 7.17.1 +CURLOPT_CRLF 7.1 +CURLOPT_CRLFILE 7.19.0 +CURLOPT_CURLU 7.63.0 +CURLOPT_CUSTOMREQUEST 7.1 +CURLOPT_DEBUGDATA 7.9.6 +CURLOPT_DEBUGFUNCTION 7.9.6 +CURLOPT_DEFAULT_PROTOCOL 7.45.0 +CURLOPT_DIRLISTONLY 7.17.0 +CURLOPT_DISALLOW_USERNAME_IN_URL 7.61.0 +CURLOPT_DNS_CACHE_TIMEOUT 7.9.3 +CURLOPT_DNS_INTERFACE 7.33.0 +CURLOPT_DNS_LOCAL_IP4 7.33.0 +CURLOPT_DNS_LOCAL_IP6 7.33.0 +CURLOPT_DNS_SERVERS 7.24.0 +CURLOPT_DNS_SHUFFLE_ADDRESSES 7.60.0 +CURLOPT_DNS_USE_GLOBAL_CACHE 7.9.3 7.11.1 +CURLOPT_DOH_URL 7.62.0 +CURLOPT_EGDSOCKET 7.7 +CURLOPT_ENCODING 7.10 +CURLOPT_ERRORBUFFER 7.1 +CURLOPT_EXPECT_100_TIMEOUT_MS 7.36.0 +CURLOPT_FAILONERROR 7.1 +CURLOPT_FILE 7.1 7.9.7 +CURLOPT_FILETIME 7.5 +CURLOPT_FNMATCH_DATA 7.21.0 +CURLOPT_FNMATCH_FUNCTION 7.21.0 +CURLOPT_FOLLOWLOCATION 7.1 +CURLOPT_FORBID_REUSE 7.7 +CURLOPT_FRESH_CONNECT 7.7 +CURLOPT_FTPAPPEND 7.1 7.16.4 +CURLOPT_FTPASCII 7.1 7.11.1 7.15.5 +CURLOPT_FTPLISTONLY 7.1 7.16.4 +CURLOPT_FTPPORT 7.1 +CURLOPT_FTPSSLAUTH 7.12.2 +CURLOPT_FTP_ACCOUNT 7.13.0 +CURLOPT_FTP_ALTERNATIVE_TO_USER 7.15.5 +CURLOPT_FTP_CREATE_MISSING_DIRS 7.10.7 +CURLOPT_FTP_FILEMETHOD 7.15.1 +CURLOPT_FTP_RESPONSE_TIMEOUT 7.10.8 +CURLOPT_FTP_SKIP_PASV_IP 7.15.0 +CURLOPT_FTP_SSL 7.11.0 7.16.4 +CURLOPT_FTP_SSL_CCC 7.16.1 +CURLOPT_FTP_USE_EPRT 7.10.5 +CURLOPT_FTP_USE_EPSV 7.9.2 +CURLOPT_FTP_USE_PRET 7.20.0 +CURLOPT_GSSAPI_DELEGATION 7.22.0 +CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 7.59.0 +CURLOPT_HAPROXYPROTOCOL 7.60.0 +CURLOPT_HEADER 7.1 +CURLOPT_HEADERDATA 7.10 +CURLOPT_HEADERFUNCTION 7.7.2 +CURLOPT_HEADEROPT 7.37.0 +CURLOPT_HTTP09_ALLOWED 7.64.0 +CURLOPT_HTTP200ALIASES 7.10.3 +CURLOPT_HTTPAUTH 7.10.6 +CURLOPT_HTTPGET 7.8.1 +CURLOPT_HTTPHEADER 7.1 +CURLOPT_HTTPPOST 7.1 7.56.0 +CURLOPT_HTTPPROXYTUNNEL 7.3 +CURLOPT_HTTPREQUEST 7.1 - 7.15.5 +CURLOPT_HTTP_CONTENT_DECODING 7.16.2 +CURLOPT_HTTP_TRANSFER_DECODING 7.16.2 +CURLOPT_HTTP_VERSION 7.9.1 +CURLOPT_IGNORE_CONTENT_LENGTH 7.14.1 +CURLOPT_INFILE 7.1 7.9.7 +CURLOPT_INFILESIZE 7.1 +CURLOPT_INFILESIZE_LARGE 7.11.0 +CURLOPT_INTERFACE 7.3 +CURLOPT_INTERLEAVEDATA 7.20.0 +CURLOPT_INTERLEAVEFUNCTION 7.20.0 +CURLOPT_IOCTLDATA 7.12.3 +CURLOPT_IOCTLFUNCTION 7.12.3 +CURLOPT_IPRESOLVE 7.10.8 +CURLOPT_ISSUERCERT 7.19.0 +CURLOPT_KEEP_SENDING_ON_ERROR 7.51.0 +CURLOPT_KEYPASSWD 7.17.0 +CURLOPT_KRB4LEVEL 7.3 7.17.0 +CURLOPT_KRBLEVEL 7.16.4 +CURLOPT_LOCALPORT 7.15.2 +CURLOPT_LOCALPORTRANGE 7.15.2 +CURLOPT_LOGIN_OPTIONS 7.34.0 +CURLOPT_LOW_SPEED_LIMIT 7.1 +CURLOPT_LOW_SPEED_TIME 7.1 +CURLOPT_MAIL_AUTH 7.25.0 +CURLOPT_MAIL_FROM 7.20.0 +CURLOPT_MAIL_RCPT 7.20.0 +CURLOPT_MAXAGE_CONN 7.65.0 +CURLOPT_MAXCONNECTS 7.7 +CURLOPT_MAXFILESIZE 7.10.8 +CURLOPT_MAXFILESIZE_LARGE 7.11.0 +CURLOPT_MAXREDIRS 7.5 +CURLOPT_MAX_RECV_SPEED_LARGE 7.15.5 +CURLOPT_MAX_SEND_SPEED_LARGE 7.15.5 +CURLOPT_MIMEPOST 7.56.0 +CURLOPT_MUTE 7.1 7.8 7.15.5 +CURLOPT_NETRC 7.1 +CURLOPT_NETRC_FILE 7.11.0 +CURLOPT_NEW_DIRECTORY_PERMS 7.16.4 +CURLOPT_NEW_FILE_PERMS 7.16.4 +CURLOPT_NOBODY 7.1 +CURLOPT_NOPROGRESS 7.1 +CURLOPT_NOPROXY 7.19.4 +CURLOPT_NOSIGNAL 7.10 +CURLOPT_NOTHING 7.1.1 7.11.1 7.11.0 +CURLOPT_OPENSOCKETDATA 7.17.1 +CURLOPT_OPENSOCKETFUNCTION 7.17.1 +CURLOPT_PASSWDDATA 7.4.2 7.11.1 7.15.5 +CURLOPT_PASSWDFUNCTION 7.4.2 7.11.1 7.15.5 +CURLOPT_PASSWORD 7.19.1 +CURLOPT_PASV_HOST 7.12.1 7.16.0 7.15.5 +CURLOPT_PATH_AS_IS 7.42.0 +CURLOPT_PINNEDPUBLICKEY 7.39.0 +CURLOPT_PIPEWAIT 7.43.0 +CURLOPT_PORT 7.1 +CURLOPT_POST 7.1 +CURLOPT_POST301 7.17.1 7.19.1 +CURLOPT_POSTFIELDS 7.1 +CURLOPT_POSTFIELDSIZE 7.2 +CURLOPT_POSTFIELDSIZE_LARGE 7.11.1 +CURLOPT_POSTQUOTE 7.1 +CURLOPT_POSTREDIR 7.19.1 +CURLOPT_PREQUOTE 7.9.5 +CURLOPT_PRE_PROXY 7.52.0 +CURLOPT_PRIVATE 7.10.3 +CURLOPT_PROGRESSDATA 7.1 +CURLOPT_PROGRESSFUNCTION 7.1 7.32.0 +CURLOPT_PROTOCOLS 7.19.4 +CURLOPT_PROXY 7.1 +CURLOPT_PROXYAUTH 7.10.7 +CURLOPT_PROXYHEADER 7.37.0 +CURLOPT_PROXYPASSWORD 7.19.1 +CURLOPT_PROXYPORT 7.1 +CURLOPT_PROXYTYPE 7.10 +CURLOPT_PROXYUSERNAME 7.19.1 +CURLOPT_PROXYUSERPWD 7.1 +CURLOPT_PROXY_CAINFO 7.52.0 +CURLOPT_PROXY_CAPATH 7.52.0 +CURLOPT_PROXY_CRLFILE 7.52.0 +CURLOPT_PROXY_KEYPASSWD 7.52.0 +CURLOPT_PROXY_PINNEDPUBLICKEY 7.52.0 +CURLOPT_PROXY_SERVICE_NAME 7.43.0 +CURLOPT_PROXY_SSLCERT 7.52.0 +CURLOPT_PROXY_SSLCERTTYPE 7.52.0 +CURLOPT_PROXY_SSLKEY 7.52.0 +CURLOPT_PROXY_SSLKEYTYPE 7.52.0 +CURLOPT_PROXY_SSLVERSION 7.52.0 +CURLOPT_PROXY_SSL_CIPHER_LIST 7.52.0 +CURLOPT_PROXY_SSL_OPTIONS 7.52.0 +CURLOPT_PROXY_SSL_VERIFYHOST 7.52.0 +CURLOPT_PROXY_SSL_VERIFYPEER 7.52.0 +CURLOPT_PROXY_TLS13_CIPHERS 7.61.0 +CURLOPT_PROXY_TLSAUTH_PASSWORD 7.52.0 +CURLOPT_PROXY_TLSAUTH_TYPE 7.52.0 +CURLOPT_PROXY_TLSAUTH_USERNAME 7.52.0 +CURLOPT_PROXY_TRANSFER_MODE 7.18.0 +CURLOPT_PUT 7.1 +CURLOPT_QUOTE 7.1 +CURLOPT_RANDOM_FILE 7.7 +CURLOPT_RANGE 7.1 +CURLOPT_READDATA 7.9.7 +CURLOPT_READFUNCTION 7.1 +CURLOPT_REDIR_PROTOCOLS 7.19.4 +CURLOPT_REFERER 7.1 +CURLOPT_REQUEST_TARGET 7.55.0 +CURLOPT_RESOLVE 7.21.3 +CURLOPT_RESOLVER_START_DATA 7.59.0 +CURLOPT_RESOLVER_START_FUNCTION 7.59.0 +CURLOPT_RESUME_FROM 7.1 +CURLOPT_RESUME_FROM_LARGE 7.11.0 +CURLOPT_RTSPHEADER 7.20.0 +CURLOPT_RTSP_CLIENT_CSEQ 7.20.0 +CURLOPT_RTSP_REQUEST 7.20.0 +CURLOPT_RTSP_SERVER_CSEQ 7.20.0 +CURLOPT_RTSP_SESSION_ID 7.20.0 +CURLOPT_RTSP_STREAM_URI 7.20.0 +CURLOPT_RTSP_TRANSPORT 7.20.0 +CURLOPT_SASL_IR 7.31.0 +CURLOPT_SEEKDATA 7.18.0 +CURLOPT_SEEKFUNCTION 7.18.0 +CURLOPT_SERVER_RESPONSE_TIMEOUT 7.20.0 +CURLOPT_SERVICE_NAME 7.43.0 +CURLOPT_SHARE 7.10 +CURLOPT_SOCKOPTDATA 7.16.0 +CURLOPT_SOCKOPTFUNCTION 7.16.0 +CURLOPT_SOCKS5_AUTH 7.55.0 +CURLOPT_SOCKS5_GSSAPI_NEC 7.19.4 +CURLOPT_SOCKS5_GSSAPI_SERVICE 7.19.4 7.49.0 +CURLOPT_SOURCE_HOST 7.12.1 - 7.15.5 +CURLOPT_SOURCE_PATH 7.12.1 - 7.15.5 +CURLOPT_SOURCE_PORT 7.12.1 - 7.15.5 +CURLOPT_SOURCE_POSTQUOTE 7.12.1 - 7.15.5 +CURLOPT_SOURCE_PREQUOTE 7.12.1 - 7.15.5 +CURLOPT_SOURCE_QUOTE 7.13.0 - 7.15.5 +CURLOPT_SOURCE_URL 7.13.0 - 7.15.5 +CURLOPT_SOURCE_USERPWD 7.12.1 - 7.15.5 +CURLOPT_SSH_AUTH_TYPES 7.16.1 +CURLOPT_SSH_COMPRESSION 7.56.0 +CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 7.17.1 +CURLOPT_SSH_KEYDATA 7.19.6 +CURLOPT_SSH_KEYFUNCTION 7.19.6 +CURLOPT_SSH_KNOWNHOSTS 7.19.6 +CURLOPT_SSH_PRIVATE_KEYFILE 7.16.1 +CURLOPT_SSH_PUBLIC_KEYFILE 7.16.1 +CURLOPT_SSLCERT 7.1 +CURLOPT_SSLCERTPASSWD 7.1.1 7.17.0 +CURLOPT_SSLCERTTYPE 7.9.3 +CURLOPT_SSLENGINE 7.9.3 +CURLOPT_SSLENGINE_DEFAULT 7.9.3 +CURLOPT_SSLKEY 7.9.3 +CURLOPT_SSLKEYPASSWD 7.9.3 7.17.0 +CURLOPT_SSLKEYTYPE 7.9.3 +CURLOPT_SSLVERSION 7.1 +CURLOPT_SSL_CIPHER_LIST 7.9 +CURLOPT_SSL_CTX_DATA 7.10.6 +CURLOPT_SSL_CTX_FUNCTION 7.10.6 +CURLOPT_SSL_ENABLE_ALPN 7.36.0 +CURLOPT_SSL_ENABLE_NPN 7.36.0 +CURLOPT_SSL_FALSESTART 7.42.0 +CURLOPT_SSL_OPTIONS 7.25.0 +CURLOPT_SSL_SESSIONID_CACHE 7.16.0 +CURLOPT_SSL_VERIFYHOST 7.8.1 +CURLOPT_SSL_VERIFYPEER 7.4.2 +CURLOPT_SSL_VERIFYSTATUS 7.41.0 +CURLOPT_STDERR 7.1 +CURLOPT_STREAM_DEPENDS 7.46.0 +CURLOPT_STREAM_DEPENDS_E 7.46.0 +CURLOPT_STREAM_WEIGHT 7.46.0 +CURLOPT_SUPPRESS_CONNECT_HEADERS 7.54.0 +CURLOPT_TCP_FASTOPEN 7.49.0 +CURLOPT_TCP_KEEPALIVE 7.25.0 +CURLOPT_TCP_KEEPIDLE 7.25.0 +CURLOPT_TCP_KEEPINTVL 7.25.0 +CURLOPT_TCP_NODELAY 7.11.2 +CURLOPT_TELNETOPTIONS 7.7 +CURLOPT_TFTP_BLKSIZE 7.19.4 +CURLOPT_TFTP_NO_OPTIONS 7.48.0 +CURLOPT_TIMECONDITION 7.1 +CURLOPT_TIMEOUT 7.1 +CURLOPT_TIMEOUT_MS 7.16.2 +CURLOPT_TIMEVALUE 7.1 +CURLOPT_TIMEVALUE_LARGE 7.59.0 +CURLOPT_TLS13_CIPHERS 7.61.0 +CURLOPT_TLSAUTH_PASSWORD 7.21.4 +CURLOPT_TLSAUTH_TYPE 7.21.4 +CURLOPT_TLSAUTH_USERNAME 7.21.4 +CURLOPT_TRAILERDATA 7.64.0 +CURLOPT_TRAILERFUNCTION 7.64.0 +CURLOPT_TRANSFERTEXT 7.1.1 +CURLOPT_TRANSFER_ENCODING 7.21.6 +CURLOPT_UNIX_SOCKET_PATH 7.40.0 +CURLOPT_UNRESTRICTED_AUTH 7.10.4 +CURLOPT_UPKEEP_INTERVAL_MS 7.62.0 +CURLOPT_UPLOAD 7.1 +CURLOPT_UPLOAD_BUFFERSIZE 7.62.0 +CURLOPT_URL 7.1 +CURLOPT_USERAGENT 7.1 +CURLOPT_USERNAME 7.19.1 +CURLOPT_USERPWD 7.1 +CURLOPT_USE_SSL 7.17.0 +CURLOPT_VERBOSE 7.1 +CURLOPT_WILDCARDMATCH 7.21.0 +CURLOPT_WRITEDATA 7.9.7 +CURLOPT_WRITEFUNCTION 7.1 +CURLOPT_WRITEHEADER 7.1 +CURLOPT_WRITEINFO 7.1 +CURLOPT_XFERINFODATA 7.32.0 +CURLOPT_XFERINFOFUNCTION 7.32.0 +CURLOPT_XOAUTH2_BEARER 7.33.0 +CURLPAUSE_ALL 7.18.0 +CURLPAUSE_CONT 7.18.0 +CURLPAUSE_RECV 7.18.0 +CURLPAUSE_RECV_CONT 7.18.0 +CURLPAUSE_SEND 7.18.0 +CURLPAUSE_SEND_CONT 7.18.0 +CURLPIPE_HTTP1 7.43.0 +CURLPIPE_MULTIPLEX 7.43.0 +CURLPIPE_NOTHING 7.43.0 +CURLPROTO_ALL 7.19.4 +CURLPROTO_DICT 7.19.4 +CURLPROTO_FILE 7.19.4 +CURLPROTO_FTP 7.19.4 +CURLPROTO_FTPS 7.19.4 +CURLPROTO_GOPHER 7.21.2 +CURLPROTO_HTTP 7.19.4 +CURLPROTO_HTTPS 7.19.4 +CURLPROTO_IMAP 7.20.0 +CURLPROTO_IMAPS 7.20.0 +CURLPROTO_LDAP 7.19.4 +CURLPROTO_LDAPS 7.19.4 +CURLPROTO_POP3 7.20.0 +CURLPROTO_POP3S 7.20.0 +CURLPROTO_RTMP 7.21.0 +CURLPROTO_RTMPE 7.21.0 +CURLPROTO_RTMPS 7.21.0 +CURLPROTO_RTMPT 7.21.0 +CURLPROTO_RTMPTE 7.21.0 +CURLPROTO_RTMPTS 7.21.0 +CURLPROTO_RTSP 7.20.0 +CURLPROTO_SCP 7.19.4 +CURLPROTO_SFTP 7.19.4 +CURLPROTO_SMB 7.40.0 +CURLPROTO_SMBS 7.40.0 +CURLPROTO_SMTP 7.20.0 +CURLPROTO_SMTPS 7.20.0 +CURLPROTO_TELNET 7.19.4 +CURLPROTO_TFTP 7.19.4 +CURLPROXY_HTTP 7.10 +CURLPROXY_HTTPS 7.52.0 +CURLPROXY_HTTP_1_0 7.19.4 +CURLPROXY_SOCKS4 7.10 +CURLPROXY_SOCKS4A 7.18.0 +CURLPROXY_SOCKS5 7.10 +CURLPROXY_SOCKS5_HOSTNAME 7.18.0 +CURLSHE_BAD_OPTION 7.10.3 +CURLSHE_INVALID 7.10.3 +CURLSHE_IN_USE 7.10.3 +CURLSHE_NOMEM 7.12.0 +CURLSHE_NOT_BUILT_IN 7.23.0 +CURLSHE_OK 7.10.3 +CURLSHOPT_LOCKFUNC 7.10.3 +CURLSHOPT_NONE 7.10.3 +CURLSHOPT_SHARE 7.10.3 +CURLSHOPT_UNLOCKFUNC 7.10.3 +CURLSHOPT_UNSHARE 7.10.3 +CURLSHOPT_USERDATA 7.10.3 +CURLSOCKTYPE_ACCEPT 7.28.0 +CURLSOCKTYPE_IPCXN 7.16.0 +CURLSSH_AUTH_AGENT 7.28.0 +CURLSSH_AUTH_ANY 7.16.1 +CURLSSH_AUTH_DEFAULT 7.16.1 +CURLSSH_AUTH_GSSAPI 7.58.0 +CURLSSH_AUTH_HOST 7.16.1 +CURLSSH_AUTH_KEYBOARD 7.16.1 +CURLSSH_AUTH_NONE 7.16.1 +CURLSSH_AUTH_PASSWORD 7.16.1 +CURLSSH_AUTH_PUBLICKEY 7.16.1 +CURLSSLBACKEND_AXTLS 7.38.0 7.61.0 +CURLSSLBACKEND_BORINGSSL 7.49.0 +CURLSSLBACKEND_CYASSL 7.34.0 +CURLSSLBACKEND_DARWINSSL 7.34.0 7.64.1 +CURLSSLBACKEND_GNUTLS 7.34.0 +CURLSSLBACKEND_GSKIT 7.34.0 +CURLSSLBACKEND_LIBRESSL 7.49.0 +CURLSSLBACKEND_MBEDTLS 7.46.0 +CURLSSLBACKEND_MESALINK 7.62.0 +CURLSSLBACKEND_NONE 7.34.0 +CURLSSLBACKEND_NSS 7.34.0 +CURLSSLBACKEND_OPENSSL 7.34.0 +CURLSSLBACKEND_POLARSSL 7.34.0 +CURLSSLBACKEND_QSOSSL 7.34.0 - 7.38.1 +CURLSSLBACKEND_SCHANNEL 7.34.0 +CURLSSLBACKEND_SECURETRANSPORT 7.64.1 +CURLSSLBACKEND_WOLFSSL 7.49.0 +CURLSSLOPT_ALLOW_BEAST 7.25.0 +CURLSSLOPT_NO_REVOKE 7.44.0 +CURLSSLSET_NO_BACKENDS 7.56.0 +CURLSSLSET_OK 7.56.0 +CURLSSLSET_TOO_LATE 7.56.0 +CURLSSLSET_UNKNOWN_BACKEND 7.56.0 +CURLUE_BAD_HANDLE 7.62.0 +CURLUE_BAD_PARTPOINTER 7.62.0 +CURLUE_BAD_PORT_NUMBER 7.62.0 +CURLUE_MALFORMED_INPUT 7.62.0 +CURLUE_NO_FRAGMENT 7.62.0 +CURLUE_NO_HOST 7.62.0 +CURLUE_NO_OPTIONS 7.62.0 +CURLUE_NO_PASSWORD 7.62.0 +CURLUE_NO_PORT 7.62.0 +CURLUE_NO_QUERY 7.62.0 +CURLUE_NO_SCHEME 7.62.0 +CURLUE_NO_USER 7.62.0 +CURLUE_OK 7.62.0 +CURLUE_OUT_OF_MEMORY 7.62.0 +CURLUE_UNKNOWN_PART 7.62.0 +CURLUE_UNSUPPORTED_SCHEME 7.62.0 +CURLUE_URLDECODE 7.62.0 +CURLUE_USER_NOT_ALLOWED 7.62.0 +CURLUPART_FRAGMENT 7.62.0 +CURLUPART_HOST 7.62.0 +CURLUPART_OPTIONS 7.62.0 +CURLUPART_PASSWORD 7.62.0 +CURLUPART_PATH 7.62.0 +CURLUPART_PORT 7.62.0 +CURLUPART_QUERY 7.62.0 +CURLUPART_SCHEME 7.62.0 +CURLUPART_URL 7.62.0 +CURLUPART_USER 7.62.0 +CURLUPART_ZONEID 7.65.0 +CURLUSESSL_ALL 7.17.0 +CURLUSESSL_CONTROL 7.17.0 +CURLUSESSL_NONE 7.17.0 +CURLUSESSL_TRY 7.17.0 +CURLU_APPENDQUERY 7.62.0 +CURLU_DEFAULT_PORT 7.62.0 +CURLU_DEFAULT_SCHEME 7.62.0 +CURLU_DISALLOW_USER 7.62.0 +CURLU_GUESS_SCHEME 7.62.0 +CURLU_NON_SUPPORT_SCHEME 7.62.0 +CURLU_NO_DEFAULT_PORT 7.62.0 +CURLU_PATH_AS_IS 7.62.0 +CURLU_URLDECODE 7.62.0 +CURLU_URLENCODE 7.62.0 +CURLVERSION_FIFTH 7.57.0 +CURLVERSION_FIRST 7.10 +CURLVERSION_FOURTH 7.16.1 +CURLVERSION_NOW 7.10 +CURLVERSION_SECOND 7.11.1 +CURLVERSION_THIRD 7.12.0 +CURL_CHUNK_BGN_FUNC_FAIL 7.21.0 +CURL_CHUNK_BGN_FUNC_OK 7.21.0 +CURL_CHUNK_BGN_FUNC_SKIP 7.21.0 +CURL_CHUNK_END_FUNC_FAIL 7.21.0 +CURL_CHUNK_END_FUNC_OK 7.21.0 +CURL_CSELECT_ERR 7.16.3 +CURL_CSELECT_IN 7.16.3 +CURL_CSELECT_OUT 7.16.3 +CURL_DID_MEMORY_FUNC_TYPEDEFS 7.49.0 +CURL_EASY_NONE 7.14.0 - 7.15.4 +CURL_EASY_TIMEOUT 7.14.0 - 7.15.4 +CURL_ERROR_SIZE 7.1 +CURL_FNMATCHFUNC_FAIL 7.21.0 +CURL_FNMATCHFUNC_MATCH 7.21.0 +CURL_FNMATCHFUNC_NOMATCH 7.21.0 +CURL_FORMADD_DISABLED 7.12.1 7.56.0 +CURL_FORMADD_ILLEGAL_ARRAY 7.9.8 7.56.0 +CURL_FORMADD_INCOMPLETE 7.9.8 7.56.0 +CURL_FORMADD_MEMORY 7.9.8 7.56.0 +CURL_FORMADD_NULL 7.9.8 7.56.0 +CURL_FORMADD_OK 7.9.8 7.56.0 +CURL_FORMADD_OPTION_TWICE 7.9.8 7.56.0 +CURL_FORMADD_UNKNOWN_OPTION 7.9.8 7.56.0 +CURL_GLOBAL_ACK_EINTR 7.30.0 +CURL_GLOBAL_ALL 7.8 +CURL_GLOBAL_DEFAULT 7.8 +CURL_GLOBAL_NOTHING 7.8 +CURL_GLOBAL_SSL 7.8 +CURL_GLOBAL_WIN32 7.8.1 +CURL_HET_DEFAULT 7.59.0 +CURL_HTTPPOST_BUFFER 7.46.0 +CURL_HTTPPOST_CALLBACK 7.46.0 +CURL_HTTPPOST_FILENAME 7.46.0 +CURL_HTTPPOST_LARGE 7.46.0 +CURL_HTTPPOST_PTRBUFFER 7.46.0 +CURL_HTTPPOST_PTRCONTENTS 7.46.0 +CURL_HTTPPOST_PTRNAME 7.46.0 +CURL_HTTPPOST_READFILE 7.46.0 +CURL_HTTP_VERSION_1_0 7.9.1 +CURL_HTTP_VERSION_1_1 7.9.1 +CURL_HTTP_VERSION_2 7.43.0 +CURL_HTTP_VERSION_2TLS 7.47.0 +CURL_HTTP_VERSION_2_0 7.33.0 +CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE 7.49.0 +CURL_HTTP_VERSION_NONE 7.9.1 +CURL_IPRESOLVE_V4 7.10.8 +CURL_IPRESOLVE_V6 7.10.8 +CURL_IPRESOLVE_WHATEVER 7.10.8 +CURL_LOCK_ACCESS_NONE 7.10.3 +CURL_LOCK_ACCESS_SHARED 7.10.3 +CURL_LOCK_ACCESS_SINGLE 7.10.3 +CURL_LOCK_DATA_CONNECT 7.10.3 +CURL_LOCK_DATA_COOKIE 7.10.3 +CURL_LOCK_DATA_DNS 7.10.3 +CURL_LOCK_DATA_NONE 7.10.3 +CURL_LOCK_DATA_PSL 7.61.0 +CURL_LOCK_DATA_SHARE 7.10.4 +CURL_LOCK_DATA_SSL_SESSION 7.10.3 +CURL_LOCK_TYPE_CONNECT 7.10 - 7.10.2 +CURL_LOCK_TYPE_COOKIE 7.10 - 7.10.2 +CURL_LOCK_TYPE_DNS 7.10 - 7.10.2 +CURL_LOCK_TYPE_NONE 7.10 - 7.10.2 +CURL_LOCK_TYPE_SSL_SESSION 7.10 - 7.10.2 +CURL_MAX_HTTP_HEADER 7.19.7 +CURL_MAX_READ_SIZE 7.53.0 +CURL_MAX_WRITE_SIZE 7.9.7 +CURL_NETRC_IGNORED 7.9.8 +CURL_NETRC_OPTIONAL 7.9.8 +CURL_NETRC_REQUIRED 7.9.8 +CURL_POLL_IN 7.14.0 +CURL_POLL_INOUT 7.14.0 +CURL_POLL_NONE 7.14.0 +CURL_POLL_OUT 7.14.0 +CURL_POLL_REMOVE 7.14.0 +CURL_PROGRESS_BAR 7.1.1 - 7.4.1 +CURL_PROGRESS_STATS 7.1.1 - 7.4.1 +CURL_PUSH_DENY 7.44.0 +CURL_PUSH_OK 7.44.0 +CURL_READFUNC_ABORT 7.12.1 +CURL_READFUNC_PAUSE 7.18.0 +CURL_REDIR_GET_ALL 7.19.1 +CURL_REDIR_POST_301 7.19.1 +CURL_REDIR_POST_302 7.19.1 +CURL_REDIR_POST_303 7.25.1 +CURL_REDIR_POST_ALL 7.19.1 +CURL_RTSPREQ_ANNOUNCE 7.20.0 +CURL_RTSPREQ_DESCRIBE 7.20.0 +CURL_RTSPREQ_GET_PARAMETER 7.20.0 +CURL_RTSPREQ_NONE 7.20.0 +CURL_RTSPREQ_OPTIONS 7.20.0 +CURL_RTSPREQ_PAUSE 7.20.0 +CURL_RTSPREQ_PLAY 7.20.0 +CURL_RTSPREQ_RECEIVE 7.20.0 +CURL_RTSPREQ_RECORD 7.20.0 +CURL_RTSPREQ_SETUP 7.20.0 +CURL_RTSPREQ_SET_PARAMETER 7.20.0 +CURL_RTSPREQ_TEARDOWN 7.20.0 +CURL_SEEKFUNC_CANTSEEK 7.19.5 +CURL_SEEKFUNC_FAIL 7.19.5 +CURL_SEEKFUNC_OK 7.19.5 +CURL_SOCKET_BAD 7.14.0 +CURL_SOCKET_TIMEOUT 7.14.0 +CURL_SOCKOPT_ALREADY_CONNECTED 7.21.5 +CURL_SOCKOPT_ERROR 7.21.5 +CURL_SOCKOPT_OK 7.21.5 +CURL_SSLVERSION_DEFAULT 7.9.2 +CURL_SSLVERSION_MAX_DEFAULT 7.54.0 +CURL_SSLVERSION_MAX_NONE 7.54.0 +CURL_SSLVERSION_MAX_TLSv1_0 7.54.0 +CURL_SSLVERSION_MAX_TLSv1_1 7.54.0 +CURL_SSLVERSION_MAX_TLSv1_2 7.54.0 +CURL_SSLVERSION_MAX_TLSv1_3 7.54.0 +CURL_SSLVERSION_SSLv2 7.9.2 +CURL_SSLVERSION_SSLv3 7.9.2 +CURL_SSLVERSION_TLSv1 7.9.2 +CURL_SSLVERSION_TLSv1_0 7.34.0 +CURL_SSLVERSION_TLSv1_1 7.34.0 +CURL_SSLVERSION_TLSv1_2 7.34.0 +CURL_SSLVERSION_TLSv1_3 7.52.0 +CURL_STRICTER 7.50.2 +CURL_TIMECOND_IFMODSINCE 7.9.7 +CURL_TIMECOND_IFUNMODSINCE 7.9.7 +CURL_TIMECOND_LASTMOD 7.9.7 +CURL_TIMECOND_NONE 7.9.7 +CURL_TLSAUTH_NONE 7.21.4 +CURL_TLSAUTH_SRP 7.21.4 +CURL_TRAILERFUNC_ABORT 7.64.0 +CURL_TRAILERFUNC_OK 7.64.0 +CURL_UPKEEP_INTERVAL_DEFAULT 7.62.0 +CURL_VERSION_ALTSVC 7.64.1 +CURL_VERSION_ASYNCHDNS 7.10.7 +CURL_VERSION_BROTLI 7.57.0 +CURL_VERSION_CONV 7.15.4 +CURL_VERSION_CURLDEBUG 7.19.6 +CURL_VERSION_DEBUG 7.10.6 +CURL_VERSION_GSSAPI 7.38.0 +CURL_VERSION_GSSNEGOTIATE 7.10.6 7.38.0 +CURL_VERSION_HTTP2 7.33.0 +CURL_VERSION_HTTPS_PROXY 7.52.0 +CURL_VERSION_IDN 7.12.0 +CURL_VERSION_IPV6 7.10 +CURL_VERSION_KERBEROS4 7.10 7.33.0 +CURL_VERSION_KERBEROS5 7.40.0 +CURL_VERSION_LARGEFILE 7.11.1 +CURL_VERSION_LIBZ 7.10 +CURL_VERSION_MULTI_SSL 7.56.0 +CURL_VERSION_NTLM 7.10.6 +CURL_VERSION_NTLM_WB 7.22.0 +CURL_VERSION_PSL 7.47.0 +CURL_VERSION_SPNEGO 7.10.8 +CURL_VERSION_SSL 7.10 +CURL_VERSION_SSPI 7.13.2 +CURL_VERSION_TLSAUTH_SRP 7.21.4 +CURL_VERSION_UNIX_SOCKETS 7.40.0 +CURL_WAIT_POLLIN 7.28.0 +CURL_WAIT_POLLOUT 7.28.0 +CURL_WAIT_POLLPRI 7.28.0 +CURL_WRITEFUNC_PAUSE 7.18.0 +CURL_ZERO_TERMINATED 7.56.0 diff --git a/bin/curl/include/curl/curl.h b/bin/curl/include/curl/curl.h new file mode 100644 index 00000000..d83b2179 --- /dev/null +++ b/bin/curl/include/curl/curl.h @@ -0,0 +1,2867 @@ +#ifndef __CURL_CURL_H +#define __CURL_CURL_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* + * If you have libcurl problems, all docs and details are found here: + * https://curl.haxx.se/libcurl/ + * + * curl-library mailing list subscription and unsubscription web interface: + * https://cool.haxx.se/mailman/listinfo/curl-library/ + */ + +#ifdef CURL_NO_OLDIES +#define CURL_STRICTER +#endif + +#include "curlver.h" /* libcurl version defines */ +#include "system.h" /* determine things run-time */ + +/* + * Define WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && \ + !defined(WIN32) && !defined(__SYMBIAN32__) +#define WIN32 +#endif + +#include +#include + +#if defined(__FreeBSD__) && (__FreeBSD__ >= 2) +/* Needed for __FreeBSD_version symbol definition */ +#include +#endif + +/* The include stuff here below is mainly for time_t! */ +#include +#include + +#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__) +#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \ + defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)) +/* The check above prevents the winsock2 inclusion if winsock.h already was + included, since they can't co-exist without problems */ +#include +#include +#endif +#endif + +/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish + libc5-based Linux systems. Only include it on systems that are known to + require it! */ +#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ + defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ + defined(__CYGWIN__) || \ + (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) +#include +#endif + +#if !defined(WIN32) && !defined(_WIN32_WCE) +#include +#endif + +#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__) +#include +#endif + +#ifdef __BEOS__ +#include +#endif + +/* Compatibility for non-Clang compilers */ +#ifndef __has_declspec_attribute +# define __has_declspec_attribute(x) 0 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +typedef struct Curl_easy CURL; +typedef struct Curl_share CURLSH; +#else +typedef void CURL; +typedef void CURLSH; +#endif + +/* + * libcurl external API function linkage decorations. + */ + +#ifdef CURL_STATICLIB +# define CURL_EXTERN +#elif defined(WIN32) || defined(__SYMBIAN32__) || \ + (__has_declspec_attribute(dllexport) && \ + __has_declspec_attribute(dllimport)) +# if defined(BUILDING_LIBCURL) +# define CURL_EXTERN __declspec(dllexport) +# else +# define CURL_EXTERN __declspec(dllimport) +# endif +#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS) +# define CURL_EXTERN CURL_EXTERN_SYMBOL +#else +# define CURL_EXTERN +#endif + +#ifndef curl_socket_typedef +/* socket typedef */ +#if defined(WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H) +typedef SOCKET curl_socket_t; +#define CURL_SOCKET_BAD INVALID_SOCKET +#else +typedef int curl_socket_t; +#define CURL_SOCKET_BAD -1 +#endif +#define curl_socket_typedef +#endif /* curl_socket_typedef */ + +/* enum for the different supported SSL backends */ +typedef enum { + CURLSSLBACKEND_NONE = 0, + CURLSSLBACKEND_OPENSSL = 1, + CURLSSLBACKEND_GNUTLS = 2, + CURLSSLBACKEND_NSS = 3, + CURLSSLBACKEND_OBSOLETE4 = 4, /* Was QSOSSL. */ + CURLSSLBACKEND_GSKIT = 5, + CURLSSLBACKEND_POLARSSL = 6, + CURLSSLBACKEND_WOLFSSL = 7, + CURLSSLBACKEND_SCHANNEL = 8, + CURLSSLBACKEND_SECURETRANSPORT = 9, + CURLSSLBACKEND_AXTLS = 10, /* never used since 7.63.0 */ + CURLSSLBACKEND_MBEDTLS = 11, + CURLSSLBACKEND_MESALINK = 12 +} curl_sslbackend; + +/* aliases for library clones and renames */ +#define CURLSSLBACKEND_LIBRESSL CURLSSLBACKEND_OPENSSL +#define CURLSSLBACKEND_BORINGSSL CURLSSLBACKEND_OPENSSL + +/* deprecated names: */ +#define CURLSSLBACKEND_CYASSL CURLSSLBACKEND_WOLFSSL +#define CURLSSLBACKEND_DARWINSSL CURLSSLBACKEND_SECURETRANSPORT + +struct curl_httppost { + struct curl_httppost *next; /* next entry in the list */ + char *name; /* pointer to allocated name */ + long namelength; /* length of name length */ + char *contents; /* pointer to allocated data contents */ + long contentslength; /* length of contents field, see also + CURL_HTTPPOST_LARGE */ + char *buffer; /* pointer to allocated buffer contents */ + long bufferlength; /* length of buffer field */ + char *contenttype; /* Content-Type */ + struct curl_slist *contentheader; /* list of extra headers for this form */ + struct curl_httppost *more; /* if one field name has more than one + file, this link should link to following + files */ + long flags; /* as defined below */ + +/* specified content is a file name */ +#define CURL_HTTPPOST_FILENAME (1<<0) +/* specified content is a file name */ +#define CURL_HTTPPOST_READFILE (1<<1) +/* name is only stored pointer do not free in formfree */ +#define CURL_HTTPPOST_PTRNAME (1<<2) +/* contents is only stored pointer do not free in formfree */ +#define CURL_HTTPPOST_PTRCONTENTS (1<<3) +/* upload file from buffer */ +#define CURL_HTTPPOST_BUFFER (1<<4) +/* upload file from pointer contents */ +#define CURL_HTTPPOST_PTRBUFFER (1<<5) +/* upload file contents by using the regular read callback to get the data and + pass the given pointer as custom pointer */ +#define CURL_HTTPPOST_CALLBACK (1<<6) +/* use size in 'contentlen', added in 7.46.0 */ +#define CURL_HTTPPOST_LARGE (1<<7) + + char *showfilename; /* The file name to show. If not set, the + actual file name will be used (if this + is a file part) */ + void *userp; /* custom pointer used for + HTTPPOST_CALLBACK posts */ + curl_off_t contentlen; /* alternative length of contents + field. Used if CURL_HTTPPOST_LARGE is + set. Added in 7.46.0 */ +}; + +/* This is the CURLOPT_PROGRESSFUNCTION callback proto. It is now considered + deprecated but was the only choice up until 7.31.0 */ +typedef int (*curl_progress_callback)(void *clientp, + double dltotal, + double dlnow, + double ultotal, + double ulnow); + +/* This is the CURLOPT_XFERINFOFUNCTION callback proto. It was introduced in + 7.32.0, it avoids floating point and provides more detailed information. */ +typedef int (*curl_xferinfo_callback)(void *clientp, + curl_off_t dltotal, + curl_off_t dlnow, + curl_off_t ultotal, + curl_off_t ulnow); + +#ifndef CURL_MAX_READ_SIZE + /* The maximum receive buffer size configurable via CURLOPT_BUFFERSIZE. */ +#define CURL_MAX_READ_SIZE 524288 +#endif + +#ifndef CURL_MAX_WRITE_SIZE + /* Tests have proven that 20K is a very bad buffer size for uploads on + Windows, while 16K for some odd reason performed a lot better. + We do the ifndef check to allow this value to easier be changed at build + time for those who feel adventurous. The practical minimum is about + 400 bytes since libcurl uses a buffer of this size as a scratch area + (unrelated to network send operations). */ +#define CURL_MAX_WRITE_SIZE 16384 +#endif + +#ifndef CURL_MAX_HTTP_HEADER +/* The only reason to have a max limit for this is to avoid the risk of a bad + server feeding libcurl with a never-ending header that will cause reallocs + infinitely */ +#define CURL_MAX_HTTP_HEADER (100*1024) +#endif + +/* This is a magic return code for the write callback that, when returned, + will signal libcurl to pause receiving on the current transfer. */ +#define CURL_WRITEFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_write_callback)(char *buffer, + size_t size, + size_t nitems, + void *outstream); + +/* This callback will be called when a new resolver request is made */ +typedef int (*curl_resolver_start_callback)(void *resolver_state, + void *reserved, void *userdata); + +/* enumeration of file types */ +typedef enum { + CURLFILETYPE_FILE = 0, + CURLFILETYPE_DIRECTORY, + CURLFILETYPE_SYMLINK, + CURLFILETYPE_DEVICE_BLOCK, + CURLFILETYPE_DEVICE_CHAR, + CURLFILETYPE_NAMEDPIPE, + CURLFILETYPE_SOCKET, + CURLFILETYPE_DOOR, /* is possible only on Sun Solaris now */ + + CURLFILETYPE_UNKNOWN /* should never occur */ +} curlfiletype; + +#define CURLFINFOFLAG_KNOWN_FILENAME (1<<0) +#define CURLFINFOFLAG_KNOWN_FILETYPE (1<<1) +#define CURLFINFOFLAG_KNOWN_TIME (1<<2) +#define CURLFINFOFLAG_KNOWN_PERM (1<<3) +#define CURLFINFOFLAG_KNOWN_UID (1<<4) +#define CURLFINFOFLAG_KNOWN_GID (1<<5) +#define CURLFINFOFLAG_KNOWN_SIZE (1<<6) +#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7) + +/* Content of this structure depends on information which is known and is + achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man + page for callbacks returning this structure -- some fields are mandatory, + some others are optional. The FLAG field has special meaning. */ +struct curl_fileinfo { + char *filename; + curlfiletype filetype; + time_t time; /* always zero! */ + unsigned int perm; + int uid; + int gid; + curl_off_t size; + long int hardlinks; + + struct { + /* If some of these fields is not NULL, it is a pointer to b_data. */ + char *time; + char *perm; + char *user; + char *group; + char *target; /* pointer to the target filename of a symlink */ + } strings; + + unsigned int flags; + + /* used internally */ + char *b_data; + size_t b_size; + size_t b_used; +}; + +/* return codes for CURLOPT_CHUNK_BGN_FUNCTION */ +#define CURL_CHUNK_BGN_FUNC_OK 0 +#define CURL_CHUNK_BGN_FUNC_FAIL 1 /* tell the lib to end the task */ +#define CURL_CHUNK_BGN_FUNC_SKIP 2 /* skip this chunk over */ + +/* if splitting of data transfer is enabled, this callback is called before + download of an individual chunk started. Note that parameter "remains" works + only for FTP wildcard downloading (for now), otherwise is not used */ +typedef long (*curl_chunk_bgn_callback)(const void *transfer_info, + void *ptr, + int remains); + +/* return codes for CURLOPT_CHUNK_END_FUNCTION */ +#define CURL_CHUNK_END_FUNC_OK 0 +#define CURL_CHUNK_END_FUNC_FAIL 1 /* tell the lib to end the task */ + +/* If splitting of data transfer is enabled this callback is called after + download of an individual chunk finished. + Note! After this callback was set then it have to be called FOR ALL chunks. + Even if downloading of this chunk was skipped in CHUNK_BGN_FUNC. + This is the reason why we don't need "transfer_info" parameter in this + callback and we are not interested in "remains" parameter too. */ +typedef long (*curl_chunk_end_callback)(void *ptr); + +/* return codes for FNMATCHFUNCTION */ +#define CURL_FNMATCHFUNC_MATCH 0 /* string corresponds to the pattern */ +#define CURL_FNMATCHFUNC_NOMATCH 1 /* pattern doesn't match the string */ +#define CURL_FNMATCHFUNC_FAIL 2 /* an error occurred */ + +/* callback type for wildcard downloading pattern matching. If the + string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */ +typedef int (*curl_fnmatch_callback)(void *ptr, + const char *pattern, + const char *string); + +/* These are the return codes for the seek callbacks */ +#define CURL_SEEKFUNC_OK 0 +#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ +#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so + libcurl might try other means instead */ +typedef int (*curl_seek_callback)(void *instream, + curl_off_t offset, + int origin); /* 'whence' */ + +/* This is a return code for the read callback that, when returned, will + signal libcurl to immediately abort the current transfer. */ +#define CURL_READFUNC_ABORT 0x10000000 +/* This is a return code for the read callback that, when returned, will + signal libcurl to pause sending data on the current transfer. */ +#define CURL_READFUNC_PAUSE 0x10000001 + +/* Return code for when the trailing headers' callback has terminated + without any errors*/ +#define CURL_TRAILERFUNC_OK 0 +/* Return code for when was an error in the trailing header's list and we + want to abort the request */ +#define CURL_TRAILERFUNC_ABORT 1 + +typedef size_t (*curl_read_callback)(char *buffer, + size_t size, + size_t nitems, + void *instream); + +typedef int (*curl_trailer_callback)(struct curl_slist **list, + void *userdata); + +typedef enum { + CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ + CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ + CURLSOCKTYPE_LAST /* never use */ +} curlsocktype; + +/* The return code from the sockopt_callback can signal information back + to libcurl: */ +#define CURL_SOCKOPT_OK 0 +#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return + CURLE_ABORTED_BY_CALLBACK */ +#define CURL_SOCKOPT_ALREADY_CONNECTED 2 + +typedef int (*curl_sockopt_callback)(void *clientp, + curl_socket_t curlfd, + curlsocktype purpose); + +struct curl_sockaddr { + int family; + int socktype; + int protocol; + unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it + turned really ugly and painful on the systems that + lack this type */ + struct sockaddr addr; +}; + +typedef curl_socket_t +(*curl_opensocket_callback)(void *clientp, + curlsocktype purpose, + struct curl_sockaddr *address); + +typedef int +(*curl_closesocket_callback)(void *clientp, curl_socket_t item); + +typedef enum { + CURLIOE_OK, /* I/O operation successful */ + CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ + CURLIOE_FAILRESTART, /* failed to restart the read */ + CURLIOE_LAST /* never use */ +} curlioerr; + +typedef enum { + CURLIOCMD_NOP, /* no operation */ + CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ + CURLIOCMD_LAST /* never use */ +} curliocmd; + +typedef curlioerr (*curl_ioctl_callback)(CURL *handle, + int cmd, + void *clientp); + +#ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS +/* + * The following typedef's are signatures of malloc, free, realloc, strdup and + * calloc respectively. Function pointers of these types can be passed to the + * curl_global_init_mem() function to set user defined memory management + * callback routines. + */ +typedef void *(*curl_malloc_callback)(size_t size); +typedef void (*curl_free_callback)(void *ptr); +typedef void *(*curl_realloc_callback)(void *ptr, size_t size); +typedef char *(*curl_strdup_callback)(const char *str); +typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); + +#define CURL_DID_MEMORY_FUNC_TYPEDEFS +#endif + +/* the kind of data that is passed to information_callback*/ +typedef enum { + CURLINFO_TEXT = 0, + CURLINFO_HEADER_IN, /* 1 */ + CURLINFO_HEADER_OUT, /* 2 */ + CURLINFO_DATA_IN, /* 3 */ + CURLINFO_DATA_OUT, /* 4 */ + CURLINFO_SSL_DATA_IN, /* 5 */ + CURLINFO_SSL_DATA_OUT, /* 6 */ + CURLINFO_END +} curl_infotype; + +typedef int (*curl_debug_callback) + (CURL *handle, /* the handle/transfer this concerns */ + curl_infotype type, /* what kind of data */ + char *data, /* points to the data */ + size_t size, /* size of the data pointed to */ + void *userptr); /* whatever the user please */ + +/* All possible error codes from all sorts of curl functions. Future versions + may return other values, stay prepared. + + Always add new return codes last. Never *EVER* remove any. The return + codes must remain the same! + */ + +typedef enum { + CURLE_OK = 0, + CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ + CURLE_FAILED_INIT, /* 2 */ + CURLE_URL_MALFORMAT, /* 3 */ + CURLE_NOT_BUILT_IN, /* 4 - [was obsoleted in August 2007 for + 7.17.0, reused in April 2011 for 7.21.5] */ + CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ + CURLE_COULDNT_RESOLVE_HOST, /* 6 */ + CURLE_COULDNT_CONNECT, /* 7 */ + CURLE_WEIRD_SERVER_REPLY, /* 8 */ + CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server + due to lack of access - when login fails + this is not returned. */ + CURLE_FTP_ACCEPT_FAILED, /* 10 - [was obsoleted in April 2006 for + 7.15.4, reused in Dec 2011 for 7.24.0]*/ + CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ + CURLE_FTP_ACCEPT_TIMEOUT, /* 12 - timeout occurred accepting server + [was obsoleted in August 2007 for 7.17.0, + reused in Dec 2011 for 7.24.0]*/ + CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ + CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ + CURLE_FTP_CANT_GET_HOST, /* 15 */ + CURLE_HTTP2, /* 16 - A problem in the http2 framing layer. + [was obsoleted in August 2007 for 7.17.0, + reused in July 2014 for 7.38.0] */ + CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ + CURLE_PARTIAL_FILE, /* 18 */ + CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ + CURLE_OBSOLETE20, /* 20 - NOT USED */ + CURLE_QUOTE_ERROR, /* 21 - quote command failure */ + CURLE_HTTP_RETURNED_ERROR, /* 22 */ + CURLE_WRITE_ERROR, /* 23 */ + CURLE_OBSOLETE24, /* 24 - NOT USED */ + CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ + CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ + CURLE_OUT_OF_MEMORY, /* 27 */ + /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error + instead of a memory allocation error if CURL_DOES_CONVERSIONS + is defined + */ + CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ + CURLE_OBSOLETE29, /* 29 - NOT USED */ + CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ + CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ + CURLE_OBSOLETE32, /* 32 - NOT USED */ + CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ + CURLE_HTTP_POST_ERROR, /* 34 */ + CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ + CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ + CURLE_FILE_COULDNT_READ_FILE, /* 37 */ + CURLE_LDAP_CANNOT_BIND, /* 38 */ + CURLE_LDAP_SEARCH_FAILED, /* 39 */ + CURLE_OBSOLETE40, /* 40 - NOT USED */ + CURLE_FUNCTION_NOT_FOUND, /* 41 - NOT USED starting with 7.53.0 */ + CURLE_ABORTED_BY_CALLBACK, /* 42 */ + CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ + CURLE_OBSOLETE44, /* 44 - NOT USED */ + CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ + CURLE_OBSOLETE46, /* 46 - NOT USED */ + CURLE_TOO_MANY_REDIRECTS, /* 47 - catch endless re-direct loops */ + CURLE_UNKNOWN_OPTION, /* 48 - User specified an unknown option */ + CURLE_TELNET_OPTION_SYNTAX, /* 49 - Malformed telnet option */ + CURLE_OBSOLETE50, /* 50 - NOT USED */ + CURLE_OBSOLETE51, /* 51 - NOT USED */ + CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ + CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ + CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as + default */ + CURLE_SEND_ERROR, /* 55 - failed sending network data */ + CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ + CURLE_OBSOLETE57, /* 57 - NOT IN USE */ + CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ + CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ + CURLE_PEER_FAILED_VERIFICATION, /* 60 - peer's certificate or fingerprint + wasn't verified fine */ + CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized/bad encoding */ + CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ + CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ + CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ + CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind + that failed */ + CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ + CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not + accepted and we failed to login */ + CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ + CURLE_TFTP_PERM, /* 69 - permission problem on server */ + CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ + CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ + CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ + CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ + CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ + CURLE_CONV_FAILED, /* 75 - conversion failed */ + CURLE_CONV_REQD, /* 76 - caller must register conversion + callbacks using curl_easy_setopt options + CURLOPT_CONV_FROM_NETWORK_FUNCTION, + CURLOPT_CONV_TO_NETWORK_FUNCTION, and + CURLOPT_CONV_FROM_UTF8_FUNCTION */ + CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing + or wrong format */ + CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ + CURLE_SSH, /* 79 - error from the SSH layer, somewhat + generic so the error message will be of + interest when this has happened */ + + CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL + connection */ + CURLE_AGAIN, /* 81 - socket is not ready for send/recv, + wait till it's ready and try again (Added + in 7.18.2) */ + CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or + wrong format (Added in 7.19.0) */ + CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in + 7.19.0) */ + CURLE_FTP_PRET_FAILED, /* 84 - a PRET command failed */ + CURLE_RTSP_CSEQ_ERROR, /* 85 - mismatch of RTSP CSeq numbers */ + CURLE_RTSP_SESSION_ERROR, /* 86 - mismatch of RTSP Session Ids */ + CURLE_FTP_BAD_FILE_LIST, /* 87 - unable to parse FTP file list */ + CURLE_CHUNK_FAILED, /* 88 - chunk callback reported error */ + CURLE_NO_CONNECTION_AVAILABLE, /* 89 - No connection available, the + session will be queued */ + CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not + match */ + CURLE_SSL_INVALIDCERTSTATUS, /* 91 - invalid certificate status */ + CURLE_HTTP2_STREAM, /* 92 - stream error in HTTP/2 framing layer + */ + CURLE_RECURSIVE_API_CALL, /* 93 - an api function was called from + inside a callback */ + CURL_LAST /* never use! */ +} CURLcode; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Previously obsolete error code re-used in 7.38.0 */ +#define CURLE_OBSOLETE16 CURLE_HTTP2 + +/* Previously obsolete error codes re-used in 7.24.0 */ +#define CURLE_OBSOLETE10 CURLE_FTP_ACCEPT_FAILED +#define CURLE_OBSOLETE12 CURLE_FTP_ACCEPT_TIMEOUT + +/* compatibility with older names */ +#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING +#define CURLE_FTP_WEIRD_SERVER_REPLY CURLE_WEIRD_SERVER_REPLY + +/* The following were added in 7.62.0 */ +#define CURLE_SSL_CACERT CURLE_PEER_FAILED_VERIFICATION + +/* The following were added in 7.21.5, April 2011 */ +#define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION + +/* The following were added in 7.17.1 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION + +/* The following were added in 7.17.0 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* no one should be using this! */ +#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46 +#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44 +#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10 +#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16 +#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32 +#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29 +#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12 +#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20 +#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40 +#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24 +#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57 +#define CURLE_URL_MALFORMAT_USER CURLE_NOT_BUILT_IN + +#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED +#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE +#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR +#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL +#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS +#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR +#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED + +/* The following were added earlier */ + +#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT + +#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR +#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED +#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED + +#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE +#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME + +/* This was the error code 50 in 7.7.3 and a few earlier versions, this + is no longer used by libcurl but is instead #defined here only to not + make programs break */ +#define CURLE_ALREADY_COMPLETE 99999 + +/* Provide defines for really old option names */ +#define CURLOPT_FILE CURLOPT_WRITEDATA /* name changed in 7.9.7 */ +#define CURLOPT_INFILE CURLOPT_READDATA /* name changed in 7.9.7 */ +#define CURLOPT_WRITEHEADER CURLOPT_HEADERDATA + +/* Since long deprecated options with no code in the lib that does anything + with them. */ +#define CURLOPT_WRITEINFO CURLOPT_OBSOLETE40 +#define CURLOPT_CLOSEPOLICY CURLOPT_OBSOLETE72 + +#endif /*!CURL_NO_OLDIES*/ + +/* This prototype applies to all conversion callbacks */ +typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); + +typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ + void *ssl_ctx, /* actually an + OpenSSL SSL_CTX */ + void *userptr); + +typedef enum { + CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use + CONNECT HTTP/1.1 */ + CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT + HTTP/1.0 */ + CURLPROXY_HTTPS = 2, /* added in 7.52.0 */ + CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already + in 7.10 */ + CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ + CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ + CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the + host name rather than the IP address. added + in 7.18.0 */ +} curl_proxytype; /* this enum was added in 7.10 */ + +/* + * Bitmasks for CURLOPT_HTTPAUTH and CURLOPT_PROXYAUTH options: + * + * CURLAUTH_NONE - No HTTP authentication + * CURLAUTH_BASIC - HTTP Basic authentication (default) + * CURLAUTH_DIGEST - HTTP Digest authentication + * CURLAUTH_NEGOTIATE - HTTP Negotiate (SPNEGO) authentication + * CURLAUTH_GSSNEGOTIATE - Alias for CURLAUTH_NEGOTIATE (deprecated) + * CURLAUTH_NTLM - HTTP NTLM authentication + * CURLAUTH_DIGEST_IE - HTTP Digest authentication with IE flavour + * CURLAUTH_NTLM_WB - HTTP NTLM authentication delegated to winbind helper + * CURLAUTH_BEARER - HTTP Bearer token authentication + * CURLAUTH_ONLY - Use together with a single other type to force no + * authentication or just that single type + * CURLAUTH_ANY - All fine types set + * CURLAUTH_ANYSAFE - All fine types except Basic + */ + +#define CURLAUTH_NONE ((unsigned long)0) +#define CURLAUTH_BASIC (((unsigned long)1)<<0) +#define CURLAUTH_DIGEST (((unsigned long)1)<<1) +#define CURLAUTH_NEGOTIATE (((unsigned long)1)<<2) +/* Deprecated since the advent of CURLAUTH_NEGOTIATE */ +#define CURLAUTH_GSSNEGOTIATE CURLAUTH_NEGOTIATE +/* Used for CURLOPT_SOCKS5_AUTH to stay terminologically correct */ +#define CURLAUTH_GSSAPI CURLAUTH_NEGOTIATE +#define CURLAUTH_NTLM (((unsigned long)1)<<3) +#define CURLAUTH_DIGEST_IE (((unsigned long)1)<<4) +#define CURLAUTH_NTLM_WB (((unsigned long)1)<<5) +#define CURLAUTH_BEARER (((unsigned long)1)<<6) +#define CURLAUTH_ONLY (((unsigned long)1)<<31) +#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) +#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) + +#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */ +#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */ +#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */ +#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */ +#define CURLSSH_AUTH_HOST (1<<2) /* host key files */ +#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */ +#define CURLSSH_AUTH_AGENT (1<<4) /* agent (ssh-agent, pageant...) */ +#define CURLSSH_AUTH_GSSAPI (1<<5) /* gssapi (kerberos, ...) */ +#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY + +#define CURLGSSAPI_DELEGATION_NONE 0 /* no delegation (default) */ +#define CURLGSSAPI_DELEGATION_POLICY_FLAG (1<<0) /* if permitted by policy */ +#define CURLGSSAPI_DELEGATION_FLAG (1<<1) /* delegate always */ + +#define CURL_ERROR_SIZE 256 + +enum curl_khtype { + CURLKHTYPE_UNKNOWN, + CURLKHTYPE_RSA1, + CURLKHTYPE_RSA, + CURLKHTYPE_DSS, + CURLKHTYPE_ECDSA, + CURLKHTYPE_ED25519 +}; + +struct curl_khkey { + const char *key; /* points to a zero-terminated string encoded with base64 + if len is zero, otherwise to the "raw" data */ + size_t len; + enum curl_khtype keytype; +}; + +/* this is the set of return values expected from the curl_sshkeycallback + callback */ +enum curl_khstat { + CURLKHSTAT_FINE_ADD_TO_FILE, + CURLKHSTAT_FINE, + CURLKHSTAT_REJECT, /* reject the connection, return an error */ + CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so + this causes a CURLE_DEFER error but otherwise the + connection will be left intact etc */ + CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ +}; + +/* this is the set of status codes pass in to the callback */ +enum curl_khmatch { + CURLKHMATCH_OK, /* match */ + CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ + CURLKHMATCH_MISSING, /* no matching host/key found */ + CURLKHMATCH_LAST /* not for use, only a marker for last-in-list */ +}; + +typedef int + (*curl_sshkeycallback) (CURL *easy, /* easy handle */ + const struct curl_khkey *knownkey, /* known */ + const struct curl_khkey *foundkey, /* found */ + enum curl_khmatch, /* libcurl's view on the keys */ + void *clientp); /* custom pointer passed from app */ + +/* parameter for the CURLOPT_USE_SSL option */ +typedef enum { + CURLUSESSL_NONE, /* do not attempt to use SSL */ + CURLUSESSL_TRY, /* try using SSL, proceed anyway otherwise */ + CURLUSESSL_CONTROL, /* SSL for the control connection or fail */ + CURLUSESSL_ALL, /* SSL for all communication or fail */ + CURLUSESSL_LAST /* not an option, never use */ +} curl_usessl; + +/* Definition of bits for the CURLOPT_SSL_OPTIONS argument: */ + +/* - ALLOW_BEAST tells libcurl to allow the BEAST SSL vulnerability in the + name of improving interoperability with older servers. Some SSL libraries + have introduced work-arounds for this flaw but those work-arounds sometimes + make the SSL communication fail. To regain functionality with those broken + servers, a user can this way allow the vulnerability back. */ +#define CURLSSLOPT_ALLOW_BEAST (1<<0) + +/* - NO_REVOKE tells libcurl to disable certificate revocation checks for those + SSL backends where such behavior is present. */ +#define CURLSSLOPT_NO_REVOKE (1<<1) + +/* The default connection attempt delay in milliseconds for happy eyeballs. + CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 and happy-eyeballs-timeout-ms.d document + this value, keep them in sync. */ +#define CURL_HET_DEFAULT 200L + +/* The default connection upkeep interval in milliseconds. */ +#define CURL_UPKEEP_INTERVAL_DEFAULT 60000L + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2009 */ + +#define CURLFTPSSL_NONE CURLUSESSL_NONE +#define CURLFTPSSL_TRY CURLUSESSL_TRY +#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL +#define CURLFTPSSL_ALL CURLUSESSL_ALL +#define CURLFTPSSL_LAST CURLUSESSL_LAST +#define curl_ftpssl curl_usessl +#endif /*!CURL_NO_OLDIES*/ + +/* parameter for the CURLOPT_FTP_SSL_CCC option */ +typedef enum { + CURLFTPSSL_CCC_NONE, /* do not send CCC */ + CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */ + CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */ + CURLFTPSSL_CCC_LAST /* not an option, never use */ +} curl_ftpccc; + +/* parameter for the CURLOPT_FTPSSLAUTH option */ +typedef enum { + CURLFTPAUTH_DEFAULT, /* let libcurl decide */ + CURLFTPAUTH_SSL, /* use "AUTH SSL" */ + CURLFTPAUTH_TLS, /* use "AUTH TLS" */ + CURLFTPAUTH_LAST /* not an option, never use */ +} curl_ftpauth; + +/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */ +typedef enum { + CURLFTP_CREATE_DIR_NONE, /* do NOT create missing dirs! */ + CURLFTP_CREATE_DIR, /* (FTP/SFTP) if CWD fails, try MKD and then CWD + again if MKD succeeded, for SFTP this does + similar magic */ + CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD + again even if MKD failed! */ + CURLFTP_CREATE_DIR_LAST /* not an option, never use */ +} curl_ftpcreatedir; + +/* parameter for the CURLOPT_FTP_FILEMETHOD option */ +typedef enum { + CURLFTPMETHOD_DEFAULT, /* let libcurl pick */ + CURLFTPMETHOD_MULTICWD, /* single CWD operation for each path part */ + CURLFTPMETHOD_NOCWD, /* no CWD at all */ + CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ + CURLFTPMETHOD_LAST /* not an option, never use */ +} curl_ftpmethod; + +/* bitmask defines for CURLOPT_HEADEROPT */ +#define CURLHEADER_UNIFIED 0 +#define CURLHEADER_SEPARATE (1<<0) + +/* CURLALTSVC_* are bits for the CURLOPT_ALTSVC_CTRL option */ +#define CURLALTSVC_IMMEDIATELY (1<<0) +#define CURLALTSVC_ALTUSED (1<<1) +#define CURLALTSVC_READONLYFILE (1<<2) +#define CURLALTSVC_H1 (1<<3) +#define CURLALTSVC_H2 (1<<4) +#define CURLALTSVC_H3 (1<<5) + +/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */ +#define CURLPROTO_HTTP (1<<0) +#define CURLPROTO_HTTPS (1<<1) +#define CURLPROTO_FTP (1<<2) +#define CURLPROTO_FTPS (1<<3) +#define CURLPROTO_SCP (1<<4) +#define CURLPROTO_SFTP (1<<5) +#define CURLPROTO_TELNET (1<<6) +#define CURLPROTO_LDAP (1<<7) +#define CURLPROTO_LDAPS (1<<8) +#define CURLPROTO_DICT (1<<9) +#define CURLPROTO_FILE (1<<10) +#define CURLPROTO_TFTP (1<<11) +#define CURLPROTO_IMAP (1<<12) +#define CURLPROTO_IMAPS (1<<13) +#define CURLPROTO_POP3 (1<<14) +#define CURLPROTO_POP3S (1<<15) +#define CURLPROTO_SMTP (1<<16) +#define CURLPROTO_SMTPS (1<<17) +#define CURLPROTO_RTSP (1<<18) +#define CURLPROTO_RTMP (1<<19) +#define CURLPROTO_RTMPT (1<<20) +#define CURLPROTO_RTMPE (1<<21) +#define CURLPROTO_RTMPTE (1<<22) +#define CURLPROTO_RTMPS (1<<23) +#define CURLPROTO_RTMPTS (1<<24) +#define CURLPROTO_GOPHER (1<<25) +#define CURLPROTO_SMB (1<<26) +#define CURLPROTO_SMBS (1<<27) +#define CURLPROTO_ALL (~0) /* enable everything */ + +/* long may be 32 or 64 bits, but we should never depend on anything else + but 32 */ +#define CURLOPTTYPE_LONG 0 +#define CURLOPTTYPE_OBJECTPOINT 10000 +#define CURLOPTTYPE_STRINGPOINT 10000 +#define CURLOPTTYPE_FUNCTIONPOINT 20000 +#define CURLOPTTYPE_OFF_T 30000 + +/* *STRINGPOINT is an alias for OBJECTPOINT to allow tools to extract the + string options from the header file */ + +/* name is uppercase CURLOPT_, + type is one of the defined CURLOPTTYPE_ + number is unique identifier */ +#ifdef CINIT +#undef CINIT +#endif + +#ifdef CURL_ISOCPP +#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define STRINGPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLOPT_/**/name = type + number +#endif + +/* + * This macro-mania below setups the CURLOPT_[what] enum, to be used with + * curl_easy_setopt(). The first argument in the CINIT() macro is the [what] + * word. + */ + +typedef enum { + /* This is the FILE * or void * the regular output should be written to. */ + CINIT(WRITEDATA, OBJECTPOINT, 1), + + /* The full URL to get/put */ + CINIT(URL, STRINGPOINT, 2), + + /* Port number to connect to, if other than default. */ + CINIT(PORT, LONG, 3), + + /* Name of proxy to use. */ + CINIT(PROXY, STRINGPOINT, 4), + + /* "user:password;options" to use when fetching. */ + CINIT(USERPWD, STRINGPOINT, 5), + + /* "user:password" to use with proxy. */ + CINIT(PROXYUSERPWD, STRINGPOINT, 6), + + /* Range to get, specified as an ASCII string. */ + CINIT(RANGE, STRINGPOINT, 7), + + /* not used */ + + /* Specified file stream to upload from (use as input): */ + CINIT(READDATA, OBJECTPOINT, 9), + + /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE + * bytes big. */ + CINIT(ERRORBUFFER, OBJECTPOINT, 10), + + /* Function that will be called to store the output (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11), + + /* Function that will be called to read the input (instead of fread). The + * parameters will use fread() syntax, make sure to follow them. */ + CINIT(READFUNCTION, FUNCTIONPOINT, 12), + + /* Time-out the read operation after this amount of seconds */ + CINIT(TIMEOUT, LONG, 13), + + /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about + * how large the file being sent really is. That allows better error + * checking and better verifies that the upload was successful. -1 means + * unknown size. + * + * For large file support, there is also a _LARGE version of the key + * which takes an off_t type, allowing platforms with larger off_t + * sizes to handle larger files. See below for INFILESIZE_LARGE. + */ + CINIT(INFILESIZE, LONG, 14), + + /* POST static input fields. */ + CINIT(POSTFIELDS, OBJECTPOINT, 15), + + /* Set the referrer page (needed by some CGIs) */ + CINIT(REFERER, STRINGPOINT, 16), + + /* Set the FTP PORT string (interface name, named or numerical IP address) + Use i.e '-' to use default address. */ + CINIT(FTPPORT, STRINGPOINT, 17), + + /* Set the User-Agent string (examined by some CGIs) */ + CINIT(USERAGENT, STRINGPOINT, 18), + + /* If the download receives less than "low speed limit" bytes/second + * during "low speed time" seconds, the operations is aborted. + * You could i.e if you have a pretty high speed connection, abort if + * it is less than 2000 bytes/sec during 20 seconds. + */ + + /* Set the "low speed limit" */ + CINIT(LOW_SPEED_LIMIT, LONG, 19), + + /* Set the "low speed time" */ + CINIT(LOW_SPEED_TIME, LONG, 20), + + /* Set the continuation offset. + * + * Note there is also a _LARGE version of this key which uses + * off_t types, allowing for large file offsets on platforms which + * use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE. + */ + CINIT(RESUME_FROM, LONG, 21), + + /* Set cookie in request: */ + CINIT(COOKIE, STRINGPOINT, 22), + + /* This points to a linked list of headers, struct curl_slist kind. This + list is also used for RTSP (in spite of its name) */ + CINIT(HTTPHEADER, OBJECTPOINT, 23), + + /* This points to a linked list of post entries, struct curl_httppost */ + CINIT(HTTPPOST, OBJECTPOINT, 24), + + /* name of the file keeping your private SSL-certificate */ + CINIT(SSLCERT, STRINGPOINT, 25), + + /* password for the SSL or SSH private key */ + CINIT(KEYPASSWD, STRINGPOINT, 26), + + /* send TYPE parameter? */ + CINIT(CRLF, LONG, 27), + + /* send linked-list of QUOTE commands */ + CINIT(QUOTE, OBJECTPOINT, 28), + + /* send FILE * or void * to store headers to, if you use a callback it + is simply passed to the callback unmodified */ + CINIT(HEADERDATA, OBJECTPOINT, 29), + + /* point to a file to read the initial cookies from, also enables + "cookie awareness" */ + CINIT(COOKIEFILE, STRINGPOINT, 31), + + /* What version to specifically try to use. + See CURL_SSLVERSION defines below. */ + CINIT(SSLVERSION, LONG, 32), + + /* What kind of HTTP time condition to use, see defines */ + CINIT(TIMECONDITION, LONG, 33), + + /* Time to use with the above condition. Specified in number of seconds + since 1 Jan 1970 */ + CINIT(TIMEVALUE, LONG, 34), + + /* 35 = OBSOLETE */ + + /* Custom request, for customizing the get command like + HTTP: DELETE, TRACE and others + FTP: to use a different list command + */ + CINIT(CUSTOMREQUEST, STRINGPOINT, 36), + + /* FILE handle to use instead of stderr */ + CINIT(STDERR, OBJECTPOINT, 37), + + /* 38 is not used */ + + /* send linked-list of post-transfer QUOTE commands */ + CINIT(POSTQUOTE, OBJECTPOINT, 39), + + CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */ + + CINIT(VERBOSE, LONG, 41), /* talk a lot */ + CINIT(HEADER, LONG, 42), /* throw the header out too */ + CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */ + CINIT(NOBODY, LONG, 44), /* use HEAD to get http document */ + CINIT(FAILONERROR, LONG, 45), /* no output on http error codes >= 400 */ + CINIT(UPLOAD, LONG, 46), /* this is an upload */ + CINIT(POST, LONG, 47), /* HTTP POST method */ + CINIT(DIRLISTONLY, LONG, 48), /* bare names when listing directories */ + + CINIT(APPEND, LONG, 50), /* Append instead of overwrite on upload! */ + + /* Specify whether to read the user+password from the .netrc or the URL. + * This must be one of the CURL_NETRC_* enums below. */ + CINIT(NETRC, LONG, 51), + + CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */ + + CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */ + CINIT(PUT, LONG, 54), /* HTTP PUT */ + + /* 55 = OBSOLETE */ + + /* DEPRECATED + * Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_progress_callback + * prototype defines. */ + CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56), + + /* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION + callbacks */ + CINIT(PROGRESSDATA, OBJECTPOINT, 57), +#define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA + + /* We want the referrer field set automatically when following locations */ + CINIT(AUTOREFERER, LONG, 58), + + /* Port of the proxy, can be set in the proxy string as well with: + "[host]:[port]" */ + CINIT(PROXYPORT, LONG, 59), + + /* size of the POST input data, if strlen() is not good to use */ + CINIT(POSTFIELDSIZE, LONG, 60), + + /* tunnel non-http operations through a HTTP proxy */ + CINIT(HTTPPROXYTUNNEL, LONG, 61), + + /* Set the interface string to use as outgoing network interface */ + CINIT(INTERFACE, STRINGPOINT, 62), + + /* Set the krb4/5 security level, this also enables krb4/5 awareness. This + * is a string, 'clear', 'safe', 'confidential' or 'private'. If the string + * is set but doesn't match one of these, 'private' will be used. */ + CINIT(KRBLEVEL, STRINGPOINT, 63), + + /* Set if we should verify the peer in ssl handshake, set 1 to verify. */ + CINIT(SSL_VERIFYPEER, LONG, 64), + + /* The CApath or CAfile used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAINFO, STRINGPOINT, 65), + + /* 66 = OBSOLETE */ + /* 67 = OBSOLETE */ + + /* Maximum number of http redirects to follow */ + CINIT(MAXREDIRS, LONG, 68), + + /* Pass a long set to 1 to get the date of the requested document (if + possible)! Pass a zero to shut it off. */ + CINIT(FILETIME, LONG, 69), + + /* This points to a linked list of telnet options */ + CINIT(TELNETOPTIONS, OBJECTPOINT, 70), + + /* Max amount of cached alive connections */ + CINIT(MAXCONNECTS, LONG, 71), + + CINIT(OBSOLETE72, LONG, 72), /* OBSOLETE, do not use! */ + + /* 73 = OBSOLETE */ + + /* Set to explicitly use a new connection for the upcoming transfer. + Do not use this unless you're absolutely sure of this, as it makes the + operation slower and is less friendly for the network. */ + CINIT(FRESH_CONNECT, LONG, 74), + + /* Set to explicitly forbid the upcoming transfer's connection to be re-used + when done. Do not use this unless you're absolutely sure of this, as it + makes the operation slower and is less friendly for the network. */ + CINIT(FORBID_REUSE, LONG, 75), + + /* Set to a file name that contains random data for libcurl to use to + seed the random engine when doing SSL connects. */ + CINIT(RANDOM_FILE, STRINGPOINT, 76), + + /* Set to the Entropy Gathering Daemon socket pathname */ + CINIT(EGDSOCKET, STRINGPOINT, 77), + + /* Time-out connect operations after this amount of seconds, if connects are + OK within this time, then fine... This only aborts the connect phase. */ + CINIT(CONNECTTIMEOUT, LONG, 78), + + /* Function that will be called to store headers (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79), + + /* Set this to force the HTTP request to get back to GET. Only really usable + if POST, PUT or a custom request have been used first. + */ + CINIT(HTTPGET, LONG, 80), + + /* Set if we should verify the Common name from the peer certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches the + * provided hostname. */ + CINIT(SSL_VERIFYHOST, LONG, 81), + + /* Specify which file name to write all known cookies in after completed + operation. Set file name to "-" (dash) to make it go to stdout. */ + CINIT(COOKIEJAR, STRINGPOINT, 82), + + /* Specify which SSL ciphers to use */ + CINIT(SSL_CIPHER_LIST, STRINGPOINT, 83), + + /* Specify which HTTP version to use! This must be set to one of the + CURL_HTTP_VERSION* enums set below. */ + CINIT(HTTP_VERSION, LONG, 84), + + /* Specifically switch on or off the FTP engine's use of the EPSV command. By + default, that one will always be attempted before the more traditional + PASV command. */ + CINIT(FTP_USE_EPSV, LONG, 85), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */ + CINIT(SSLCERTTYPE, STRINGPOINT, 86), + + /* name of the file keeping your private SSL-key */ + CINIT(SSLKEY, STRINGPOINT, 87), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */ + CINIT(SSLKEYTYPE, STRINGPOINT, 88), + + /* crypto engine for the SSL-sub system */ + CINIT(SSLENGINE, STRINGPOINT, 89), + + /* set the crypto engine for the SSL-sub system as default + the param has no meaning... + */ + CINIT(SSLENGINE_DEFAULT, LONG, 90), + + /* Non-zero value means to use the global dns cache */ + CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* DEPRECATED, do not use! */ + + /* DNS cache timeout */ + CINIT(DNS_CACHE_TIMEOUT, LONG, 92), + + /* send linked-list of pre-transfer QUOTE commands */ + CINIT(PREQUOTE, OBJECTPOINT, 93), + + /* set the debug function */ + CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94), + + /* set the data for the debug function */ + CINIT(DEBUGDATA, OBJECTPOINT, 95), + + /* mark this as start of a cookie session */ + CINIT(COOKIESESSION, LONG, 96), + + /* The CApath directory used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAPATH, STRINGPOINT, 97), + + /* Instruct libcurl to use a smaller receive buffer */ + CINIT(BUFFERSIZE, LONG, 98), + + /* Instruct libcurl to not use any signal/alarm handlers, even when using + timeouts. This option is useful for multi-threaded applications. + See libcurl-the-guide for more background information. */ + CINIT(NOSIGNAL, LONG, 99), + + /* Provide a CURLShare for mutexing non-ts data */ + CINIT(SHARE, OBJECTPOINT, 100), + + /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), + CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and + CURLPROXY_SOCKS5. */ + CINIT(PROXYTYPE, LONG, 101), + + /* Set the Accept-Encoding string. Use this to tell a server you would like + the response to be compressed. Before 7.21.6, this was known as + CURLOPT_ENCODING */ + CINIT(ACCEPT_ENCODING, STRINGPOINT, 102), + + /* Set pointer to private data */ + CINIT(PRIVATE, OBJECTPOINT, 103), + + /* Set aliases for HTTP 200 in the HTTP Response header */ + CINIT(HTTP200ALIASES, OBJECTPOINT, 104), + + /* Continue to send authentication (user+password) when following locations, + even when hostname changed. This can potentially send off the name + and password to whatever host the server decides. */ + CINIT(UNRESTRICTED_AUTH, LONG, 105), + + /* Specifically switch on or off the FTP engine's use of the EPRT command ( + it also disables the LPRT attempt). By default, those ones will always be + attempted before the good old traditional PORT command. */ + CINIT(FTP_USE_EPRT, LONG, 106), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_USERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(HTTPAUTH, LONG, 107), + + /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx + in second argument. The function must be matching the + curl_ssl_ctx_callback proto. */ + CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108), + + /* Set the userdata for the ssl context callback function's third + argument */ + CINIT(SSL_CTX_DATA, OBJECTPOINT, 109), + + /* FTP Option that causes missing dirs to be created on the remote server. + In 7.19.4 we introduced the convenience enums for this option using the + CURLFTP_CREATE_DIR prefix. + */ + CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(PROXYAUTH, LONG, 111), + + /* FTP option that changes the timeout, in seconds, associated with + getting a response. This is different from transfer timeout time and + essentially places a demand on the FTP server to acknowledge commands + in a timely manner. */ + CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112), +#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT + + /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to + tell libcurl to resolve names to those IP versions only. This only has + affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */ + CINIT(IPRESOLVE, LONG, 113), + + /* Set this option to limit the size of a file that will be downloaded from + an HTTP or FTP server. + + Note there is also _LARGE version which adds large file support for + platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */ + CINIT(MAXFILESIZE, LONG, 114), + + /* See the comment for INFILESIZE above, but in short, specifies + * the size of the file being uploaded. -1 means unknown. + */ + CINIT(INFILESIZE_LARGE, OFF_T, 115), + + /* Sets the continuation offset. There is also a LONG version of this; + * look above for RESUME_FROM. + */ + CINIT(RESUME_FROM_LARGE, OFF_T, 116), + + /* Sets the maximum size of data that will be downloaded from + * an HTTP or FTP server. See MAXFILESIZE above for the LONG version. + */ + CINIT(MAXFILESIZE_LARGE, OFF_T, 117), + + /* Set this option to the file name of your .netrc file you want libcurl + to parse (using the CURLOPT_NETRC option). If not set, libcurl will do + a poor attempt to find the user's home directory and check for a .netrc + file in there. */ + CINIT(NETRC_FILE, STRINGPOINT, 118), + + /* Enable SSL/TLS for FTP, pick one of: + CURLUSESSL_TRY - try using SSL, proceed anyway otherwise + CURLUSESSL_CONTROL - SSL for the control connection or fail + CURLUSESSL_ALL - SSL for all communication or fail + */ + CINIT(USE_SSL, LONG, 119), + + /* The _LARGE version of the standard POSTFIELDSIZE option */ + CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120), + + /* Enable/disable the TCP Nagle algorithm */ + CINIT(TCP_NODELAY, LONG, 121), + + /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 123 OBSOLETE. Gone in 7.16.0 */ + /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 127 OBSOLETE. Gone in 7.16.0 */ + /* 128 OBSOLETE. Gone in 7.16.0 */ + + /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option + can be used to change libcurl's default action which is to first try + "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK + response has been received. + + Available parameters are: + CURLFTPAUTH_DEFAULT - let libcurl decide + CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS + CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL + */ + CINIT(FTPSSLAUTH, LONG, 129), + + CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130), + CINIT(IOCTLDATA, OBJECTPOINT, 131), + + /* 132 OBSOLETE. Gone in 7.16.0 */ + /* 133 OBSOLETE. Gone in 7.16.0 */ + + /* zero terminated string for pass on to the FTP server when asked for + "account" info */ + CINIT(FTP_ACCOUNT, STRINGPOINT, 134), + + /* feed cookie into cookie engine */ + CINIT(COOKIELIST, STRINGPOINT, 135), + + /* ignore Content-Length */ + CINIT(IGNORE_CONTENT_LENGTH, LONG, 136), + + /* Set to non-zero to skip the IP address received in a 227 PASV FTP server + response. Typically used for FTP-SSL purposes but is not restricted to + that. libcurl will then instead use the same IP address it used for the + control connection. */ + CINIT(FTP_SKIP_PASV_IP, LONG, 137), + + /* Select "file method" to use when doing FTP, see the curl_ftpmethod + above. */ + CINIT(FTP_FILEMETHOD, LONG, 138), + + /* Local port number to bind the socket to */ + CINIT(LOCALPORT, LONG, 139), + + /* Number of ports to try, including the first one set with LOCALPORT. + Thus, setting it to 1 will make no additional attempts but the first. + */ + CINIT(LOCALPORTRANGE, LONG, 140), + + /* no transfer, set up connection and let application use the socket by + extracting it with CURLINFO_LASTSOCKET */ + CINIT(CONNECT_ONLY, LONG, 141), + + /* Function that will be called to convert from the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142), + + /* Function that will be called to convert to the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143), + + /* Function that will be called to convert from UTF8 + (instead of using the iconv calls in libcurl) + Note that this is used only for SSL certificate processing */ + CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144), + + /* if the connection proceeds too quickly then need to slow it down */ + /* limit-rate: maximum number of bytes per second to send or receive */ + CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145), + CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146), + + /* Pointer to command string to send if USER/PASS fails. */ + CINIT(FTP_ALTERNATIVE_TO_USER, STRINGPOINT, 147), + + /* callback function for setting socket options */ + CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148), + CINIT(SOCKOPTDATA, OBJECTPOINT, 149), + + /* set to 0 to disable session ID re-use for this transfer, default is + enabled (== 1) */ + CINIT(SSL_SESSIONID_CACHE, LONG, 150), + + /* allowed SSH authentication methods */ + CINIT(SSH_AUTH_TYPES, LONG, 151), + + /* Used by scp/sftp to do public/private key authentication */ + CINIT(SSH_PUBLIC_KEYFILE, STRINGPOINT, 152), + CINIT(SSH_PRIVATE_KEYFILE, STRINGPOINT, 153), + + /* Send CCC (Clear Command Channel) after authentication */ + CINIT(FTP_SSL_CCC, LONG, 154), + + /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */ + CINIT(TIMEOUT_MS, LONG, 155), + CINIT(CONNECTTIMEOUT_MS, LONG, 156), + + /* set to zero to disable the libcurl's decoding and thus pass the raw body + data to the application even when it is encoded/compressed */ + CINIT(HTTP_TRANSFER_DECODING, LONG, 157), + CINIT(HTTP_CONTENT_DECODING, LONG, 158), + + /* Permission used when creating new files and directories on the remote + server for protocols that support it, SFTP/SCP/FILE */ + CINIT(NEW_FILE_PERMS, LONG, 159), + CINIT(NEW_DIRECTORY_PERMS, LONG, 160), + + /* Set the behaviour of POST when redirecting. Values must be set to one + of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ + CINIT(POSTREDIR, LONG, 161), + + /* used by scp/sftp to verify the host's public key */ + CINIT(SSH_HOST_PUBLIC_KEY_MD5, STRINGPOINT, 162), + + /* Callback function for opening socket (instead of socket(2)). Optionally, + callback is able change the address or refuse to connect returning + CURL_SOCKET_BAD. The callback should have type + curl_opensocket_callback */ + CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163), + CINIT(OPENSOCKETDATA, OBJECTPOINT, 164), + + /* POST volatile input fields. */ + CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165), + + /* set transfer mode (;type=) when doing FTP via an HTTP proxy */ + CINIT(PROXY_TRANSFER_MODE, LONG, 166), + + /* Callback function for seeking in the input stream */ + CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167), + CINIT(SEEKDATA, OBJECTPOINT, 168), + + /* CRL file */ + CINIT(CRLFILE, STRINGPOINT, 169), + + /* Issuer certificate */ + CINIT(ISSUERCERT, STRINGPOINT, 170), + + /* (IPv6) Address scope */ + CINIT(ADDRESS_SCOPE, LONG, 171), + + /* Collect certificate chain info and allow it to get retrievable with + CURLINFO_CERTINFO after the transfer is complete. */ + CINIT(CERTINFO, LONG, 172), + + /* "name" and "pwd" to use when fetching. */ + CINIT(USERNAME, STRINGPOINT, 173), + CINIT(PASSWORD, STRINGPOINT, 174), + + /* "name" and "pwd" to use with Proxy when fetching. */ + CINIT(PROXYUSERNAME, STRINGPOINT, 175), + CINIT(PROXYPASSWORD, STRINGPOINT, 176), + + /* Comma separated list of hostnames defining no-proxy zones. These should + match both hostnames directly, and hostnames within a domain. For + example, local.com will match local.com and www.local.com, but NOT + notlocal.com or www.notlocal.com. For compatibility with other + implementations of this, .local.com will be considered to be the same as + local.com. A single * is the only valid wildcard, and effectively + disables the use of proxy. */ + CINIT(NOPROXY, STRINGPOINT, 177), + + /* block size for TFTP transfers */ + CINIT(TFTP_BLKSIZE, LONG, 178), + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_SERVICE, STRINGPOINT, 179), /* DEPRECATED, do not use! */ + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_NEC, LONG, 180), + + /* set the bitmask for the protocols that are allowed to be used for the + transfer, which thus helps the app which takes URLs from users or other + external inputs and want to restrict what protocol(s) to deal + with. Defaults to CURLPROTO_ALL. */ + CINIT(PROTOCOLS, LONG, 181), + + /* set the bitmask for the protocols that libcurl is allowed to follow to, + as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs + to be set in both bitmasks to be allowed to get redirected to. Defaults + to all protocols except FILE and SCP. */ + CINIT(REDIR_PROTOCOLS, LONG, 182), + + /* set the SSH knownhost file name to use */ + CINIT(SSH_KNOWNHOSTS, STRINGPOINT, 183), + + /* set the SSH host key callback, must point to a curl_sshkeycallback + function */ + CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184), + + /* set the SSH host key callback custom pointer */ + CINIT(SSH_KEYDATA, OBJECTPOINT, 185), + + /* set the SMTP mail originator */ + CINIT(MAIL_FROM, STRINGPOINT, 186), + + /* set the list of SMTP mail receiver(s) */ + CINIT(MAIL_RCPT, OBJECTPOINT, 187), + + /* FTP: send PRET before PASV */ + CINIT(FTP_USE_PRET, LONG, 188), + + /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */ + CINIT(RTSP_REQUEST, LONG, 189), + + /* The RTSP session identifier */ + CINIT(RTSP_SESSION_ID, STRINGPOINT, 190), + + /* The RTSP stream URI */ + CINIT(RTSP_STREAM_URI, STRINGPOINT, 191), + + /* The Transport: header to use in RTSP requests */ + CINIT(RTSP_TRANSPORT, STRINGPOINT, 192), + + /* Manually initialize the client RTSP CSeq for this handle */ + CINIT(RTSP_CLIENT_CSEQ, LONG, 193), + + /* Manually initialize the server RTSP CSeq for this handle */ + CINIT(RTSP_SERVER_CSEQ, LONG, 194), + + /* The stream to pass to INTERLEAVEFUNCTION. */ + CINIT(INTERLEAVEDATA, OBJECTPOINT, 195), + + /* Let the application define a custom write method for RTP data */ + CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196), + + /* Turn on wildcard matching */ + CINIT(WILDCARDMATCH, LONG, 197), + + /* Directory matching callback called before downloading of an + individual file (chunk) started */ + CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198), + + /* Directory matching callback called after the file (chunk) + was downloaded, or skipped */ + CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199), + + /* Change match (fnmatch-like) callback for wildcard matching */ + CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200), + + /* Let the application define custom chunk data pointer */ + CINIT(CHUNK_DATA, OBJECTPOINT, 201), + + /* FNMATCH_FUNCTION user pointer */ + CINIT(FNMATCH_DATA, OBJECTPOINT, 202), + + /* send linked-list of name:port:address sets */ + CINIT(RESOLVE, OBJECTPOINT, 203), + + /* Set a username for authenticated TLS */ + CINIT(TLSAUTH_USERNAME, STRINGPOINT, 204), + + /* Set a password for authenticated TLS */ + CINIT(TLSAUTH_PASSWORD, STRINGPOINT, 205), + + /* Set authentication type for authenticated TLS */ + CINIT(TLSAUTH_TYPE, STRINGPOINT, 206), + + /* Set to 1 to enable the "TE:" header in HTTP requests to ask for + compressed transfer-encoded responses. Set to 0 to disable the use of TE: + in outgoing requests. The current default is 0, but it might change in a + future libcurl release. + + libcurl will ask for the compressed methods it knows of, and if that + isn't any, it will not ask for transfer-encoding at all even if this + option is set to 1. + + */ + CINIT(TRANSFER_ENCODING, LONG, 207), + + /* Callback function for closing socket (instead of close(2)). The callback + should have type curl_closesocket_callback */ + CINIT(CLOSESOCKETFUNCTION, FUNCTIONPOINT, 208), + CINIT(CLOSESOCKETDATA, OBJECTPOINT, 209), + + /* allow GSSAPI credential delegation */ + CINIT(GSSAPI_DELEGATION, LONG, 210), + + /* Set the name servers to use for DNS resolution */ + CINIT(DNS_SERVERS, STRINGPOINT, 211), + + /* Time-out accept operations (currently for FTP only) after this amount + of milliseconds. */ + CINIT(ACCEPTTIMEOUT_MS, LONG, 212), + + /* Set TCP keepalive */ + CINIT(TCP_KEEPALIVE, LONG, 213), + + /* non-universal keepalive knobs (Linux, AIX, HP-UX, more) */ + CINIT(TCP_KEEPIDLE, LONG, 214), + CINIT(TCP_KEEPINTVL, LONG, 215), + + /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */ + CINIT(SSL_OPTIONS, LONG, 216), + + /* Set the SMTP auth originator */ + CINIT(MAIL_AUTH, STRINGPOINT, 217), + + /* Enable/disable SASL initial response */ + CINIT(SASL_IR, LONG, 218), + + /* Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_xferinfo_callback + * prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */ + CINIT(XFERINFOFUNCTION, FUNCTIONPOINT, 219), + + /* The XOAUTH2 bearer token */ + CINIT(XOAUTH2_BEARER, STRINGPOINT, 220), + + /* Set the interface string to use as outgoing network + * interface for DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_INTERFACE, STRINGPOINT, 221), + + /* Set the local IPv4 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_LOCAL_IP4, STRINGPOINT, 222), + + /* Set the local IPv6 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_LOCAL_IP6, STRINGPOINT, 223), + + /* Set authentication options directly */ + CINIT(LOGIN_OPTIONS, STRINGPOINT, 224), + + /* Enable/disable TLS NPN extension (http2 over ssl might fail without) */ + CINIT(SSL_ENABLE_NPN, LONG, 225), + + /* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */ + CINIT(SSL_ENABLE_ALPN, LONG, 226), + + /* Time to wait for a response to a HTTP request containing an + * Expect: 100-continue header before sending the data anyway. */ + CINIT(EXPECT_100_TIMEOUT_MS, LONG, 227), + + /* This points to a linked list of headers used for proxy requests only, + struct curl_slist kind */ + CINIT(PROXYHEADER, OBJECTPOINT, 228), + + /* Pass in a bitmask of "header options" */ + CINIT(HEADEROPT, LONG, 229), + + /* The public key in DER form used to validate the peer public key + this option is used only if SSL_VERIFYPEER is true */ + CINIT(PINNEDPUBLICKEY, STRINGPOINT, 230), + + /* Path to Unix domain socket */ + CINIT(UNIX_SOCKET_PATH, STRINGPOINT, 231), + + /* Set if we should verify the certificate status. */ + CINIT(SSL_VERIFYSTATUS, LONG, 232), + + /* Set if we should enable TLS false start. */ + CINIT(SSL_FALSESTART, LONG, 233), + + /* Do not squash dot-dot sequences */ + CINIT(PATH_AS_IS, LONG, 234), + + /* Proxy Service Name */ + CINIT(PROXY_SERVICE_NAME, STRINGPOINT, 235), + + /* Service Name */ + CINIT(SERVICE_NAME, STRINGPOINT, 236), + + /* Wait/don't wait for pipe/mutex to clarify */ + CINIT(PIPEWAIT, LONG, 237), + + /* Set the protocol used when curl is given a URL without a protocol */ + CINIT(DEFAULT_PROTOCOL, STRINGPOINT, 238), + + /* Set stream weight, 1 - 256 (default is 16) */ + CINIT(STREAM_WEIGHT, LONG, 239), + + /* Set stream dependency on another CURL handle */ + CINIT(STREAM_DEPENDS, OBJECTPOINT, 240), + + /* Set E-xclusive stream dependency on another CURL handle */ + CINIT(STREAM_DEPENDS_E, OBJECTPOINT, 241), + + /* Do not send any tftp option requests to the server */ + CINIT(TFTP_NO_OPTIONS, LONG, 242), + + /* Linked-list of host:port:connect-to-host:connect-to-port, + overrides the URL's host:port (only for the network layer) */ + CINIT(CONNECT_TO, OBJECTPOINT, 243), + + /* Set TCP Fast Open */ + CINIT(TCP_FASTOPEN, LONG, 244), + + /* Continue to send data if the server responds early with an + * HTTP status code >= 300 */ + CINIT(KEEP_SENDING_ON_ERROR, LONG, 245), + + /* The CApath or CAfile used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_CAINFO, STRINGPOINT, 246), + + /* The CApath directory used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_CAPATH, STRINGPOINT, 247), + + /* Set if we should verify the proxy in ssl handshake, + set 1 to verify. */ + CINIT(PROXY_SSL_VERIFYPEER, LONG, 248), + + /* Set if we should verify the Common name from the proxy certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches + * the provided hostname. */ + CINIT(PROXY_SSL_VERIFYHOST, LONG, 249), + + /* What version to specifically try to use for proxy. + See CURL_SSLVERSION defines below. */ + CINIT(PROXY_SSLVERSION, LONG, 250), + + /* Set a username for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_USERNAME, STRINGPOINT, 251), + + /* Set a password for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_PASSWORD, STRINGPOINT, 252), + + /* Set authentication type for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_TYPE, STRINGPOINT, 253), + + /* name of the file keeping your private SSL-certificate for proxy */ + CINIT(PROXY_SSLCERT, STRINGPOINT, 254), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") for + proxy */ + CINIT(PROXY_SSLCERTTYPE, STRINGPOINT, 255), + + /* name of the file keeping your private SSL-key for proxy */ + CINIT(PROXY_SSLKEY, STRINGPOINT, 256), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") for + proxy */ + CINIT(PROXY_SSLKEYTYPE, STRINGPOINT, 257), + + /* password for the SSL private key for proxy */ + CINIT(PROXY_KEYPASSWD, STRINGPOINT, 258), + + /* Specify which SSL ciphers to use for proxy */ + CINIT(PROXY_SSL_CIPHER_LIST, STRINGPOINT, 259), + + /* CRL file for proxy */ + CINIT(PROXY_CRLFILE, STRINGPOINT, 260), + + /* Enable/disable specific SSL features with a bitmask for proxy, see + CURLSSLOPT_* */ + CINIT(PROXY_SSL_OPTIONS, LONG, 261), + + /* Name of pre proxy to use. */ + CINIT(PRE_PROXY, STRINGPOINT, 262), + + /* The public key in DER form used to validate the proxy public key + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_PINNEDPUBLICKEY, STRINGPOINT, 263), + + /* Path to an abstract Unix domain socket */ + CINIT(ABSTRACT_UNIX_SOCKET, STRINGPOINT, 264), + + /* Suppress proxy CONNECT response headers from user callbacks */ + CINIT(SUPPRESS_CONNECT_HEADERS, LONG, 265), + + /* The request target, instead of extracted from the URL */ + CINIT(REQUEST_TARGET, STRINGPOINT, 266), + + /* bitmask of allowed auth methods for connections to SOCKS5 proxies */ + CINIT(SOCKS5_AUTH, LONG, 267), + + /* Enable/disable SSH compression */ + CINIT(SSH_COMPRESSION, LONG, 268), + + /* Post MIME data. */ + CINIT(MIMEPOST, OBJECTPOINT, 269), + + /* Time to use with the CURLOPT_TIMECONDITION. Specified in number of + seconds since 1 Jan 1970. */ + CINIT(TIMEVALUE_LARGE, OFF_T, 270), + + /* Head start in milliseconds to give happy eyeballs. */ + CINIT(HAPPY_EYEBALLS_TIMEOUT_MS, LONG, 271), + + /* Function that will be called before a resolver request is made */ + CINIT(RESOLVER_START_FUNCTION, FUNCTIONPOINT, 272), + + /* User data to pass to the resolver start callback. */ + CINIT(RESOLVER_START_DATA, OBJECTPOINT, 273), + + /* send HAProxy PROXY protocol header? */ + CINIT(HAPROXYPROTOCOL, LONG, 274), + + /* shuffle addresses before use when DNS returns multiple */ + CINIT(DNS_SHUFFLE_ADDRESSES, LONG, 275), + + /* Specify which TLS 1.3 ciphers suites to use */ + CINIT(TLS13_CIPHERS, STRINGPOINT, 276), + CINIT(PROXY_TLS13_CIPHERS, STRINGPOINT, 277), + + /* Disallow specifying username/login in URL. */ + CINIT(DISALLOW_USERNAME_IN_URL, LONG, 278), + + /* DNS-over-HTTPS URL */ + CINIT(DOH_URL, STRINGPOINT, 279), + + /* Preferred buffer size to use for uploads */ + CINIT(UPLOAD_BUFFERSIZE, LONG, 280), + + /* Time in ms between connection upkeep calls for long-lived connections. */ + CINIT(UPKEEP_INTERVAL_MS, LONG, 281), + + /* Specify URL using CURL URL API. */ + CINIT(CURLU, OBJECTPOINT, 282), + + /* add trailing data just after no more data is available */ + CINIT(TRAILERFUNCTION, FUNCTIONPOINT, 283), + + /* pointer to be passed to HTTP_TRAILER_FUNCTION */ + CINIT(TRAILERDATA, OBJECTPOINT, 284), + + /* set this to 1L to allow HTTP/0.9 responses or 0L to disallow */ + CINIT(HTTP09_ALLOWED, LONG, 285), + + /* alt-svc control bitmask */ + CINIT(ALTSVC_CTRL, LONG, 286), + + /* alt-svc cache file name to possibly read from/write to */ + CINIT(ALTSVC, STRINGPOINT, 287), + + /* maximum age of a connection to consider it for reuse (in seconds) */ + CINIT(MAXAGE_CONN, LONG, 288), + + CURLOPT_LASTENTRY /* the last unused */ +} CURLoption; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2011 */ + +/* This was added in version 7.19.1 */ +#define CURLOPT_POST301 CURLOPT_POSTREDIR + +/* These are scheduled to disappear by 2009 */ + +/* The following were added in 7.17.0 */ +#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_FTPAPPEND CURLOPT_APPEND +#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY +#define CURLOPT_FTP_SSL CURLOPT_USE_SSL + +/* The following were added earlier */ + +#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL + +#else +/* This is set if CURL_NO_OLDIES is defined at compile-time */ +#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ +#endif + + + /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host + name resolves addresses using more than one IP protocol version, this + option might be handy to force libcurl to use a specific IP version. */ +#define CURL_IPRESOLVE_WHATEVER 0 /* default, resolves addresses to all IP + versions that your system allows */ +#define CURL_IPRESOLVE_V4 1 /* resolve to IPv4 addresses */ +#define CURL_IPRESOLVE_V6 2 /* resolve to IPv6 addresses */ + + /* three convenient "aliases" that follow the name scheme better */ +#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER + + /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ +enum { + CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd + like the library to choose the best possible + for us! */ + CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ + CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ + CURL_HTTP_VERSION_2_0, /* please use HTTP 2 in the request */ + CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */ + CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1 + Upgrade */ + + CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ +}; + +/* Convenience definition simple because the name of the version is HTTP/2 and + not 2.0. The 2_0 version of the enum name was set while the version was + still planned to be 2.0 and we stick to it for compatibility. */ +#define CURL_HTTP_VERSION_2 CURL_HTTP_VERSION_2_0 + +/* + * Public API enums for RTSP requests + */ +enum { + CURL_RTSPREQ_NONE, /* first in list */ + CURL_RTSPREQ_OPTIONS, + CURL_RTSPREQ_DESCRIBE, + CURL_RTSPREQ_ANNOUNCE, + CURL_RTSPREQ_SETUP, + CURL_RTSPREQ_PLAY, + CURL_RTSPREQ_PAUSE, + CURL_RTSPREQ_TEARDOWN, + CURL_RTSPREQ_GET_PARAMETER, + CURL_RTSPREQ_SET_PARAMETER, + CURL_RTSPREQ_RECORD, + CURL_RTSPREQ_RECEIVE, + CURL_RTSPREQ_LAST /* last in list */ +}; + + /* These enums are for use with the CURLOPT_NETRC option. */ +enum CURL_NETRC_OPTION { + CURL_NETRC_IGNORED, /* The .netrc will never be read. + * This is the default. */ + CURL_NETRC_OPTIONAL, /* A user:password in the URL will be preferred + * to one in the .netrc. */ + CURL_NETRC_REQUIRED, /* A user:password in the URL will be ignored. + * Unless one is set programmatically, the .netrc + * will be queried. */ + CURL_NETRC_LAST +}; + +enum { + CURL_SSLVERSION_DEFAULT, + CURL_SSLVERSION_TLSv1, /* TLS 1.x */ + CURL_SSLVERSION_SSLv2, + CURL_SSLVERSION_SSLv3, + CURL_SSLVERSION_TLSv1_0, + CURL_SSLVERSION_TLSv1_1, + CURL_SSLVERSION_TLSv1_2, + CURL_SSLVERSION_TLSv1_3, + + CURL_SSLVERSION_LAST /* never use, keep last */ +}; + +enum { + CURL_SSLVERSION_MAX_NONE = 0, + CURL_SSLVERSION_MAX_DEFAULT = (CURL_SSLVERSION_TLSv1 << 16), + CURL_SSLVERSION_MAX_TLSv1_0 = (CURL_SSLVERSION_TLSv1_0 << 16), + CURL_SSLVERSION_MAX_TLSv1_1 = (CURL_SSLVERSION_TLSv1_1 << 16), + CURL_SSLVERSION_MAX_TLSv1_2 = (CURL_SSLVERSION_TLSv1_2 << 16), + CURL_SSLVERSION_MAX_TLSv1_3 = (CURL_SSLVERSION_TLSv1_3 << 16), + + /* never use, keep last */ + CURL_SSLVERSION_MAX_LAST = (CURL_SSLVERSION_LAST << 16) +}; + +enum CURL_TLSAUTH { + CURL_TLSAUTH_NONE, + CURL_TLSAUTH_SRP, + CURL_TLSAUTH_LAST /* never use, keep last */ +}; + +/* symbols to use with CURLOPT_POSTREDIR. + CURL_REDIR_POST_301, CURL_REDIR_POST_302 and CURL_REDIR_POST_303 + can be bitwise ORed so that CURL_REDIR_POST_301 | CURL_REDIR_POST_302 + | CURL_REDIR_POST_303 == CURL_REDIR_POST_ALL */ + +#define CURL_REDIR_GET_ALL 0 +#define CURL_REDIR_POST_301 1 +#define CURL_REDIR_POST_302 2 +#define CURL_REDIR_POST_303 4 +#define CURL_REDIR_POST_ALL \ + (CURL_REDIR_POST_301|CURL_REDIR_POST_302|CURL_REDIR_POST_303) + +typedef enum { + CURL_TIMECOND_NONE, + + CURL_TIMECOND_IFMODSINCE, + CURL_TIMECOND_IFUNMODSINCE, + CURL_TIMECOND_LASTMOD, + + CURL_TIMECOND_LAST +} curl_TimeCond; + +/* Special size_t value signaling a zero-terminated string. */ +#define CURL_ZERO_TERMINATED ((size_t) -1) + +/* curl_strequal() and curl_strnequal() are subject for removal in a future + release */ +CURL_EXTERN int curl_strequal(const char *s1, const char *s2); +CURL_EXTERN int curl_strnequal(const char *s1, const char *s2, size_t n); + +/* Mime/form handling support. */ +typedef struct curl_mime_s curl_mime; /* Mime context. */ +typedef struct curl_mimepart_s curl_mimepart; /* Mime part context. */ + +/* + * NAME curl_mime_init() + * + * DESCRIPTION + * + * Create a mime context and return its handle. The easy parameter is the + * target handle. + */ +CURL_EXTERN curl_mime *curl_mime_init(CURL *easy); + +/* + * NAME curl_mime_free() + * + * DESCRIPTION + * + * release a mime handle and its substructures. + */ +CURL_EXTERN void curl_mime_free(curl_mime *mime); + +/* + * NAME curl_mime_addpart() + * + * DESCRIPTION + * + * Append a new empty part to the given mime context and return a handle to + * the created part. + */ +CURL_EXTERN curl_mimepart *curl_mime_addpart(curl_mime *mime); + +/* + * NAME curl_mime_name() + * + * DESCRIPTION + * + * Set mime/form part name. + */ +CURL_EXTERN CURLcode curl_mime_name(curl_mimepart *part, const char *name); + +/* + * NAME curl_mime_filename() + * + * DESCRIPTION + * + * Set mime part remote file name. + */ +CURL_EXTERN CURLcode curl_mime_filename(curl_mimepart *part, + const char *filename); + +/* + * NAME curl_mime_type() + * + * DESCRIPTION + * + * Set mime part type. + */ +CURL_EXTERN CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype); + +/* + * NAME curl_mime_encoder() + * + * DESCRIPTION + * + * Set mime data transfer encoder. + */ +CURL_EXTERN CURLcode curl_mime_encoder(curl_mimepart *part, + const char *encoding); + +/* + * NAME curl_mime_data() + * + * DESCRIPTION + * + * Set mime part data source from memory data, + */ +CURL_EXTERN CURLcode curl_mime_data(curl_mimepart *part, + const char *data, size_t datasize); + +/* + * NAME curl_mime_filedata() + * + * DESCRIPTION + * + * Set mime part data source from named file. + */ +CURL_EXTERN CURLcode curl_mime_filedata(curl_mimepart *part, + const char *filename); + +/* + * NAME curl_mime_data_cb() + * + * DESCRIPTION + * + * Set mime part data source from callback function. + */ +CURL_EXTERN CURLcode curl_mime_data_cb(curl_mimepart *part, + curl_off_t datasize, + curl_read_callback readfunc, + curl_seek_callback seekfunc, + curl_free_callback freefunc, + void *arg); + +/* + * NAME curl_mime_subparts() + * + * DESCRIPTION + * + * Set mime part data source from subparts. + */ +CURL_EXTERN CURLcode curl_mime_subparts(curl_mimepart *part, + curl_mime *subparts); +/* + * NAME curl_mime_headers() + * + * DESCRIPTION + * + * Set mime part headers. + */ +CURL_EXTERN CURLcode curl_mime_headers(curl_mimepart *part, + struct curl_slist *headers, + int take_ownership); + +/* Old form API. */ +/* name is uppercase CURLFORM_ */ +#ifdef CFINIT +#undef CFINIT +#endif + +#ifdef CURL_ISOCPP +#define CFINIT(name) CURLFORM_ ## name +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define CFINIT(name) CURLFORM_/**/name +#endif + +typedef enum { + CFINIT(NOTHING), /********* the first one is unused ************/ + + /* */ + CFINIT(COPYNAME), + CFINIT(PTRNAME), + CFINIT(NAMELENGTH), + CFINIT(COPYCONTENTS), + CFINIT(PTRCONTENTS), + CFINIT(CONTENTSLENGTH), + CFINIT(FILECONTENT), + CFINIT(ARRAY), + CFINIT(OBSOLETE), + CFINIT(FILE), + + CFINIT(BUFFER), + CFINIT(BUFFERPTR), + CFINIT(BUFFERLENGTH), + + CFINIT(CONTENTTYPE), + CFINIT(CONTENTHEADER), + CFINIT(FILENAME), + CFINIT(END), + CFINIT(OBSOLETE2), + + CFINIT(STREAM), + CFINIT(CONTENTLEN), /* added in 7.46.0, provide a curl_off_t length */ + + CURLFORM_LASTENTRY /* the last unused */ +} CURLformoption; + +#undef CFINIT /* done */ + +/* structure to be used as parameter for CURLFORM_ARRAY */ +struct curl_forms { + CURLformoption option; + const char *value; +}; + +/* use this for multipart formpost building */ +/* Returns code for curl_formadd() + * + * Returns: + * CURL_FORMADD_OK on success + * CURL_FORMADD_MEMORY if the FormInfo allocation fails + * CURL_FORMADD_OPTION_TWICE if one option is given twice for one Form + * CURL_FORMADD_NULL if a null pointer was given for a char + * CURL_FORMADD_MEMORY if the allocation of a FormInfo struct failed + * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used + * CURL_FORMADD_INCOMPLETE if the some FormInfo is not complete (or error) + * CURL_FORMADD_MEMORY if a curl_httppost struct cannot be allocated + * CURL_FORMADD_MEMORY if some allocation for string copying failed. + * CURL_FORMADD_ILLEGAL_ARRAY if an illegal option is used in an array + * + ***************************************************************************/ +typedef enum { + CURL_FORMADD_OK, /* first, no error */ + + CURL_FORMADD_MEMORY, + CURL_FORMADD_OPTION_TWICE, + CURL_FORMADD_NULL, + CURL_FORMADD_UNKNOWN_OPTION, + CURL_FORMADD_INCOMPLETE, + CURL_FORMADD_ILLEGAL_ARRAY, + CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */ + + CURL_FORMADD_LAST /* last */ +} CURLFORMcode; + +/* + * NAME curl_formadd() + * + * DESCRIPTION + * + * Pretty advanced function for building multi-part formposts. Each invoke + * adds one part that together construct a full post. Then use + * CURLOPT_HTTPPOST to send it off to libcurl. + */ +CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, + struct curl_httppost **last_post, + ...); + +/* + * callback function for curl_formget() + * The void *arg pointer will be the one passed as second argument to + * curl_formget(). + * The character buffer passed to it must not be freed. + * Should return the buffer length passed to it as the argument "len" on + * success. + */ +typedef size_t (*curl_formget_callback)(void *arg, const char *buf, + size_t len); + +/* + * NAME curl_formget() + * + * DESCRIPTION + * + * Serialize a curl_httppost struct built with curl_formadd(). + * Accepts a void pointer as second argument which will be passed to + * the curl_formget_callback function. + * Returns 0 on success. + */ +CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, + curl_formget_callback append); +/* + * NAME curl_formfree() + * + * DESCRIPTION + * + * Free a multipart formpost previously built with curl_formadd(). + */ +CURL_EXTERN void curl_formfree(struct curl_httppost *form); + +/* + * NAME curl_getenv() + * + * DESCRIPTION + * + * Returns a malloc()'ed string that MUST be curl_free()ed after usage is + * complete. DEPRECATED - see lib/README.curlx + */ +CURL_EXTERN char *curl_getenv(const char *variable); + +/* + * NAME curl_version() + * + * DESCRIPTION + * + * Returns a static ascii string of the libcurl version. + */ +CURL_EXTERN char *curl_version(void); + +/* + * NAME curl_easy_escape() + * + * DESCRIPTION + * + * Escapes URL strings (converts all letters consider illegal in URLs to their + * %XX versions). This function returns a new allocated string or NULL if an + * error occurred. + */ +CURL_EXTERN char *curl_easy_escape(CURL *handle, + const char *string, + int length); + +/* the previous version: */ +CURL_EXTERN char *curl_escape(const char *string, + int length); + + +/* + * NAME curl_easy_unescape() + * + * DESCRIPTION + * + * Unescapes URL encoding in strings (converts all %XX codes to their 8bit + * versions). This function returns a new allocated string or NULL if an error + * occurred. + * Conversion Note: On non-ASCII platforms the ASCII %XX codes are + * converted into the host encoding. + */ +CURL_EXTERN char *curl_easy_unescape(CURL *handle, + const char *string, + int length, + int *outlength); + +/* the previous version */ +CURL_EXTERN char *curl_unescape(const char *string, + int length); + +/* + * NAME curl_free() + * + * DESCRIPTION + * + * Provided for de-allocation in the same translation unit that did the + * allocation. Added in libcurl 7.10 + */ +CURL_EXTERN void curl_free(void *p); + +/* + * NAME curl_global_init() + * + * DESCRIPTION + * + * curl_global_init() should be invoked exactly once for each application that + * uses libcurl and before any call of other libcurl functions. + * + * This function is not thread-safe! + */ +CURL_EXTERN CURLcode curl_global_init(long flags); + +/* + * NAME curl_global_init_mem() + * + * DESCRIPTION + * + * curl_global_init() or curl_global_init_mem() should be invoked exactly once + * for each application that uses libcurl. This function can be used to + * initialize libcurl and set user defined memory management callback + * functions. Users can implement memory management routines to check for + * memory leaks, check for mis-use of the curl library etc. User registered + * callback routines with be invoked by this library instead of the system + * memory management routines like malloc, free etc. + */ +CURL_EXTERN CURLcode curl_global_init_mem(long flags, + curl_malloc_callback m, + curl_free_callback f, + curl_realloc_callback r, + curl_strdup_callback s, + curl_calloc_callback c); + +/* + * NAME curl_global_cleanup() + * + * DESCRIPTION + * + * curl_global_cleanup() should be invoked exactly once for each application + * that uses libcurl + */ +CURL_EXTERN void curl_global_cleanup(void); + +/* linked-list structure for the CURLOPT_QUOTE option (and other) */ +struct curl_slist { + char *data; + struct curl_slist *next; +}; + +/* + * NAME curl_global_sslset() + * + * DESCRIPTION + * + * When built with multiple SSL backends, curl_global_sslset() allows to + * choose one. This function can only be called once, and it must be called + * *before* curl_global_init(). + * + * The backend can be identified by the id (e.g. CURLSSLBACKEND_OPENSSL). The + * backend can also be specified via the name parameter (passing -1 as id). + * If both id and name are specified, the name will be ignored. If neither id + * nor name are specified, the function will fail with + * CURLSSLSET_UNKNOWN_BACKEND and set the "avail" pointer to the + * NULL-terminated list of available backends. + * + * Upon success, the function returns CURLSSLSET_OK. + * + * If the specified SSL backend is not available, the function returns + * CURLSSLSET_UNKNOWN_BACKEND and sets the "avail" pointer to a NULL-terminated + * list of available SSL backends. + * + * The SSL backend can be set only once. If it has already been set, a + * subsequent attempt to change it will result in a CURLSSLSET_TOO_LATE. + */ + +typedef struct { + curl_sslbackend id; + const char *name; +} curl_ssl_backend; + +typedef enum { + CURLSSLSET_OK = 0, + CURLSSLSET_UNKNOWN_BACKEND, + CURLSSLSET_TOO_LATE, + CURLSSLSET_NO_BACKENDS /* libcurl was built without any SSL support */ +} CURLsslset; + +CURL_EXTERN CURLsslset curl_global_sslset(curl_sslbackend id, const char *name, + const curl_ssl_backend ***avail); + +/* + * NAME curl_slist_append() + * + * DESCRIPTION + * + * Appends a string to a linked list. If no list exists, it will be created + * first. Returns the new list, after appending. + */ +CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *, + const char *); + +/* + * NAME curl_slist_free_all() + * + * DESCRIPTION + * + * free a previously built curl_slist. + */ +CURL_EXTERN void curl_slist_free_all(struct curl_slist *); + +/* + * NAME curl_getdate() + * + * DESCRIPTION + * + * Returns the time, in seconds since 1 Jan 1970 of the time string given in + * the first argument. The time argument in the second parameter is unused + * and should be set to NULL. + */ +CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); + +/* info about the certificate chain, only for OpenSSL builds. Asked + for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ +struct curl_certinfo { + int num_of_certs; /* number of certificates with information */ + struct curl_slist **certinfo; /* for each index in this array, there's a + linked list with textual information in the + format "name: value" */ +}; + +/* Information about the SSL library used and the respective internal SSL + handle, which can be used to obtain further information regarding the + connection. Asked for with CURLINFO_TLS_SSL_PTR or CURLINFO_TLS_SESSION. */ +struct curl_tlssessioninfo { + curl_sslbackend backend; + void *internals; +}; + +#define CURLINFO_STRING 0x100000 +#define CURLINFO_LONG 0x200000 +#define CURLINFO_DOUBLE 0x300000 +#define CURLINFO_SLIST 0x400000 +#define CURLINFO_PTR 0x400000 /* same as SLIST */ +#define CURLINFO_SOCKET 0x500000 +#define CURLINFO_OFF_T 0x600000 +#define CURLINFO_MASK 0x0fffff +#define CURLINFO_TYPEMASK 0xf00000 + +typedef enum { + CURLINFO_NONE, /* first, never use this */ + CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, + CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, + CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3, + CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4, + CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5, + CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6, + CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7, + CURLINFO_SIZE_UPLOAD_T = CURLINFO_OFF_T + 7, + CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, + CURLINFO_SIZE_DOWNLOAD_T = CURLINFO_OFF_T + 8, + CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, + CURLINFO_SPEED_DOWNLOAD_T = CURLINFO_OFF_T + 9, + CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, + CURLINFO_SPEED_UPLOAD_T = CURLINFO_OFF_T + 10, + CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, + CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, + CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, + CURLINFO_FILETIME = CURLINFO_LONG + 14, + CURLINFO_FILETIME_T = CURLINFO_OFF_T + 14, + CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, + CURLINFO_CONTENT_LENGTH_DOWNLOAD_T = CURLINFO_OFF_T + 15, + CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, + CURLINFO_CONTENT_LENGTH_UPLOAD_T = CURLINFO_OFF_T + 16, + CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, + CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, + CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, + CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, + CURLINFO_PRIVATE = CURLINFO_STRING + 21, + CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22, + CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, + CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, + CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, + CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, + CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, + CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, + CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, + CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, + CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, + CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, + CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, + CURLINFO_CERTINFO = CURLINFO_PTR + 34, + CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, + CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36, + CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37, + CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG + 38, + CURLINFO_RTSP_CSEQ_RECV = CURLINFO_LONG + 39, + CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, + CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, + CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, + CURLINFO_TLS_SESSION = CURLINFO_PTR + 43, + CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44, + CURLINFO_TLS_SSL_PTR = CURLINFO_PTR + 45, + CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46, + CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47, + CURLINFO_PROTOCOL = CURLINFO_LONG + 48, + CURLINFO_SCHEME = CURLINFO_STRING + 49, + /* Fill in new entries below here! */ + + /* Preferably these would be defined conditionally based on the + sizeof curl_off_t being 64-bits */ + CURLINFO_TOTAL_TIME_T = CURLINFO_OFF_T + 50, + CURLINFO_NAMELOOKUP_TIME_T = CURLINFO_OFF_T + 51, + CURLINFO_CONNECT_TIME_T = CURLINFO_OFF_T + 52, + CURLINFO_PRETRANSFER_TIME_T = CURLINFO_OFF_T + 53, + CURLINFO_STARTTRANSFER_TIME_T = CURLINFO_OFF_T + 54, + CURLINFO_REDIRECT_TIME_T = CURLINFO_OFF_T + 55, + CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56, + + CURLINFO_LASTONE = 56 +} CURLINFO; + +/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as + CURLINFO_HTTP_CODE */ +#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE + +typedef enum { + CURLCLOSEPOLICY_NONE, /* first, never use this */ + + CURLCLOSEPOLICY_OLDEST, + CURLCLOSEPOLICY_LEAST_RECENTLY_USED, + CURLCLOSEPOLICY_LEAST_TRAFFIC, + CURLCLOSEPOLICY_SLOWEST, + CURLCLOSEPOLICY_CALLBACK, + + CURLCLOSEPOLICY_LAST /* last, never use this */ +} curl_closepolicy; + +#define CURL_GLOBAL_SSL (1<<0) /* no purpose since since 7.57.0 */ +#define CURL_GLOBAL_WIN32 (1<<1) +#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) +#define CURL_GLOBAL_NOTHING 0 +#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL +#define CURL_GLOBAL_ACK_EINTR (1<<2) + + +/***************************************************************************** + * Setup defines, protos etc for the sharing stuff. + */ + +/* Different data locks for a single share */ +typedef enum { + CURL_LOCK_DATA_NONE = 0, + /* CURL_LOCK_DATA_SHARE is used internally to say that + * the locking is just made to change the internal state of the share + * itself. + */ + CURL_LOCK_DATA_SHARE, + CURL_LOCK_DATA_COOKIE, + CURL_LOCK_DATA_DNS, + CURL_LOCK_DATA_SSL_SESSION, + CURL_LOCK_DATA_CONNECT, + CURL_LOCK_DATA_PSL, + CURL_LOCK_DATA_LAST +} curl_lock_data; + +/* Different lock access types */ +typedef enum { + CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */ + CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */ + CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */ + CURL_LOCK_ACCESS_LAST /* never use */ +} curl_lock_access; + +typedef void (*curl_lock_function)(CURL *handle, + curl_lock_data data, + curl_lock_access locktype, + void *userptr); +typedef void (*curl_unlock_function)(CURL *handle, + curl_lock_data data, + void *userptr); + + +typedef enum { + CURLSHE_OK, /* all is fine */ + CURLSHE_BAD_OPTION, /* 1 */ + CURLSHE_IN_USE, /* 2 */ + CURLSHE_INVALID, /* 3 */ + CURLSHE_NOMEM, /* 4 out of memory */ + CURLSHE_NOT_BUILT_IN, /* 5 feature not present in lib */ + CURLSHE_LAST /* never use */ +} CURLSHcode; + +typedef enum { + CURLSHOPT_NONE, /* don't use */ + CURLSHOPT_SHARE, /* specify a data type to share */ + CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */ + CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */ + CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */ + CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock + callback functions */ + CURLSHOPT_LAST /* never use */ +} CURLSHoption; + +CURL_EXTERN CURLSH *curl_share_init(void); +CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); +CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *); + +/**************************************************************************** + * Structures for querying information about the curl library at runtime. + */ + +typedef enum { + CURLVERSION_FIRST, + CURLVERSION_SECOND, + CURLVERSION_THIRD, + CURLVERSION_FOURTH, + CURLVERSION_FIFTH, + CURLVERSION_LAST /* never actually use this */ +} CURLversion; + +/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by + basically all programs ever that want to get version information. It is + meant to be a built-in version number for what kind of struct the caller + expects. If the struct ever changes, we redefine the NOW to another enum + from above. */ +#define CURLVERSION_NOW CURLVERSION_FIFTH + +typedef struct { + CURLversion age; /* age of the returned struct */ + const char *version; /* LIBCURL_VERSION */ + unsigned int version_num; /* LIBCURL_VERSION_NUM */ + const char *host; /* OS/host/cpu/machine when configured */ + int features; /* bitmask, see defines below */ + const char *ssl_version; /* human readable string */ + long ssl_version_num; /* not used anymore, always 0 */ + const char *libz_version; /* human readable string */ + /* protocols is terminated by an entry with a NULL protoname */ + const char * const *protocols; + + /* The fields below this were added in CURLVERSION_SECOND */ + const char *ares; + int ares_num; + + /* This field was added in CURLVERSION_THIRD */ + const char *libidn; + + /* These field were added in CURLVERSION_FOURTH */ + + /* Same as '_libiconv_version' if built with HAVE_ICONV */ + int iconv_ver_num; + + const char *libssh_version; /* human readable string */ + + /* These fields were added in CURLVERSION_FIFTH */ + + unsigned int brotli_ver_num; /* Numeric Brotli version + (MAJOR << 24) | (MINOR << 12) | PATCH */ + const char *brotli_version; /* human readable string. */ + +} curl_version_info_data; + +#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ +#define CURL_VERSION_KERBEROS4 (1<<1) /* Kerberos V4 auth is supported + (deprecated) */ +#define CURL_VERSION_SSL (1<<2) /* SSL options are present */ +#define CURL_VERSION_LIBZ (1<<3) /* libz features are present */ +#define CURL_VERSION_NTLM (1<<4) /* NTLM auth is supported */ +#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth is supported + (deprecated) */ +#define CURL_VERSION_DEBUG (1<<6) /* Built with debug capabilities */ +#define CURL_VERSION_ASYNCHDNS (1<<7) /* Asynchronous DNS resolves */ +#define CURL_VERSION_SPNEGO (1<<8) /* SPNEGO auth is supported */ +#define CURL_VERSION_LARGEFILE (1<<9) /* Supports files larger than 2GB */ +#define CURL_VERSION_IDN (1<<10) /* Internationized Domain Names are + supported */ +#define CURL_VERSION_SSPI (1<<11) /* Built against Windows SSPI */ +#define CURL_VERSION_CONV (1<<12) /* Character conversions supported */ +#define CURL_VERSION_CURLDEBUG (1<<13) /* Debug memory tracking supported */ +#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */ +#define CURL_VERSION_NTLM_WB (1<<15) /* NTLM delegation to winbind helper + is supported */ +#define CURL_VERSION_HTTP2 (1<<16) /* HTTP2 support built-in */ +#define CURL_VERSION_GSSAPI (1<<17) /* Built against a GSS-API library */ +#define CURL_VERSION_KERBEROS5 (1<<18) /* Kerberos V5 auth is supported */ +#define CURL_VERSION_UNIX_SOCKETS (1<<19) /* Unix domain sockets support */ +#define CURL_VERSION_PSL (1<<20) /* Mozilla's Public Suffix List, used + for cookie domain verification */ +#define CURL_VERSION_HTTPS_PROXY (1<<21) /* HTTPS-proxy support built-in */ +#define CURL_VERSION_MULTI_SSL (1<<22) /* Multiple SSL backends available */ +#define CURL_VERSION_BROTLI (1<<23) /* Brotli features are present. */ +#define CURL_VERSION_ALTSVC (1<<24) /* Alt-Svc handling built-in */ + + /* + * NAME curl_version_info() + * + * DESCRIPTION + * + * This function returns a pointer to a static copy of the version info + * struct. See above. + */ +CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion); + +/* + * NAME curl_easy_strerror() + * + * DESCRIPTION + * + * The curl_easy_strerror function may be used to turn a CURLcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_easy_strerror(CURLcode); + +/* + * NAME curl_share_strerror() + * + * DESCRIPTION + * + * The curl_share_strerror function may be used to turn a CURLSHcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_share_strerror(CURLSHcode); + +/* + * NAME curl_easy_pause() + * + * DESCRIPTION + * + * The curl_easy_pause function pauses or unpauses transfers. Select the new + * state by setting the bitmask, use the convenience defines below. + * + */ +CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); + +#define CURLPAUSE_RECV (1<<0) +#define CURLPAUSE_RECV_CONT (0) + +#define CURLPAUSE_SEND (1<<2) +#define CURLPAUSE_SEND_CONT (0) + +#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND) +#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT) + +#ifdef __cplusplus +} +#endif + +/* unfortunately, the easy.h and multi.h include files need options and info + stuff before they can be included! */ +#include "easy.h" /* nothing in curl is fun without the easy stuff */ +#include "multi.h" +#include "urlapi.h" + +/* the typechecker doesn't work in C++ (yet) */ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ + !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) +#include "typecheck-gcc.h" +#else +#if defined(__STDC__) && (__STDC__ >= 1) +/* This preprocessor magic that replaces a call with the exact same call is + only done to make sure application authors pass exactly three arguments + to these functions. */ +#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param) +#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg) +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) +#endif /* __STDC__ >= 1 */ +#endif /* gcc >= 4.3 && !__cplusplus */ + +#endif /* __CURL_CURL_H */ diff --git a/bin/curl/include/curl/curlver.h b/bin/curl/include/curl/curlver.h new file mode 100644 index 00000000..dd58bbc4 --- /dev/null +++ b/bin/curl/include/curl/curlver.h @@ -0,0 +1,77 @@ +#ifndef __CURL_CURLVER_H +#define __CURL_CURLVER_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* This header file contains nothing but libcurl version info, generated by + a script at release-time. This was made its own header file in 7.11.2 */ + +/* This is the global package copyright */ +#define LIBCURL_COPYRIGHT "1996 - 2019 Daniel Stenberg, ." + +/* This is the version number of the libcurl package from which this header + file origins: */ +#define LIBCURL_VERSION "7.65.0" + +/* The numeric version number is also available "in parts" by using these + defines: */ +#define LIBCURL_VERSION_MAJOR 7 +#define LIBCURL_VERSION_MINOR 65 +#define LIBCURL_VERSION_PATCH 0 + +/* This is the numeric version of the libcurl version number, meant for easier + parsing and comparions by programs. The LIBCURL_VERSION_NUM define will + always follow this syntax: + + 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal (using 8 bits each). All three numbers are always represented + using two digits. 1.2 would appear as "0x010200" while version 9.11.7 + appears as "0x090b07". + + This 6-digit (24 bits) hexadecimal number does not show pre-release number, + and it is always a greater number in a more recent release. It makes + comparisons with greater than and less than work. + + Note: This define is the full hex number and _does not_ use the + CURL_VERSION_BITS() macro since curl's own configure script greps for it + and needs it to contain the full number. +*/ +#define LIBCURL_VERSION_NUM 0x074100 + +/* + * This is the date and time when the full source package was created. The + * timestamp is not stored in git, as the timestamp is properly set in the + * tarballs by the maketgz script. + * + * The format of the date follows this template: + * + * "2007-11-23" + */ +#define LIBCURL_TIMESTAMP "2019-05-22" + +#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z)) +#define CURL_AT_LEAST_VERSION(x,y,z) \ + (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) + +#endif /* __CURL_CURLVER_H */ diff --git a/bin/curl/include/curl/easy.h b/bin/curl/include/curl/easy.h new file mode 100644 index 00000000..f42a8a96 --- /dev/null +++ b/bin/curl/include/curl/easy.h @@ -0,0 +1,112 @@ +#ifndef __CURL_EASY_H +#define __CURL_EASY_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN CURL *curl_easy_init(void); +CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); +CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); +CURL_EXTERN void curl_easy_cleanup(CURL *curl); + +/* + * NAME curl_easy_getinfo() + * + * DESCRIPTION + * + * Request internal information from the curl session with this function. The + * third argument MUST be a pointer to a long, a pointer to a char * or a + * pointer to a double (as the documentation describes elsewhere). The data + * pointed to will be filled in accordingly and can be relied upon only if the + * function returns CURLE_OK. This function is intended to get used *AFTER* a + * performed transfer, all results from this function are undefined until the + * transfer is completed. + */ +CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); + + +/* + * NAME curl_easy_duphandle() + * + * DESCRIPTION + * + * Creates a new curl session handle with the same options set for the handle + * passed in. Duplicating a handle could only be a matter of cloning data and + * options, internal state info and things like persistent connections cannot + * be transferred. It is useful in multithreaded applications when you can run + * curl_easy_duphandle() for each new thread to avoid a series of identical + * curl_easy_setopt() invokes in every thread. + */ +CURL_EXTERN CURL *curl_easy_duphandle(CURL *curl); + +/* + * NAME curl_easy_reset() + * + * DESCRIPTION + * + * Re-initializes a CURL handle to the default values. This puts back the + * handle to the same state as it was in when it was just created. + * + * It does keep: live connections, the Session ID cache, the DNS cache and the + * cookies. + */ +CURL_EXTERN void curl_easy_reset(CURL *curl); + +/* + * NAME curl_easy_recv() + * + * DESCRIPTION + * + * Receives data from the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, + size_t *n); + +/* + * NAME curl_easy_send() + * + * DESCRIPTION + * + * Sends data over the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer, + size_t buflen, size_t *n); + + +/* + * NAME curl_easy_upkeep() + * + * DESCRIPTION + * + * Performs connection upkeep for the given session handle. + */ +CURL_EXTERN CURLcode curl_easy_upkeep(CURL *curl); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bin/curl/include/curl/mprintf.h b/bin/curl/include/curl/mprintf.h new file mode 100644 index 00000000..e20f546e --- /dev/null +++ b/bin/curl/include/curl/mprintf.h @@ -0,0 +1,50 @@ +#ifndef __CURL_MPRINTF_H +#define __CURL_MPRINTF_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include +#include /* needed for FILE */ +#include "curl.h" /* for CURL_EXTERN */ + +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN int curl_mprintf(const char *format, ...); +CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...); +CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...); +CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, + const char *format, ...); +CURL_EXTERN int curl_mvprintf(const char *format, va_list args); +CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args); +CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args); +CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, + const char *format, va_list args); +CURL_EXTERN char *curl_maprintf(const char *format, ...); +CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); + +#ifdef __cplusplus +} +#endif + +#endif /* __CURL_MPRINTF_H */ diff --git a/bin/curl/include/curl/multi.h b/bin/curl/include/curl/multi.h new file mode 100644 index 00000000..b19dbaf7 --- /dev/null +++ b/bin/curl/include/curl/multi.h @@ -0,0 +1,441 @@ +#ifndef __CURL_MULTI_H +#define __CURL_MULTI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +/* + This is an "external" header file. Don't give away any internals here! + + GOALS + + o Enable a "pull" interface. The application that uses libcurl decides where + and when to ask libcurl to get/send data. + + o Enable multiple simultaneous transfers in the same thread without making it + complicated for the application. + + o Enable the application to select() on its own file descriptors and curl's + file descriptors simultaneous easily. + +*/ + +/* + * This header file should not really need to include "curl.h" since curl.h + * itself includes this file and we expect user applications to do #include + * without the need for especially including multi.h. + * + * For some reason we added this include here at one point, and rather than to + * break existing (wrongly written) libcurl applications, we leave it as-is + * but with this warning attached. + */ +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +typedef struct Curl_multi CURLM; +#else +typedef void CURLM; +#endif + +typedef enum { + CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or + curl_multi_socket*() soon */ + CURLM_OK, + CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */ + CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ + CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */ + CURLM_INTERNAL_ERROR, /* this is a libcurl bug */ + CURLM_BAD_SOCKET, /* the passed in socket argument did not match */ + CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */ + CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was + attempted to get added - again */ + CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a + callback */ + CURLM_LAST +} CURLMcode; + +/* just to make code nicer when using curl_multi_socket() you can now check + for CURLM_CALL_MULTI_SOCKET too in the same style it works for + curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */ +#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM + +/* bitmask bits for CURLMOPT_PIPELINING */ +#define CURLPIPE_NOTHING 0L +#define CURLPIPE_HTTP1 1L +#define CURLPIPE_MULTIPLEX 2L + +typedef enum { + CURLMSG_NONE, /* first, not used */ + CURLMSG_DONE, /* This easy handle has completed. 'result' contains + the CURLcode of the transfer */ + CURLMSG_LAST /* last, not used */ +} CURLMSG; + +struct CURLMsg { + CURLMSG msg; /* what this message means */ + CURL *easy_handle; /* the handle it concerns */ + union { + void *whatever; /* message-specific data */ + CURLcode result; /* return code for transfer */ + } data; +}; +typedef struct CURLMsg CURLMsg; + +/* Based on poll(2) structure and values. + * We don't use pollfd and POLL* constants explicitly + * to cover platforms without poll(). */ +#define CURL_WAIT_POLLIN 0x0001 +#define CURL_WAIT_POLLPRI 0x0002 +#define CURL_WAIT_POLLOUT 0x0004 + +struct curl_waitfd { + curl_socket_t fd; + short events; + short revents; /* not supported yet */ +}; + +/* + * Name: curl_multi_init() + * + * Desc: inititalize multi-style curl usage + * + * Returns: a new CURLM handle to use in all 'curl_multi' functions. + */ +CURL_EXTERN CURLM *curl_multi_init(void); + +/* + * Name: curl_multi_add_handle() + * + * Desc: add a standard curl handle to the multi stack + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_remove_handle() + * + * Desc: removes a curl handle from the multi stack again + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_fdset() + * + * Desc: Ask curl for its fd_set sets. The app can use these to select() or + * poll() on. We want curl_multi_perform() called as soon as one of + * them are ready. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, + fd_set *read_fd_set, + fd_set *write_fd_set, + fd_set *exc_fd_set, + int *max_fd); + +/* + * Name: curl_multi_wait() + * + * Desc: Poll on all fds within a CURLM set as well as any + * additional fds passed to the function. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle, + struct curl_waitfd extra_fds[], + unsigned int extra_nfds, + int timeout_ms, + int *ret); + + /* + * Name: curl_multi_perform() + * + * Desc: When the app thinks there's data available for curl it calls this + * function to read/write whatever there is right now. This returns + * as soon as the reads and writes are done. This function does not + * require that there actually is data available for reading or that + * data can be written, it can be called just in case. It returns + * the number of handles that still transfer data in the second + * argument's integer-pointer. + * + * Returns: CURLMcode type, general multi error code. *NOTE* that this only + * returns errors etc regarding the whole multi stack. There might + * still have occurred problems on individual transfers even when + * this returns OK. + */ +CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, + int *running_handles); + + /* + * Name: curl_multi_cleanup() + * + * Desc: Cleans up and removes a whole multi stack. It does not free or + * touch any individual easy handles in any way. We need to define + * in what state those handles will be if this function is called + * in the middle of a transfer. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); + +/* + * Name: curl_multi_info_read() + * + * Desc: Ask the multi handle if there's any messages/informationals from + * the individual transfers. Messages include informationals such as + * error code from the transfer or just the fact that a transfer is + * completed. More details on these should be written down as well. + * + * Repeated calls to this function will return a new struct each + * time, until a special "end of msgs" struct is returned as a signal + * that there is no more to get at this point. + * + * The data the returned pointer points to will not survive calling + * curl_multi_cleanup(). + * + * The 'CURLMsg' struct is meant to be very simple and only contain + * very basic information. If more involved information is wanted, + * we will provide the particular "transfer handle" in that struct + * and that should/could/would be used in subsequent + * curl_easy_getinfo() calls (or similar). The point being that we + * must never expose complex structs to applications, as then we'll + * undoubtably get backwards compatibility problems in the future. + * + * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out + * of structs. It also writes the number of messages left in the + * queue (after this read) in the integer the second argument points + * to. + */ +CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, + int *msgs_in_queue); + +/* + * Name: curl_multi_strerror() + * + * Desc: The curl_multi_strerror function may be used to turn a CURLMcode + * value into the equivalent human readable error string. This is + * useful for printing meaningful error messages. + * + * Returns: A pointer to a zero-terminated error message. + */ +CURL_EXTERN const char *curl_multi_strerror(CURLMcode); + +/* + * Name: curl_multi_socket() and + * curl_multi_socket_all() + * + * Desc: An alternative version of curl_multi_perform() that allows the + * application to pass in one of the file descriptors that have been + * detected to have "action" on them and let libcurl perform. + * See man page for details. + */ +#define CURL_POLL_NONE 0 +#define CURL_POLL_IN 1 +#define CURL_POLL_OUT 2 +#define CURL_POLL_INOUT 3 +#define CURL_POLL_REMOVE 4 + +#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD + +#define CURL_CSELECT_IN 0x01 +#define CURL_CSELECT_OUT 0x02 +#define CURL_CSELECT_ERR 0x04 + +typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* see above */ + void *userp, /* private callback + pointer */ + void *socketp); /* private socket + pointer */ +/* + * Name: curl_multi_timer_callback + * + * Desc: Called by libcurl whenever the library detects a change in the + * maximum number of milliseconds the app is allowed to wait before + * curl_multi_socket() or curl_multi_perform() must be called + * (to allow libcurl's timed events to take place). + * + * Returns: The callback should return zero. + */ +typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp); /* private callback + pointer */ + +CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, + curl_socket_t s, + int ev_bitmask, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle, + int *running_handles); + +#ifndef CURL_ALLOW_OLD_MULTI_SOCKET +/* This macro below was added in 7.16.3 to push users who recompile to use + the new curl_multi_socket_action() instead of the old curl_multi_socket() +*/ +#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z) +#endif + +/* + * Name: curl_multi_timeout() + * + * Desc: Returns the maximum number of milliseconds the app is allowed to + * wait before curl_multi_socket() or curl_multi_perform() must be + * called (to allow libcurl's timed events to take place). + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, + long *milliseconds); + +#undef CINIT /* re-using the same name as in curl.h */ + +#ifdef CURL_ISOCPP +#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLMOPT_/**/name = type + number +#endif + +typedef enum { + /* This is the socket callback function pointer */ + CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1), + + /* This is the argument passed to the socket callback */ + CINIT(SOCKETDATA, OBJECTPOINT, 2), + + /* set to 1 to enable pipelining for this multi handle */ + CINIT(PIPELINING, LONG, 3), + + /* This is the timer callback function pointer */ + CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4), + + /* This is the argument passed to the timer callback */ + CINIT(TIMERDATA, OBJECTPOINT, 5), + + /* maximum number of entries in the connection cache */ + CINIT(MAXCONNECTS, LONG, 6), + + /* maximum number of (pipelining) connections to one host */ + CINIT(MAX_HOST_CONNECTIONS, LONG, 7), + + /* maximum number of requests in a pipeline */ + CINIT(MAX_PIPELINE_LENGTH, LONG, 8), + + /* a connection with a content-length longer than this + will not be considered for pipelining */ + CINIT(CONTENT_LENGTH_PENALTY_SIZE, OFF_T, 9), + + /* a connection with a chunk length longer than this + will not be considered for pipelining */ + CINIT(CHUNK_LENGTH_PENALTY_SIZE, OFF_T, 10), + + /* a list of site names(+port) that are blacklisted from + pipelining */ + CINIT(PIPELINING_SITE_BL, OBJECTPOINT, 11), + + /* a list of server types that are blacklisted from + pipelining */ + CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12), + + /* maximum number of open connections in total */ + CINIT(MAX_TOTAL_CONNECTIONS, LONG, 13), + + /* This is the server push callback function pointer */ + CINIT(PUSHFUNCTION, FUNCTIONPOINT, 14), + + /* This is the argument passed to the server push callback */ + CINIT(PUSHDATA, OBJECTPOINT, 15), + + CURLMOPT_LASTENTRY /* the last unused */ +} CURLMoption; + + +/* + * Name: curl_multi_setopt() + * + * Desc: Sets options for the multi handle. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle, + CURLMoption option, ...); + + +/* + * Name: curl_multi_assign() + * + * Desc: This function sets an association in the multi handle between the + * given socket and a private pointer of the application. This is + * (only) useful for curl_multi_socket uses. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, + curl_socket_t sockfd, void *sockp); + + +/* + * Name: curl_push_callback + * + * Desc: This callback gets called when a new stream is being pushed by the + * server. It approves or denies the new stream. + * + * Returns: CURL_PUSH_OK or CURL_PUSH_DENY. + */ +#define CURL_PUSH_OK 0 +#define CURL_PUSH_DENY 1 + +struct curl_pushheaders; /* forward declaration only */ + +CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h, + size_t num); +CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h, + const char *name); + +typedef int (*curl_push_callback)(CURL *parent, + CURL *easy, + size_t num_headers, + struct curl_pushheaders *headers, + void *userp); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif diff --git a/bin/curl/include/curl/stdcheaders.h b/bin/curl/include/curl/stdcheaders.h new file mode 100644 index 00000000..027b6f42 --- /dev/null +++ b/bin/curl/include/curl/stdcheaders.h @@ -0,0 +1,33 @@ +#ifndef __STDC_HEADERS_H +#define __STDC_HEADERS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include + +size_t fread(void *, size_t, size_t, FILE *); +size_t fwrite(const void *, size_t, size_t, FILE *); + +int strcasecmp(const char *, const char *); +int strncasecmp(const char *, const char *, size_t); + +#endif /* __STDC_HEADERS_H */ diff --git a/bin/curl/include/curl/system.h b/bin/curl/include/curl/system.h new file mode 100644 index 00000000..1e555ec1 --- /dev/null +++ b/bin/curl/include/curl/system.h @@ -0,0 +1,493 @@ +#ifndef __CURL_SYSTEM_H +#define __CURL_SYSTEM_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* + * Try to keep one section per platform, compiler and architecture, otherwise, + * if an existing section is reused for a different one and later on the + * original is adjusted, probably the piggybacking one can be adversely + * changed. + * + * In order to differentiate between platforms/compilers/architectures use + * only compiler built in predefined preprocessor symbols. + * + * curl_off_t + * ---------- + * + * For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit + * wide signed integral data type. The width of this data type must remain + * constant and independent of any possible large file support settings. + * + * As an exception to the above, curl_off_t shall be typedef'ed to a 32-bit + * wide signed integral data type if there is no 64-bit type. + * + * As a general rule, curl_off_t shall not be mapped to off_t. This rule shall + * only be violated if off_t is the only 64-bit data type available and the + * size of off_t is independent of large file support settings. Keep your + * build on the safe side avoiding an off_t gating. If you have a 64-bit + * off_t then take for sure that another 64-bit data type exists, dig deeper + * and you will find it. + * + */ + +#if defined(__DJGPP__) || defined(__GO32__) +# if defined(__DJGPP__) && (__DJGPP__ > 1) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__SALFORDC__) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__BORLANDC__) +# if (__BORLANDC__ < 0x520) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__TURBOC__) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__WATCOMC__) +# if defined(__386__) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__POCC__) +# if (__POCC__ < 280) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# elif defined(_MSC_VER) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__LCC__) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__SYMBIAN32__) +# if defined(__EABI__) /* Treat all ARM compilers equally */ +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__CW32__) +# pragma longlong on +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__VC32__) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int + +#elif defined(__MWERKS__) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(_WIN32_WCE) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__MINGW32__) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_WS2TCPIP_H 1 + +#elif defined(__VMS) +# if defined(__VAX) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int + +#elif defined(__OS400__) +# if defined(__ILEC400__) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__MVS__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# elif defined(_LP64) +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__370__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# elif defined(_LP64) +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(TPF) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__TINYC__) /* also known as tcc */ + +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* Oracle Solaris Studio */ +# if !defined(__LP64) && (defined(__ILP32) || \ + defined(__i386) || \ + defined(__sparcv8) || \ + defined(__sparcv8plus)) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__LP64) || \ + defined(__amd64) || defined(__sparcv9) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#elif defined(__xlc__) /* IBM xlc compiler */ +# if !defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +/* ===================================== */ +/* KEEP MSVC THE PENULTIMATE ENTRY */ +/* ===================================== */ + +#elif defined(_MSC_VER) +# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +/* ===================================== */ +/* KEEP GENERIC GCC THE LAST ENTRY */ +/* ===================================== */ + +#elif defined(__GNUC__) && !defined(_SCO_DS) +# if !defined(__LP64__) && \ + (defined(__ILP32__) || defined(__i386__) || defined(__hppa__) || \ + defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \ + defined(__sparc__) || defined(__mips__) || defined(__sh__) || \ + defined(__XTENSA__) || \ + (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4) || \ + (defined(__LONG_MAX__) && __LONG_MAX__ == 2147483647L)) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__LP64__) || \ + defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \ + (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \ + (defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#else +/* generic "safe guess" on old 32 bit style */ +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +#endif + +#ifdef _AIX +/* AIX needs */ +#define CURL_PULL_SYS_POLL_H +#endif + + +/* CURL_PULL_WS2TCPIP_H is defined above when inclusion of header file */ +/* ws2tcpip.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_WS2TCPIP_H +# include +# include +# include +#endif + +/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ +/* sys/types.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ +/* sys/socket.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file */ +/* sys/poll.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_POLL_H +# include +#endif + +/* Data type definition of curl_socklen_t. */ +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T + typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; +#endif + +/* Data type definition of curl_off_t. */ + +#ifdef CURL_TYPEOF_CURL_OFF_T + typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; +#endif + +/* + * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow + * these to be visible and exported by the external libcurl interface API, + * while also making them visible to the library internals, simply including + * curl_setup.h, without actually needing to include curl.h internally. + * If some day this section would grow big enough, all this should be moved + * to its own header file. + */ + +/* + * Figure out if we can use the ## preprocessor operator, which is supported + * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ + * or __cplusplus so we need to carefully check for them too. + */ + +#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ + defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ + defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ + defined(__ILEC400__) + /* This compiler is believed to have an ISO compatible preprocessor */ +#define CURL_ISOCPP +#else + /* This compiler is believed NOT to have an ISO compatible preprocessor */ +#undef CURL_ISOCPP +#endif + +/* + * Macros for minimum-width signed and unsigned curl_off_t integer constants. + */ + +#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551) +# define __CURL_OFF_T_C_HLPR2(x) x +# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x) +# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ + __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ + __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU) +#else +# ifdef CURL_ISOCPP +# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix +# else +# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix +# endif +# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix) +# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU) +#endif + +#endif /* __CURL_SYSTEM_H */ diff --git a/bin/curl/include/curl/typecheck-gcc.h b/bin/curl/include/curl/typecheck-gcc.h new file mode 100644 index 00000000..2d1de4d4 --- /dev/null +++ b/bin/curl/include/curl/typecheck-gcc.h @@ -0,0 +1,694 @@ +#ifndef __CURL_TYPECHECK_GCC_H +#define __CURL_TYPECHECK_GCC_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* wraps curl_easy_setopt() with typechecking */ + +/* To add a new kind of warning, add an + * if(_curl_is_sometype_option(_curl_opt)) + * if(!_curl_is_sometype(value)) + * _curl_easy_setopt_err_sometype(); + * block and define _curl_is_sometype_option, _curl_is_sometype and + * _curl_easy_setopt_err_sometype below + * + * NOTE: We use two nested 'if' statements here instead of the && operator, in + * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x + * when compiling with -Wlogical-op. + * + * To add an option that uses the same type as an existing option, you'll just + * need to extend the appropriate _curl_*_option macro + */ +#define curl_easy_setopt(handle, option, value) \ +__extension__ ({ \ + __typeof__(option) _curl_opt = option; \ + if(__builtin_constant_p(_curl_opt)) { \ + if(_curl_is_long_option(_curl_opt)) \ + if(!_curl_is_long(value)) \ + _curl_easy_setopt_err_long(); \ + if(_curl_is_off_t_option(_curl_opt)) \ + if(!_curl_is_off_t(value)) \ + _curl_easy_setopt_err_curl_off_t(); \ + if(_curl_is_string_option(_curl_opt)) \ + if(!_curl_is_string(value)) \ + _curl_easy_setopt_err_string(); \ + if(_curl_is_write_cb_option(_curl_opt)) \ + if(!_curl_is_write_cb(value)) \ + _curl_easy_setopt_err_write_callback(); \ + if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION) \ + if(!_curl_is_resolver_start_callback(value)) \ + _curl_easy_setopt_err_resolver_start_callback(); \ + if((_curl_opt) == CURLOPT_READFUNCTION) \ + if(!_curl_is_read_cb(value)) \ + _curl_easy_setopt_err_read_cb(); \ + if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \ + if(!_curl_is_ioctl_cb(value)) \ + _curl_easy_setopt_err_ioctl_cb(); \ + if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \ + if(!_curl_is_sockopt_cb(value)) \ + _curl_easy_setopt_err_sockopt_cb(); \ + if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \ + if(!_curl_is_opensocket_cb(value)) \ + _curl_easy_setopt_err_opensocket_cb(); \ + if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \ + if(!_curl_is_progress_cb(value)) \ + _curl_easy_setopt_err_progress_cb(); \ + if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \ + if(!_curl_is_debug_cb(value)) \ + _curl_easy_setopt_err_debug_cb(); \ + if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \ + if(!_curl_is_ssl_ctx_cb(value)) \ + _curl_easy_setopt_err_ssl_ctx_cb(); \ + if(_curl_is_conv_cb_option(_curl_opt)) \ + if(!_curl_is_conv_cb(value)) \ + _curl_easy_setopt_err_conv_cb(); \ + if((_curl_opt) == CURLOPT_SEEKFUNCTION) \ + if(!_curl_is_seek_cb(value)) \ + _curl_easy_setopt_err_seek_cb(); \ + if(_curl_is_cb_data_option(_curl_opt)) \ + if(!_curl_is_cb_data(value)) \ + _curl_easy_setopt_err_cb_data(); \ + if((_curl_opt) == CURLOPT_ERRORBUFFER) \ + if(!_curl_is_error_buffer(value)) \ + _curl_easy_setopt_err_error_buffer(); \ + if((_curl_opt) == CURLOPT_STDERR) \ + if(!_curl_is_FILE(value)) \ + _curl_easy_setopt_err_FILE(); \ + if(_curl_is_postfields_option(_curl_opt)) \ + if(!_curl_is_postfields(value)) \ + _curl_easy_setopt_err_postfields(); \ + if((_curl_opt) == CURLOPT_HTTPPOST) \ + if(!_curl_is_arr((value), struct curl_httppost)) \ + _curl_easy_setopt_err_curl_httpost(); \ + if((_curl_opt) == CURLOPT_MIMEPOST) \ + if(!_curl_is_ptr((value), curl_mime)) \ + _curl_easy_setopt_err_curl_mimepost(); \ + if(_curl_is_slist_option(_curl_opt)) \ + if(!_curl_is_arr((value), struct curl_slist)) \ + _curl_easy_setopt_err_curl_slist(); \ + if((_curl_opt) == CURLOPT_SHARE) \ + if(!_curl_is_ptr((value), CURLSH)) \ + _curl_easy_setopt_err_CURLSH(); \ + } \ + curl_easy_setopt(handle, _curl_opt, value); \ +}) + +/* wraps curl_easy_getinfo() with typechecking */ +#define curl_easy_getinfo(handle, info, arg) \ +__extension__ ({ \ + __typeof__(info) _curl_info = info; \ + if(__builtin_constant_p(_curl_info)) { \ + if(_curl_is_string_info(_curl_info)) \ + if(!_curl_is_arr((arg), char *)) \ + _curl_easy_getinfo_err_string(); \ + if(_curl_is_long_info(_curl_info)) \ + if(!_curl_is_arr((arg), long)) \ + _curl_easy_getinfo_err_long(); \ + if(_curl_is_double_info(_curl_info)) \ + if(!_curl_is_arr((arg), double)) \ + _curl_easy_getinfo_err_double(); \ + if(_curl_is_slist_info(_curl_info)) \ + if(!_curl_is_arr((arg), struct curl_slist *)) \ + _curl_easy_getinfo_err_curl_slist(); \ + if(_curl_is_tlssessioninfo_info(_curl_info)) \ + if(!_curl_is_arr((arg), struct curl_tlssessioninfo *)) \ + _curl_easy_getinfo_err_curl_tlssesssioninfo(); \ + if(_curl_is_certinfo_info(_curl_info)) \ + if(!_curl_is_arr((arg), struct curl_certinfo *)) \ + _curl_easy_getinfo_err_curl_certinfo(); \ + if(_curl_is_socket_info(_curl_info)) \ + if(!_curl_is_arr((arg), curl_socket_t)) \ + _curl_easy_getinfo_err_curl_socket(); \ + if(_curl_is_off_t_info(_curl_info)) \ + if(!_curl_is_arr((arg), curl_off_t)) \ + _curl_easy_getinfo_err_curl_off_t(); \ + } \ + curl_easy_getinfo(handle, _curl_info, arg); \ +}) + +/* + * For now, just make sure that the functions are called with three arguments + */ +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) + + +/* the actual warnings, triggered by calling the _curl_easy_setopt_err* + * functions */ + +/* To define a new warning, use _CURL_WARNING(identifier, "message") */ +#define _CURL_WARNING(id, message) \ + static void __attribute__((__warning__(message))) \ + __attribute__((__unused__)) __attribute__((__noinline__)) \ + id(void) { __asm__(""); } + +_CURL_WARNING(_curl_easy_setopt_err_long, + "curl_easy_setopt expects a long argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_off_t, + "curl_easy_setopt expects a curl_off_t argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_string, + "curl_easy_setopt expects a " + "string ('char *' or char[]) argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_write_callback, + "curl_easy_setopt expects a curl_write_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_resolver_start_callback, + "curl_easy_setopt expects a " + "curl_resolver_start_callback argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_read_cb, + "curl_easy_setopt expects a curl_read_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb, + "curl_easy_setopt expects a curl_ioctl_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb, + "curl_easy_setopt expects a curl_sockopt_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb, + "curl_easy_setopt expects a " + "curl_opensocket_callback argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_progress_cb, + "curl_easy_setopt expects a curl_progress_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_debug_cb, + "curl_easy_setopt expects a curl_debug_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb, + "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_conv_cb, + "curl_easy_setopt expects a curl_conv_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_seek_cb, + "curl_easy_setopt expects a curl_seek_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_cb_data, + "curl_easy_setopt expects a " + "private data pointer as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_error_buffer, + "curl_easy_setopt expects a " + "char buffer of CURL_ERROR_SIZE as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_FILE, + "curl_easy_setopt expects a 'FILE *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_postfields, + "curl_easy_setopt expects a 'void *' or 'char *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_httpost, + "curl_easy_setopt expects a 'struct curl_httppost *' " + "argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_mimepost, + "curl_easy_setopt expects a 'curl_mime *' " + "argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_slist, + "curl_easy_setopt expects a 'struct curl_slist *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_CURLSH, + "curl_easy_setopt expects a CURLSH* argument for this option") + +_CURL_WARNING(_curl_easy_getinfo_err_string, + "curl_easy_getinfo expects a pointer to 'char *' for this info") +_CURL_WARNING(_curl_easy_getinfo_err_long, + "curl_easy_getinfo expects a pointer to long for this info") +_CURL_WARNING(_curl_easy_getinfo_err_double, + "curl_easy_getinfo expects a pointer to double for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_slist, + "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo, + "curl_easy_getinfo expects a pointer to " + "'struct curl_tlssessioninfo *' for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_certinfo, + "curl_easy_getinfo expects a pointer to " + "'struct curl_certinfo *' for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_socket, + "curl_easy_getinfo expects a pointer to curl_socket_t for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_off_t, + "curl_easy_getinfo expects a pointer to curl_off_t for this info") + +/* groups of curl_easy_setops options that take the same type of argument */ + +/* To add a new option to one of the groups, just add + * (option) == CURLOPT_SOMETHING + * to the or-expression. If the option takes a long or curl_off_t, you don't + * have to do anything + */ + +/* evaluates to true if option takes a long argument */ +#define _curl_is_long_option(option) \ + (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) + +#define _curl_is_off_t_option(option) \ + ((option) > CURLOPTTYPE_OFF_T) + +/* evaluates to true if option takes a char* argument */ +#define _curl_is_string_option(option) \ + ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \ + (option) == CURLOPT_ACCEPT_ENCODING || \ + (option) == CURLOPT_ALTSVC || \ + (option) == CURLOPT_CAINFO || \ + (option) == CURLOPT_CAPATH || \ + (option) == CURLOPT_COOKIE || \ + (option) == CURLOPT_COOKIEFILE || \ + (option) == CURLOPT_COOKIEJAR || \ + (option) == CURLOPT_COOKIELIST || \ + (option) == CURLOPT_CRLFILE || \ + (option) == CURLOPT_CUSTOMREQUEST || \ + (option) == CURLOPT_DEFAULT_PROTOCOL || \ + (option) == CURLOPT_DNS_INTERFACE || \ + (option) == CURLOPT_DNS_LOCAL_IP4 || \ + (option) == CURLOPT_DNS_LOCAL_IP6 || \ + (option) == CURLOPT_DNS_SERVERS || \ + (option) == CURLOPT_DOH_URL || \ + (option) == CURLOPT_EGDSOCKET || \ + (option) == CURLOPT_FTPPORT || \ + (option) == CURLOPT_FTP_ACCOUNT || \ + (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ + (option) == CURLOPT_INTERFACE || \ + (option) == CURLOPT_ISSUERCERT || \ + (option) == CURLOPT_KEYPASSWD || \ + (option) == CURLOPT_KRBLEVEL || \ + (option) == CURLOPT_LOGIN_OPTIONS || \ + (option) == CURLOPT_MAIL_AUTH || \ + (option) == CURLOPT_MAIL_FROM || \ + (option) == CURLOPT_NETRC_FILE || \ + (option) == CURLOPT_NOPROXY || \ + (option) == CURLOPT_PASSWORD || \ + (option) == CURLOPT_PINNEDPUBLICKEY || \ + (option) == CURLOPT_PRE_PROXY || \ + (option) == CURLOPT_PROXY || \ + (option) == CURLOPT_PROXYPASSWORD || \ + (option) == CURLOPT_PROXYUSERNAME || \ + (option) == CURLOPT_PROXYUSERPWD || \ + (option) == CURLOPT_PROXY_CAINFO || \ + (option) == CURLOPT_PROXY_CAPATH || \ + (option) == CURLOPT_PROXY_CRLFILE || \ + (option) == CURLOPT_PROXY_KEYPASSWD || \ + (option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \ + (option) == CURLOPT_PROXY_SERVICE_NAME || \ + (option) == CURLOPT_PROXY_SSLCERT || \ + (option) == CURLOPT_PROXY_SSLCERTTYPE || \ + (option) == CURLOPT_PROXY_SSLKEY || \ + (option) == CURLOPT_PROXY_SSLKEYTYPE || \ + (option) == CURLOPT_PROXY_SSL_CIPHER_LIST || \ + (option) == CURLOPT_PROXY_TLSAUTH_PASSWORD || \ + (option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \ + (option) == CURLOPT_PROXY_TLSAUTH_TYPE || \ + (option) == CURLOPT_RANDOM_FILE || \ + (option) == CURLOPT_RANGE || \ + (option) == CURLOPT_REFERER || \ + (option) == CURLOPT_RTSP_SESSION_ID || \ + (option) == CURLOPT_RTSP_STREAM_URI || \ + (option) == CURLOPT_RTSP_TRANSPORT || \ + (option) == CURLOPT_SERVICE_NAME || \ + (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ + (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ + (option) == CURLOPT_SSH_KNOWNHOSTS || \ + (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ + (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ + (option) == CURLOPT_SSLCERT || \ + (option) == CURLOPT_SSLCERTTYPE || \ + (option) == CURLOPT_SSLENGINE || \ + (option) == CURLOPT_SSLKEY || \ + (option) == CURLOPT_SSLKEYTYPE || \ + (option) == CURLOPT_SSL_CIPHER_LIST || \ + (option) == CURLOPT_TLSAUTH_PASSWORD || \ + (option) == CURLOPT_TLSAUTH_TYPE || \ + (option) == CURLOPT_TLSAUTH_USERNAME || \ + (option) == CURLOPT_UNIX_SOCKET_PATH || \ + (option) == CURLOPT_URL || \ + (option) == CURLOPT_USERAGENT || \ + (option) == CURLOPT_USERNAME || \ + (option) == CURLOPT_USERPWD || \ + (option) == CURLOPT_XOAUTH2_BEARER || \ + 0) + +/* evaluates to true if option takes a curl_write_callback argument */ +#define _curl_is_write_cb_option(option) \ + ((option) == CURLOPT_HEADERFUNCTION || \ + (option) == CURLOPT_WRITEFUNCTION) + +/* evaluates to true if option takes a curl_conv_callback argument */ +#define _curl_is_conv_cb_option(option) \ + ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) + +/* evaluates to true if option takes a data argument to pass to a callback */ +#define _curl_is_cb_data_option(option) \ + ((option) == CURLOPT_CHUNK_DATA || \ + (option) == CURLOPT_CLOSESOCKETDATA || \ + (option) == CURLOPT_DEBUGDATA || \ + (option) == CURLOPT_FNMATCH_DATA || \ + (option) == CURLOPT_HEADERDATA || \ + (option) == CURLOPT_INTERLEAVEDATA || \ + (option) == CURLOPT_IOCTLDATA || \ + (option) == CURLOPT_OPENSOCKETDATA || \ + (option) == CURLOPT_PRIVATE || \ + (option) == CURLOPT_PROGRESSDATA || \ + (option) == CURLOPT_READDATA || \ + (option) == CURLOPT_SEEKDATA || \ + (option) == CURLOPT_SOCKOPTDATA || \ + (option) == CURLOPT_SSH_KEYDATA || \ + (option) == CURLOPT_SSL_CTX_DATA || \ + (option) == CURLOPT_WRITEDATA || \ + (option) == CURLOPT_RESOLVER_START_DATA || \ + (option) == CURLOPT_CURLU || \ + 0) + +/* evaluates to true if option takes a POST data argument (void* or char*) */ +#define _curl_is_postfields_option(option) \ + ((option) == CURLOPT_POSTFIELDS || \ + (option) == CURLOPT_COPYPOSTFIELDS || \ + 0) + +/* evaluates to true if option takes a struct curl_slist * argument */ +#define _curl_is_slist_option(option) \ + ((option) == CURLOPT_HTTP200ALIASES || \ + (option) == CURLOPT_HTTPHEADER || \ + (option) == CURLOPT_MAIL_RCPT || \ + (option) == CURLOPT_POSTQUOTE || \ + (option) == CURLOPT_PREQUOTE || \ + (option) == CURLOPT_PROXYHEADER || \ + (option) == CURLOPT_QUOTE || \ + (option) == CURLOPT_RESOLVE || \ + (option) == CURLOPT_TELNETOPTIONS || \ + 0) + +/* groups of curl_easy_getinfo infos that take the same type of argument */ + +/* evaluates to true if info expects a pointer to char * argument */ +#define _curl_is_string_info(info) \ + (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG) + +/* evaluates to true if info expects a pointer to long argument */ +#define _curl_is_long_info(info) \ + (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) + +/* evaluates to true if info expects a pointer to double argument */ +#define _curl_is_double_info(info) \ + (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) + +/* true if info expects a pointer to struct curl_slist * argument */ +#define _curl_is_slist_info(info) \ + (((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST)) + +/* true if info expects a pointer to struct curl_tlssessioninfo * argument */ +#define _curl_is_tlssessioninfo_info(info) \ + (((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION)) + +/* true if info expects a pointer to struct curl_certinfo * argument */ +#define _curl_is_certinfo_info(info) ((info) == CURLINFO_CERTINFO) + +/* true if info expects a pointer to struct curl_socket_t argument */ +#define _curl_is_socket_info(info) \ + (CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T) + +/* true if info expects a pointer to curl_off_t argument */ +#define _curl_is_off_t_info(info) \ + (CURLINFO_OFF_T < (info)) + + +/* typecheck helpers -- check whether given expression has requested type*/ + +/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros, + * otherwise define a new macro. Search for __builtin_types_compatible_p + * in the GCC manual. + * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is + * the actual expression passed to the curl_easy_setopt macro. This + * means that you can only apply the sizeof and __typeof__ operators, no + * == or whatsoever. + */ + +/* XXX: should evaluate to true if expr is a pointer */ +#define _curl_is_any_ptr(expr) \ + (sizeof(expr) == sizeof(void *)) + +/* evaluates to true if expr is NULL */ +/* XXX: must not evaluate expr, so this check is not accurate */ +#define _curl_is_NULL(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) + +/* evaluates to true if expr is type*, const type* or NULL */ +#define _curl_is_ptr(expr, type) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), type *) || \ + __builtin_types_compatible_p(__typeof__(expr), const type *)) + +/* evaluates to true if expr is one of type[], type*, NULL or const type* */ +#define _curl_is_arr(expr, type) \ + (_curl_is_ptr((expr), type) || \ + __builtin_types_compatible_p(__typeof__(expr), type [])) + +/* evaluates to true if expr is a string */ +#define _curl_is_string(expr) \ + (_curl_is_arr((expr), char) || \ + _curl_is_arr((expr), signed char) || \ + _curl_is_arr((expr), unsigned char)) + +/* evaluates to true if expr is a long (no matter the signedness) + * XXX: for now, int is also accepted (and therefore short and char, which + * are promoted to int when passed to a variadic function) */ +#define _curl_is_long(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), long) || \ + __builtin_types_compatible_p(__typeof__(expr), signed long) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ + __builtin_types_compatible_p(__typeof__(expr), int) || \ + __builtin_types_compatible_p(__typeof__(expr), signed int) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ + __builtin_types_compatible_p(__typeof__(expr), short) || \ + __builtin_types_compatible_p(__typeof__(expr), signed short) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ + __builtin_types_compatible_p(__typeof__(expr), char) || \ + __builtin_types_compatible_p(__typeof__(expr), signed char) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned char)) + +/* evaluates to true if expr is of type curl_off_t */ +#define _curl_is_off_t(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) + +/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ +/* XXX: also check size of an char[] array? */ +#define _curl_is_error_buffer(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), char *) || \ + __builtin_types_compatible_p(__typeof__(expr), char[])) + +/* evaluates to true if expr is of type (const) void* or (const) FILE* */ +#if 0 +#define _curl_is_cb_data(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_ptr((expr), FILE)) +#else /* be less strict */ +#define _curl_is_cb_data(expr) \ + _curl_is_any_ptr(expr) +#endif + +/* evaluates to true if expr is of type FILE* */ +#define _curl_is_FILE(expr) \ + (_curl_is_NULL(expr) || \ + (__builtin_types_compatible_p(__typeof__(expr), FILE *))) + +/* evaluates to true if expr can be passed as POST data (void* or char*) */ +#define _curl_is_postfields(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_arr((expr), char) || \ + _curl_is_arr((expr), unsigned char)) + +/* helper: __builtin_types_compatible_p distinguishes between functions and + * function pointers, hide it */ +#define _curl_callback_compatible(func, type) \ + (__builtin_types_compatible_p(__typeof__(func), type) || \ + __builtin_types_compatible_p(__typeof__(func) *, type)) + +/* evaluates to true if expr is of type curl_resolver_start_callback */ +#define _curl_is_resolver_start_callback(expr) \ + (_curl_is_NULL(expr) || \ + _curl_callback_compatible((expr), curl_resolver_start_callback)) + +/* evaluates to true if expr is of type curl_read_callback or "similar" */ +#define _curl_is_read_cb(expr) \ + (_curl_is_NULL(expr) || \ + _curl_callback_compatible((expr), __typeof__(fread) *) || \ + _curl_callback_compatible((expr), curl_read_callback) || \ + _curl_callback_compatible((expr), _curl_read_callback1) || \ + _curl_callback_compatible((expr), _curl_read_callback2) || \ + _curl_callback_compatible((expr), _curl_read_callback3) || \ + _curl_callback_compatible((expr), _curl_read_callback4) || \ + _curl_callback_compatible((expr), _curl_read_callback5) || \ + _curl_callback_compatible((expr), _curl_read_callback6)) +typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *); +typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *); +typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *); +typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *); +typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *); +typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_write_callback or "similar" */ +#define _curl_is_write_cb(expr) \ + (_curl_is_read_cb(expr) || \ + _curl_callback_compatible((expr), __typeof__(fwrite) *) || \ + _curl_callback_compatible((expr), curl_write_callback) || \ + _curl_callback_compatible((expr), _curl_write_callback1) || \ + _curl_callback_compatible((expr), _curl_write_callback2) || \ + _curl_callback_compatible((expr), _curl_write_callback3) || \ + _curl_callback_compatible((expr), _curl_write_callback4) || \ + _curl_callback_compatible((expr), _curl_write_callback5) || \ + _curl_callback_compatible((expr), _curl_write_callback6)) +typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *); +typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t, + const void *); +typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *); +typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *); +typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t, + const void *); +typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ +#define _curl_is_ioctl_cb(expr) \ + (_curl_is_NULL(expr) || \ + _curl_callback_compatible((expr), curl_ioctl_callback) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback1) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback2) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback3) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback4)) +typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *); +typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *); +typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *); +typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *); + +/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ +#define _curl_is_sockopt_cb(expr) \ + (_curl_is_NULL(expr) || \ + _curl_callback_compatible((expr), curl_sockopt_callback) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback1) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback2)) +typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); +typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t, + curlsocktype); + +/* evaluates to true if expr is of type curl_opensocket_callback or + "similar" */ +#define _curl_is_opensocket_cb(expr) \ + (_curl_is_NULL(expr) || \ + _curl_callback_compatible((expr), curl_opensocket_callback) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback1) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback2) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback3) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback4)) +typedef curl_socket_t (*_curl_opensocket_callback1) + (void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (*_curl_opensocket_callback2) + (void *, curlsocktype, const struct curl_sockaddr *); +typedef curl_socket_t (*_curl_opensocket_callback3) + (const void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (*_curl_opensocket_callback4) + (const void *, curlsocktype, const struct curl_sockaddr *); + +/* evaluates to true if expr is of type curl_progress_callback or "similar" */ +#define _curl_is_progress_cb(expr) \ + (_curl_is_NULL(expr) || \ + _curl_callback_compatible((expr), curl_progress_callback) || \ + _curl_callback_compatible((expr), _curl_progress_callback1) || \ + _curl_callback_compatible((expr), _curl_progress_callback2)) +typedef int (*_curl_progress_callback1)(void *, + double, double, double, double); +typedef int (*_curl_progress_callback2)(const void *, + double, double, double, double); + +/* evaluates to true if expr is of type curl_debug_callback or "similar" */ +#define _curl_is_debug_cb(expr) \ + (_curl_is_NULL(expr) || \ + _curl_callback_compatible((expr), curl_debug_callback) || \ + _curl_callback_compatible((expr), _curl_debug_callback1) || \ + _curl_callback_compatible((expr), _curl_debug_callback2) || \ + _curl_callback_compatible((expr), _curl_debug_callback3) || \ + _curl_callback_compatible((expr), _curl_debug_callback4) || \ + _curl_callback_compatible((expr), _curl_debug_callback5) || \ + _curl_callback_compatible((expr), _curl_debug_callback6) || \ + _curl_callback_compatible((expr), _curl_debug_callback7) || \ + _curl_callback_compatible((expr), _curl_debug_callback8)) +typedef int (*_curl_debug_callback1) (CURL *, + curl_infotype, char *, size_t, void *); +typedef int (*_curl_debug_callback2) (CURL *, + curl_infotype, char *, size_t, const void *); +typedef int (*_curl_debug_callback3) (CURL *, + curl_infotype, const char *, size_t, void *); +typedef int (*_curl_debug_callback4) (CURL *, + curl_infotype, const char *, size_t, const void *); +typedef int (*_curl_debug_callback5) (CURL *, + curl_infotype, unsigned char *, size_t, void *); +typedef int (*_curl_debug_callback6) (CURL *, + curl_infotype, unsigned char *, size_t, const void *); +typedef int (*_curl_debug_callback7) (CURL *, + curl_infotype, const unsigned char *, size_t, void *); +typedef int (*_curl_debug_callback8) (CURL *, + curl_infotype, const unsigned char *, size_t, const void *); + +/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ +/* this is getting even messier... */ +#define _curl_is_ssl_ctx_cb(expr) \ + (_curl_is_NULL(expr) || \ + _curl_callback_compatible((expr), curl_ssl_ctx_callback) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback8)) +typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *); +typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *); +typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *); +typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *, + const void *); +#ifdef HEADER_SSL_H +/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX + * this will of course break if we're included before OpenSSL headers... + */ +typedef CURLcode (*_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *); +typedef CURLcode (*_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *); +typedef CURLcode (*_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *); +typedef CURLcode (*_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX, + const void *); +#else +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; +#endif + +/* evaluates to true if expr is of type curl_conv_callback or "similar" */ +#define _curl_is_conv_cb(expr) \ + (_curl_is_NULL(expr) || \ + _curl_callback_compatible((expr), curl_conv_callback) || \ + _curl_callback_compatible((expr), _curl_conv_callback1) || \ + _curl_callback_compatible((expr), _curl_conv_callback2) || \ + _curl_callback_compatible((expr), _curl_conv_callback3) || \ + _curl_callback_compatible((expr), _curl_conv_callback4)) +typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); +typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); +typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); +typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); + +/* evaluates to true if expr is of type curl_seek_callback or "similar" */ +#define _curl_is_seek_cb(expr) \ + (_curl_is_NULL(expr) || \ + _curl_callback_compatible((expr), curl_seek_callback) || \ + _curl_callback_compatible((expr), _curl_seek_callback1) || \ + _curl_callback_compatible((expr), _curl_seek_callback2)) +typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); +typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); + + +#endif /* __CURL_TYPECHECK_GCC_H */ diff --git a/bin/curl/include/curl/urlapi.h b/bin/curl/include/curl/urlapi.h new file mode 100644 index 00000000..58e89d85 --- /dev/null +++ b/bin/curl/include/curl/urlapi.h @@ -0,0 +1,123 @@ +#ifndef __CURL_URLAPI_H +#define __CURL_URLAPI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 2018 - 2019, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* the error codes for the URL API */ +typedef enum { + CURLUE_OK, + CURLUE_BAD_HANDLE, /* 1 */ + CURLUE_BAD_PARTPOINTER, /* 2 */ + CURLUE_MALFORMED_INPUT, /* 3 */ + CURLUE_BAD_PORT_NUMBER, /* 4 */ + CURLUE_UNSUPPORTED_SCHEME, /* 5 */ + CURLUE_URLDECODE, /* 6 */ + CURLUE_OUT_OF_MEMORY, /* 7 */ + CURLUE_USER_NOT_ALLOWED, /* 8 */ + CURLUE_UNKNOWN_PART, /* 9 */ + CURLUE_NO_SCHEME, /* 10 */ + CURLUE_NO_USER, /* 11 */ + CURLUE_NO_PASSWORD, /* 12 */ + CURLUE_NO_OPTIONS, /* 13 */ + CURLUE_NO_HOST, /* 14 */ + CURLUE_NO_PORT, /* 15 */ + CURLUE_NO_QUERY, /* 16 */ + CURLUE_NO_FRAGMENT /* 17 */ +} CURLUcode; + +typedef enum { + CURLUPART_URL, + CURLUPART_SCHEME, + CURLUPART_USER, + CURLUPART_PASSWORD, + CURLUPART_OPTIONS, + CURLUPART_HOST, + CURLUPART_PORT, + CURLUPART_PATH, + CURLUPART_QUERY, + CURLUPART_FRAGMENT, + CURLUPART_ZONEID /* added in 7.65.0 */ +} CURLUPart; + +#define CURLU_DEFAULT_PORT (1<<0) /* return default port number */ +#define CURLU_NO_DEFAULT_PORT (1<<1) /* act as if no port number was set, + if the port number matches the + default for the scheme */ +#define CURLU_DEFAULT_SCHEME (1<<2) /* return default scheme if + missing */ +#define CURLU_NON_SUPPORT_SCHEME (1<<3) /* allow non-supported scheme */ +#define CURLU_PATH_AS_IS (1<<4) /* leave dot sequences */ +#define CURLU_DISALLOW_USER (1<<5) /* no user+password allowed */ +#define CURLU_URLDECODE (1<<6) /* URL decode on get */ +#define CURLU_URLENCODE (1<<7) /* URL encode on set */ +#define CURLU_APPENDQUERY (1<<8) /* append a form style part */ +#define CURLU_GUESS_SCHEME (1<<9) /* legacy curl-style guessing */ + +typedef struct Curl_URL CURLU; + +/* + * curl_url() creates a new CURLU handle and returns a pointer to it. + * Must be freed with curl_url_cleanup(). + */ +CURL_EXTERN CURLU *curl_url(void); + +/* + * curl_url_cleanup() frees the CURLU handle and related resources used for + * the URL parsing. It will not free strings previously returned with the URL + * API. + */ +CURL_EXTERN void curl_url_cleanup(CURLU *handle); + +/* + * curl_url_dup() duplicates a CURLU handle and returns a new copy. The new + * handle must also be freed with curl_url_cleanup(). + */ +CURL_EXTERN CURLU *curl_url_dup(CURLU *in); + +/* + * curl_url_get() extracts a specific part of the URL from a CURLU + * handle. Returns error code. The returned pointer MUST be freed with + * curl_free() afterwards. + */ +CURL_EXTERN CURLUcode curl_url_get(CURLU *handle, CURLUPart what, + char **part, unsigned int flags); + +/* + * curl_url_set() sets a specific part of the URL in a CURLU handle. Returns + * error code. The passed in string will be copied. Passing a NULL instead of + * a part string, clears that part. + */ +CURL_EXTERN CURLUcode curl_url_set(CURLU *handle, CURLUPart what, + const char *part, unsigned int flags); + + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif diff --git a/bin/curl/lib/libcurl.a b/bin/curl/lib/libcurl.a new file mode 100644 index 0000000000000000000000000000000000000000..09eb64769b11f2c5f8be14de9fdfb89055700ad9 GIT binary patch literal 806000 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 %Maf8ueY#MnXRn#b( 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 z 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

    B6w?~z-z`>VeL4<8O4(jNNi(Aw(PtFg!R$(# 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 |xs8;(LllTcHT5hx5a4OLb; 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 z%0A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

    `vu%HaL>c7hkFg~ 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 literal 0 HcmV?d00001 diff --git a/bin/regex2.dll b/bin/regex2.dll new file mode 100644 index 0000000000000000000000000000000000000000..f84a847a0de92fc59fa2ff8494ff700e62b87326 GIT binary patch literal 79360 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%0D_;! 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 literal 0 HcmV?d00001 diff --git a/blockstorage_dev_public.pem b/blockstorage_dev_public.pem new file mode 100644 index 00000000..67abbdef --- /dev/null +++ b/blockstorage_dev_public.pem @@ -0,0 +1,25 @@ +-----BEGIN PUBLIC KEY----- +MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEKfZmq5mMAtD4kSt2Gc/5J +H+HHTYtUZE6YYvsvz8TNG/bNL67ZtNRyaoMyhLTfIN4rPBNLUfD+owNS+u5Yk+lS +ZLYyOuhoCZIFefayYqKLr42G8EeuRbx0IMzXmJtN0a4rqxlWhkYufJubpdQ+V4DF +oeupcPdIATaadCKVeZC7A0G0uaSwoiAVMG5dZqjQW7F2LoQm3PhNkPvAybIJ6vBy +LqdBegS1JrDn43x/pvQHzLO+l+FIG23D1F7iF+yZm3DkzBdcmi/mOMYs/rXZpBym +2/kTuSGh5buuJCeyOwR8N3WdvXw6+KHMU/wWU8qTCTT87mYbzH4YR8HgkjkLHxAO +5waHK6vMu0TxugCdJmVV6BSbiarJsh66VRosn7+6hlq6AdgksxqCeNELZBS+LBki +tb5hKyL+jNZnaHiR0U7USWtmnqZG6FVVRzlCnxP7tZo5O5Ex9AAFGz5JzOzsFNbv +xwQ0zqaTQOze+MJbkda7JfRoC6TncD0+3hoXsiaF4mCn8PqUCn0DwhglcRucZlST +ZvDNDo1WAtxPJebb3aS6uymNhBIquQbVAWxVO4eTrOYEgutxwkHE3yO3is+ogp8d +xot7f/+vzlbsbIDyuZBDe0fFkbTIMTU48QuUUVZpRKmKZTHQloz4EHqminbfX1sh +M7wvDkpJEtqbc0VnG/BukUzP6e7Skvgc7eF1sI3+8jH8du2rivZeZAl7Q2f+L9JA +BY9pjaxttxsud7V5jeFi4tKuDHi21/XhSjlJK2c2C4AiUEK5/WhtGbQ5JjmcOjRq +yXFRqLlerzOcop2kbtU3Ar230wOx3Dj23Wg8++lV3LU4U9vMR/t0qnSbCSGJys7m +ax2JpFlTwj/0wYuTlVFoNQHZJ1cdfyRiRBY4Ou7XO0W5hcBBKiYsC+neEeMMHdCe +iTDIW/ojcVTdFovl+sq3n1u4SBknE90JC/3H+TPE1s2iB+fwORVg0KPosQSNDS0A +7iK6AZCDC3YooFo+OzHkYMt9uLkXiXMSLx70az+qlIwOzVHKxCo7W/QpeKCXUCRZ +MMdlYEUs1PC8x2qIRUEVHuJ0XMTKNyOHmzVLuLK93wUWbToh+rdDxnbhX+emuESn +XH6aKiUwX4olEVKSylRUQw8nVckZGVWXzLDlgpzDrLHC8J8qHzFt7eCqOdiqsxhZ +x1U5LtugxwSWncTZ7vlKl0DuC/AWB7SuDi7bGRMSVp2n+MnD1VLKlsCclHXjIciE +W29n3G3lJ/sOta2sxqLd0j1XBQddrFXl5b609sIY81ocHqu8P2hRu5CpqJ/sGZC5 +mMH3segHBkRj0xJcfOxceRLj1a+ULIIR3xL/3f8s5Id25TDo/nqBoCvu5PeCpo6L +9wIDAQAB +-----END PUBLIC KEY----- diff --git a/cmake/awscpp.cmake b/cmake/awscpp.cmake new file mode 100644 index 00000000..ac742f6b --- /dev/null +++ b/cmake/awscpp.cmake @@ -0,0 +1,98 @@ +if (REPERTORY_ENABLE_S3) + set(AWSCPP_PROJECT_NAME awscpp_${AWSCPP_VERSION}) + set(AWSCPP_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${AWSCPP_PROJECT_NAME}) + + if (LINUX) + if (IS_CLANG_COMPILER) + set(AWSCPP_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=unused-function -Wno-error=uninitialized") + set(AWSCPP_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=unused-function -Wno-error=uninitialized") + else () + set(AWSCPP_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=unused-function -Wno-error=maybe-uninitialized") + set(AWSCPP_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=unused-function -Wno-error=maybe-uninitialized") + endif () + elseif (MACOS) + set(AWSCPP_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") + else () + set(AWSCPP_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + endif () + + set(AWSCPP_CMAKE_ARGS + -DAWS_WARNINGS_ARE_ERRORS=OFF + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_GENERATOR=${CMAKE_GENERATOR} + -DCMAKE_CXX_FLAGS=${AWSCPP_CXX_FLAGS} + -DCMAKE_C_FLAGS=${AWSCPP_C_FLAGS} + -DCMAKE_BUILD_TYPE=${EXTERNAL_BUILD_TYPE} + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS} + -DCMAKE_INSTALL_PREFIX=${EXTERNAL_BUILD_ROOT} + -DBUILD_ONLY=s3 + -DBUILD_SHARED_LIBS=OFF + -DENABLE_TESTING=OFF + -DOPENSSL_USE_STATIC_LIBS=ON + -DCPP_STANDARD=${CMAKE_CXX_STANDARD} + -DCURL_LIBRARY=${CURL_LIBRARIES} + ) + + if (OPENSSL_ROOT_DIR) + set(AWSCPP_CMAKE_ARGS ${AWSCPP_CMAKE_ARGS} -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}) + elseif (LINUX) + set(AWSCPP_CMAKE_ARGS ${AWSCPP_CMAKE_ARGS} -DOPENSSL_ROOT_DIR=${EXTERNAL_BUILD_ROOT}) + endif () + + ExternalProject_Add(awscpp_project + DOWNLOAD_NO_PROGRESS 1 + GIT_REPOSITORY https://github.com/aws/aws-sdk-cpp.git + GIT_TAG ${AWSCPP_VERSION} + GIT_SUBMODULES_RECURSE ON + PREFIX ${AWSCPP_BUILD_ROOT} + CMAKE_ARGS ${AWSCPP_CMAKE_ARGS} + # BUILD_COMMAND echo 0 + # CONFIGURE_COMMAND echo 0 + # INSTALL_COMMAND echo 0 + ) + + if (MSVC OR LINUX) + add_dependencies(awscpp_project curl_project) + endif () + + if (MACOS OR LINUX) + add_dependencies(awscpp_project openssl_project) + endif () + + if (MSVC) + set(AWSCPP_LIBRARIES + ${EXTERNAL_BUILD_ROOT}/lib/aws-cpp-sdk-s3.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-cpp-sdk-core.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-crt-cpp.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-c-s3.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-c-auth.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-c-mqtt.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-c-http.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-c-event-stream.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-c-io.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-checksums.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-c-cal.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-c-compression.lib + ${EXTERNAL_BUILD_ROOT}/lib/aws-c-common.lib + ) + else () + set(AWSCPP_LIBRARIES + libaws-cpp-sdk-s3.a + libaws-cpp-sdk-core.a + libaws-crt-cpp.a + libaws-c-s3.a + libaws-c-auth.a + libaws-c-mqtt.a + libaws-c-http.a + libaws-c-event-stream.a + libaws-c-io.a + libs2n.a + libaws-checksums.a + libaws-c-cal.a + libaws-c-compression.a + libaws-c-common.a + ) + endif () +endif() diff --git a/cmake/boost.cmake b/cmake/boost.cmake new file mode 100644 index 00000000..4d620a1f --- /dev/null +++ b/cmake/boost.cmake @@ -0,0 +1,117 @@ +set(BOOST_ADDRESS_MODEL 64) +set(BOOST_DLL_ARCH x64) +set(BOOST_DOWNLOAD_URL https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_DL}.tar.gz) + +if (UNIX) + set(BOOST_PROJECT_NAME boost_${BOOST_VERSION}) + set(BOOST_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${BOOST_PROJECT_NAME}) + if (IS_CLANG_COMPILER) + set(BOOST_TOOLSET --with-toolset=clang) + else () + set(BOOST_OPENSSL_DIR "--openssldir=${EXTERNAL_BUILD_ROOT}") + endif() + if (IS_ARM64) + set (BOOST_ARCH arm) + else() + set (BOOST_ARCH x86) + endif() + set (BOOST_COMMON_ARGS + ${BOOST_OPENSSL_DIR} + --prefix=${EXTERNAL_BUILD_ROOT} + address-model=${BOOST_ADDRESS_MODEL} + architecture=${BOOST_ARCH} + cxxflags=-std=c++${CMAKE_CXX_STANDARD} + cxxstd=${CMAKE_CXX_STANDARD} + define=BOOST_ASIO_HAS_STD_STRING_VIEW + define=BOOST_SYSTEM_NO_DEPRECATED + link=static + linkflags=-std=c++${CMAKE_CXX_STANDARD} + threading=multi + ) + + ExternalProject_Add(boost_project + DOWNLOAD_NO_PROGRESS 1 + URL ${BOOST_DOWNLOAD_URL} + PREFIX ${BOOST_BUILD_ROOT} + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND + ./bootstrap.sh + ${BOOST_TOOLSET} + --with-libraries=atomic,chrono,date_time,filesystem,random,regex,serialization,system,thread + BUILD_COMMAND + ./b2 + ${BOOST_COMMON_ARGS} + INSTALL_COMMAND + ./b2 + install + ${BOOST_COMMON_ARGS} + ) + + add_dependencies(boost_project openssl_project) + + set(BOOST_ROOT ${BOOST_BUILD_ROOT}/src/boost_project) + + set(Boost_LIBRARIES + libboost_system.a + libboost_atomic.a + libboost_chrono.a + libboost_date_time.a + libboost_filesystem.a + libboost_random.a + libboost_regex.a + libboost_serialization.a + libboost_thread.a + ) +elseif(MSVC) + set(BOOST_PROJECT_NAME boost_${BOOST_VERSION}) + set(BOOST_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${BOOST_PROJECT_NAME}) + set (BOOST_COMMON_ARGS + --with-date_time + --with-regex + --with-serialization + --with-system + --with-filesystem + --prefix=${EXTERNAL_BUILD_ROOT} + runtime-link=shared + threading=multi + address-model=${BOOST_ADDRESS_MODEL} + architecture=x86 + toolset=${BOOST_MSVC_TOOLSET} + variant=${CMAKE_BUILD_TYPE_LOWER} + -sZLIB_BINARY=zlibstatic${DEBUG_EXTRA} + -sZLIB_LIBPATH="${EXTERNAL_BUILD_ROOT}/lib" + -sZLIB_INCLUDE="${EXTERNAL_BUILD_ROOT}/include" + ) + + ExternalProject_Add(boost_project + DOWNLOAD_NO_PROGRESS 1 + URL ${BOOST_DOWNLOAD_URL} + PREFIX ${BOOST_BUILD_ROOT} + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND + bootstrap.bat + --with-date_time + --with-regex + --with-system + --with-serialization + --with-filesystem + BUILD_COMMAND + b2.exe + ${BOOST_COMMON_ARGS} + INSTALL_COMMAND + b2.exe + install + ${BOOST_COMMON_ARGS} + ) + + add_dependencies(boost_project zlib_project) + set(BOOST_ROOT ${BOOST_BUILD_ROOT}/src/boost_project) + set(Boost_INCLUDE_DIR ${EXTERNAL_BUILD_ROOT}/include/boost-${BOOST_VERSION_DLL}) + set(Boost_LIBRARIES + ${EXTERNAL_BUILD_ROOT}/lib/libboost_date_time-vc${BOOST_MSVC_TOOLSET_DLL}-mt-${BOOST_DEBUG_EXTRA}${BOOST_DLL_ARCH}-${BOOST_VERSION_DLL}.lib + ${EXTERNAL_BUILD_ROOT}/lib/libboost_filesystem-vc${BOOST_MSVC_TOOLSET_DLL}-mt-${BOOST_DEBUG_EXTRA}${BOOST_DLL_ARCH}-${BOOST_VERSION_DLL}.lib + ${EXTERNAL_BUILD_ROOT}/lib/libboost_regex-vc${BOOST_MSVC_TOOLSET_DLL}-mt-${BOOST_DEBUG_EXTRA}${BOOST_DLL_ARCH}-${BOOST_VERSION_DLL}.lib + ${EXTERNAL_BUILD_ROOT}/lib/libboost_serialization-vc${BOOST_MSVC_TOOLSET_DLL}-mt-${BOOST_DEBUG_EXTRA}${BOOST_DLL_ARCH}-${BOOST_VERSION_DLL}.lib + ${EXTERNAL_BUILD_ROOT}/lib/libboost_system-vc${BOOST_MSVC_TOOLSET_DLL}-mt-${BOOST_DEBUG_EXTRA}${BOOST_DLL_ARCH}-${BOOST_VERSION_DLL}.lib + ) +endif() diff --git a/cmake/cryptopp.cmake b/cmake/cryptopp.cmake new file mode 100644 index 00000000..9cb1ce25 --- /dev/null +++ b/cmake/cryptopp.cmake @@ -0,0 +1,51 @@ +set(CRYPTOPP_PROJECT_NAME cryptopp_${CRYPTOPP_VERSION}) +set(CRYPTOPP_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${CRYPTOPP_PROJECT_NAME}) + +if(MSVC) + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(MTEXTRA Debug) + endif() + set (CRYPTOPP_PLATFORM x64) + ExternalProject_Add(cryptopp_project + DOWNLOAD_NO_PROGRESS 1 + BUILD_IN_SOURCE 1 + URL https://github.com/weidai11/cryptopp/archive/CRYPTOPP_${CRYPTOPP_VERSION}.tar.gz + PREFIX ${CRYPTOPP_BUILD_ROOT} + CONFIGURE_COMMAND + ${CMAKE_CURRENT_SOURCE_DIR}/bin/sed -e "s/MultiThreaded ${CRYPTOPP_BUILD_ROOT}/src/cryptopp_project/cryptlib2.vcxproj + BUILD_COMMAND + msbuild + cryptlib2.vcxproj + /p:Configuration=${CMAKE_BUILD_TYPE} + /p:Platform=${CRYPTOPP_PLATFORM} + /p:BuildProjectReferences=false + INSTALL_COMMAND cmd.exe /c echo "Skipping Install" + ) + + include_directories(SYSTEM ${CRYPTOPP_BUILD_ROOT}/src/cryptopp_project) + link_libraries(${CRYPTOPP_BUILD_ROOT}/src/cryptopp_project/${CRYPTOPP_PLATFORM}/Output/${CMAKE_BUILD_TYPE}/cryptlib.lib) +else() + set (CRYPTOPP_CXXFLAGS "${CMAKE_CXX_FLAGS} -DCRYPTOPP_DISABLE_ASM") + set(CRYPTOPP_MAKE_EXEC make) + if (MACOS) + set(CRYPTOPP_CXXFLAGS "${CRYPTOPP_CXXFLAGS} -fvisibility=hidden") + if (EXISTS /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/) + set(CRYPTOPP_CXXFLAGS "${CRYPTOPP_CXXFLAGS} -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk") + endif() + endif() + ExternalProject_Add(cryptopp_project + DOWNLOAD_NO_PROGRESS 1 + BUILD_IN_SOURCE 1 + URL https://github.com/weidai11/cryptopp/archive/CRYPTOPP_${CRYPTOPP_VERSION}.tar.gz + PREFIX ${CRYPTOPP_BUILD_ROOT} + CONFIGURE_COMMAND echo "Skipping Configure" + BUILD_COMMAND + ${CRYPTOPP_MAKE_EXEC} + CXXFLAGS=${CRYPTOPP_CXXFLAGS} + PREFIX=${EXTERNAL_BUILD_ROOT} + CC=${CMAKE_C_COMPILER} + CXX=${CMAKE_CXX_COMPILER} + INSTALL_COMMAND ${CRYPTOPP_MAKE_EXEC} install PREFIX=${EXTERNAL_BUILD_ROOT} + ) + link_libraries(${EXTERNAL_BUILD_ROOT}/lib/libcryptopp.a) +endif() diff --git a/cmake/curl.cmake b/cmake/curl.cmake new file mode 100644 index 00000000..16b8e554 --- /dev/null +++ b/cmake/curl.cmake @@ -0,0 +1,48 @@ +set(CURL_PROJECT_NAME curl_${CURL_VERSION}) +set(CURL_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${CURL_PROJECT_NAME}) + +if (OPENSSL_ROOT_DIR) + set(CURL_OPENSSL_EXTRA -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}) +elseif(LINUX) + set(CURL_OPENSSL_EXTRA -DOPENSSL_ROOT_DIR=${EXTERNAL_BUILD_ROOT}) +endif() + +set(CURL_CMAKE_ARGS + ${CURL_OPENSSL_EXTRA} + -DCMAKE_BUILD_TYPE=${EXTERNAL_BUILD_TYPE} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_GENERATOR=${CMAKE_GENERATOR} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS} + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DCMAKE_INSTALL_PREFIX=${EXTERNAL_BUILD_ROOT} + -DCMAKE_USE_WINSSL=OFF + -DCURL_CA_FALLBACK=ON + -DCURL_CA_BUNDLE=./cacert.pem + -DOPENSSL_USE_STATIC_LIBS=ON + -DCURL_USE_OPENSSL=ON + -DCURL_USE_LIBSSH2=OFF + -DENABLE_THREADED_RESOLVER=ON + -DBUILD_SHARED_LIBS=OFF + -DCURL_STATICLIB=ON + -DBUILD_TESTING=OFF + -DBUILD_CURL_EXE=OFF + -DCURL_DISABLE_LDAP=ON + -DCURL_ZLIB=OFF +) + +ExternalProject_Add(curl_project + DOWNLOAD_NO_PROGRESS 1 + URL https://github.com/curl/curl/archive/curl-${CURL_VERSION}.tar.gz + PREFIX ${CURL_BUILD_ROOT} + CMAKE_ARGS ${CURL_CMAKE_ARGS} +) + +add_definitions(-DCURL_STATICLIB=ON -DCURL_DISABLE_LDAP=ON) + +if (MSVC) + set(CURL_LIBRARIES ${EXTERNAL_BUILD_ROOT}/lib/libcurl${DEBUG_EXTRA2}.${STATIC_LIB_EXT}) +else() + set(CURL_LIBRARIES libcurl${DEBUG_EXTRA2}.${STATIC_LIB_EXT}) + add_dependencies(curl_project openssl_project) +endif() diff --git a/cmake/libhttpserver.cmake b/cmake/libhttpserver.cmake new file mode 100644 index 00000000..9f9cdd3a --- /dev/null +++ b/cmake/libhttpserver.cmake @@ -0,0 +1,59 @@ +set(LIBHTTPSERVER_PROJECT_NAME libhttpserver_${LIBHTTPSERVER_VERSION}) +set(LIBHTTPSERVER_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${LIBHTTPSERVER_PROJECT_NAME}) + +if (MSVC) + add_custom_target(libhttpserver_project DEPENDS libmicrohttpd_project) + + include_directories(SYSTEM + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/glue + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/libhttpserver-${LIBHTTPSERVER_VERSION}/src + ) + set(REPERTORY_HEADERS + ${REPERTORY_HEADERS} + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/glue/pthread.h + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/glue/strings.h + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/glue/unistd.h + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/glue/sys/time.h + ) + set(REPERTORY_SOURCES + ${REPERTORY_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/libhttpserver-${LIBHTTPSERVER_VERSION}/src/details/http_endpoint.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/libhttpserver-${LIBHTTPSERVER_VERSION}/src/string_utilities.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/libhttpserver-${LIBHTTPSERVER_VERSION}/src/string_response.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/libhttpserver-${LIBHTTPSERVER_VERSION}/src/http_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/libhttpserver-${LIBHTTPSERVER_VERSION}/src/http_resource.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/libhttpserver-${LIBHTTPSERVER_VERSION}/src/http_request.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/libhttpserver-${LIBHTTPSERVER_VERSION}/src/http_response.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/libhttpserver-${LIBHTTPSERVER_VERSION}/src/webserver.cpp + ) + add_definitions(-DHTTPSERVER_COMPILATION) +else() + set (LIBHTTPSERVER_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${EXTERNAL_BUILD_ROOT}/include") + set (LIBHTTPSERVER_LDFLAGS "-L${EXTERNAL_BUILD_ROOT}/lib") + set(LIBHTTPSERVER_MAKE make) + set(LIBHTTPSERVER_SED "sed -i -e s/have_gnutls=\"yes\"/have_gnutls=\"no\"/g ./configure") + + if (MACOS) + set (LIBHTTPSERVER_CXX g++) + set (LIBHTTPSERVER_CC gcc) + set(LIBHTTPSERVER_CXX_FLAGS "${LIBHTTPSERVER_CXX_FLAGS} -fvisibility=hidden") + else() + set (LIBHTTPSERVER_CXX ${CMAKE_CXX_COMPILER}) + set (LIBHTTPSERVER_CC ${CMAKE_C_COMPILER}) + endif() + + ExternalProject_Add(libhttpserver_project + DOWNLOAD_NO_PROGRESS 1 + BUILD_IN_SOURCE 1 + URL https://github.com/etr/libhttpserver/archive/${LIBHTTPSERVER_VERSION}.tar.gz + PREFIX ${LIBHTTPSERVER_BUILD_ROOT} + CONFIGURE_COMMAND ./bootstrap && sh -c "${LIBHTTPSERVER_SED}" + BUILD_COMMAND mkdir -p build && cd build && ../configure MAKE=${LIBHTTPSERVER_MAKE} + CXX=${LIBHTTPSERVER_CXX} CC=${LIBHTTPSERVER_CC} CXXFLAGS=${LIBHTTPSERVER_CXX_FLAGS} + LDFLAGS=${LIBHTTPSERVER_LDFLAGS} CPPFLAGS=-fpermissive --prefix=${EXTERNAL_BUILD_ROOT} + --enable-static=yes --enable-shared=yes --disable-examples --disable-doxygen-doc && ${LIBHTTPSERVER_MAKE} + INSTALL_COMMAND cd build && ${LIBHTTPSERVER_MAKE} install + ) + set(LIBHTTPSERVER_LIBRARIES ${EXTERNAL_BUILD_ROOT}/lib/libhttpserver.a) +endif() +add_dependencies(libhttpserver_project libmicrohttpd_project) diff --git a/cmake/libmicrohttpd.cmake b/cmake/libmicrohttpd.cmake new file mode 100644 index 00000000..3c13d01f --- /dev/null +++ b/cmake/libmicrohttpd.cmake @@ -0,0 +1,42 @@ +set(LIBMICROHTTPD_PROJECT_NAME libmicrohttpd_${LIBMICROHTTPD_VERSION}) +set(LIBMICROHTTPD_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${LIBMICROHTTPD_PROJECT_NAME}) + +if (MSVC) + set (LIBMICROHTTPD_BUILD_TYPE x64) + + ExternalProject_Add(libmicrohttpd_project + DOWNLOAD_NO_PROGRESS 1 + BUILD_IN_SOURCE 1 + URL https://gnu.freemirror.org/gnu/libmicrohttpd/libmicrohttpd-${LIBMICROHTTPD_VERSION}.tar.gz + PREFIX ${LIBMICROHTTPD_BUILD_ROOT} + CONFIGURE_COMMAND echo "Configuring" + BUILD_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/libmicrohttpd/build.cmd "${LIBMICROHTTPD_BUILD_ROOT}\\src\\libmicrohttpd_project" ${CMAKE_BUILD_TYPE} + INSTALL_COMMAND echo "Skipping Installation" + ) + include_directories(${LIBMICROHTTPD_BUILD_ROOT}/src/libmicrohttpd_project/w32/VS2019/Output/${LIBMICROHTTPD_BUILD_TYPE}) + link_directories(PRIVATE ${LIBMICROHTTPD_BUILD_ROOT}/src/libmicrohttpd_project/w32/VS2019/Output/${LIBMICROHTTPD_BUILD_TYPE}) + set(LIBMICROHTTPD_LIBRARIES libmicrohttpd${DEBUG_EXTRA3}.lib) +else() + if (MACOS) + set (LIBMICROHTTPD_CXX g++) + set (LIBMICROHTTPD_CC gcc) + set (LIBMICROHTTPD_CXX_FLAGS "-I${EXTERNAL_BUILD_ROOT}/include -fvisibility=hidden") + else() + set (LIBMICROHTTPD_CXX ${CMAKE_CXX_COMPILER}) + set (LIBMICROHTTPD_CC ${CMAKE_C_COMPILER}) + set (LIBMICROHTTPD_CXX_FLAGS -I${EXTERNAL_BUILD_ROOT}/include) + endif() + + ExternalProject_Add(libmicrohttpd_project + DOWNLOAD_NO_PROGRESS 1 + BUILD_IN_SOURCE 1 + URL https://gnu.freemirror.org/gnu/libmicrohttpd/libmicrohttpd-${LIBMICROHTTPD_VERSION}.tar.gz + PREFIX ${LIBMICROHTTPD_BUILD_ROOT} + CONFIGURE_COMMAND ./configure CXX=${LIBMICROHTTPD_CXX} CC=${LIBMICROHTTPD_CC} + CXXFLAGS=${LIBMICROHTTPD_CXX_FLAGS} LDFLAGS=-L${EXTERNAL_BUILD_ROOT}/lib + --prefix=${EXTERNAL_BUILD_ROOT} --enable-static=yes --disable-https --disable-examples --disable-doc + BUILD_COMMAND make + INSTALL_COMMAND make install + ) + set(LIBMICROHTTPD_LIBRARIES ${EXTERNAL_BUILD_ROOT}/lib/libmicrohttpd.a) +endif() diff --git a/cmake/libuuid.cmake b/cmake/libuuid.cmake new file mode 100644 index 00000000..77fa331f --- /dev/null +++ b/cmake/libuuid.cmake @@ -0,0 +1,17 @@ +if (LINUX) + set(LIBUUID_PROJECT_NAME libuuid_${LIBUUID_VERSION}) + set(LIBUUID_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${LIBUUID_PROJECT_NAME}) + #URL "https://www.mirrorservice.org/sites/ftp.ossp.org/pkg/lib/uuid/uuid-${LIBUUID_VERSION}.tar.gz" + ExternalProject_Add(libuuid_project + DOWNLOAD_NO_PROGRESS 1 + PREFIX ${LIBUUID_BUILD_ROOT} + URL https://src.fedoraproject.org/repo/pkgs/uuid/uuid-${LIBUUID_VERSION}.tar.gz/5db0d43a9022a6ebbbc25337ae28942f/uuid-${LIBUUID_VERSION}.tar.gz + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/config.guess ./config.guess && + cp ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/config.sub ./config.sub && + CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER};./configure --enable-static --prefix=${EXTERNAL_BUILD_ROOT} + BUILD_COMMAND CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER};make + INSTALL_COMMAND make install + ) + set(LIBUUID_LIBRARIES ${EXTERNAL_BUILD_ROOT}/lib/libuuid.a) +endif() diff --git a/cmake/openssl.cmake b/cmake/openssl.cmake new file mode 100644 index 00000000..75a7f508 --- /dev/null +++ b/cmake/openssl.cmake @@ -0,0 +1,37 @@ +if (MACOS OR LINUX) + if (IS_CLANG_COMPILER) + set(OPENSSL_COMPILE_TYPE_EXTRA -clang) + endif() + + if (MACOS) + set(OPENSSL_COMPILE_TYPE darwin64-x86_64-cc) + elseif(IS_ARM64) + set(OPENSSL_COMPILE_TYPE linux-aarch64${OPENSSL_COMPILE_TYPE_EXTRA}) + else() + set(OPENSSL_COMPILE_TYPE linux-x86_64${OPENSSL_COMPILE_TYPE_EXTRA}) + endif() + + set(OPENSSL_PROJECT_NAME openssl_${OPENSSL_VERSION}) + set(OPENSSL_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${OPENSSL_PROJECT_NAME}) + ExternalProject_Add(openssl_project + DOWNLOAD_NO_PROGRESS 1 + URL https://github.com/openssl/openssl/archive/OpenSSL_${OPENSSL_VERSION}.tar.gz + PREFIX ${OPENSSL_BUILD_ROOT} + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND ./Configure ${OPENSSL_COMPILE_TYPE} --prefix=${EXTERNAL_BUILD_ROOT} + BUILD_COMMAND make -j1 + INSTALL_COMMAND make install + ) + + if (MACOS) + set(OPENSSL_LIBRARIES + ${EXTERNAL_BUILD_ROOT}/lib/libssl.a + ${EXTERNAL_BUILD_ROOT}/lib/libcrypto.a + ) + else() + set(OPENSSL_LIBRARIES + libssl.a + libcrypto.a + ) + endif() +endif() diff --git a/cmake/rocksdb.cmake b/cmake/rocksdb.cmake new file mode 100644 index 00000000..38e3021a --- /dev/null +++ b/cmake/rocksdb.cmake @@ -0,0 +1,60 @@ +set(ROCKSDB_PROJECT_NAME rocksdb_${ROCKSDB_VERSION}) +set(ROCKSDB_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${ROCKSDB_PROJECT_NAME}) + +set(ROCKSDB_CMAKE_ARGS + -DCMAKE_BUILD_TYPE=${EXTERNAL_BUILD_TYPE} + -DCMAKE_GENERATOR=${CMAKE_GENERATOR} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_FLAGS=${ROCKSDB_CMAKE_CXX_FLAGS} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS} + -DWITH_TOOLS=OFF + -DFAIL_ON_WARNINGS=OFF + -DPORTABLE=ON + -DWITH_TESTS=OFF + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DROCKSDB_BUILD_SHARED=OFF + -DWITH_BENCHMARK_TOOLS=OFF + -DWITH_LIBURING=OFF + -DCMAKE_INSTALL_PREFIX=${EXTERNAL_BUILD_ROOT} +) + +if(MSVC) + ExternalProject_Add(rocksdb_project + DOWNLOAD_NO_PROGRESS 1 + URL https://github.com/facebook/rocksdb/archive/v${ROCKSDB_VERSION}.tar.gz + PREFIX ${ROCKSDB_BUILD_ROOT} + CMAKE_ARGS ${ROCKSDB_CMAKE_ARGS} + INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "Skipping install step.") + + set(ROCKSDB_INCLUDE_DIRS ${ROCKSDB_BUILD_ROOT}/src/rocksdb_project/include) + + if (CMAKE_GENERATOR_LOWER STREQUAL "nmake makefiles") + set(ROCKSDB_LIBRARIES ${ROCKSDB_BUILD_ROOT}/src/rocksdb_project-build/rocksdb.lib) + else () + set(ROCKSDB_LIBRARIES ${ROCKSDB_BUILD_ROOT}/src/rocksdb_project-build/${CMAKE_BUILD_TYPE}/rocksdb.lib) + endif () +else() + if (MACOS) + set(ROCKSDB_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") + else() + set(ROCKSDB_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + endif() + ExternalProject_Add(rocksdb_project + DOWNLOAD_NO_PROGRESS 1 + URL https://github.com/facebook/rocksdb/archive/v${ROCKSDB_VERSION}.tar.gz + PREFIX ${ROCKSDB_BUILD_ROOT} + CMAKE_ARGS ${ROCKSDB_CMAKE_ARGS} -DWITH_GFLAGS=OFF + ) + + if (MACOS) + set(ROCKSDB_LIBRARIES ${EXTERNAL_BUILD_ROOT}/lib/librocksdb.a) + else() + set(ROCKSDB_LIBRARIES librocksdb.a) + endif() +endif() + +if (MSVC OR LINUX) + add_dependencies(rocksdb_project curl_project) +endif() diff --git a/cmake/testing.cmake b/cmake/testing.cmake new file mode 100644 index 00000000..35d61e8a --- /dev/null +++ b/cmake/testing.cmake @@ -0,0 +1,126 @@ +# Testing +if (REPERTORY_ENABLE_TESTING) + enable_testing() + + set(GTEST_PROJECT_NAME gtest_${GTEST_VERSION}) + set(GTEST_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${GTEST_PROJECT_NAME}) + if (MSVC) + ExternalProject_Add(gtest_project + DOWNLOAD_NO_PROGRESS 1 + URL https://github.com/google/googletest/archive/release-${GTEST_VERSION}.tar.gz + PREFIX ${GTEST_BUILD_ROOT} + CMAKE_ARGS + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DCMAKE_BUILD_TYPE=${EXTERNAL_BUILD_TYPE} + -Dgtest_force_shared_crt=OFF + -DBUILD_SHARED_LIBS=ON + -DCMAKE_CXX_FLAGS=/D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING + INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "Skipping install step." + ) + else() + ExternalProject_Add(gtest_project + DOWNLOAD_NO_PROGRESS 1 + URL https://github.com/google/googletest/archive/release-${GTEST_VERSION}.tar.gz + PREFIX ${GTEST_BUILD_ROOT} + CMAKE_ARGS + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DCMAKE_BUILD_TYPE=${EXTERNAL_BUILD_TYPE} + INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "Skipping install step." + ) + endif() + + set(GTEST_INCLUDE_DIRS + ${GTEST_BUILD_ROOT}/src/gtest_project/googletest/include + ${GTEST_BUILD_ROOT}/src/gtest_project/googlemock/include + ) + + if (MSVC) + if (NOT CMAKE_GENERATOR_LOWER STREQUAL "nmake makefiles") + set (GTEST_PATH_EXTRA ${CMAKE_BUILD_TYPE}/) + endif() + set(GTEST_LIBRARIES + ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/${GTEST_PATH_EXTRA}gmock${DEBUG_EXTRA}.lib + ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/${GTEST_PATH_EXTRA}gmock_main${DEBUG_EXTRA}.lib + ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/${GTEST_PATH_EXTRA}gtest${DEBUG_EXTRA}.lib + ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/${GTEST_PATH_EXTRA}gtest_main${DEBUG_EXTRA}.lib + ) + elseif (UNIX) + set(GTEST_LIBRARIES + ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/libgmock${DEBUG_EXTRA}.a + ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/libgtest${DEBUG_EXTRA}.a + ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/libgtest_main${DEBUG_EXTRA}.a + ) + endif() + + file(GLOB_RECURSE UNITTEST_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/tests/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/tests/*.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/tests/fixtures/*.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/tests/mocks/*.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/tests/utils/*.hpp + ) + + add_executable(unittests + src/main.cpp + ${REPERTORY_HEADERS} + ${UNITTEST_SOURCES} + ) + + #target_precompile_headers(unittests PRIVATE include/common.hpp tests/test_common.hpp) + target_compile_definitions(unittests PUBLIC GTEST_LINKED_AS_SHARED_LIBRARY=1 REPERTORY_TESTING) + + target_link_libraries(unittests PRIVATE ${GTEST_LIBRARIES} librepertory) + + if (MSVC) + add_custom_command(TARGET unittests + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${GTEST_BUILD_ROOT}/src/gtest_project-build/bin/${GTEST_PATH_EXTRA}gmock${DEBUG_EXTRA}.dll ${CMAKE_CURRENT_BINARY_DIR}/${GTEST_PATH_EXTRA} + ) + add_custom_command(TARGET unittests + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${GTEST_BUILD_ROOT}/src/gtest_project-build/bin/${GTEST_PATH_EXTRA}gmock_main${DEBUG_EXTRA}.dll ${CMAKE_CURRENT_BINARY_DIR}/${GTEST_PATH_EXTRA} + ) + add_custom_command(TARGET unittests + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${GTEST_BUILD_ROOT}/src/gtest_project-build/bin/${GTEST_PATH_EXTRA}gtest${DEBUG_EXTRA}.dll ${CMAKE_CURRENT_BINARY_DIR}/${GTEST_PATH_EXTRA} + ) + add_custom_command(TARGET unittests + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${GTEST_BUILD_ROOT}/src/gtest_project-build/bin/${GTEST_PATH_EXTRA}gtest_main${DEBUG_EXTRA}.dll ${CMAKE_CURRENT_BINARY_DIR}/${GTEST_PATH_EXTRA} + ) + endif() + target_include_directories(unittests PUBLIC + ${GTEST_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR}/tests + ) + + add_custom_command( + TARGET unittests + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/cacert.pem + ${CMAKE_BINARY_DIR}/cacert.pem + ) + + add_dependencies(unittests + gtest_project + librepertory + ) + + if (MACOS) + target_link_libraries(unittests PRIVATE -W1,-rpath,@executable_path) + set_target_properties(unittests PROPERTIES COMPILE_FLAGS -fvisibility=hidden) + elseif (MSVC) + CopySupportFiles(unittests) + endif() + + if (CMAKE_GENERATOR_LOWER STREQUAL "nmake makefiles") + add_test(NAME AllTests COMMAND unittests WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + else() + add_test(NAME AllTests COMMAND unittests WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}) + endif() +endif() diff --git a/cmake/zlib.cmake b/cmake/zlib.cmake new file mode 100644 index 00000000..cb31e005 --- /dev/null +++ b/cmake/zlib.cmake @@ -0,0 +1,22 @@ +if (MSVC) + set(ZLIB_PROJECT_NAME zlib_${ZLIB_VERSION}) + set(ZLIB_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${ZLIB_PROJECT_NAME}) + set(ZLIB_CMAKE_ARGS + -DCMAKE_BUILD_TYPE=${EXTERNAL_BUILD_TYPE} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_GENERATOR=${CMAKE_GENERATOR} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS} + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DCMAKE_INSTALL_PREFIX=${EXTERNAL_BUILD_ROOT} + ) + ExternalProject_Add(zlib_project + DOWNLOAD_NO_PROGRESS 1 + URL https://github.com/madler/zlib/archive/${ZLIB_VERSION}.tar.gz + PREFIX ${ZLIB_BUILD_ROOT} + CMAKE_ARGS ${ZLIB_CMAKE_ARGS} + ) + set(ZLIB_LIBRARIES ${EXTERNAL_BUILD_ROOT}/lib/zlibstatic${DEBUG_EXTRA}.lib) +elseif(LINUX) + set(ZLIB_LIBRARIES libz.a) +endif() diff --git a/compile_tag.sh b/compile_tag.sh new file mode 100755 index 00000000..349f237e --- /dev/null +++ b/compile_tag.sh @@ -0,0 +1,192 @@ +#!/bin/bash + +CMAKE_VERSION=3.22.2 + +beginsWith() { case $2 in "$1"*) true ;; *) false ;; esac } + +TAG=$1 +TYPE=$2 +# currently unused +ENABLE_UPLOAD=$3 + +REPOSITORY=repertory +CURRENT_DIR=$(pwd) + +TAG_BUILDS_ROOT=${CURRENT_DIR}/tag_builds +mkdir -p "${TAG_BUILDS_ROOT}" + +ARM64=0 +MACHINE=$(uname -m) +if beginsWith "aarch64" "$MACHINE"; then + ARM64=1 +fi + +if beginsWith darwin "$OSTYPE"; then + PLATFORM_NAME=darwin +else + PLATFORM_NAME=$(/bin/bash "${CURRENT_DIR}/detect_linux_build.sh") +fi +NUM_JOBS=$(getconf _NPROCESSORS_ONLN 2> /dev/null || getconf NPROCESSORS_ONLN 2> /dev/null || echo 1) + +if [ "$PLATFORM_NAME" = "darwin" ]; then + BASE64_EXEC=base64 + SHA256_EXEC="shasum -a 256 -b" +elif [ "$ARM64" = "1" ]; then + BASE64_EXEC="base64 -w0" + SHA256_EXEC="sha256sum -b" +else + BASE64_EXEC="base64 -w0" + SHA256_EXEC="sha256sum -b" +fi + +if [ -f "${CURRENT_DIR}/src/CMakeLists.txt" ]; then + REPERTORY_ROOT=${CURRENT_DIR}/src +else + REPERTORY_ROOT=${CURRENT_DIR} +fi + +if [ "$ARM64" = "1" ]; then + TAG_BUILD=${TAG_BUILDS_ROOT}/arm64_${PLATFORM_NAME}/${TAG} + ERROR_FILE=${TAG_BUILDS_ROOT}/arm64_${PLATFORM_NAME}.error +else + TAG_BUILD=${TAG_BUILDS_ROOT}/${PLATFORM_NAME}${NAME_EXTRA}/${TAG} + ERROR_FILE=${TAG_BUILDS_ROOT}/${PLATFORM_NAME}${NAME_EXTRA}.error +fi +rm -f "${ERROR_FILE}" + +split_string() { + IFS=$1 + DATA=$2 + read -ra SPLIT_STRING <<< "$DATA" + IFS=' ' +} + +exit_script() { + echo "$1" > "${ERROR_FILE}" + echo "$1" + cd "${CURRENT_DIR}" + exit 1 +} + +set_temp_ld_library_path() { + LD_LIBRARY_PATH=${TAG_BUILD}/external/lib:${TAG_BUILD}/external/lib64 + export LD_LIBRARY_PATH +} + +clear_temp_ld_library_path() { + LD_LIBRARY_PATH= + export LD_LIBRARY_PATH +} + +if [ "$PLATFORM_NAME" = "unknown" ]; then + exit_script "Unknown build platform" +elif [ -z "$TAG" ]; then + exit_script "Branch/tag not supplied" +else + split_string '_' ${TAG} + APP_VER=${SPLIT_STRING[0]} + + split_string '-' ${APP_VER} + APP_RELEASE_TYPE=${SPLIT_STRING[1]} + + split_string '.' ${APP_RELEASE_TYPE} + APP_RELEASE_TYPE=${SPLIT_STRING[0]} + APP_RELEASE_TYPE="$(tr '[:lower:]' '[:upper:]' <<< ${APP_RELEASE_TYPE:0:1})${APP_RELEASE_TYPE:1}" + if [ "$APP_RELEASE_TYPE" = "Rc" ]; then + APP_RELEASE_TYPE="RC" + fi + mkdir -p "${TAG_BUILD}" + + rm -f "${TAG_BUILD}/repertory.sig" + rm -f "${TAG_BUILD}/repertory.sha256" + + if [ ! -f "${TAG_BUILDS_ROOT}/blockstorage_dev_public.pem" ]; then + cp -f blockstorage_dev_public.pem "${TAG_BUILDS_ROOT}" + fi + + if [ ! -f "${TAG_BUILDS_ROOT}/blockstorage_dev_private.pem" ]; then + cp -f blockstorage_dev_private.pem "${TAG_BUILDS_ROOT}" + fi + + if [ "$PLATFORM_NAME" = "debian9" ]; then + CMAKE_OPTS="${CMAKE_OPTS} -DCMAKE_CXX_STANDARD=14" + fi + + if [ "$ARM64" = "1" ]; then + CMAKE_OS=linux + CMAKE_PLATFORM=aarch64 + else + CMAKE_OS=linux + CMAKE_PLATFORM=x86_64 + fi + + if [ ! -d "${TAG_BUILDS_ROOT}/cmake-${CMAKE_VERSION}-${CMAKE_OS}-${CMAKE_PLATFORM}" ]; then + cd "${TAG_BUILDS_ROOT}" || exit_script "Unable to change to directory: ${TAG_BUILDS_ROOT}" + wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-${CMAKE_OS}-${CMAKE_PLATFORM}.tar.gz || exit_script "Download cmake failed" + tar xvzf cmake-${CMAKE_VERSION}-${CMAKE_OS}-${CMAKE_PLATFORM}.tar.gz || exit_script "Extract cmake failed" + rm -f cmake-${CMAKE_VERSION}-${CMAKE_OS}-${CMAKE_PLATFORM}.tar.gz + cd - || exit_script "Unable to change to directory: -" + fi + PATH="${TAG_BUILDS_ROOT}/cmake-${CMAKE_VERSION}-${CMAKE_OS}-${CMAKE_PLATFORM}/bin:$PATH" + + cd "${REPERTORY_ROOT}" || exit_script "Unable to change to directory: ${REPERTORY_ROOT}" + GIT_REV=$(git rev-parse --short HEAD) + REPERTORY_VERSION=$(grep set\(REPERTORY_MAJOR ${REPERTORY_ROOT}/CMakeLists.txt | sed s/\)//g | awk '{print $2}') + REPERTORY_VERSION=${REPERTORY_VERSION}.$(grep set\(REPERTORY_MINOR ${REPERTORY_ROOT}/CMakeLists.txt | sed s/\)//g | awk '{print $2}') + REPERTORY_VERSION=${REPERTORY_VERSION}.$(grep set\(REPERTORY_REV ${REPERTORY_ROOT}/CMakeLists.txt | sed s/\)//g | awk '{print $2}') + REPERTORY_VERSION=${REPERTORY_VERSION}-$(grep set\(REPERTORY_RELEASE_ITER ${REPERTORY_ROOT}/CMakeLists.txt | sed s/\)//g | awk '{print $2}') + + if [ "$ARM64" = "1" ]; then + OUT_FILE=repertory_${REPERTORY_VERSION}_${GIT_REV}_${PLATFORM_NAME}_arm64.zip + else + if [ "$PLATFORM_NAME" = "centos7" ]; then + OUT_FILE=repertory_${REPERTORY_VERSION}_${GIT_REV}_linux_amd64.zip + else + OUT_FILE=repertory_${REPERTORY_VERSION}_${GIT_REV}_${PLATFORM_NAME}_amd64.zip + fi + fi + OUT_ZIP=${TAG_BUILDS_ROOT}/${OUT_FILE} + + PATH="${REPERTORY_ROOT}/bin:$PATH" + export PATH + + if [ -f "${OUT_ZIP}" ]; then + echo "${PLATFORM_NAME} already exists" + else + if [ "${PLATFORM_NAME}" = "tumbleweed" ]; then + zypper --non-interactive patch + elif [ "${PLATFORM_NAME}" = "arch" ]; then + pacman -Syy --noconfirm && pacman -Su --noconfirm + fi + + cd "${TAG_BUILD}" || exit_script "Unable to change to directory: ${TAG_BUILD}" + + if (cmake "${REPERTORY_ROOT}" ${CMAKE_OPTS} && make -j ${NUM_JOBS}) || (cmake "${REPERTORY_ROOT}" ${CMAKE_OPTS} && make -j ${NUM_JOBS}); then + PATH=${TAG_BUILD}/external/bin:$PATH + export PATH + + strip ./repertory + ${SHA256_EXEC} ./repertory > repertory.sha256 || exit_script "SHA-256 failed for repertory" + + set_temp_ld_library_path + openssl dgst -sha256 -sign "${TAG_BUILDS_ROOT}/blockstorage_dev_private.pem" -out repertory.sig repertory || exit_script "Create signature failed for repertory" + openssl dgst -sha256 -verify "${TAG_BUILDS_ROOT}/blockstorage_dev_public.pem" -signature repertory.sig repertory || exit_script "Verify signature failed for repertory" + clear_temp_ld_library_path + + zip "${OUT_ZIP}" repertory repertory.sha256 repertory.sig cacert.pem || exit_script "Create zip failed" + + cd "${TAG_BUILDS_ROOT}" || exit_script "Unable to change to directory: ${TAG_BUILDS_ROOT}" + ${SHA256_EXEC} "./${OUT_FILE}" > "${OUT_FILE}.sha256" || exit_script "SHA-256 failed for zip file" + + set_temp_ld_library_path + openssl dgst -sha256 -sign blockstorage_dev_private.pem -out "${OUT_FILE}.sig" "${OUT_FILE}" || exit_script "Create signature failed for zip file" + openssl dgst -sha256 -verify blockstorage_dev_public.pem -signature "${OUT_FILE}.sig" "${OUT_FILE}" > "${OUT_FILE}.status" 2>&1 || exit_script "Verify signature failed for zip file" + clear_temp_ld_library_path + + ${BASE64_EXEC} "${OUT_FILE}.sig" > "${OUT_FILE}.sig.b64" || exit_script "Create base64 signature failed for zip file" + else + exit_script "Build failed" + fi + fi + cd "${CURRENT_DIR}" +fi diff --git a/create_containers.sh b/create_containers.sh new file mode 100755 index 00000000..48bf543e --- /dev/null +++ b/create_containers.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +CURRENT_DIR=$(pwd) + +function create_containers() { + TYPE=$1 + NAME_EXTRA= + if [ -z "$TYPE" ]; then + TYPE=64_bit + fi + + if [ "$TYPE" = "arm64" ]; then + for FILE in $(pwd)/arm64/*; do + chmod +x $FILE + $FILE + done + else + for FILE in $(pwd)/docker/${TYPE}/*; do + DISTRONAME=$(basename ${FILE}) + CONTAINER_NAME=repertory${NAME_EXTRA}_${DISTRONAME} + TAG_NAME=repertory${NAME_EXTRA}:${DISTRONAME} + echo Creating Container [${CONTAINER_NAME}] + + docker stop ${CONTAINER_NAME} + docker rm ${CONTAINER_NAME} + docker build -t ${TAG_NAME} - < docker/${TYPE}/${DISTRONAME} + docker stop ${CONTAINER_NAME} + docker rm ${CONTAINER_NAME} + done + fi +} + +if [ "$UID" != 0 ]; then + echo "Must be run as root" + exit 1 +else + create_containers arm64 + create_containers 64_bit +fi diff --git a/detect_linux_build.sh b/detect_linux_build.sh new file mode 100755 index 00000000..604c92af --- /dev/null +++ b/detect_linux_build.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +CENTOS_VERSIONS=("7 8") +DEBIAN_VERSIONS=("9 10 11") +FEDORA_VERSIONS=("35 34 33 32 31 30 29 28") +OPENSUSE_VERSIONS=("15.0 15.1 15.2 15.3") +UBUNTU_VERSIONS=("18.04 19.10 20.04 20.10 21.04 21.10") + +DISTNAME=unknown +DISTVER= + +resetDistVer() { + DISTNAME=unknown + DISTVER= +} + +if [ -f /etc/centos-release ]; then + . /etc/os-release + if [[ "${CENTOS_VERSIONS[@]}" =~ "${VERSION_ID}" ]]; then + DISTNAME=centos + DISTVER=$VERSION_ID + else + resetDistVer + fi +elif [ -f /etc/fedora-release ]; then + . /etc/os-release + if [[ "${FEDORA_VERSIONS[@]}" =~ "${VERSION_ID}" ]]; then + DISTNAME=fedora + DISTVER=$VERSION_ID + else + resetDistVer + fi +elif [ -f /etc/solus-release ]; then + DISTNAME=solus +elif [ -f /etc/lsb-release ]; then + . /etc/lsb-release + DISTNAME=$(echo ${DISTRIB_ID} | awk '{print tolower($0)}') + DISTVER=${DISTRIB_RELEASE} + if [ "$DISTNAME" != "ubuntu" ]; then + resetDistVer + elif [[ ! "${UBUNTU_VERSIONS[@]}" =~ "${DISTVER}" ]]; then + resetDistVer + fi +fi + +if [ "$DISTNAME" = "unknown" ] && [ -f /etc/debian_version ]; then + DISTNAME=debian + DISTVER=$(head -1 /etc/debian_version | awk -F. '{print $1}') + if [[ ! "${DEBIAN_VERSIONS[@]}" =~ "${DISTVER}" ]]; then + resetDistVer + fi +fi + +if [ "$DISTNAME" = "unknown" ]; then + if [ -f /etc/os-release ]; then + . /etc/os-release + if [ "$ID" = "arch" ] || [ "$ID" = "manjaro" ]; then + DISTNAME=arch + elif [ "$ID" = "opensuse-leap" ]; then + if [[ "${OPENSUSE_VERSIONS[@]}" =~ "${VERSION_ID}" ]]; then + DISTNAME=opensuse + if [ "$VERSION_ID" = "15.0" ]; then + DISTVER=15 + else + DISTVER=$VERSION_ID + fi + else + resetDistVer + fi + elif [ "$ID" = "opensuse-tumbleweed" ]; then + DISTNAME=tumbleweed + DISTVER= + else + resetDistVer + fi + else + resetDistVer + fi +fi + +echo ${DISTNAME}${DISTVER} diff --git a/docker/64_bit/arch b/docker/64_bit/arch new file mode 100644 index 00000000..df9121bf --- /dev/null +++ b/docker/64_bit/arch @@ -0,0 +1,26 @@ +FROM archlinux:base +MAINTAINER Scott E. Graves +CMD bash + +# Required system packages +RUN pacman -Syy --noconfirm && pacman -Su --noconfirm && pacman --noconfirm -S \ + automake \ + autoconf \ + m4 \ + perl \ + base-devel \ + autoconf \ + automake \ + libtool \ + nano \ + cmake \ + make \ + fuse2 \ + gcc \ + gnupg \ + git \ + diffutils \ + tar \ + wget \ + zip \ + pkgconf diff --git a/docker/64_bit/centos7 b/docker/64_bit/centos7 new file mode 100644 index 00000000..371391a9 --- /dev/null +++ b/docker/64_bit/centos7 @@ -0,0 +1,36 @@ +FROM centos:7 AS env +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +USER 0 +RUN yum update -y +RUN yum install -y centos-release-scl +RUN yum install -y devtoolset-8 +RUN yum -y install \ + wget \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + autoconf \ + automake \ + libtool \ + patch \ + pkgconfig \ + zip \ + zlib-devel \ + zlib-static +RUN git config --system user.name "Scott E. Graves" +RUN git config --system user.email "scott.e.graves@protonmail.com" +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:/opt/rh/devtoolset-8/root/usr/bin:${PATH}" diff --git a/docker/64_bit/debian10 b/docker/64_bit/debian10 new file mode 100644 index 00000000..8664c864 --- /dev/null +++ b/docker/64_bit/debian10 @@ -0,0 +1,34 @@ +FROM debian:buster +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN apt-get update && apt-get -y install \ + apt-utils \ + build-essential \ + curl \ + pkg-config \ + autoconf \ + automake \ + libtool \ + wget \ + make \ + gcc \ + g++ \ + libfuse-dev \ + libstdc++-8-dev \ + diffutils \ + git \ + tar \ + zlib1g-dev \ + zip +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/debian11 b/docker/64_bit/debian11 new file mode 100644 index 00000000..c6d5d38a --- /dev/null +++ b/docker/64_bit/debian11 @@ -0,0 +1,34 @@ +FROM debian:bullseye +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN apt-get update && apt-get -y install \ + apt-utils \ + build-essential \ + curl \ + pkg-config \ + autoconf \ + automake \ + libtool \ + make \ + gcc \ + g++ \ + libfuse-dev \ + libstdc++-10-dev \ + diffutils \ + git \ + tar \ + wget \ + zlib1g-dev \ + zip +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/debian9 b/docker/64_bit/debian9 new file mode 100644 index 00000000..129d3ed6 --- /dev/null +++ b/docker/64_bit/debian9 @@ -0,0 +1,34 @@ +FROM debian:stretch +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN apt-get update && apt-get -y install \ + apt-utils \ + build-essential \ + curl \ + pkg-config \ + autoconf \ + automake \ + libtool \ + make \ + wget \ + gcc \ + g++ \ + libfuse-dev \ + libstdc++-6-dev \ + diffutils \ + git \ + tar \ + zlib1g-dev \ + zip +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/fedora29 b/docker/64_bit/fedora29 new file mode 100644 index 00000000..9e17fbde --- /dev/null +++ b/docker/64_bit/fedora29 @@ -0,0 +1,32 @@ +FROM fedora:29 +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN dnf -y update && dnf -y install \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + zlib-devel \ + zlib-static \ + autoconf \ + automake \ + libtool \ + wget \ + zip \ + gcc \ + gcc-c++ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/fedora30 b/docker/64_bit/fedora30 new file mode 100644 index 00000000..12524f4f --- /dev/null +++ b/docker/64_bit/fedora30 @@ -0,0 +1,33 @@ +FROM fedora:30 +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN dnf -y update && dnf -y install \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + zip \ + file \ + autoconf \ + automake \ + libtool \ + wget \ + zlib-devel \ + zlib-static \ + gcc \ + gcc-c++ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/fedora31 b/docker/64_bit/fedora31 new file mode 100644 index 00000000..b5195daa --- /dev/null +++ b/docker/64_bit/fedora31 @@ -0,0 +1,33 @@ +FROM fedora:31 +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN dnf -y update && dnf -y install \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + zip \ + file \ + autoconf \ + automake \ + libtool \ + wget \ + zlib-devel \ + zlib-static \ + gcc \ + gcc-c++ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/fedora32 b/docker/64_bit/fedora32 new file mode 100644 index 00000000..44b7a45e --- /dev/null +++ b/docker/64_bit/fedora32 @@ -0,0 +1,33 @@ +FROM fedora:32 +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN dnf -y update && dnf -y install \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + zip \ + autoconf \ + automake \ + libtool \ + file \ + wget \ + zlib-devel \ + zlib-static \ + gcc \ + gcc-c++ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/fedora33 b/docker/64_bit/fedora33 new file mode 100644 index 00000000..c11dcb79 --- /dev/null +++ b/docker/64_bit/fedora33 @@ -0,0 +1,34 @@ +FROM fedora:33 +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN dnf -y update && dnf -y install \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + zip \ + autoconf \ + automake \ + libtool \ + file \ + wget \ + zlib-devel \ + zlib-static \ + gcc \ + gcc-c++ \ + cpan +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/fedora34 b/docker/64_bit/fedora34 new file mode 100644 index 00000000..90a9bda6 --- /dev/null +++ b/docker/64_bit/fedora34 @@ -0,0 +1,34 @@ +FROM fedora:34 +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN dnf -y update && dnf -y install \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + zip \ + autoconf \ + automake \ + libtool \ + file \ + wget \ + zlib-devel \ + zlib-static \ + gcc \ + gcc-c++ \ + cpan +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/fedora35 b/docker/64_bit/fedora35 new file mode 100644 index 00000000..d085cd18 --- /dev/null +++ b/docker/64_bit/fedora35 @@ -0,0 +1,24 @@ +FROM fedora:35 +MAINTAINER Scott E. Graves +CMD bash + +# Required system packages +RUN dnf -y update && dnf -y install \ + cmake \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + zip \ + autoconf \ + automake \ + libtool \ + file \ + zlib-devel \ + zlib-static \ + gcc \ + gcc-c++ \ + cpan diff --git a/docker/64_bit/opensuse15 b/docker/64_bit/opensuse15 new file mode 100644 index 00000000..49d20a26 --- /dev/null +++ b/docker/64_bit/opensuse15 @@ -0,0 +1,35 @@ +FROM opensuse/leap:15.0 +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN zypper --non-interactive patch;zypper --non-interactive patch;zypper --non-interactive patch;zypper --non-interactive patch;zypper --non-interactive patch;zypper --non-interactive patch;zypper --non-interactive patch;zypper --non-interactive patch;zypper --non-interactive patch;zypper --non-interactive patch && zypper --non-interactive install \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + autoconf \ + automake \ + libtool \ + zip \ + file \ + gzip \ + which \ + wget \ + zlib-devel \ + zlib-devel-static \ + gcc \ + gcc-c++ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/opensuse15.1 b/docker/64_bit/opensuse15.1 new file mode 100644 index 00000000..539992b8 --- /dev/null +++ b/docker/64_bit/opensuse15.1 @@ -0,0 +1,35 @@ +FROM opensuse/leap:15.1 +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN zypper --non-interactive patch;zypper --non-interactive patch && zypper --non-interactive install \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + autoconf \ + automake \ + libtool \ + zip \ + file \ + gzip \ + which \ + wget \ + zlib-devel \ + zlib-devel-static \ + gcc \ + gcc-c++ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/opensuse15.2 b/docker/64_bit/opensuse15.2 new file mode 100644 index 00000000..4f33c77d --- /dev/null +++ b/docker/64_bit/opensuse15.2 @@ -0,0 +1,35 @@ +FROM opensuse/leap:15.2 +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN zypper --non-interactive patch;zypper --non-interactive patch && zypper --non-interactive install \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + autoconf \ + automake \ + libtool \ + zip \ + file \ + gzip \ + which \ + wget \ + zlib-devel \ + zlib-devel-static \ + gcc \ + gcc-c++ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/opensuse15.3 b/docker/64_bit/opensuse15.3 new file mode 100644 index 00000000..4980ff37 --- /dev/null +++ b/docker/64_bit/opensuse15.3 @@ -0,0 +1,35 @@ +FROM opensuse/leap:15.3 +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN zypper --non-interactive patch;zypper --non-interactive patch && zypper --non-interactive install \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + autoconf \ + automake \ + libtool \ + zip \ + file \ + gzip \ + which \ + wget \ + zlib-devel \ + zlib-devel-static \ + gcc \ + gcc-c++ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/tumbleweed b/docker/64_bit/tumbleweed new file mode 100644 index 00000000..d0774d45 --- /dev/null +++ b/docker/64_bit/tumbleweed @@ -0,0 +1,26 @@ +FROM opensuse/tumbleweed +MAINTAINER Scott E. Graves +CMD bash + +# Required system packages +RUN zypper --non-interactive patch && zypper --non-interactive install \ + cmake \ + curl \ + make \ + git \ + fuse \ + fuse-devel \ + pkgconfig \ + patch \ + autoconf \ + automake \ + libtool \ + zip \ + file \ + gzip \ + which \ + wget \ + zlib-devel \ + zlib-devel-static \ + gcc \ + gcc-c++ diff --git a/docker/64_bit/ubuntu18.04 b/docker/64_bit/ubuntu18.04 new file mode 100644 index 00000000..b40b91e9 --- /dev/null +++ b/docker/64_bit/ubuntu18.04 @@ -0,0 +1,35 @@ +FROM ubuntu:bionic +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN apt-get update && apt-get -y install \ + apt-utils \ + build-essential \ + curl \ + pkg-config \ + autoconf \ + automake \ + libtool \ + make \ + gcc \ + g++ \ + libfuse-dev \ + libstdc++-6-dev \ + diffutils \ + git \ + tar \ + wget \ + zip \ + zlib1g-dev \ + diffutils +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/ubuntu20.04 b/docker/64_bit/ubuntu20.04 new file mode 100644 index 00000000..01905cfe --- /dev/null +++ b/docker/64_bit/ubuntu20.04 @@ -0,0 +1,39 @@ +FROM ubuntu:focal +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN apt-get update +RUN DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata +RUN ln -fs /usr/share/zoneinfo/America/Chicago /etc/localtime +RUN dpkg-reconfigure --frontend noninteractive tzdata +RUN apt-get -y install \ + apt-utils \ + build-essential \ + curl \ + pkg-config \ + autoconf \ + automake \ + libtool \ + make \ + gcc \ + g++ \ + libfuse-dev \ + libstdc++-9-dev \ + diffutils \ + git \ + tar \ + wget \ + zip \ + zlib1g-dev \ + diffutils +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/docker/64_bit/ubuntu21.10 b/docker/64_bit/ubuntu21.10 new file mode 100644 index 00000000..89316340 --- /dev/null +++ b/docker/64_bit/ubuntu21.10 @@ -0,0 +1,39 @@ +FROM ubuntu:impish +MAINTAINER Scott E. Graves +CMD bash + +ARG CMAKE_VERSION=3.22.2 + +# Required system packages +RUN apt-get update +RUN DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata +RUN ln -fs /usr/share/zoneinfo/America/Chicago /etc/localtime +RUN dpkg-reconfigure --frontend noninteractive tzdata +RUN apt-get -y install \ + apt-utils \ + build-essential \ + curl \ + pkg-config \ + autoconf \ + automake \ + libtool \ + make \ + gcc \ + g++ \ + libfuse-dev \ + libstdc++-9-dev \ + diffutils \ + git \ + tar \ + wget \ + zip \ + zlib1g-dev \ + diffutils +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + -q -O /tmp/cmake-install.sh \ + && chmod u+x /tmp/cmake-install.sh \ + && mkdir /cmake \ + && /tmp/cmake-install.sh --skip-license --prefix=/cmake \ + && rm /tmp/cmake-install.sh + +ENV PATH="/cmake/bin:${PATH}" diff --git a/include/app_config.hpp b/include/app_config.hpp new file mode 100644 index 00000000..97755453 --- /dev/null +++ b/include/app_config.hpp @@ -0,0 +1,382 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_APP_CONFIG_HPP_ +#define INCLUDE_APP_CONFIG_HPP_ + +#include "common.hpp" +#include "events/events.hpp" +#include "events/event_system.hpp" +#include "types/repertory.hpp" +#include "types/skynet.hpp" + +namespace repertory { +class app_config final { +public: + static std::string default_agent_name(const provider_type &pt); + + static std::uint16_t default_api_port(const provider_type &pt); + + static std::string default_data_directory(const provider_type &pt); + + static std::uint16_t default_rpc_port(const provider_type &pt); + + static std::string get_provider_api_password(const provider_type &pt); + + static std::string get_provider_display_name(const provider_type &pt); + + static std::string get_provider_minimum_version(const provider_type &pt); + + static std::string get_provider_name(const provider_type &pt); + + static std::string get_provider_path_name(const provider_type &pt); + +public: + explicit app_config(const provider_type &pt, const std::string &data_directory = ""); + + ~app_config() { save(); } + +private: + const provider_type pt_; + std::string api_auth_; + std::uint16_t api_port_; + std::string api_user_; + bool config_changed_; + const std::string data_directory_; + std::uint8_t download_timeout_secs_; + bool enable_chunk_downloader_timeout_; + bool enable_comm_duration_events_; + bool enable_drive_events_; + bool enable_max_cache_size_; +#ifdef _WIN32 + bool enable_mount_manager_; +#endif + bool enable_remote_mount_; + event_level event_level_; + std::uint32_t eviction_delay_mins_; + bool eviction_uses_accessed_time_; + std::uint8_t high_freq_interval_secs_; + bool is_remote_mount_; + std::uint32_t low_freq_interval_secs_; + std::uint64_t max_cache_size_bytes_; + std::uint8_t max_upload_count_; + std::uint8_t min_download_timeout_secs_; + double minimum_redundancy_; + std::uint16_t online_check_retry_secs_; + std::uint16_t orphaned_file_retention_days_; + std::string preferred_download_type_; + std::uint8_t read_ahead_count_; + std::uint8_t remote_client_pool_size_; + std::string remote_host_name_or_ip_; + std::uint8_t remote_max_connections_; + std::uint16_t remote_port_; + std::uint16_t remote_receive_timeout_secs_; + std::uint16_t remote_send_timeout_secs_; + std::string remote_token_; + std::uint16_t retry_read_count_; + std::uint16_t ring_buffer_file_size_; + api_currency storage_byte_month_; + std::uint64_t version_ = REPERTORY_CONFIG_VERSION; + std::string cache_directory_; + host_config hc_; + s3_config s3_config_; + skynet_config skynet_config_; + std::string log_directory_; + std::recursive_mutex read_write_mutex_; + std::recursive_mutex remote_mount_mutex_; + +private: + bool load(); + + template + bool get_value(const json &json_document, const std::string &name, dest &dst, + bool &success_flag) { + auto ret = false; + try { + if (json_document.find(name) != json_document.end()) { + dst = json_document[name].get(); + ret = true; + } else { + success_flag = false; + } + } catch (const json::exception &ex) { + event_system::instance().raise(__FUNCTION__, ex.what()); + success_flag = false; + ret = false; + } + + return ret; + } + + template bool set_value(dest &dst, const source &src) { + auto ret = false; + recur_mutex_lock l(read_write_mutex_); + if (dst != src) { + dst = src; + config_changed_ = true; + save(); + ret = true; + + if (reinterpret_cast(&dst) == &skynet_config_.portal_list) { + event_system::instance().raise(); + } + } + + return ret; + } + +public: + std::string get_api_auth() const { return api_auth_; } + + std::uint16_t get_api_port() const { return api_port_; } + + std::string get_api_user() const { return api_user_; } + + std::string get_cache_directory() const { return cache_directory_; } + + std::uint8_t get_chunk_downloader_timeout_secs() const { + return std::max(min_download_timeout_secs_, download_timeout_secs_); + } + + std::string get_config_file_path() const; + + std::string get_data_directory() const { return data_directory_; } + + bool get_enable_chunk_download_timeout() const { return enable_chunk_downloader_timeout_; } + + bool get_enable_comm_duration_events() const { return enable_comm_duration_events_; } + + bool get_enable_drive_events() const { return enable_drive_events_; } + +#ifdef _WIN32 + bool get_enable_mount_manager() const { return enable_mount_manager_; } +#endif + + bool get_enable_max_cache_size() const { return enable_max_cache_size_; } + + bool get_enable_remote_mount() const { return enable_remote_mount_; } + + event_level get_event_level() const { return event_level_; } + + std::uint32_t get_eviction_delay_mins() const { return eviction_delay_mins_; } + + bool get_eviction_uses_accessed_time() const { return eviction_uses_accessed_time_; } + + std::uint8_t get_high_frequency_interval_secs() const { + return std::max((std::uint8_t)1, high_freq_interval_secs_); + } + + host_config get_host_config() const { return hc_; } + + bool get_is_remote_mount() const { return is_remote_mount_; } + + json get_json() const; + + std::string get_log_directory() const { return log_directory_; } + + std::uint32_t get_low_frequency_interval_secs() const { + return std::max((std::uint32_t)1, low_freq_interval_secs_); + } + + std::uint64_t get_max_cache_size_bytes() const; + + std::uint8_t get_max_upload_count() const { + return std::max(std::uint8_t(1u), max_upload_count_); + } + + double get_minimum_redundancy() const { return std::max(1.5, minimum_redundancy_); } + + std::uint16_t get_online_check_retry_secs() const { + return std::max(std::uint16_t(15), online_check_retry_secs_); + } + + std::uint16_t get_orphaned_file_retention_days() const { + return std::min((std::uint16_t)31, std::max((std::uint16_t)1, orphaned_file_retention_days_)); + } + + download_type get_preferred_download_type() const { + return utils::download_type_from_string(preferred_download_type_, download_type::fallback); + } + + provider_type get_provider_type() const { return pt_; } + + std::uint8_t get_read_ahead_count() const { return std::max((std::uint8_t)1, read_ahead_count_); } + + std::uint8_t get_remote_client_pool_size() const { + return std::max((std::uint8_t)5u, remote_client_pool_size_); + } + + std::string get_remote_host_name_or_ip() const { return remote_host_name_or_ip_; } + + std::uint8_t get_remote_max_connections() const { + return std::max((std::uint8_t)1, remote_max_connections_); + } + + std::uint16_t get_remote_port() const { return remote_port_; } + + std::uint16_t get_remote_receive_timeout_secs() const { return remote_receive_timeout_secs_; } + + std::uint16_t get_remote_send_timeout_secs() const { return remote_send_timeout_secs_; } + + std::string get_remote_token() const { return remote_token_; } + + std::uint16_t get_retry_read_count() const { + return std::max(std::uint16_t(2), retry_read_count_); + } + + std::uint16_t get_ring_buffer_file_size() const { + return std::max((std::uint16_t)64, std::min((std::uint16_t)1024, ring_buffer_file_size_)); + } + + s3_config get_s3_config() const { return s3_config_; } + + skynet_config get_skynet_config() const { return skynet_config_; } + + api_currency get_storage_byte_month() const { return storage_byte_month_; } + + std::string get_value_by_name(const std::string &name); + + std::uint64_t get_version() const { return version_; } + + void save(); + + void set_api_auth(const std::string &api_auth) { set_value(api_auth_, api_auth); } + + void set_api_port(const std::uint16_t &api_port) { set_value(api_port_, api_port); } + + void set_api_user(const std::string &api_user) { set_value(api_user_, api_user); } + + void set_chunk_downloader_timeout_secs(const std::uint8_t &chunk_downloader_timeout_secs) { + set_value(download_timeout_secs_, chunk_downloader_timeout_secs); + } + + void set_enable_chunk_downloader_timeout(const bool &enable_chunk_downloader_timeout) { + set_value(enable_chunk_downloader_timeout_, enable_chunk_downloader_timeout); + } + + void set_enable_comm_duration_events(const bool &enable_comm_duration_events) { + set_value(enable_comm_duration_events_, enable_comm_duration_events); + } + + void set_enable_drive_events(const bool &enable_drive_events) { + set_value(enable_drive_events_, enable_drive_events); + } + + void set_enable_max_cache_size(const bool &enable_max_cache_size) { + set_value(enable_max_cache_size_, enable_max_cache_size); + } + +#ifdef _WIN32 + void set_enable_mount_manager(const bool &enable_mount_manager) { + set_value(enable_mount_manager_, enable_mount_manager); + } +#endif + + void set_enable_remote_mount(const bool &enable_remote_mount); + + void set_event_level(const event_level &level) { + if (set_value(event_level_, level)) { + event_system::instance().raise(event_level_to_string(level)); + } + } + + void set_eviction_delay_mins(const std::uint32_t &eviction_delay_mins) { + set_value(eviction_delay_mins_, eviction_delay_mins); + } + + void set_eviction_uses_accessed_time(const bool &eviction_uses_accessed_time) { + set_value(eviction_uses_accessed_time_, eviction_uses_accessed_time); + } + + void set_high_frequency_interval_secs(const std::uint8_t &high_frequency_interval_secs) { + set_value(high_freq_interval_secs_, high_frequency_interval_secs); + } + + void set_is_remote_mount(const bool &is_remote_mount); + + void set_low_frequency_interval_secs(const std::uint32_t &low_frequency_interval_secs) { + set_value(low_freq_interval_secs_, low_frequency_interval_secs); + } + + void set_max_cache_size_bytes(const std::uint64_t &max_cache_size_bytes) { + set_value(max_cache_size_bytes_, max_cache_size_bytes); + } + + void set_max_upload_count(const std::uint8_t &max_upload_count) { + set_value(max_upload_count_, max_upload_count); + } + + void set_minimum_redundancy(const double &minimum_redundancy) { + set_value(minimum_redundancy_, minimum_redundancy); + } + + void set_online_check_retry_secs(const std::uint16_t &online_check_retry_secs) { + set_value(online_check_retry_secs_, online_check_retry_secs); + } + + void set_orphaned_file_retention_days(const std::uint16_t &orphaned_file_retention_days) { + set_value(orphaned_file_retention_days_, orphaned_file_retention_days); + } + + void set_preferred_download_type(const download_type &dt) { + set_value(preferred_download_type_, utils::download_type_to_string(dt)); + } + + void set_read_ahead_count(const std::uint8_t &read_ahead_count) { + set_value(read_ahead_count_, read_ahead_count); + } + + void set_remote_client_pool_size(const std::uint8_t &remote_client_pool_size) { + set_value(remote_client_pool_size_, remote_client_pool_size); + } + + void set_ring_buffer_file_size(const std::uint16_t &ring_buffer_file_size) { + set_value(ring_buffer_file_size_, ring_buffer_file_size); + } + + void set_remote_host_name_or_ip(const std::string &remote_host_name_or_ip) { + set_value(remote_host_name_or_ip_, remote_host_name_or_ip); + } + + void set_remote_max_connections(const std::uint8_t &remote_max_connections) { + set_value(remote_max_connections_, remote_max_connections); + } + + void set_remote_port(const std::uint16_t &remote_port) { set_value(remote_port_, remote_port); } + + void set_remote_receive_timeout_secs(const std::uint16_t &remote_receive_timeout_secs) { + set_value(remote_receive_timeout_secs_, remote_receive_timeout_secs); + } + + void set_remote_send_timeout_secs(const std::uint16_t &remote_send_timeout_secs) { + set_value(remote_send_timeout_secs_, remote_send_timeout_secs); + } + + void set_remote_token(const std::string &remote_token) { set_value(remote_token_, remote_token); } + + void set_retry_read_count(const std::uint16_t &retry_read_count) { + set_value(retry_read_count_, retry_read_count); + } + + void set_storage_byte_month(const api_currency &storage_byte_month); + + std::string set_value_by_name(const std::string &name, const std::string &value); +}; +} // namespace repertory + +#endif // INCLUDE_APP_CONFIG_HPP_ diff --git a/include/cli/actions.hpp b/include/cli/actions.hpp new file mode 100644 index 00000000..c7734878 --- /dev/null +++ b/include/cli/actions.hpp @@ -0,0 +1,96 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_ACTIONS_HPP_ +#define INCLUDE_CLI_ACTIONS_HPP_ + +#include "common.hpp" +#include "cli/check_version.hpp" +#include "cli/display_config.hpp" +#include "cli/drive_information.hpp" +#include "cli/export.hpp" +#include "cli/export_all.hpp" +#include "cli/get.hpp" +#include "cli/get_directory_items.hpp" +#include "cli/get_pinned_files.hpp" +#include "cli/help.hpp" +#include "cli/import.hpp" +#include "cli/import_json.hpp" +#include "cli/mount.hpp" +#include "cli/open_files.hpp" +#include "cli/pin_file.hpp" +#include "cli/pinned_status.hpp" +#include "cli/set.hpp" +#include "cli/status.hpp" +#include "cli/test_skynet_auth.hpp" +#include "cli/unmount.hpp" +#include "cli/unpin_file.hpp" +#include "cli/version.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +typedef std::function + action; + +struct option_hasher { + std::size_t operator()(const utils::cli::option &opt) const { + return std::hash()(opt[0u] + '|' + opt[1u]); + } +}; + +static const std::unordered_map option_actions = { + {utils::cli::options::check_version_option, cli::actions::check_version}, + {utils::cli::options::display_config_option, cli::actions::display_config}, + {utils::cli::options::drive_information_option, cli::actions::drive_information}, + {utils::cli::options::export_option, cli::actions::export_action}, + {utils::cli::options::export_all_option, cli::actions::export_all}, + {utils::cli::options::get_directory_items_option, cli::actions::get_directory_items}, + {utils::cli::options::get_option, cli::actions::get}, + {utils::cli::options::get_pinned_files_option, cli::actions::get_pinned_files}, + {utils::cli::options::import_option, cli::actions::import}, + {utils::cli::options::import_json_option, cli::actions::import_json}, + {utils::cli::options::open_files_option, cli::actions::open_files}, + {utils::cli::options::pin_file_option, cli::actions::pin_file}, + {utils::cli::options::pinned_status_option, cli::actions::pinned_status}, + {utils::cli::options::set_option, cli::actions::set}, + {utils::cli::options::status_option, cli::actions::status}, +#if defined(REPERTORY_ENABLE_SKYNET) + {utils::cli::options::test_skynet_auth_option, cli::actions::test_skynet_auth}, +#endif + {utils::cli::options::unmount_option, cli::actions::unmount}, + {utils::cli::options::unpin_file_option, cli::actions::unpin_file}, +}; + +static exit_code perform_action(const utils::cli::option &opt, const int &argc, char *argv[], + const std::string &data_directory, const provider_type &pt, + const std::string &unique_id, std::string user, + std::string password) { + if (utils::cli::has_option(argc, argv, opt)) { + if (option_actions.find(opt) != option_actions.end()) { + return option_actions.at(opt)(argc, argv, data_directory, pt, unique_id, std::move(user), + std::move(password)); + } + } + + return exit_code::option_not_found; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_ACTIONS_HPP_ diff --git a/include/cli/check_version.hpp b/include/cli/check_version.hpp new file mode 100644 index 00000000..b408d080 --- /dev/null +++ b/include/cli/check_version.hpp @@ -0,0 +1,63 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_CHECK_VERSION_HPP_ +#define INCLUDE_CLI_CHECK_VERSION_HPP_ + +#include "common.hpp" +#include "comm/curl/curl_comm.hpp" +#include "app_config.hpp" +#include "types/repertory.hpp" + +namespace repertory::cli::actions { +static exit_code check_version(const int &, char *[], const std::string &data_directory, + const provider_type &pt, const std::string &, std::string, + std::string) { + auto ret = exit_code::success; + + if (not((pt == provider_type::remote) || (pt == provider_type::s3) || + (pt == provider_type::skynet))) { + app_config config(pt, data_directory); + curl_comm comm(config); + json data, err; + + if (comm.get("/daemon/version", data, err) == api_error::success) { + const auto res = utils::compare_version_strings(data["version"].get(), + app_config::get_provider_minimum_version(pt)); + if (res < 0) { + ret = exit_code::incompatible_version; + std::cerr << "Failed!" << std::endl; + std::cerr << " Actual: " << data["version"].get() << std::endl; + std::cerr << " Minimum: " << app_config::get_provider_minimum_version(pt) << std::endl; + } else { + std::cout << "Success!" << std::endl; + std::cout << " Actual: " << data["version"].get() << std::endl; + std::cout << " Minimum: " << app_config::get_provider_minimum_version(pt) << std::endl; + } + } else { + std::cerr << "Failed!" << std::endl; + std::cerr << err.dump(2) << std::endl; + ret = exit_code::communication_error; + } + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_CHECK_VERSION_HPP_ diff --git a/include/cli/display_config.hpp b/include/cli/display_config.hpp new file mode 100644 index 00000000..8602e75b --- /dev/null +++ b/include/cli/display_config.hpp @@ -0,0 +1,53 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_DISPLAY_CONFIG_HPP_ +#define INCLUDE_CLI_DISPLAY_CONFIG_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "platform/platform.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code display_config(const int &, char *[], const std::string &data_directory, + const provider_type &pt, const std::string &unique_id, + std::string user, std::string password) { + lock_data lock(pt, unique_id); + const auto res = lock.grab_lock(1u); + if (res == lock_result::success) { + app_config config(pt, data_directory); + const auto cfg = config.get_json(); + std::cout << 0 << std::endl; + std::cout << cfg.dump(2) << std::endl; + } else if (res == lock_result::locked) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).get_config(); + std::cout << static_cast(response.response_type) << std::endl; + std::cout << response.data.dump(2) << std::endl; + } + + return exit_code::success; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_DISPLAY_CONFIG_HPP_ diff --git a/include/cli/drive_information.hpp b/include/cli/drive_information.hpp new file mode 100644 index 00000000..979589aa --- /dev/null +++ b/include/cli/drive_information.hpp @@ -0,0 +1,53 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_DRIVE_INFORMATION_HPP_ +#define INCLUDE_CLI_DRIVE_INFORMATION_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "platform/platform.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code drive_information(const int &, char *[], const std::string &data_directory, + const provider_type &pt, const std::string &unique_id, + std::string user, std::string password) { + auto ret = exit_code::success; + + lock_data lock(pt, unique_id); + const auto res = lock.grab_lock(1u); + if (res == lock_result::locked) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).get_drive_information(); + std::cout << static_cast(response.response_type) << std::endl; + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << app_config::get_provider_display_name(pt) << " is not mounted." << std::endl; + ret = exit_code::not_mounted; + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_DRIVE_INFORMATION_HPP_ diff --git a/include/cli/export.hpp b/include/cli/export.hpp new file mode 100644 index 00000000..6b0598f2 --- /dev/null +++ b/include/cli/export.hpp @@ -0,0 +1,53 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_EXPORT_HPP_ +#define INCLUDE_CLI_EXPORT_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code export_action(const int &argc, char *argv[], const std::string &data_directory, + const provider_type &pt, const std::string &, std::string user, + std::string password) { + std::string data; + auto ret = utils::cli::parse_string_option(argc, argv, + repertory::utils::cli::options::export_option, data); + if (ret == exit_code::success) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = + client({"localhost", password, port, user}).export_list(utils::string::split(data, ',')); + if (response.response_type == rpc_response_type::success) { + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << response.data.dump(2) << std::endl; + ret = exit_code::export_failed; + } + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_EXPORT_HPP_ diff --git a/include/cli/export_all.hpp b/include/cli/export_all.hpp new file mode 100644 index 00000000..456c6024 --- /dev/null +++ b/include/cli/export_all.hpp @@ -0,0 +1,49 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_EXPORT_ALL_HPP_ +#define INCLUDE_CLI_EXPORT_ALL_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "types/skynet.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code export_all(const int &, char *[], const std::string &data_directory, + const provider_type &pt, const std::string &, std::string user, + std::string password) { + auto ret = exit_code::success; + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).export_all(); + if (response.response_type == rpc_response_type::success) { + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << response.data.dump(2) << std::endl; + ret = exit_code::export_failed; + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_EXPORT_ALL_HPP_ diff --git a/include/cli/get.hpp b/include/cli/get.hpp new file mode 100644 index 00000000..de56b6de --- /dev/null +++ b/include/cli/get.hpp @@ -0,0 +1,60 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_GET_HPP_ +#define INCLUDE_CLI_GET_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "platform/platform.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code get(const int &argc, char *argv[], const std::string &data_directory, + const provider_type &pt, const std::string &unique_id, std::string user, + std::string password) { + std::string data; + auto ret = + utils::cli::parse_string_option(argc, argv, repertory::utils::cli::options::get_option, data); + if (ret == exit_code::success) { + lock_data lock(pt, unique_id); + const auto res = lock.grab_lock(1); + if (res == lock_result::success) { + app_config config(pt, data_directory); + const auto value = config.get_value_by_name(data); + std::cout << (value.empty() ? static_cast(rpc_response_type::config_value_not_found) : 0) + << std::endl; + std::cout << json({{"value", value}}).dump(2) << std::endl; + } else if (res == lock_result::locked) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = + client({"localhost", password, port, user}).get_config_value_by_name(data); + std::cout << static_cast(response.response_type) << std::endl; + std::cout << response.data.dump(2) << std::endl; + } + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_GET_HPP_ diff --git a/include/cli/get_directory_items.hpp b/include/cli/get_directory_items.hpp new file mode 100644 index 00000000..e7e2ceae --- /dev/null +++ b/include/cli/get_directory_items.hpp @@ -0,0 +1,53 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_GET_DIRECTORY_ITEMS_HPP_ +#define INCLUDE_CLI_GET_DIRECTORY_ITEMS_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "types/skynet.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code get_directory_items(const int &argc, char *argv[], + const std::string &data_directory, const provider_type &pt, + const std::string &, std::string user, std::string password) { + std::string data; + auto ret = utils::cli::parse_string_option( + argc, argv, repertory::utils::cli::options::get_directory_items_option, data); + if (ret == exit_code::success) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).get_directory_items(data); + if (response.response_type == rpc_response_type::success) { + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << response.data.dump(2) << std::endl; + ret = exit_code::export_failed; + } + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_GETDIRECTORYITEMS_HPP_ diff --git a/include/cli/get_pinned_files.hpp b/include/cli/get_pinned_files.hpp new file mode 100644 index 00000000..1395ad9d --- /dev/null +++ b/include/cli/get_pinned_files.hpp @@ -0,0 +1,48 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_GET_PINNED_FILES_HPP_ +#define INCLUDE_CLI_GET_PINNED_FILES_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code get_pinned_files(const int &, char *[], const std::string &data_directory, + const provider_type &pt, const std::string &, std::string user, + std::string password) { + auto ret = exit_code::success; + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).get_pinned_files(); + if (response.response_type == rpc_response_type::success) { + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << response.data.dump(2) << std::endl; + ret = exit_code::export_failed; + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_GET_PINNED_FILES_HPP_ diff --git a/include/cli/help.hpp b/include/cli/help.hpp new file mode 100644 index 00000000..001e4522 --- /dev/null +++ b/include/cli/help.hpp @@ -0,0 +1,106 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_HELP_HPP_ +#define INCLUDE_CLI_HELP_HPP_ + +#include "common.hpp" + +namespace repertory::cli::actions { +template static void help(const int &argc, char *argv[]) { + drive::display_options(argc, argv); + std::cout << "Repertory options:" << std::endl; + std::cout << " -cv,--check_version Check daemon version compatibility" + << std::endl; + std::cout << " -dc,--display_config Display configuration" << std::endl; + std::cout << " -dd,--data_directory [directory] Override data directory" << std::endl; + std::cout << " -di,--drive_information Display mounted drive information" + << std::endl; +#if defined(REPERTORY_ENABLE_SKYNET) + std::cout << " -ea,--export_all Export all Skynet skylinks" << std::endl; + std::cout << " -ex,--export [path1,path2,...] Export one or more Skynet skylinks" + << std::endl; +#endif // defined(REPERTORY_ENABLE_SKYNET) +#if defined(REPERTORY_ENABLE_S3) + std::cout << " -s3,--s3 Enables S3 mode" << std::endl; + std::cout << " -na,--name Unique name for S3 instance [Required]" + << std::endl; +#endif // defined(REPERTORY_ENABLE_S3) + std::cout << " -gc,--generate_config Generate initial configuration" << std::endl; + std::cout << " -get,--get [name] Get configuration value" << std::endl; + std::cout << " -gdi,--get_directory_items Get directory list in json format" + << std::endl + << " [API path]" << std::endl; + std::cout << " -gpf,--get_pinned_files Get a list of all pinned files" << std::endl; + std::cout << " -gt,--generate_template Generate configuration template" << std::endl; +#if defined(REPERTORY_ENABLE_SKYNET) + std::cout << " -ij,--import_json [json_array] Import Skynet skylink(s)" << std::endl; + std::cout << " [json_array] format:" << std::endl; + std::cout << " [{" << std::endl; + std::cout << R"( "directory": "/parent",)" << std::endl; + std::cout << R"( "skylink": "AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA",)" + << std::endl; + std::cout << R"( "token": "encryption password")" << std::endl; + std::cout << " }]" << std::endl; + std::cout << " NOTE: 'directory' and 'token' are optional" << std::endl; + std::cout << " -im,--import [list] Import Skynet skylink(s)" << std::endl; + std::cout << " [list] format:" << std::endl; + std::cout << " directory=:skylink=:token=;..." << std::endl; + std::cout << std::endl; + std::cout << " NOTE: 'directory' and 'token' are optional" << std::endl; + std::cout << " NOTE: Use '@sem@' to escape a ';'" << std::endl; + std::cout << " Use '@comma@' to escape a ','" << std::endl; + std::cout << " Use '@equal@' to escape an '='" << std::endl; + std::cout << " Use '@dbl_quote@' to escape a '\"'" << std::endl; +#endif // defined(REPERTORY_ENABLE_SKYNET) + std::cout << " -nc Force disable console output" << std::endl; + std::cout << " -of,--open_files List all open files and count" << std::endl; + std::cout << " -rm,--remote_mount [host/ip:port] Enables remote mount mode" << std::endl; + std::cout << " -pf,--pin_file [API path] Pin a file to cache to prevent eviction" + << std::endl; + std::cout << " -ps,--pinned_status [API path] Return pinned status for a file" << std::endl; + std::cout << " -pw,--password Specify API password" << std::endl; +#if defined(REPERTORY_ENABLE_SKYNET) + std::cout << " -sk,--skynet [EXPERIMENTAL] Enables Skynet mode" + << std::endl; +#endif // defined(REPERTORY_ENABLE_SKYNET) +#ifndef _WIN32 +#if defined(REPERTORY_ENABLE_S3) + std::cout << " -o s3 Enables S3 mode for 'fstab' mounts" + << std::endl; +#endif // defined(REPERTORY_ENABLE_S3) +#if defined(REPERTORY_ENABLE_SKYNET) + std::cout << " -o sk,-o skynet Enables Skynet mode for 'fstab' mounts" + << std::endl; +#endif // defined(REPERTORY_ENABLE_SKYNET) +#endif // _WIN32 + std::cout << " -set,--set [name] [value] Set configuration value" << std::endl; + std::cout << " -status Display mount status" << std::endl; +#if defined(REPERTORY_ENABLE_SKYNET) + std::cout << " -tsa,--test_skynet_auth Test Skynet portal authentication" + << std::endl; + std::cout << " [URL] [user] [password] [agent string] [API key]" << std::endl; +#endif // defined(REPERTORY_ENABLE_SKYNET) + std::cout << " -unmount,--unmount Unmount and shutdown" << std::endl; + std::cout << " -uf,--unpin_file [API path] Unpin a file from cache to allow eviction" + << std::endl; + std::cout << " -us,--user Specify API user name" << std::endl; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_HELP_HPP_ diff --git a/include/cli/import.hpp b/include/cli/import.hpp new file mode 100644 index 00000000..8d59b2b0 --- /dev/null +++ b/include/cli/import.hpp @@ -0,0 +1,62 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_IMPORT_HPP_ +#define INCLUDE_CLI_IMPORT_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "types/skynet.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code import(const int &argc, char *argv[], const std::string &data_directory, + const provider_type &pt, const std::string &, std::string user, + std::string password) { + std::string data; + auto ret = utils::cli::parse_string_option(argc, argv, + repertory::utils::cli::options::import_option, data); + if (ret == exit_code::success) { + utils::string::replace(data, "@dbl_quote@", "\""); + const auto parts = utils::string::split(data, ';'); + skylink_import_list list; + for (const auto &part : parts) { + list.emplace_back( + skylink_import::from_string(utils::string::replace_copy(part, "@sem@", ";"))); + } + + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).import_skylink(list); + std::cout << static_cast(response.response_type) << std::endl; + if (response.response_type == rpc_response_type::success) { + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << response.data.dump(2) << std::endl; + ret = exit_code::import_failed; + } + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_IMPORT_HPP_ diff --git a/include/cli/import_json.hpp b/include/cli/import_json.hpp new file mode 100644 index 00000000..4bf6c999 --- /dev/null +++ b/include/cli/import_json.hpp @@ -0,0 +1,68 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_IMPORT_JSON_HPP_ +#define INCLUDE_CLI_IMPORT_JSON_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "types/skynet.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code import_json(const int &argc, char *argv[], const std::string &data_directory, + const provider_type &pt, const std::string &, std::string user, + std::string password) { + std::string data; + auto ret = utils::cli::parse_string_option(argc, argv, {"-ij", "--import_json"}, data); + if (ret == exit_code::success) { + utils::string::replace(data, "@dbl_quote@", "\""); + + skylink_import_list list; + try { + const auto json_data = json::parse(data); + for (const auto &j : json_data) { + list.emplace_back(skylink_import::from_json(j)); + } + } catch (const std::exception &e) { + std::cerr << "Import JSON failed:" << std::endl << e.what() << std::endl; + ret = exit_code::import_failed; + } + + if (not list.empty()) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).import_skylink(list); + std::cout << static_cast(response.response_type) << std::endl; + if (response.response_type == rpc_response_type::success) { + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << response.data.dump(2) << std::endl; + ret = exit_code::import_failed; + } + } + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_IMPORT_JSON_HPP_ diff --git a/include/cli/mount.hpp b/include/cli/mount.hpp new file mode 100644 index 00000000..685ca86a --- /dev/null +++ b/include/cli/mount.hpp @@ -0,0 +1,159 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_MOUNT_HPP_ +#define INCLUDE_CLI_MOUNT_HPP_ + +#include "common.hpp" +#include "platform/platform.hpp" +#include "providers/provider.hpp" +#include "types/repertory.hpp" +#include "utils/cli_utils.hpp" +#include "utils/com_init_wrapper.hpp" +#include "utils/file_utils.hpp" + +#ifdef _WIN32 +#include "drives/winfsp/remotewinfsp/remote_client.hpp" +#include "drives/winfsp/remotewinfsp/remote_winfsp_drive.hpp" +#include "drives/winfsp/winfsp_drive.hpp" + +typedef repertory::winfsp_drive repertory_drive; +typedef repertory::remote_winfsp::remote_client remote_client; +typedef repertory::remote_winfsp::remote_winfsp_drive remote_drive; +typedef repertory::remote_winfsp::i_remote_instance remote_instance; +#else +#include "drives/fuse/fuse_drive.hpp" +#include "drives/fuse/remotefuse/remote_client.hpp" +#include "drives/fuse/remotefuse/remote_fuse_drive.hpp" + +typedef repertory::fuse_drive repertory_drive; +typedef repertory::remote_fuse::remote_client remote_client; +typedef repertory::remote_fuse::remote_fuse_drive remote_drive; +typedef repertory::remote_fuse::i_remote_instance remote_instance; +#endif + +namespace repertory::cli::actions { +static exit_code mount(const int &argc, char *argv[], std::string data_directory, int &mount_result, + provider_type pt, const std::string &remote_host, + const std::uint16_t &remote_port, const std::string &unique_id) { + auto ret = exit_code::success; + + lock_data lock(pt, unique_id); + const auto res = lock.grab_lock(); + if (res == lock_result::locked) { + ret = exit_code::mount_active; + std::cerr << app_config::get_provider_display_name(pt) << " mount is already active" + << std::endl; + } else if (res == lock_result::success) { + curl_global_init(CURL_GLOBAL_DEFAULT); + { + const auto generate_config = + utils::cli::has_option(argc, argv, utils::cli::options::generate_config_option); + if (generate_config) { + app_config config(pt, data_directory); + if (pt == provider_type::remote) { + config.set_enable_remote_mount(false); + config.set_is_remote_mount(true); + config.set_remote_host_name_or_ip(remote_host); + config.set_remote_port(remote_port); + } + std::cout << "Generated " << app_config::get_provider_display_name(pt) << " Configuration" + << std::endl; + std::cout << config.get_config_file_path() << std::endl; + ret = utils::file::is_file(config.get_config_file_path()) ? exit_code::success + : exit_code::file_creation_failed; + } else { +#ifdef _WIN32 + if (utils::cli::has_option(argc, argv, utils::cli::options::hidden_option)) { + ::ShowWindow(::GetConsoleWindow(), SW_HIDE); + } +#endif + const auto driveArgs = utils::cli::parse_drive_options(argc, argv, pt, data_directory); + std::cout << "Initializing " << app_config::get_provider_display_name(pt) + << (unique_id.empty() ? "" + : (pt == provider_type::s3) + ? " [" + unique_id + ']' + : " [" + remote_host + ':' + std::to_string(remote_port) + ']') + << " Drive" << std::endl; + app_config config(pt, data_directory); + if (pt == provider_type::remote) { + std::uint16_t port = 0u; + if (utils::get_next_available_port(config.get_api_port(), port)) { + config.set_remote_host_name_or_ip(remote_host); + config.set_remote_port(remote_port); + config.set_api_port(port); + config.set_is_remote_mount(true); + config.set_enable_remote_mount(false); + config.save(); + try { + remote_drive drive(config, lock, [&config]() -> std::unique_ptr { + return std::unique_ptr(new remote_client(config)); + }); + lock.set_mount_state(true, "", -1); + mount_result = drive.mount(driveArgs); + ret = exit_code::mount_result; + } catch (const std::exception &e) { + std::cerr << "FATAL: " << e.what() << std::endl; + ret = exit_code::startup_exception; + } + } else { + std::cerr << "FATAL: Unable to get available port" << std::endl; + ret = exit_code::startup_exception; + } + } else { +#ifdef _WIN32 + if (config.get_enable_mount_manager() && not utils::is_process_elevated()) { + com_init_wrapper cw; + lock.set_mount_state(true, "elevating", -1); + lock.release(); + + mount_result = utils::run_process_elevated(argc, argv); + lock_data lockData2(pt, unique_id); + if (lockData2.grab_lock() == lock_result::success) { + lockData2.set_mount_state(false, "", -1); + lockData2.release(); + } + + return exit_code::mount_result; + } +#endif + config.set_is_remote_mount(false); + + try { + auto provider = create_provider(pt, config); + repertory_drive drive(config, lock, *provider); + lock.set_mount_state(true, "", -1); + mount_result = drive.mount(driveArgs); + ret = exit_code::mount_result; + } catch (const std::exception &e) { + std::cerr << "FATAL: " << e.what() << std::endl; + ret = exit_code::startup_exception; + } + } + } + } + curl_global_cleanup(); + } else { + ret = exit_code::lock_failed; + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_MOUNT_HPP_ diff --git a/include/cli/open_files.hpp b/include/cli/open_files.hpp new file mode 100644 index 00000000..85bccf4a --- /dev/null +++ b/include/cli/open_files.hpp @@ -0,0 +1,52 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_OPEN_FILES_HPP_ +#define INCLUDE_CLI_OPEN_FILES_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "platform/platform.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code open_files(const int &, char *[], const std::string &data_directory, + const provider_type &pt, const std::string &unique_id, std::string user, + std::string password) { + auto ret = exit_code::success; + lock_data lock(pt, unique_id); + const auto res = lock.grab_lock(1u); + if (res == lock_result::locked) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).get_open_files(); + std::cout << static_cast(response.response_type) << std::endl; + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << app_config::get_provider_display_name(pt) << " is not mounted." << std::endl; + ret = exit_code::not_mounted; + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_OPEN_FILES_HPP_ diff --git a/include/cli/pin_file.hpp b/include/cli/pin_file.hpp new file mode 100644 index 00000000..4da7ab8a --- /dev/null +++ b/include/cli/pin_file.hpp @@ -0,0 +1,53 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_PIN_FILE_HPP_ +#define INCLUDE_CLI_PIN_FILE_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "types/skynet.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code pin_file(const int &argc, char *argv[], const std::string &data_directory, + const provider_type &pt, const std::string &, std::string user, + std::string password) { + std::string data; + auto ret = utils::cli::parse_string_option(argc, argv, + repertory::utils::cli::options::pin_file_option, data); + if (ret == exit_code::success) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).pin_file(data); + if (response.response_type == rpc_response_type::success) { + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << response.data.dump(2) << std::endl; + ret = exit_code::pin_failed; + } + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_PIN_FILE_HPP_ diff --git a/include/cli/pinned_status.hpp b/include/cli/pinned_status.hpp new file mode 100644 index 00000000..2d8803d1 --- /dev/null +++ b/include/cli/pinned_status.hpp @@ -0,0 +1,53 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_PINNED_STATUS_HPP_ +#define INCLUDE_CLI_PINNED_STATUS_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "types/skynet.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code pinned_status(const int &argc, char *argv[], const std::string &data_directory, + const provider_type &pt, const std::string &, std::string user, + std::string password) { + std::string data; + auto ret = utils::cli::parse_string_option( + argc, argv, repertory::utils::cli::options::pinned_status_option, data); + if (ret == exit_code::success) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).pinned_status(data); + if (response.response_type == rpc_response_type::success) { + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << response.data.dump(2) << std::endl; + ret = exit_code::export_failed; + } + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_PINNED_STATUS_HPP_ diff --git a/include/cli/set.hpp b/include/cli/set.hpp new file mode 100644 index 00000000..44b91ffc --- /dev/null +++ b/include/cli/set.hpp @@ -0,0 +1,72 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_SET_HPP_ +#define INCLUDE_CLI_SET_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "platform/platform.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code set(const int &argc, char *argv[], const std::string &data_directory, + const provider_type &pt, const std::string &unique_id, std::string user, + std::string password) { + auto ret = exit_code::success; + auto data = utils::cli::parse_option(argc, argv, "-set", 2u); + if (data.empty()) { + data = utils::cli::parse_option(argc, argv, "--set", 2u); + if (data.empty()) { + ret = exit_code::invalid_syntax; + std::cerr << "Invalid syntax for '-set'" << std::endl; + } + } + if (ret == exit_code::success) { + lock_data lock(pt, unique_id); + const auto res = lock.grab_lock(1u); + if (res == lock_result::success) { + app_config config(pt, data_directory); + const auto value = config.set_value_by_name(data[0u], data[1u]); + const auto notFound = value.empty() && not data[1u].empty(); + ret = notFound ? exit_code::set_option_not_found : exit_code::success; + std::cout << (notFound ? static_cast(rpc_response_type::config_value_not_found) : 0) + << std::endl; + std::cout << json({{"value", value}}).dump(2) << std::endl; + } else if (res == lock_result::locked) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = + client({"localhost", password, port, user}).set_config_value_by_name(data[0u], data[1u]); + std::cout << static_cast(response.response_type) << std::endl; + std::cout << response.data.dump(2) << std::endl; + ret = response.response_type == rpc_response_type::config_value_not_found + ? exit_code::set_option_not_found + : response.response_type == rpc_response_type::success ? exit_code::success + : exit_code::communication_error; + } + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_SET_HPP_ diff --git a/include/cli/status.hpp b/include/cli/status.hpp new file mode 100644 index 00000000..159d55cf --- /dev/null +++ b/include/cli/status.hpp @@ -0,0 +1,44 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_STATUS_HPP_ +#define INCLUDE_CLI_STATUS_HPP_ + +#include "common.hpp" +#include "platform/platform.hpp" +#include "types/repertory.hpp" + +namespace repertory::cli::actions { +static exit_code status(const int &, char *[], const std::string &, const provider_type &pt, + const std::string &unique_id, std::string, std::string) { + auto ret = exit_code::success; + lock_data lock(pt, unique_id); + lock.grab_lock(10u); + json mount_state; + if (lock.get_mount_state(mount_state)) { + std::cout << mount_state.dump(2) << std::endl; + } else { + std::cout << "{}" << std::endl; + ret = exit_code::failed_to_get_mount_state; + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_STATUS_HPP_ diff --git a/include/cli/test_skynet_auth.hpp b/include/cli/test_skynet_auth.hpp new file mode 100644 index 00000000..a463a93e --- /dev/null +++ b/include/cli/test_skynet_auth.hpp @@ -0,0 +1,91 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_TEST_SKYNET_AUTH_HPP_ +#define INCLUDE_CLI_TEST_SKYNET_AUTH_HPP_ +#ifdef REPERTORY_ENABLE_SKYNET + +#include "common.hpp" +#include "comm/curl/curl_comm.hpp" +#include "app_config.hpp" +#include "events/consumers/console_consumer.hpp" +#include "events/event_system.hpp" +#include "types/repertory.hpp" +#include "utils/cli_utils.hpp" +#include "utils/file_utils.hpp" +#include "utils/path_utils.hpp" +#include "utils/utils.hpp" + +namespace repertory::cli::actions { +static exit_code test_skynet_auth(const int &argc, char *argv[], const std::string &, + const provider_type &, const std::string &, std::string, + std::string) { + auto ret = exit_code::success; + auto data = utils::cli::parse_option(argc, argv, "-tsa", 5u); + if (data.empty()) { + data = utils::cli::parse_option(argc, argv, "--test_skynet_auth", 5u); + if (data.empty()) { + ret = exit_code::invalid_syntax; + std::cerr << "Invalid syntax for '-tsa'" << std::endl; + } + } + + const auto uuid = utils::create_uuid_string(); + const auto config_directory = utils::path::absolute(utils::path::combine("./", {uuid})); + if (ret == exit_code::success) { + utils::file::change_to_process_directory(); + { + console_consumer c; + event_system::instance().start(); + app_config config(provider_type::skynet, config_directory); + + host_config hc{}; + hc.auth_url = data[0]; + hc.auth_user = data[1]; + hc.auth_password = data[2]; + hc.agent_string = data[3]; + hc.api_password = data[4]; + + curl_comm comm(config); + std::string session; + CURL *curl_handle = nullptr; + ret = (comm.create_auth_session(curl_handle, config, hc, session)) + ? exit_code::success + : exit_code::communication_error; + if (ret == exit_code::success) { + curl_easy_cleanup(curl_handle); + comm.release_auth_session(config, hc, session); + } + + event_system::instance().stop(); + } + + if (ret == exit_code::success) { + std::cout << std::endl << "Authentication Succeeded!" << std::endl; + } else { + std::cerr << std::endl << "Authentication Failed!" << std::endl; + } + } + utils::file::delete_directory_recursively(config_directory); + + return ret; +} +} // namespace repertory::cli::actions + +#endif // REPERTORY_ENABLE_SKYNET +#endif // INCLUDE_CLI_TEST_SKYNET_AUTH_HPP_ diff --git a/include/cli/unmount.hpp b/include/cli/unmount.hpp new file mode 100644 index 00000000..2cda32f8 --- /dev/null +++ b/include/cli/unmount.hpp @@ -0,0 +1,49 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_UNMOUNT_HPP_ +#define INCLUDE_CLI_UNMOUNT_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code unmount(const int &, char *[], const std::string &data_directory, + const provider_type &pt, const std::string &, std::string user, + std::string password) { + auto ret = exit_code::success; + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).unmount(); + std::cout << static_cast(response.response_type) << std::endl; + if (response.response_type == rpc_response_type::success) { + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << response.data.dump(2) << std::endl; + ret = exit_code::communication_error; + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_UNMOUNT_HPP_ diff --git a/include/cli/unpin_file.hpp b/include/cli/unpin_file.hpp new file mode 100644 index 00000000..012ca997 --- /dev/null +++ b/include/cli/unpin_file.hpp @@ -0,0 +1,53 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_UNPIN_FILE_HPP_ +#define INCLUDE_CLI_UNPIN_FILE_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "rpc/client/client.hpp" +#include "types/repertory.hpp" +#include "types/rpc.hpp" +#include "types/skynet.hpp" +#include "utils/cli_utils.hpp" + +namespace repertory::cli::actions { +static exit_code unpin_file(const int &argc, char *argv[], const std::string &data_directory, + const provider_type &pt, const std::string &, std::string user, + std::string password) { + std::string data; + auto ret = utils::cli::parse_string_option( + argc, argv, repertory::utils::cli::options::unpin_file_option, data); + if (ret == exit_code::success) { + auto port = app_config::default_api_port(pt); + utils::cli::get_api_authentication_data(user, password, port, pt, data_directory); + const auto response = client({"localhost", password, port, user}).unpin_file(data); + if (response.response_type == rpc_response_type::success) { + std::cout << response.data.dump(2) << std::endl; + } else { + std::cerr << response.data.dump(2) << std::endl; + ret = exit_code::unpin_failed; + } + } + + return ret; +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_UNPIN_FILE_HPP_ diff --git a/include/cli/version.hpp b/include/cli/version.hpp new file mode 100644 index 00000000..05addc9f --- /dev/null +++ b/include/cli/version.hpp @@ -0,0 +1,32 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_CLI_VERSION_HPP_ +#define INCLUDE_CLI_VERSION_HPP_ + +#include "common.hpp" + +namespace repertory::cli::actions { +template static void version(const int &argc, char *argv[]) { + std::cout << "Repertory core version: " << get_repertory_version() << std::endl; + std::cout << "Repertory Git revision: " << get_repertory_git_revision() << std::endl; + drive::display_version_information(argc, argv); +} +} // namespace repertory::cli::actions + +#endif // INCLUDE_CLI_VERSION_HPP_ diff --git a/include/comm/aws_s3/aws_s3_comm.hpp b/include/comm/aws_s3/aws_s3_comm.hpp new file mode 100644 index 00000000..de483ad6 --- /dev/null +++ b/include/comm/aws_s3/aws_s3_comm.hpp @@ -0,0 +1,124 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_AWS_S3_AWS_S3_COMM_HPP_ +#define INCLUDE_COMM_AWS_S3_AWS_S3_COMM_HPP_ +#if defined(REPERTORY_ENABLE_S3) + +#include "common.hpp" +#include "comm/i_s3_comm.hpp" + +namespace repertory { +class app_config; +class aws_s3_comm final : public virtual i_s3_comm { +public: + explicit aws_s3_comm(const app_config &config); + + ~aws_s3_comm() override; + +private: + struct cache_entry final { + std::chrono::system_clock::time_point expiration; + directory_item_list items; + + void reset_timeout(std::chrono::seconds timeout) { + timeout = std::max(std::chrono::seconds(5u), timeout); + expiration = std::chrono::system_clock::now() + timeout; + } + }; + +private: + const app_config &config_; + s3_config s3_config_; + Aws::SDKOptions sdk_options_; + std::unique_ptr s3_client_; + mutable std::recursive_mutex cached_directories_mutex_; + mutable std::unordered_map cached_directories_; + +private: + void clear_expired_directories(); + + bool get_cached_directory_item_count(const std::string &api_path, std::size_t &count) const; + + bool get_cached_directory_items(const std::string &api_path, + const meta_provider_callback &meta_provider, + directory_item_list &list) const; + + bool get_cached_file_exists(const std::string &api_path, bool &exists) const; + + api_error grab_directory_items(const std::string &api_path, + const meta_provider_callback &meta_provider, + directory_item_list &list) const; + + api_error get_file_list(const std::string &bucket_name, + const get_api_file_token_callback &get_api_file_token, + const get_name_callback &get_name, api_file_list &list) const; + + void remove_cached_directory(const std::string &api_path); + + void set_cached_directory_items(const std::string &api_path, directory_item_list list) const; + +public: + api_error create_bucket(const std::string &api_path) override; + + bool exists(const std::string &api_path, const get_key_callback &get_key) const override; + + void get_bucket_name_and_object_name(const std::string &api_path, const get_key_callback &getKey, + std::string &bucketName, + std::string &objectName) const override; + + std::size_t get_directory_item_count(const std::string &api_path, + const meta_provider_callback &meta_provider) const override; + + api_error get_directory_items(const std::string &api_path, + const meta_provider_callback &meta_provider, + directory_item_list &list) const override; + + api_error get_file(const std::string &api_path, const get_key_callback &get_key, + const get_name_callback &get_name, const get_token_callback &get_token, + api_file &file) const override; + + api_error get_file_list(const get_api_file_token_callback &get_api_file_token, + const get_name_callback &get_name, api_file_list &list) const override; + + s3_config get_s3_config() override { return s3_config_; } + + s3_config get_s3_config() const override { return s3_config_; } + + bool is_online() const override { return s3_client_->ListBuckets().IsSuccess(); } + + api_error read_file_bytes(const std::string &api_path, const std::size_t &size, + const std::uint64_t &offset, std::vector &data, + const get_key_callback &get_key, const get_size_callback &get_size, + const get_token_callback &get_token, + const bool &stop_requested) const override; + + api_error remove_bucket(const std::string &api_path) override; + + api_error remove_file(const std::string &api_path, const get_key_callback &get_key) override; + + api_error rename_file(const std::string &api_path, const std::string &new_api_path) override; + + api_error upload_file(const std::string &api_path, const std::string &source_path, + const std::string &encryption_token, const get_key_callback &get_key, + const set_key_callback &set_key, const bool &stop_requested) override; +}; +} // namespace repertory + +#endif // REPERTORY_ENABLE_S3 +#endif // INCLUDE_COMM_AWS_S3_AWS_S3_COMM_HPP_ diff --git a/include/comm/curl/curl_comm.hpp b/include/comm/curl/curl_comm.hpp new file mode 100644 index 00000000..37dd97a4 --- /dev/null +++ b/include/comm/curl/curl_comm.hpp @@ -0,0 +1,270 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_CURL_CURL_COMM_HPP_ +#define INCLUDE_COMM_CURL_CURL_COMM_HPP_ + +#include "common.hpp" +#include "comm/curl/multi_request.hpp" +#include "comm/curl/session_manager.hpp" +#include "comm/i_comm.hpp" +#include "app_config.hpp" + +namespace repertory { +class curl_resolver; +namespace utils::encryption { +class encrypting_reader; +} +struct curl_setup; +struct raw_write_data; + +class curl_comm : public virtual i_comm { +public: + typedef size_t (*curl_read_callback)(char *, size_t, size_t, void *); + typedef size_t (*curl_write_callback)(char *, size_t, size_t, void *); + + static curl_read_callback read_data_callback_; + static curl_write_callback write_data_callback_; + static curl_write_callback write_header_callback_; + static curl_write_callback write_null_callback_; + static curl_write_callback write_string_callback_; + +public: + explicit curl_comm(const app_config &config) : config_(config) {} + + ~curl_comm() override = default; + +private: + const app_config &config_; + session_manager session_manager_; + +public: + static std::string construct_url(CURL *curl_handle, const std::string &relative_path, + const host_config &hc); + + static bool create_auth_session(CURL *&curl_handle, const app_config &config, host_config hc, + std::string &session); + + static std::string http_range_to_string(const http_range &range); + + static void release_auth_session(const app_config &config, host_config hc, + const std::string &session); + + static void update_auth_session(CURL *curl_handle, const app_config &config, + const std::string &session); + +private: + CURL *common_curl_setup(const std::string &path, curl_setup &setup, std::string &url, + std::string &fields); + + CURL *common_curl_setup(CURL *curl_handle, const std::string &path, curl_setup &setup, + std::string &url, std::string &fields); + + template + api_error execute_binary_operation(CURL *curl_handle, const std::string &url, + std::vector &data, json &error, + const bool &stop_requested, + const CURLcode &default_code = CURLE_OK) { + auto curl_code = default_code; + long http_code = 400; + execute_operation(curl_handle, url, curl_code, http_code, stop_requested); + + const auto ret = process_binary_response(url, curl_code, http_code, data, error); + if (config_.get_event_level() >= end::level) { + event_system::instance().raise(url, curl_code, http_code, + ((ret == api_error::success) ? "" : error.dump(2))); + } + + return ret; + } + + template + api_error execute_json_operation(CURL *curl_handle, const std::string &url, + const std::string &result, json &data, json &error, + const bool &stop_requested, + const CURLcode &default_code = CURLE_OK) { + auto curl_code = default_code; + long http_code = 400; + execute_operation(curl_handle, url, curl_code, http_code, stop_requested); + + const auto ret = process_json_response(url, curl_code, http_code, result, data, error); + if (config_.get_event_level() >= end::level) { + event_system::instance().raise(url, curl_code, http_code, + ((ret == api_error::success) ? "" : error.dump(2))); + } + + return ret; + } + + template + void execute_operation(CURL *curl_handle, const std::string &url, CURLcode &curl_code, + long &http_code, const bool &stop_requested) { + if (config_.get_event_level() >= begin::level) { + event_system::instance().raise(url); + } + + if (curl_code == CURLE_OK) { + multi_request request(curl_handle, stop_requested); + request.get_result(curl_code, http_code); + } + } + + api_error get_or_post(const host_config &hc, const bool &post, const std::string &path, + const http_parameters ¶meters, json &data, json &error, + http_headers *headers = nullptr, + std::function cb = nullptr); + + api_error get_range(const host_config &hc, const std::string &path, + const std::uint64_t &data_size, const http_parameters ¶meters, + const std::string &encryption_token, std::vector &data, + const http_ranges &ranges, json &error, http_headers *headers, + const bool &stop_requested); + + api_error get_range_unencrypted(const host_config &hc, const std::string &path, + const http_parameters ¶meters, std::vector &data, + const http_ranges &ranges, json &error, http_headers *headers, + const bool &stop_requested); + + api_error process_binary_response(const std::string &url, const CURLcode &res, + const long &http_code, std::vector data, json &error); + + api_error process_json_response(const std::string &url, const CURLcode &res, + const long &http_code, const std::string &result, json &data, + json &error); + + api_error process_response(const std::string &url, const CURLcode &res, const long &http_code, + const std::size_t &data_size, + const std::function &to_string_converter, + const std::function &success_handler, json &error) const; + + static std::string url_encode(CURL *curl_handle, const std::string &data, + const bool &allow_slash = false); + +public: + api_error get(const std::string &path, json &data, json &error) override { + return get_or_post(config_.get_host_config(), false, path, {}, data, error); + } + + api_error get(const host_config &hc, const std::string &path, json &data, json &error) override { + return get_or_post(hc, false, path, {}, data, error); + } + + api_error get(const std::string &path, const http_parameters ¶meters, json &data, + json &error) override { + return get_or_post(config_.get_host_config(), false, path, parameters, data, error); + } + + api_error get(const host_config &hc, const std::string &path, const http_parameters ¶meters, + json &data, json &error) override { + return get_or_post(hc, false, path, parameters, data, error); + } + + api_error get_range(const std::string &path, const std::uint64_t &data_size, + const http_parameters ¶meters, const std::string &encryption_token, + std::vector &data, const http_ranges &ranges, json &error, + const bool &stop_requested) override { + return get_range(config_.get_host_config(), path, data_size, parameters, encryption_token, data, + ranges, error, nullptr, stop_requested); + } + + api_error get_range(const host_config &hc, const std::string &path, + const std::uint64_t &data_size, const http_parameters ¶meters, + const std::string &encryption_token, std::vector &data, + const http_ranges &ranges, json &error, const bool &stop_requested) override { + return get_range(hc, path, data_size, parameters, encryption_token, data, ranges, error, + nullptr, stop_requested); + } + + api_error get_range_and_headers(const std::string &path, const std::uint64_t &dataSize, + const http_parameters ¶meters, + const std::string &encryption_token, std::vector &data, + const http_ranges &ranges, json &error, http_headers &headers, + const bool &stop_requested) override { + return get_range(config_.get_host_config(), path, dataSize, parameters, encryption_token, data, + ranges, error, &headers, stop_requested); + } + + api_error get_range_and_headers(const host_config &hc, const std::string &path, + const std::uint64_t &dataSize, const http_parameters ¶meters, + const std::string &encryption_token, std::vector &data, + const http_ranges &ranges, json &error, http_headers &headers, + const bool &stop_requested) override { + return get_range(hc, path, dataSize, parameters, encryption_token, data, ranges, error, + &headers, stop_requested); + } + + api_error get_raw(const std::string &path, const http_parameters ¶meters, + std::vector &data, json &error, const bool &stop_requested) override { + return get_raw(config_.get_host_config(), path, parameters, data, error, stop_requested); + } + + api_error get_raw(const host_config &hc, const std::string &path, + const http_parameters ¶meters, std::vector &data, json &error, + const bool &stop_requested) override; + + api_error post(const std::string &path, json &data, json &error) override { + return get_or_post(config_.get_host_config(), true, path, {}, data, error); + } + + api_error post(const host_config &hc, const std::string &path, json &data, json &error) override { + return get_or_post(hc, true, path, {}, data, error); + } + + api_error post(const std::string &path, const http_parameters ¶meters, json &data, + json &error) override { + return get_or_post(config_.get_host_config(), true, path, parameters, data, error); + } + + api_error post(const host_config &hc, const std::string &path, const http_parameters ¶meters, + json &data, json &error) override { + return get_or_post(hc, true, path, parameters, data, error); + } + + api_error post_file(const std::string &path, const std::string &source_path, + const http_parameters ¶meters, json &data, json &error, + const bool &stop_requested) override { + return post_file(config_.get_host_config(), path, source_path, parameters, data, error, + stop_requested); + } + + api_error post_file(const host_config &hc, const std::string &path, + const std::string &source_path, const http_parameters ¶meters, json &data, + json &error, const bool &stop_requested) override; + + api_error post_multipart_file(const std::string &path, const std::string &file_name, + const std::string &source_path, const std::string &encryption_token, + json &data, json &error, const bool &stop_requested) override { + return post_multipart_file(config_.get_host_config(), path, file_name, source_path, + encryption_token, data, error, stop_requested); + } + + api_error post_multipart_file(const host_config &hc, const std::string &path, + const std::string &file_name, const std::string &source_path, + const std::string &encryption_token, json &data, json &error, + const bool &stop_requested) override; + + bool tus_upload(host_config hc, const std::string &source_path, const std::string &file_name, + std::uint64_t file_size, const std::string &location, std::string &skylink, + const bool &stop_requested, utils::encryption::encrypting_reader *reader); + + bool tus_upload_create(host_config hc, const std::string &file_name, + const std::uint64_t &file_size, std::string &location); +}; +} // namespace repertory + +#endif // INCLUDE_COMM_CURL_CURL_COMM_HPP_ diff --git a/include/comm/curl/curl_resolver.hpp b/include/comm/curl/curl_resolver.hpp new file mode 100644 index 00000000..d77dad5c --- /dev/null +++ b/include/comm/curl/curl_resolver.hpp @@ -0,0 +1,45 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_CURL_CURL_RESOLVER_HPP_ +#define INCLUDE_COMM_CURL_CURL_RESOLVER_HPP_ + +#include "common.hpp" + +namespace repertory { +class curl_resolver final { +public: + curl_resolver() = delete; + curl_resolver(const curl_resolver &) noexcept = delete; + curl_resolver(curl_resolver &&) noexcept = delete; + curl_resolver &operator=(const curl_resolver &) noexcept = delete; + curl_resolver &operator=(curl_resolver &&) noexcept = delete; + +public: + curl_resolver(CURL *handle, std::vector items, const bool &ignore_root = false); + + ~curl_resolver(); + +private: + std::vector items_; + + struct curl_slist *host_list_ = nullptr; +}; +} // namespace repertory + +#endif // INCLUDE_COMM_CURL_CURL_RESOLVER_HPP_ diff --git a/include/comm/curl/multi_request.hpp b/include/comm/curl/multi_request.hpp new file mode 100644 index 00000000..b1b1880f --- /dev/null +++ b/include/comm/curl/multi_request.hpp @@ -0,0 +1,41 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_CURL_MULTI_REQUEST_HPP_ +#define INCLUDE_COMM_CURL_MULTI_REQUEST_HPP_ + +#include "common.hpp" + +namespace repertory { +class multi_request final { +public: + multi_request(CURL *curl_handle, const bool &stop_requested); + + ~multi_request(); + +private: + CURL *curl_handle_; + const bool &stop_requested_; + CURLM *multi_handle_; + +public: + void get_result(CURLcode &curl_code, long &http_code); +}; +} // namespace repertory + +#endif // INCLUDE_COMM_CURL_MULTI_REQUEST_HPP_ diff --git a/include/comm/curl/session_manager.hpp b/include/comm/curl/session_manager.hpp new file mode 100644 index 00000000..543b4579 --- /dev/null +++ b/include/comm/curl/session_manager.hpp @@ -0,0 +1,43 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_CURL_SESSION_MANAGER_HPP_ +#define INCLUDE_COMM_CURL_SESSION_MANAGER_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class app_config; +class session_manager final { +private: + std::string session_; + std::uint64_t session_count_ = 0u; + std::mutex session_mutex_; + +public: + bool create_auth_session(CURL *&curl_handle, const app_config &config, host_config hc, + std::string &session); + + void release_auth_session(const app_config &config, host_config hc, const std::string &session); + + void update_auth_session(CURL *curl_handle, const app_config &config, const host_config &hc); +}; +} // namespace repertory + +#endif // INCLUDE_COMM_CURL_SESSION_MANAGER_HPP_ diff --git a/include/comm/i_comm.hpp b/include/comm/i_comm.hpp new file mode 100644 index 00000000..f14612f4 --- /dev/null +++ b/include/comm/i_comm.hpp @@ -0,0 +1,107 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_I_COMM_HPP_ +#define INCLUDE_COMM_I_COMM_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class i_comm { + INTERFACE_SETUP(i_comm); + +public: + virtual api_error get(const std::string &path, json &data, json &error) = 0; + + virtual api_error get(const host_config &hc, const std::string &path, json &data, + json &error) = 0; + + virtual api_error get(const std::string &path, const http_parameters ¶meters, json &data, + json &error) = 0; + + virtual api_error get(const host_config &hc, const std::string &path, + const http_parameters ¶meters, json &data, json &error) = 0; + + virtual api_error get_range(const std::string &path, const std::uint64_t &data_size, + const http_parameters ¶meters, + const std::string &encryption_token, std::vector &data, + const http_ranges &ranges, json &error, + const bool &stop_requested) = 0; + + virtual api_error get_range(const host_config &hc, const std::string &path, + const std::uint64_t &data_size, const http_parameters ¶meters, + const std::string &encryption_token, std::vector &data, + const http_ranges &ranges, json &error, + const bool &stop_requested) = 0; + + virtual api_error get_range_and_headers(const std::string &path, const std::uint64_t &data_size, + const http_parameters ¶meters, + const std::string &encryption_token, + std::vector &data, const http_ranges &ranges, + json &error, http_headers &headers, + const bool &stop_requested) = 0; + + virtual api_error get_range_and_headers(const host_config &hc, const std::string &path, + const std::uint64_t &data_size, + const http_parameters ¶meters, + const std::string &encryption_token, + std::vector &data, const http_ranges &ranges, + json &error, http_headers &headers, + const bool &stop_requested) = 0; + + virtual api_error get_raw(const std::string &path, const http_parameters ¶meters, + std::vector &data, json &error, const bool &stop_requested) = 0; + + virtual api_error get_raw(const host_config &hc, const std::string &path, + const http_parameters ¶meters, std::vector &data, json &error, + const bool &stop_requested) = 0; + + virtual api_error post(const std::string &path, json &data, json &error) = 0; + + virtual api_error post(const host_config &hc, const std::string &path, json &data, + json &error) = 0; + + virtual api_error post(const std::string &path, const http_parameters ¶meters, json &data, + json &error) = 0; + + virtual api_error post(const host_config &hc, const std::string &path, + const http_parameters ¶meters, json &data, json &error) = 0; + + virtual api_error post_file(const std::string &path, const std::string &sourcePath, + const http_parameters ¶meters, json &data, json &error, + const bool &stop_requested) = 0; + + virtual api_error post_file(const host_config &hc, const std::string &path, + const std::string &sourcePath, const http_parameters ¶meters, + json &data, json &error, const bool &stop_requested) = 0; + + virtual api_error post_multipart_file(const std::string &path, const std::string &file_name, + const std::string &source_path, + const std::string &encryption_token, json &data, + json &error, const bool &stop_requested) = 0; + + virtual api_error post_multipart_file(const host_config &hc, const std::string &path, + const std::string &file_name, + const std::string &source_path, + const std::string &encryption_token, json &data, + json &error, const bool &stop_requested) = 0; +}; +} // namespace repertory + +#endif // INCLUDE_COMM_I_COMM_HPP_ diff --git a/include/comm/i_s3_comm.hpp b/include/comm/i_s3_comm.hpp new file mode 100644 index 00000000..d4039cbb --- /dev/null +++ b/include/comm/i_s3_comm.hpp @@ -0,0 +1,92 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_I_S3_COMM_HPP_ +#define INCLUDE_COMM_I_S3_COMM_HPP_ +#if defined(REPERTORY_ENABLE_S3) + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class i_provider; +class i_s3_comm { + INTERFACE_SETUP(i_s3_comm); + +public: + typedef std::function get_api_file_token_callback; + typedef std::function get_key_callback; + typedef std::function + get_name_callback; + typedef std::function get_size_callback; + typedef std::function get_token_callback; + typedef std::function set_key_callback; + +public: + virtual api_error create_bucket(const std::string &api_path) = 0; + + virtual bool exists(const std::string &api_path, const get_key_callback &get_key) const = 0; + + virtual void get_bucket_name_and_object_name(const std::string &api_path, + const get_key_callback &get_key, + std::string &bucket_name, + std::string &object_name) const = 0; + + virtual std::size_t + get_directory_item_count(const std::string &api_path, + const meta_provider_callback &meta_provider) const = 0; + + virtual api_error get_directory_items(const std::string &api_path, + const meta_provider_callback &meta_provider, + directory_item_list &list) const = 0; + + virtual s3_config get_s3_config() = 0; + + virtual s3_config get_s3_config() const = 0; + + virtual api_error get_file(const std::string &api_path, const get_key_callback &get_key, + const get_name_callback &get_name, const get_token_callback &get_token, + api_file &file) const = 0; + + virtual api_error get_file_list(const get_api_file_token_callback &get_api_file_token, + const get_name_callback &get_name, api_file_list &list) const = 0; + + virtual bool is_online() const = 0; + + virtual api_error read_file_bytes(const std::string &api_path, const std::size_t &size, + const std::uint64_t &offset, std::vector &data, + const get_key_callback &get_key, + const get_size_callback &get_size, + const get_token_callback &get_token, + const bool &stop_requested) const = 0; + + virtual api_error remove_file(const std::string &api_path, const get_key_callback &get_key) = 0; + + virtual api_error remove_bucket(const std::string &api_path) = 0; + + virtual api_error rename_file(const std::string &api_path, const std::string &new_api_path) = 0; + + virtual api_error upload_file(const std::string &api_path, const std::string &source_path, + const std::string &encryption_token, + const get_key_callback &get_key, const set_key_callback &set_key, + const bool &stop_requested) = 0; +}; +} // namespace repertory + +#endif // REPERTORY_ENABLE_S3 +#endif // INCLUDE_COMM_I_S3_COMM_HPP_ diff --git a/include/comm/packet/client_pool.hpp b/include/comm/packet/client_pool.hpp new file mode 100644 index 00000000..733a47c3 --- /dev/null +++ b/include/comm/packet/client_pool.hpp @@ -0,0 +1,89 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_PACKET_CLIENT_POOL_HPP_ +#define INCLUDE_COMM_PACKET_CLIENT_POOL_HPP_ + +#include "common.hpp" +#include "comm/packet/packet.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class client_pool final { +public: + typedef std::function worker_callback; + typedef std::function worker_complete_callback; + +private: + class pool final { + private: + struct work_item final { + work_item(const worker_callback &worker, const worker_complete_callback &worker_complete) + : work(worker), work_complete(worker_complete) {} + + worker_callback work; + worker_complete_callback work_complete; + }; + + struct work_queue final { + std::mutex mutex; + std::condition_variable notify; + std::deque> queue; + }; + + public: + explicit pool(const std::uint8_t &pool_size); + + ~pool() { shutdown(); } + + private: + std::vector> pool_queues_; + std::vector pool_threads_; + bool shutdown_ = false; + std::atomic thread_index_; + + public: + void execute(const std::uint64_t &thread_id, const worker_callback &worker, + const worker_complete_callback &worker_complete); + + void shutdown(); + }; + +public: + explicit client_pool(const std::uint8_t &pool_size = 10u) + : pool_size_(pool_size ? pool_size : 10u) {} + + ~client_pool() { shutdown(); } + +private: + const std::uint8_t pool_size_; + std::unordered_map> pool_lookup_; + std::mutex pool_mutex_; + bool shutdown_ = false; + +public: + void execute(const std::string &client_id, const std::uint64_t &thread_id, + const worker_callback &worker, const worker_complete_callback &worker_complete); + + void remove_client(const std::string &client_id); + + void shutdown(); +}; +} // namespace repertory + +#endif // INCLUDE_COMM_PACKET_CLIENT_POOL_HPP_ diff --git a/include/comm/packet/packet.hpp b/include/comm/packet/packet.hpp new file mode 100644 index 00000000..044bb1f0 --- /dev/null +++ b/include/comm/packet/packet.hpp @@ -0,0 +1,213 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_PACKET_PACKET_HPP_ +#define INCLUDE_COMM_PACKET_PACKET_HPP_ + +#include "common.hpp" +#include "types/remote.hpp" +#include "types/repertory.hpp" + +namespace repertory { +#define DECODE_OR_RETURN(p, value) \ + if ((ret = (p)->decode(value)) != 0) \ + return ret +#define DECODE_OR_IGNORE(p, value) \ + if (ret == 0) \ + ret = (p)->decode(value) + +class packet final { +public: + typedef std::int32_t error_type; + +public: + packet() = default; + + explicit packet(std::vector buffer) : buffer_(std::move(buffer)) {} + + explicit packet(std::vector &&buffer) : buffer_(std::move(buffer)) {} + + packet(const packet &p) noexcept : buffer_(p.buffer_), decode_offset_(p.decode_offset_) {} + + packet(packet &&p) noexcept : buffer_(std::move(p.buffer_)), decode_offset_(p.decode_offset_) {} + +private: + std::vector buffer_; + std::size_t decode_offset_ = 0u; + +public: + static int decode_json(packet &response, json &json_data); + +public: + void clear(); + + char *current_pointer() { + return (decode_offset_ < buffer_.size()) ? &buffer_[decode_offset_] : nullptr; + } + + const char *current_pointer() const { + return (decode_offset_ < buffer_.size()) ? &buffer_[decode_offset_] : nullptr; + } + + error_type decode(std::string &data); + + error_type decode(std::wstring &data); + + error_type decode(void *buffer, const size_t &size); + + error_type decode(void *&ptr); + + error_type decode(std::int8_t &i); + + error_type decode(std::uint8_t &i); + + error_type decode(std::int16_t &i); + + error_type decode(std::uint16_t &i); + + error_type decode(std::int32_t &i); + + error_type decode(std::uint32_t &i); + + error_type decode(std::int64_t &i); + + error_type decode(std::uint64_t &i); + + error_type decode(remote::open_flags &i) { + return decode(reinterpret_cast(i)); + } + + error_type decode(remote::setattr_x &i); + + error_type decode(remote::stat &i); + + error_type decode(remote::statfs &i); + + error_type decode(remote::statfs_x &i); + + error_type decode(remote::file_info &i); + + error_type decrypt(const std::string &token); + + void encode(const void *buffer, const std::size_t &size, bool should_reserve = true); + + void encode(char *str) { encode(std::string(str ? str : "")); } + + void encode(const char *str) { encode(std::string(str ? str : "")); } + + void encode(const std::string &str); + + void encode(wchar_t *str); + + void encode(const wchar_t *str); + + void encode(const std::wstring &str); + + void encode(void *ptr) { + encode(static_cast(reinterpret_cast(ptr))); + } + + void encode(std::int8_t i); + + void encode(std::uint8_t i); + + void encode(std::int16_t i); + + void encode(std::uint16_t i); + + void encode(std::int32_t i); + + void encode(std::uint32_t i); + + void encode(std::int64_t i); + + void encode(std::uint64_t i); + + void encode(remote::open_flags i) { encode(static_cast(i)); } + + void encode(remote::setattr_x i); + + void encode(remote::stat i); + + void encode(remote::statfs i, bool should_reserve = true); + + void encode(remote::statfs_x i); + + void encode(remote::file_info i); + + void encode_top(const void *buffer, const std::size_t &size, bool should_reserve = true); + + void encode_top(const std::string &str); + + void encode_top(const std::wstring &str); + + void encode_top(void *ptr) { + encode_top(static_cast(reinterpret_cast(ptr))); + } + + void encode_top(std::int8_t i); + + void encode_top(std::uint8_t i); + + void encode_top(std::int16_t i); + + void encode_top(std::uint16_t i); + + void encode_top(std::int32_t i); + + void encode_top(std::uint32_t i); + + void encode_top(std::int64_t i); + + void encode_top(std::uint64_t i); + + void encode_top(remote::open_flags i) { encode_top(static_cast(i)); } + + void encode_top(remote::setattr_x i); + + void encode_top(remote::stat i); + + void encode_top(remote::statfs i, bool should_reserve = true); + + void encode_top(remote::statfs_x i); + + void encode_top(remote::file_info i); + + void encrypt(const std::string &token); + + std::uint32_t get_size() const { return static_cast(buffer_.size()); } + + void transfer_into(std::vector &buffer); + +public: + packet &operator=(const std::vector &buffer) noexcept; + + packet &operator=(std::vector &&buffer) noexcept; + + packet &operator=(const packet &p) noexcept; + + packet &operator=(packet &&p) noexcept; + + char &operator[](const size_t &index) { return buffer_[index]; } + + const char &operator[](const size_t &index) const { return buffer_.at(index); } +}; +typedef packet packet; +} // namespace repertory + +#endif // INCLUDE_COMM_PACKET_PACKET_HPP_ diff --git a/include/comm/packet/packet_client.hpp b/include/comm/packet/packet_client.hpp new file mode 100644 index 00000000..77c970f4 --- /dev/null +++ b/include/comm/packet/packet_client.hpp @@ -0,0 +1,84 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_PACKET_PACKET_CLIENT_HPP_ +#define INCLUDE_COMM_PACKET_PACKET_CLIENT_HPP_ + +#include "common.hpp" +#include "comm/packet/packet.hpp" + +using boost::asio::ip::tcp; + +namespace repertory { +class packet_client final { +private: + struct client { + client(boost::asio::io_context &ctx) : nonce(""), socket(ctx) {} + + std::string nonce; + tcp::socket socket; + }; + +public: + packet_client(std::string host_name_or_ip, const std::uint8_t &max_connections, + const std::uint16_t &port, const std::uint16_t &receive_timeout, + const std::uint16_t &send_timeout, std::string encryption_token); + + ~packet_client(); + +private: + boost::asio::io_context io_context_; + const std::string host_name_or_ip_; + const std::uint8_t max_connections_; + const std::uint16_t port_; + const std::uint16_t receive_timeout_; + const std::uint16_t send_timeout_; + const std::string encryption_token_; + std::string unique_id_; + + bool allow_connections_ = true; + boost::asio::ip::basic_resolver::results_type resolve_results_; + std::mutex clients_mutex_; + std::vector> clients_; + +private: + void close(client &c) const; + + void close_all(); + + bool connect(client &c); + + std::shared_ptr get_client(); + + void put_client(std::shared_ptr &c); + + packet::error_type read_packet(client &c, packet &response); + + void resolve(); + +public: + packet::error_type send(const std::string &method, std::uint32_t &service_flags); + + packet::error_type send(const std::string &method, packet &request, std::uint32_t &service_flags); + + packet::error_type send(const std::string &method, packet &request, packet &response, + std::uint32_t &service_flags); +}; +} // namespace repertory + +#endif // INCLUDE_COMM_PACKET_PACKET_CLIENT_HPP_ diff --git a/include/comm/packet/packet_server.hpp b/include/comm/packet/packet_server.hpp new file mode 100644 index 00000000..2655d513 --- /dev/null +++ b/include/comm/packet/packet_server.hpp @@ -0,0 +1,90 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMM_PACKET_PACKET_SERVER_HPP_ +#define INCLUDE_COMM_PACKET_PACKET_SERVER_HPP_ + +#include "common.hpp" +#include "comm/packet/client_pool.hpp" +#include "utils/utils.hpp" + +using namespace boost::asio; +using boost::asio::ip::tcp; + +namespace repertory { +class packet_server final { +public: + typedef std::function closed_callback; + typedef client_pool::worker_complete_callback message_complete_callback; + typedef std::function + message_handler_callback; + +public: + packet_server(const std::uint16_t &port, std::string token, std::uint8_t pool_size, + closed_callback closed, message_handler_callback message_handler); + + ~packet_server(); + +private: + struct connection { + connection(boost::asio::io_service &io_service, tcp::acceptor &acceptor) + : socket(io_service), acceptor(acceptor) {} + + tcp::socket socket; + tcp::acceptor &acceptor; + std::vector buffer; + std::string client_id; + std::string nonce; + + void generate_nonce() { nonce = utils::generate_random_string(256u); } + }; + +private: + const std::string encryption_token_; + closed_callback closed_; + message_handler_callback message_handler_; + boost::asio::io_context io_context_; + std::unique_ptr server_thread_; + std::vector service_threads_; + std::recursive_mutex connection_mutex_; + std::unordered_map connection_lookup_; + +private: + void add_client(connection &c, const std::string &client_id); + + void initialize(const uint16_t &port, uint8_t pool_size); + + void listen_for_connection(tcp::acceptor &acceptor); + + void on_accept(std::shared_ptr c, boost::system::error_code ec); + + void read_header(std::shared_ptr c); + + void read_packet(std::shared_ptr c, const std::uint32_t &data_size); + + void remove_client(connection &c); + + void send_response(std::shared_ptr c, const packet::error_type &result, + packet &response); +}; +} // namespace repertory + +#endif // INCLUDE_COMM_PACKET_PACKET_SERVER_HPP_ diff --git a/include/common.hpp b/include/common.hpp new file mode 100644 index 00000000..a286d958 --- /dev/null +++ b/include/common.hpp @@ -0,0 +1,324 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_COMMON_HPP_ +#define INCLUDE_COMMON_HPP_ + +#ifdef _WIN32 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#else +#define FUSE_USE_VERSION 29 +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __linux__ +#include +#endif +#include +#ifdef HAS_SETXATTR +#include +#include +#endif +#ifdef __APPLE__ +#include +#include +#include +#endif +#if __APPLE__ +#include +#include +#endif +#if __linux__ +#include +#else +#include +#endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if !IS_DEBIAN9_DISTRO && HAS_STD_OPTIONAL +#include +#else +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#else +#include +#endif + +#if defined(REPERTORY_ENABLE_S3) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +using namespace std::chrono_literals; +using json = nlohmann::json; + +const std::string &get_repertory_git_revision(); +const std::string &get_repertory_version(); + +#ifdef _WIN32 +#ifdef CreateDirectory +#undef CreateDirectory +#endif +#ifdef CreateFile +#undef CreateFile +#endif +#ifdef DeleteFile +#undef DeleteFile +#endif +#ifdef RemoveDirectory +#undef RemoveDirectory +#endif +#endif + +#define MIN_REMOTE_VERSION "2.0.0" +#define MIN_SIA_VERSION "1.4.1" +#define MIN_SP_VERSION "1.4.1.2" +#define REPERTORY_CONFIG_VERSION 0ull +#define REPERTORY "repertory" +#define REPERTORY_DATA_NAME "repertory2" +#define REPERTORY_W L"repertory" + +#define NANOS_PER_SECOND 1000000000L + +#ifdef _WIN32 +#define REPERTORY_INVALID_HANDLE INVALID_HANDLE_VALUE +#define REPERTORY_API_INVALID_HANDLE static_cast(-1) +#define OSHandle HANDLE +#else +#define REPERTORY_INVALID_HANDLE -1 +#define REPERTORY_API_INVALID_HANDLE REPERTORY_INVALID_HANDLE +#define OSHandle int +#endif + +#ifndef _WIN32 +#ifdef __APPLE__ +#define G_PREFIX "org" +#define G_KAUTH_FILESEC_XATTR G_PREFIX ".apple.system.Security" +#define A_PREFIX "com" +#define A_KAUTH_FILESEC_XATTR A_PREFIX ".apple.system.Security" +#define XATTR_APPLE_PREFIX "com.apple." +#endif + +#ifndef XATTR_NAME_MAX +#define XATTR_NAME_MAX 255 /* # chars in an extended attribute name */ +#endif + +#ifndef XATTR_SIZE_MAX +#define XATTR_SIZE_MAX 65536 +#endif +#endif + +#if __APPLE__ +#define pread64 pread +#define pwrite64 pwrite +#endif + +#define WINFSP_ALLOCATION_UNIT UINT64(4096U) + +#ifdef _WIN32 +#define UTIME_NOW ((1l << 30) - 1l) +#define UTIME_OMIT ((1l << 30) - 2l) +#define CONVERT_STATUS_NOT_IMPLEMENTED(e) e +#else +#define VOID void +#define PVOID VOID * +typedef PVOID HANDLE; +#define WCHAR wchar_t +#define PWSTR WCHAR * +#define BOOLEAN std::uint8_t +#define UINT16 std::uint16_t +#define UINT32 std::uint32_t +#define PUINT32 UINT32 * +#define UINT64 std::uint64_t +#define SIZE_T std::uint64_t +#define DWORD std::uint32_t + +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#define FILE_ATTRIBUTE_DEVICE 0x00000040 +#define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 +#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 +#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 +#define FILE_ATTRIBUTE_COMPRESSED 0x00000800 +#define FILE_ATTRIBUTE_OFFLINE 0x00001000 +#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 +#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 +#define FILE_ATTRIBUTE_INTEGRITY_STREAM 0x00008000 +#define FILE_ATTRIBUTE_VIRTUAL 0x00010000 +#define FILE_ATTRIBUTE_NO_SCRUB_DATA 0x00020000 +#define FILE_ATTRIBUTE_EA 0x00040000 +#define FILE_ATTRIBUTE_PINNED 0x00080000 +#define FILE_ATTRIBUTE_UNPINNED 0x00100000 +#define FILE_ATTRIBUTE_RECALL_ON_OPEN 0x00040000 +#define FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS 0x00400000 + +#define FILE_DIRECTORY_FILE 0x00000001 + +#define FILE_EXECUTE (0x0020) +#define FILE_GENERIC_EXECUTE (0x00020000L | 0x0080 | 0x0020 | 0x00100000L) + +#define GENERIC_READ (0x80000000L) +#define GENERIC_WRITE (0x40000000L) +#define GENERIC_EXECUTE (0x20000000L) +#define GENERIC_ALL (0x10000000L) + +#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) + +#define MAX_PATH 260 + +#define STATUS_SUCCESS std::int32_t(0) +#define STATUS_ACCESS_DENIED std::int32_t(0xC0000022L) +#define STATUS_DEVICE_BUSY std::int32_t(0x80000011L) +#define STATUS_DEVICE_INSUFFICIENT_RESOURCES std::int32_t(0xC0000468L) +#define STATUS_DIRECTORY_NOT_EMPTY std::int32_t(0xC0000101L) +#define STATUS_FILE_IS_A_DIRECTORY std::int32_t(0xC00000BAL) +#define STATUS_FILE_TOO_LARGE std::int32_t(0xC0000904L) +#define STATUS_INSUFFICIENT_RESOURCES std::int32_t(0xC000009AL) +#define STATUS_INTERNAL_ERROR std::int32_t(0xC00000E5L) +#define STATUS_INVALID_ADDRESS std::int32_t(0xC0000141L) +#define STATUS_INVALID_HANDLE std::int32_t(0xC0000006L) +#define STATUS_INVALID_IMAGE_FORMAT std::int32_t(0xC000007BL) +#define STATUS_INVALID_PARAMETER std::int32_t(0xC000000DL) +#define STATUS_NO_MEMORY std::int32_t(0xC0000017L) +#define STATUS_NOT_IMPLEMENTED std::int32_t(0xC0000002L) +#define STATUS_OBJECT_NAME_EXISTS std::int32_t(0x40000000L) +#define STATUS_OBJECT_NAME_NOT_FOUND std::int32_t(0xC0000034L) +#define STATUS_OBJECT_PATH_INVALID std::int32_t(0xC0000039L) +#define STATUS_UNEXPECTED_IO_ERROR std::int32_t(0xC00000E9L) +#define CONVERT_STATUS_NOT_IMPLEMENTED(e) \ + ((std::int32_t(e) == STATUS_NOT_IMPLEMENTED) ? -ENOTSUP : e) + +namespace Fsp::FileSystemBase { +enum { + FspCleanupDelete = 0x01, + FspCleanupSetAllocationSize = 0x02, + FspCleanupSetArchiveBit = 0x10, + FspCleanupSetLastAccessTime = 0x20, + FspCleanupSetLastWriteTime = 0x40, + FspCleanupSetChangeTime = 0x80 +}; + +struct FSP_FSCTL_FILE_INFO { + UINT32 FileAttributes; + UINT32 ReparseTag; + UINT64 AllocationSize; + UINT64 FileSize; + UINT64 CreationTime; + UINT64 LastAccessTime; + UINT64 LastWriteTime; + UINT64 ChangeTime; + UINT64 IndexNumber; + UINT32 HardLinks; + UINT32 EaSize; +}; + +typedef FSP_FSCTL_FILE_INFO FileInfo; +} // namespace Fsp::FileSystemBase +#endif + +using namespace Fsp; + +#define INTERFACE_SETUP(name) \ +public: \ + name(const name &) noexcept = delete; \ + name(name &&) noexcept = delete; \ + name &operator=(const name &) noexcept = delete; \ + name &operator=(name &&) noexcept = delete; \ + \ +protected: \ + name() = default; \ + \ +public: \ + virtual ~name() = default + +#endif // INCLUDE_COMMON_HPP_ diff --git a/include/db/directory_db.hpp b/include/db/directory_db.hpp new file mode 100644 index 00000000..e33be34b --- /dev/null +++ b/include/db/directory_db.hpp @@ -0,0 +1,101 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DB_DIRECTORY_DB_HPP_ +#define INCLUDE_DB_DIRECTORY_DB_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "types/repertory.hpp" +#include "utils/rocksdb_utils.hpp" + +namespace repertory { +class directory_db final { +private: + class directory_tree final { + private: + std::unordered_map> sub_directory_lookup_; + + public: + void add_path(const std::string &api_path, const std::vector &files, + rocksdb::DB &db); + + std::size_t get_count(const std::string &api_path) const; + + std::vector get_directories() const; + + std::vector get_sub_directories(const std::string &api_path) const; + + bool is_directory(const std::string &api_path) const; + + bool remove_directory(const std::string &api_path, rocksdb::DB &db, + const bool &allow_remove_root = false); + }; + +public: + explicit directory_db(const app_config &config); + +public: + ~directory_db(); + +private: + mutable std::recursive_mutex directory_mutex_; + std::unique_ptr db_; + directory_tree tree_; + const std::string DIRDB_NAME = "directory_db"; + +private: + json get_directory_data(const std::string &api_path) const; + +public: + api_error create_directory(const std::string &api_path, const bool &create_always = false); + + api_error create_file(const std::string &api_path); + + std::uint64_t get_directory_item_count(const std::string &api_path) const; + + api_error get_file(const std::string &api_path, api_file &file, + api_file_provider_callback api_file_provider) const; + + api_error get_file_list(api_file_list &list, api_file_provider_callback api_file_provider) const; + + std::size_t get_sub_directory_count(const std::string &api_path) const; + + std::uint64_t get_total_item_count() const; + + bool is_directory(const std::string &api_path) const; + + bool is_file(const std::string &api_path) const; + + void populate_directory_files(const std::string &api_path, + const meta_provider_callback &meta_provider, + directory_item_list &list) const; + + void populate_sub_directories(const std::string &api_path, + const meta_provider_callback &meta_provider, + directory_item_list &list) const; + + api_error remove_directory(const std::string &api_path, const bool &allow_remove_root = false); + + bool remove_file(const std::string &api_path); + + api_error rename_file(const std::string &from_api_path, const std::string &to_api_path); +}; +} // namespace repertory + +#endif // INCLUDE_DB_DIRECTORY_DB_HPP_ diff --git a/include/db/meta_db.hpp b/include/db/meta_db.hpp new file mode 100644 index 00000000..0429362f --- /dev/null +++ b/include/db/meta_db.hpp @@ -0,0 +1,81 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DB_META_DB_HPP_ +#define INCLUDE_DB_META_DB_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "types/repertory.hpp" +#include "utils/rocksdb_utils.hpp" + +namespace repertory { +class meta_db final { +public: + explicit meta_db(const app_config &config); + +public: + ~meta_db(); + +private: + std::unique_ptr db_; + std::unique_ptr default_family_; + std::unique_ptr source_family_; + std::unique_ptr keys_family_; + const std::string METADB_NAME = "meta_db"; + +private: + api_error get_item_meta_json(const std::string &api_path, json &json_data) const; + + void release_resources(); + +public: + std::shared_ptr create_iterator(const bool &source_family); + + api_error get_api_path_from_key(const std::string &key, std::string &api_path) const; + + api_error get_api_path_from_source(const std::string &source_path, std::string &api_path) const; + + api_error get_item_meta(const std::string &api_path, api_meta_map &meta) const; + + api_error get_item_meta(const std::string &api_path, const std::string &key, + std::string &value) const; + + bool get_item_meta_exists(const std::string &api_path) const; + + std::vector get_pinned_files() const; + + bool get_source_path_exists(const std::string &source_path) const; + + void remove_item_meta(const std::string &api_path); + + api_error remove_item_meta(const std::string &api_path, const std::string &key); + + api_error rename_item_meta(const std::string &source_path, const std::string &from_api_path, + const std::string &to_api_path); + + api_error set_item_meta(const std::string &api_path, const std::string &key, + const std::string &value); + + api_error set_item_meta(const std::string &api_path, const api_meta_map &meta); + + api_error set_source_path(const std::string &api_path, const std::string &source_path); +}; +} // namespace repertory + +#endif // INCLUDE_DB_META_DB_HPP_ diff --git a/include/db/retry_db.hpp b/include/db/retry_db.hpp new file mode 100644 index 00000000..70193c81 --- /dev/null +++ b/include/db/retry_db.hpp @@ -0,0 +1,63 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DB_RETRY_DB_HPP_ +#define INCLUDE_DB_RETRY_DB_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "events/events.hpp" +#include "events/event_system.hpp" +#include "types/repertory.hpp" +#include "utils/path_utils.hpp" +#include "utils/rocksdb_utils.hpp" + +namespace repertory { +class retry_db final { +public: + typedef std::function process_callback; + +public: + explicit retry_db(const app_config &config); + + ~retry_db(); + +private: + std::unique_ptr db_; + bool paused_ = false; + std::mutex processing_mutex_; + const std::string ROCKS_DB_NAME = "retry_db"; + +public: + bool exists(const std::string &api_path) const; + + void pause(); + + bool process_all(const process_callback &process); + + void remove(const std::string &api_path); + + void rename(const std::string &from_api_path, const std::string &to_api_path); + + void resume(); + + void set(const std::string &api_path); +}; +} // namespace repertory + +#endif // INCLUDE_DB_RETRY_DB_HPP_ diff --git a/include/download/buffered_reader.hpp b/include/download/buffered_reader.hpp new file mode 100644 index 00000000..5c5a8eaa --- /dev/null +++ b/include/download/buffered_reader.hpp @@ -0,0 +1,78 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DOWNLOAD_BUFFERED_READER_HPP_ +#define INCLUDE_DOWNLOAD_BUFFERED_READER_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class app_config; +class buffered_reader final { +public: + buffered_reader(const app_config &config, const filesystem_item &fsi, + const api_reader_callback &api_reader, const std::size_t &chunk_size, + const std::size_t &total_chunks, const std::size_t &start_chunk); + + ~buffered_reader(); + +private: + const filesystem_item &fsi_; + const api_reader_callback &api_reader_; + const std::size_t chunk_size_; + const std::size_t total_chunks_; + boost::dynamic_bitset<> ring_state_; + + api_error error_ = api_error::success; + std::unique_ptr> first_chunk_data_; + std::unique_ptr> last_chunk_data_; + std::size_t read_chunk_index_ = 0u; + std::mutex read_mutex_; + std::condition_variable read_notify_; + std::size_t read_offset_ = 0u; + bool reset_reader_ = false; + std::vector> ring_data_; + std::unique_ptr reader_thread_; + bool stop_requested_ = false; + std::mutex write_mutex_; + std::size_t write_chunk_index_ = 0u; + +private: + bool is_active() const { return not stop_requested_ && (error_ == api_error::success); } + + void reader_thread(); + +public: + std::size_t get_chunk_size() const { return chunk_size_; } + + void get_first_chunk(std::vector *&data) { data = first_chunk_data_.get(); } + + void get_last_chunk(std::vector *&data) { data = last_chunk_data_.get(); } + + bool has_first_chunk() const { return static_cast(first_chunk_data_); } + + bool has_last_chunk() const { return static_cast(last_chunk_data_); } + + void notify_stop_requested(); + + api_error read_chunk(const std::size_t &chunk_index, std::vector &data); +}; +} // namespace repertory + +#endif // INCLUDE_DOWNLOAD_BUFFERED_READER_HPP_ diff --git a/include/download/direct_download.hpp b/include/download/direct_download.hpp new file mode 100644 index 00000000..b939c701 --- /dev/null +++ b/include/download/direct_download.hpp @@ -0,0 +1,99 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DOWNLOAD_DIRECT_DOWNLOAD_HPP_ +#define INCLUDE_DOWNLOAD_DIRECT_DOWNLOAD_HPP_ + +#include "common.hpp" +#include "download/i_download.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class buffered_reader; +class app_config; +class direct_download final : public virtual i_download { +public: + direct_download(const app_config &config, filesystem_item fsi, + const api_reader_callback &api_reader, const std::uint64_t &handle); + + ~direct_download() override; + +private: + const app_config &config_; + const filesystem_item fsi_; + const api_reader_callback &api_reader_; + const std::uint64_t handle_; + + api_error error_ = api_error::success; + std::unique_ptr buffered_reader_; + bool disable_download_end_ = false; + bool download_end_notified_ = false; + double progress_ = 0.0; + std::mutex read_mutex_; + bool stop_requested_ = false; + +private: + bool is_active() const { return not stop_requested_ && (error_ == api_error::success); } + + void notify_download_end(); + + void set_api_error(const api_error &error); + +public: + api_error allocate(const std::uint64_t & /*handle*/, const std::uint64_t & /*size*/, + const allocator_callback & /*allocator*/, + const completer_callback & /*completer*/) override { + return api_error::not_implemented; + } + + api_error download_all() override { return api_error::not_implemented; } + + api_error get_result() const override { return error_; } + + std::string get_source_path() const override { return ""; } + + void get_state_information(filesystem_item &, std::size_t &, std::size_t &, + boost::dynamic_bitset<> &, boost::dynamic_bitset<> &) override {} + + bool get_write_supported() const override { return false; } + + void notify_stop_requested() override; + + bool pause() override { return false; } + + api_error read_bytes(const std::uint64_t &, std::size_t read_size, + const std::uint64_t &read_offset, std::vector &data) override; + + void reset_timeout(const bool &) override {} + + void resume() override {} + + void set_api_path(const std::string &) override {} + + void set_disable_download_end(const bool &disable) override { disable_download_end_ = disable; } + + api_error write_bytes(const std::uint64_t &, const std::uint64_t &, std::vector, + std::size_t &bytes_written, + const completer_callback & /*completer*/) override { + bytes_written = 0u; + return api_error::not_implemented; + } +}; +} // namespace repertory + +#endif // INCLUDE_DOWNLOAD_DIRECT_DOWNLOAD_HPP_ diff --git a/include/download/download.hpp b/include/download/download.hpp new file mode 100644 index 00000000..301bcded --- /dev/null +++ b/include/download/download.hpp @@ -0,0 +1,191 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DOWNLOAD_DOWNLOAD_HPP_ +#define INCLUDE_DOWNLOAD_DOWNLOAD_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "download/i_download.hpp" +#include "types/repertory.hpp" +#include "utils/native_file.hpp" + +namespace repertory { +class i_open_file_table; +class download final : public virtual i_download { +private: + struct active_chunk { + explicit active_chunk(std::thread worker) : worker(std::move(worker)) {} + + std::thread worker; + std::mutex mutex; + std::condition_variable notify; + }; + typedef std::shared_ptr active_chunk_ptr; + + struct read_data { + read_data(std::vector &data, const std::uint64_t &offset) + : complete(false), data(data), offset(offset) {} + + bool complete; + std::vector &data; + const std::uint64_t offset; + std::mutex mutex; + std::condition_variable notify; + }; + typedef std::shared_ptr read_data_ptr; + + struct write_data { + write_data(const std::size_t &chunk, std::vector data, const std::uint64_t &offset) + : chunk_index(chunk), data(std::move(data)), offset(offset) {} + write_data(const std::uint64_t &offset, std::vector data) + : chunk_index(0u), data(std::move(data)), offset(offset), from_read(false) {} + + std::size_t chunk_index; + std::vector data; + const std::uint64_t offset; + bool from_read = true; + bool complete = false; + std::mutex mutex; + std::condition_variable notify; + std::size_t written = 0u; + }; + typedef std::shared_ptr write_data_ptr; + +public: + download(const app_config &config, filesystem_item &fsi, const api_reader_callback &api_reader, + const std::size_t &chunk_size, i_open_file_table &oft); + + download(const app_config &config, filesystem_item &fsi, const api_reader_callback &api_reader, + const std::size_t &chunk_size, std::size_t &last_chunk_size, + boost::dynamic_bitset<> &read_state, boost::dynamic_bitset<> &write_state, + i_open_file_table &oft); + + ~download() override; + +private: + // Constructor initialization + const app_config &config_; + filesystem_item fsi_; + const api_reader_callback &api_reader_; + i_open_file_table &oft_; + const std::size_t chunk_size_; + boost::dynamic_bitset<> read_chunk_state_; + std::size_t last_chunk_size_; + boost::dynamic_bitset<> write_chunk_state_; + + // Default initialization + bool auto_close_ = false; + std::unordered_map active_chunks_; + api_error error_ = api_error::success; + std::vector background_workers_; + std::size_t current_chunk_index_ = 0u; + bool disable_download_end_ = false; + std::unique_ptr io_thread_; + std::uint64_t open_file_handle_ = REPERTORY_API_INVALID_HANDLE; + bool paused_ = false; + bool processed_ = false; + std::condition_variable processed_notify_; + double progress_ = 0.0; + std::size_t read_offset_ = 0u; + std::deque read_queue_; + native_file_ptr read_write_file_; + std::mutex read_write_mutex_; + std::condition_variable read_write_notify_; + bool stop_requested_ = false; + std::chrono::system_clock::time_point timeout_ = + std::chrono::system_clock::now() + + std::chrono::seconds(config_.get_chunk_downloader_timeout_secs()); + std::deque write_queue_; + +private: + void create_active_chunk(std::size_t chunk_index); + + void download_chunk(std::size_t chunk_index, bool inactive_only); + + bool get_complete() const; + + bool get_timeout_enabled() const; + + void handle_active_chunk_complete(std::size_t chunk_index, unique_mutex_lock &lock); + + void initialize_download(filesystem_item &fsi, const bool &delete_existing); + + void io_data_worker(); + + void notify_progress(); + + void process_download_complete(unique_mutex_lock &lock); + + void process_read_queue(unique_mutex_lock &lock); + + void process_timeout(unique_mutex_lock &lock); + + void process_write_queue(unique_mutex_lock &lock); + + void read_ahead_worker(); + + void read_behind_worker(); + + void read_end_worker(); + + void shutdown(unique_mutex_lock &lock); + + void wait_for_io(unique_mutex_lock &lock); + +public: + api_error allocate(const std::uint64_t &handle, const std::uint64_t &size, + const allocator_callback &allocator, + const completer_callback &completer) override; + + api_error download_all() override; + + api_error get_result() const override { return error_; } + + std::string get_source_path() const override { return fsi_.source_path; } + + void get_state_information(filesystem_item &fsi, std::size_t &chunk_size, + std::size_t &last_chunk_size, boost::dynamic_bitset<> &read_state, + boost::dynamic_bitset<> &write_state) override; + + bool get_write_supported() const override { return true; } + + bool is_active() const { return not read_chunk_state_.all(); } + + void notify_stop_requested() override; + + bool pause() override; + + api_error read_bytes(const std::uint64_t &handle, std::size_t read_size, + const std::uint64_t &read_offset, std::vector &data) override; + + void reset_timeout(const bool &) override; + + void resume() override; + + void set_api_path(const std::string &api_path) override; + + void set_disable_download_end(const bool &disable) override { disable_download_end_ = disable; } + + api_error write_bytes(const std::uint64_t &handle, const std::uint64_t &write_offset, + std::vector data, std::size_t &bytes_written, + const completer_callback &completer) override; +}; +} // namespace repertory + +#endif // INCLUDE_DOWNLOAD_DOWNLOAD_HPP_ diff --git a/include/download/download_manager.hpp b/include/download/download_manager.hpp new file mode 100644 index 00000000..bfa96e3a --- /dev/null +++ b/include/download/download_manager.hpp @@ -0,0 +1,102 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DOWNLOAD_DOWNLOAD_MANAGER_HPP_ +#define INCLUDE_DOWNLOAD_DOWNLOAD_MANAGER_HPP_ + +#include "common.hpp" +#include "download/i_download.hpp" +#include "download/i_download_manager.hpp" +#include "events/event_system.hpp" + +namespace repertory { +class app_config; +class download_end; +class filesystem_item_handle_closed; +class i_open_file_table; +class download_manager final : public virtual i_download_manager { + E_CONSUMER(); + +public: + download_manager(const app_config &config, api_reader_callback api_reader, + const bool &force_download = false); + + ~download_manager() override; + +private: + const app_config &config_; + const api_reader_callback api_reader_; + bool force_download_; + i_open_file_table *oft_ = nullptr; + mutable std::recursive_mutex download_mutex_; + std::unordered_map> download_lookup_; + std::recursive_mutex start_stop_mutex_; + bool stop_requested_ = true; + std::unique_ptr restore_db_; + +private: + bool contains_handle(const std::string &api_path, const std::uint64_t &handle) const; + + download_ptr get_download(std::uint64_t handle, filesystem_item &fsi, + const bool &write_Supported); + + void handle_download_end(const download_end &de); + + void on_handle_closed(const filesystem_item_handle_closed &handle_closed); + + void reset_timeout(const std::string &api_path, const bool &file_closed); + + void start_incomplete(); + +public: + api_error allocate(const std::uint64_t &handle, filesystem_item &fsi, const std::uint64_t &size, + const i_download::allocator_callback &allocator) override; + + bool contains_restore(const std::string &api_path) const override; + + api_error download_file(const std::uint64_t &handle, filesystem_item &fsi) override; + + std::size_t get_download_count() const { return download_lookup_.size(); } + + std::string get_source_path(const std::string &api_path) const; + + bool is_processing(const std::string &api_path) const override; + + bool pause_download(const std::string &api_path) override; + + api_error read_bytes(const std::uint64_t &handle, filesystem_item &fsi, std::size_t read_size, + const std::uint64_t &read_offset, std::vector &data) override; + + void rename_download(const std::string &from_api_path, const std::string &to_api_path) override; + + api_error resize(const std::uint64_t &handle, filesystem_item &fsi, + const std::uint64_t &size) override; + + void resume_download(const std::string &api_path) override; + + void start(i_open_file_table *oft); + + void stop(); + + api_error write_bytes(const std::uint64_t &handle, filesystem_item &fsi, + const std::uint64_t &write_offset, std::vector data, + std::size_t &bytes_written) override; +}; +} // namespace repertory + +#endif // INCLUDE_DOWNLOAD_DOWNLOAD_MANAGER_HPP_ diff --git a/include/download/events.hpp b/include/download/events.hpp new file mode 100644 index 00000000..a72177ad --- /dev/null +++ b/include/download/events.hpp @@ -0,0 +1,85 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DOWNLOAD_EVENTS_HPP_ +#define INCLUDE_DOWNLOAD_EVENTS_HPP_ + +#include "common.hpp" +#include "events/events.hpp" +#include "types/repertory.hpp" + +namespace repertory { +// clang-format off +E_SIMPLE2(download_begin, normal, true, + std::string, api_path, ap, E_STRING, + std::string, dest_path, dest, E_STRING +); + +E_SIMPLE4(download_end, normal, true, + std::string, api_path, ap, E_STRING, + std::string, dest_path, dest, E_STRING, + std::uint64_t, handle, handle, E_FROM_UINT64, + api_error, result, result, E_FROM_API_FILE_ERROR +); + +E_SIMPLE2(download_paused, normal, true, + std::string, api_path, ap, E_STRING, + std::string, dest_path, dest, E_STRING +); + +E_SIMPLE3(download_progress, normal, true, + std::string, api_path, ap, E_STRING, + std::string, dest_path, dest, E_STRING, + double, progress, prog, E_DOUBLE_PRECISE +); + +E_SIMPLE2(download_restored, normal, true, + std::string, api_path, ap, E_STRING, + std::string, dest_path, dest, E_STRING +); + +E_SIMPLE3(download_restore_failed, error, true, + std::string, api_path, ap, E_STRING, + std::string, dest_path, dest, E_STRING, + std::string, error, err, E_STRING +); + +E_SIMPLE2(download_resumed, normal, true, + std::string, api_path, ap, E_STRING, + std::string, dest_path, dest, E_STRING +); + +E_SIMPLE2(download_stored, normal, true, + std::string, api_path, ap, E_STRING, + std::string, dest_path, dest, E_STRING +); + +E_SIMPLE3(download_store_failed, error, true, + std::string, api_path, ap, E_STRING, + std::string, dest_path, dest, E_STRING, + std::string, error, err, E_STRING +); + +E_SIMPLE2(download_timeout, warn, true, + std::string, api_path, ap, E_STRING, + std::string, dest_path, dest, E_STRING +); +// clang-format on +} // namespace repertory + +#endif // INCLUDE_DOWNLOAD_EVENTS_HPP_ diff --git a/include/download/i_download.hpp b/include/download/i_download.hpp new file mode 100644 index 00000000..6c7e9afb --- /dev/null +++ b/include/download/i_download.hpp @@ -0,0 +1,76 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DOWNLOAD_I_DOWNLOAD_HPP_ +#define INCLUDE_DOWNLOAD_I_DOWNLOAD_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class i_download { + INTERFACE_SETUP(i_download); + +public: + typedef std::function allocator_callback; + + typedef std::function + completer_callback; + +public: + virtual api_error allocate(const std::uint64_t &handle, const std::uint64_t &size, + const allocator_callback &allocator, + const completer_callback &completer) = 0; + + virtual api_error download_all() = 0; + + virtual api_error get_result() const = 0; + + virtual std::string get_source_path() const = 0; + + virtual void get_state_information(filesystem_item &fsi, std::size_t &chunk_size, + std::size_t &last_chunk_size, + boost::dynamic_bitset<> &read_state, + boost::dynamic_bitset<> &write_state) = 0; + + virtual bool get_write_supported() const = 0; + + virtual void notify_stop_requested() = 0; + + virtual bool pause() = 0; + + virtual api_error read_bytes(const std::uint64_t &handle, std::size_t read_size, + const std::uint64_t &read_offset, std::vector &data) = 0; + + virtual void reset_timeout(const bool &file_closed) = 0; + + virtual void resume() = 0; + + virtual void set_api_path(const std::string &api_path) = 0; + + virtual void set_disable_download_end(const bool &disable) = 0; + + virtual api_error write_bytes(const std::uint64_t &handle, const std::uint64_t &write_offset, + std::vector data, std::size_t &bytes_written, + const completer_callback &completer) = 0; +}; + +typedef std::shared_ptr download_ptr; +} // namespace repertory + +#endif // INCLUDE_DOWNLOAD_I_DOWNLOAD_HPP_ diff --git a/include/download/i_download_manager.hpp b/include/download/i_download_manager.hpp new file mode 100644 index 00000000..ee08b03c --- /dev/null +++ b/include/download/i_download_manager.hpp @@ -0,0 +1,61 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DOWNLOAD_I_DOWNLOAD_MANAGER_HPP_ +#define INCLUDE_DOWNLOAD_I_DOWNLOAD_MANAGER_HPP_ + +#include "common.hpp" +#include "download/i_download.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class i_download_manager { + INTERFACE_SETUP(i_download_manager); + +public: + virtual api_error allocate(const std::uint64_t &handle, filesystem_item &fsi, + const std::uint64_t &size, + const i_download::allocator_callback &allocator) = 0; + + virtual bool contains_restore(const std::string &api_path) const = 0; + + virtual api_error download_file(const std::uint64_t &handle, filesystem_item &fsi) = 0; + + virtual bool is_processing(const std::string &api_path) const = 0; + + virtual bool pause_download(const std::string &api_path) = 0; + + virtual api_error read_bytes(const std::uint64_t &handle, filesystem_item &fsi, + std::size_t read_size, const std::uint64_t &read_offset, + std::vector &data) = 0; + + virtual void rename_download(const std::string &from_api_path, + const std::string &to_api_path) = 0; + + virtual api_error resize(const std::uint64_t &handle, filesystem_item &fsi, + const std::uint64_t &size) = 0; + + virtual void resume_download(const std::string &api_path) = 0; + + virtual api_error write_bytes(const std::uint64_t &handle, filesystem_item &fsi, + const std::uint64_t &write_offset, std::vector data, + std::size_t &bytes_written) = 0; +}; +} // namespace repertory + +#endif // INCLUDE_DOWNLOAD_I_DOWNLOAD_MANAGER_HPP_ diff --git a/include/download/reader_pool.hpp b/include/download/reader_pool.hpp new file mode 100644 index 00000000..d9b2a461 --- /dev/null +++ b/include/download/reader_pool.hpp @@ -0,0 +1,87 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DOWNLOAD_READER_POOL_HPP_ +#define INCLUDE_DOWNLOAD_READER_POOL_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class reader_pool final { +public: + typedef std::function completed_callback; + +private: + struct pool_work_item { + pool_work_item(std::string api_path, const std::size_t &read_size, + const std::uint64_t &read_offset, std::vector &data, + completed_callback completed) + : api_path(std::move(api_path)), read_size(read_size), read_offset(read_offset), data(data), + completed(completed) {} + + std::string api_path; + std::size_t read_size; + std::uint64_t read_offset; + std::vector &data; + completed_callback completed; + }; + +public: + reader_pool(const std::size_t &pool_size, const api_reader_callback &api_reader) + : pool_size_(pool_size), api_reader_(api_reader) { + start(); + } + + ~reader_pool() { stop(); } + +private: + const std::size_t pool_size_; + const api_reader_callback &api_reader_; + bool paused_ = false; + bool restart_active_ = false; + bool stop_requested_ = false; + std::mutex work_mutex_; + std::condition_variable work_notify_; + std::deque> work_queue_; + std::vector work_threads_; + std::uint16_t active_count_ = 0u; + +private: + void process_work_item(pool_work_item &work); + + void start(); + + void stop(); + + void wait_for_resume(unique_mutex_lock &lock); + +public: + void pause(); + + void queue_read_bytes(const std::string &api_path, const std::size_t &read_size, + const std::uint64_t &read_offset, std::vector &data, + completed_callback completed); + + void restart(); + + void resume(); +}; +} // namespace repertory + +#endif // INCLUDE_DOWNLOAD_READER_POOL_HPP_ diff --git a/include/download/ring_download.hpp b/include/download/ring_download.hpp new file mode 100644 index 00000000..8980966e --- /dev/null +++ b/include/download/ring_download.hpp @@ -0,0 +1,136 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DOWNLOAD_RING_DOWNLOAD_HPP_ +#define INCLUDE_DOWNLOAD_RING_DOWNLOAD_HPP_ + +#include "common.hpp" +#include "download/i_download.hpp" +#include "utils/native_file.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class buffered_reader; +class app_config; +class ring_download final : public virtual i_download { +private: + struct io_action { + io_action(std::mutex &mtx, std::condition_variable &cv, std::function action) + : mutex(mtx), notify(cv), action(action) {} + + std::mutex &mutex; + std::condition_variable ¬ify; + std::function action; + }; + +public: + ring_download(const app_config &config, filesystem_item fsi, + const api_reader_callback &api_reader, const std::uint64_t &handle, + const std::size_t &chunk_size, const std::size_t &ring_buffer_size); + + ~ring_download() override; + +private: + const app_config &config_; + const filesystem_item fsi_; + const api_reader_callback &api_reader_; + const std::uint64_t handle_; + const std::size_t chunk_size_; + boost::dynamic_bitset<> ring_state_; + const std::size_t total_chunks_ = 0u; + + api_error error_ = api_error::success; + native_file_ptr buffer_file_; + std::string buffer_file_path_; + buffered_reader *buffered_reader_ = nullptr; + bool disable_download_end_ = false; + std::size_t head_chunk_index_ = 0ull; + std::mutex io_mutex_; + std::condition_variable io_notify_; + std::deque> io_queue_; + std::unique_ptr io_thread_; + std::size_t read_chunk_ = 0ull; + std::unique_ptr buffer_thread_; + std::mutex read_mutex_; + std::condition_variable read_notify_; + bool stop_requested_ = false; + std::size_t write_chunk_ = 0ull; + std::mutex write_mutex_; + +private: + void buffer_thread(std::size_t start_chunk_index); + + void io_thread(); + + bool is_active() const { return not stop_requested_ && (error_ == api_error::success); } + + bool queue_io_item(std::mutex &m, std::condition_variable &cv, const bool &is_read, + std::function action); + + void read(std::size_t read_chunk_index, std::size_t read_size, std::size_t read_offset, + std::vector &data); + + void set_api_error(const api_error &error); + + void start(const std::size_t &start_chunk_index); + + void stop(); + +public: + api_error allocate(const std::uint64_t & /*handle*/, const std::uint64_t & /*size*/, + const allocator_callback & /*allocator*/, + const completer_callback & /*completer*/) override { + return api_error::not_implemented; + } + + api_error download_all() override { return api_error::not_implemented; } + + api_error get_result() const override { return error_; } + + std::string get_source_path() const override { return buffer_file_path_; } + + void get_state_information(filesystem_item &, std::size_t &, std::size_t &, + boost::dynamic_bitset<> &, boost::dynamic_bitset<> &) override {} + + bool get_write_supported() const override { return false; } + + void notify_stop_requested() override; + + bool pause() override { return false; } + + api_error read_bytes(const std::uint64_t &, std::size_t read_size, + const std::uint64_t &read_offset, std::vector &data) override; + + void reset_timeout(const bool &) override {} + + void resume() override {} + + void set_api_path(const std::string &) override {} + + void set_disable_download_end(const bool &disable) override { disable_download_end_ = disable; } + + api_error write_bytes(const std::uint64_t &, const std::uint64_t &, std::vector, + std::size_t &bytes_written, + const completer_callback & /*completer*/) override { + bytes_written = 0u; + return api_error::not_implemented; + } +}; +} // namespace repertory + +#endif // INCLUDE_DOWNLOAD_RING_DOWNLOAD_HPP_ diff --git a/include/download/utils.hpp b/include/download/utils.hpp new file mode 100644 index 00000000..7bb5ee6e --- /dev/null +++ b/include/download/utils.hpp @@ -0,0 +1,41 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DOWNLOAD_UTILS_HPP_ +#define INCLUDE_DOWNLOAD_UTILS_HPP_ + +#include "common.hpp" +#include "app_config.hpp" + +namespace repertory::utils::download { +template +void notify_progress(const app_config &config, const std::string &api_path, + const std::string &source_path, const double ¤t, const double &total, + double &progress) { + if (config.get_event_level() >= event_type::level) { + const double next_progress = (current / total) * 100.0; + if ((next_progress == 0.0) || (next_progress >= (progress + 0.2)) || + ((next_progress == 100.00) && (next_progress != progress))) { + progress = next_progress; + event_system::instance().raise(api_path, source_path, progress); + } + } +} +} // namespace repertory::utils::download + +#endif // INCLUDE_DOWNLOAD_UTILS_HPP_ diff --git a/include/drives/directory_cache.hpp b/include/drives/directory_cache.hpp new file mode 100644 index 00000000..d0e3df78 --- /dev/null +++ b/include/drives/directory_cache.hpp @@ -0,0 +1,68 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_DIRECTORY_CACHE_HPP_ +#define INCLUDE_DRIVES_DIRECTORY_CACHE_HPP_ + +#include "common.hpp" + +namespace repertory { +class directory_iterator; + +class directory_cache final { +public: + typedef std::function execute_callback; + +private: + struct open_directory { + directory_iterator *iterator; + std::chrono::system_clock::time_point last_update = std::chrono::system_clock::now(); + }; + +public: + directory_cache() = default; + + ~directory_cache() { stop(); } + +private: + std::unordered_map directory_lookup_; + std::recursive_mutex directory_mutex_; + bool is_shutdown_ = true; + std::unique_ptr refresh_thread_; + std::mutex shutdown_mutex_; + std::condition_variable shutdown_notify_; + +private: + void refresh_thread(); + +public: + bool execute_action(const std::string &api_path, const execute_callback &execute); + + directory_iterator *remove_directory(const std::string &api_path); + + void remove_directory(directory_iterator *iterator); + + void set_directory(const std::string &api_path, directory_iterator *iterator); + + void start(); + + void stop(); +}; +} // namespace repertory + +#endif // INCLUDE_DRIVES_DIRECTORY_CACHE_HPP_ diff --git a/include/drives/directory_iterator.hpp b/include/drives/directory_iterator.hpp new file mode 100644 index 00000000..d84f2e94 --- /dev/null +++ b/include/drives/directory_iterator.hpp @@ -0,0 +1,71 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_DIRECTORY_ITERATOR_HPP_ +#define INCLUDE_DRIVES_DIRECTORY_ITERATOR_HPP_ + +#include "common.hpp" +#include "types/remote.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class directory_iterator final { +public: +#ifndef _WIN32 + typedef std::function + populate_stat_callback; +#endif +public: + explicit directory_iterator(directory_item_list list) : items_(std::move(list)) {} + + directory_iterator(const directory_iterator &iterator) noexcept : items_(iterator.items_) {} + + directory_iterator(directory_iterator &&iterator) noexcept : items_(std::move(iterator.items_)) {} + +private: + directory_item_list items_; + +public: +#ifndef _WIN32 + int fill_buffer(const remote::file_offset &offset, fuse_fill_dir_t filler_function, void *buffer, + populate_stat_callback populate_stat); +#endif + + int get(const std::size_t &offset, std::string &item); + + std::size_t get_count() const { return items_.size(); } + + api_error get_directory_item(const std::size_t &offset, directory_item &di); + + api_error get_directory_item(const std::string &api_path, directory_item &di); + + int get_json(const std::size_t &offset, json &item); + + std::size_t get_next_directory_offset(const std::string &api_path) const; + +public: + directory_iterator &operator=(const directory_iterator &iterator) noexcept; + + directory_iterator &operator=(directory_iterator &&iterator) noexcept; + + directory_iterator &operator=(directory_item_list list) noexcept; +}; +} // namespace repertory + +#endif // INCLUDE_DRIVES_DIRECTORY_ITERATOR_HPP_ diff --git a/include/drives/eviction.hpp b/include/drives/eviction.hpp new file mode 100644 index 00000000..10f3e934 --- /dev/null +++ b/include/drives/eviction.hpp @@ -0,0 +1,59 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_EVICTION_HPP_ +#define INCLUDE_DRIVES_EVICTION_HPP_ + +#include "common.hpp" + +namespace repertory { +class app_config; +class i_open_file_table; +class i_provider; +class eviction final { +public: + eviction(i_provider &provider, const app_config &config, i_open_file_table &oft) + : provider_(provider), config_(config), oft_(oft) {} + + ~eviction() = default; + +private: + i_provider &provider_; + const app_config &config_; + i_open_file_table &oft_; + bool stop_requested_ = false; + std::mutex start_stop_mutex_; + std::condition_variable stop_notify_; + std::unique_ptr eviction_thread_; + std::mutex eviction_mutex_; + +private: + void check_items_thread(); + + bool check_minimum_requirements(const std::string &file_path); + + std::deque get_filtered_cached_files(); + +public: + void start(); + + void stop(); +}; +} // namespace repertory + +#endif // INCLUDE_DRIVES_EVICTION_HPP_ diff --git a/include/drives/fuse/events.hpp b/include/drives/fuse/events.hpp new file mode 100644 index 00000000..c867069e --- /dev/null +++ b/include/drives/fuse/events.hpp @@ -0,0 +1,39 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_FUSE_EVENTS_HPP_ +#define INCLUDE_DRIVES_FUSE_EVENTS_HPP_ + +#include "common.hpp" +#include "events/event_system.hpp" + +namespace repertory { +// clang-format off +E_SIMPLE3(fuse_event, debug, true, + std::string, function, func, E_STRING, + std::string, api_path, ap, E_STRING, + int, result, res, E_FROM_INT32 +); + +E_SIMPLE1(fuse_args_parsed, normal, true, + std::string, arguments, args, E_STRING +); +// clang-format on +} // namespace repertory + +#endif // INCLUDE_DRIVES_FUSE_EVENTS_HPP_ diff --git a/include/drives/fuse/fuse_base.hpp b/include/drives/fuse/fuse_base.hpp new file mode 100644 index 00000000..37a785f2 --- /dev/null +++ b/include/drives/fuse/fuse_base.hpp @@ -0,0 +1,506 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_FUSE_FUSE_BASE_HPP_ +#define INCLUDE_DRIVES_FUSE_FUSE_BASE_HPP_ +#ifndef _WIN32 + +#include "common.hpp" +#include "events/event_system.hpp" +#include "drives/fuse/i_fuse_drive.hpp" +#include "utils/path_utils.hpp" + +namespace repertory { +class app_config; +class i_provider; + +class fuse_base : public i_fuse_drive { + E_CONSUMER(); + +public: + explicit fuse_base(app_config &config_); + + virtual ~fuse_base(); + +protected: + app_config &config_; + +private: + std::string mount_location_; + +protected: + bool atime_enabled_ = true; + bool console_enabled_ = false; + std::optional forced_gid_; + std::optional forced_uid_; + std::optional forced_umask_; + +private: + static fuse_base &instance(); + +private: + // clang-format off + struct fuse_operations fuse_ops_ { + .getattr = fuse_base::getattr_, + .readlink = nullptr, // int (*readlink) (const char *, char *, size_t); + .getdir = nullptr, // int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t); + .mknod = nullptr, // int (*mknod) (const char *, mode_t, dev_t); + .mkdir = fuse_base::mkdir_, + .unlink = fuse_base::unlink_, + .rmdir = fuse_base::rmdir_, + .symlink = nullptr, // int (*symlink) (const char *, const char *); + .rename = fuse_base::rename_, + .link = nullptr, // int (*link) (const char *, const char *); + .chmod = fuse_base::chmod_, + .chown = fuse_base::chown_, + .truncate = fuse_base::truncate_, + .utime = nullptr, // int (*utime) (const char *, struct utimbuf *); + .open = fuse_base::open_, + .read = fuse_base::read_, + .write = fuse_base::write_, +#ifdef __APPLE__ + .statfs = nullptr, +#else // __APPLE__ + .statfs = fuse_base::statfs_, +#endif // __APPLE__ + .flush = nullptr, // int (*flush) (const char *, struct fuse_file_info *); + .release = fuse_base::release_, + .fsync = fuse_base::fsync_, +#if HAS_SETXATTR + .setxattr = fuse_base::setxattr_, + .getxattr = fuse_base::getxattr_, + .listxattr = fuse_base::listxattr_, + .removexattr = fuse_base::removexattr_, +#else // HAS_SETXATTR + .setxattr = nullptr, + .getxattr = nullptr, + .listxattr = nullptr, + .removexattr = nullptr, +#endif // HAS_SETXATTR + .opendir = fuse_base::opendir_, + .readdir = fuse_base::readdir_, + .releasedir = fuse_base::releasedir_, + .fsyncdir = nullptr, // int (*fsyncdir) (const char *, int, struct fuse_file_info *); + .init = fuse_base::init_, + .destroy = fuse_base::destroy_, + .access = fuse_base::access_, + .create = fuse_base::create_, + .ftruncate = fuse_base::ftruncate_, + .fgetattr = fuse_base::fgetattr_, + .lock = nullptr, // int (*lock) (const char *, struct fuse_file_info *, int cmd, struct flock *); + .utimens = fuse_base::utimens_, + .bmap = nullptr, // int (*bmap) (const char *, size_t blocksize, uint64_t *idx); + .flag_nullpath_ok = 0, + .flag_nopath = 0, + .flag_utime_omit_ok = 1, + .flag_reserved = 0, + .ioctl = nullptr, // int (*ioctl) (const char *, int cmd, void *arg, struct fuse_file_info *, unsigned int flags, void *data); + .poll = nullptr, // int (*poll) (const char *, struct fuse_file_info *, struct fuse_pollhandle *ph, unsigned *reventsp); + .write_buf = nullptr, // int (*write_buf) (const char *, struct fuse_bufvec *buf, off_t off, struct fuse_file_info *); + .read_buf = nullptr, // int (*read_buf) (const char *, struct fuse_bufvec **bufp, size_t size, off_t off, struct fuse_file_info *); + .flock = nullptr, // int (*flock) (const char *, struct fuse_file_info *, int op); + .fallocate = fuse_base::fallocate_ + }; + // clang-format on + +private: + int execute_callback(const std::string &function_name, const char *from, const char *to, + const std::function &cb, + const bool &disable_logging = false); + + int execute_callback(const std::string &function_name, const char *path, + const std::function &cb, + const bool &disable_logging = false); + + static void execute_void_callback(const std::string &function_name, + const std::function &cb); + + static void *execute_void_pointer_callback(const std::string &function_name, + const std::function &cb); + + void raise_fuse_event(std::string function_name, const std::string &api_file, const int &ret, + const bool &disable_logging); + +private: + static int access_(const char *path, int mask); + +#ifdef __APPLE__ + static int chflags_(const char *path, uint32_t flags); +#endif // __APPLE__ + + static int chmod_(const char *path, mode_t mode); + + static int chown_(const char *path, uid_t uid, gid_t gid); + + static int create_(const char *path, mode_t mode, struct fuse_file_info *fi); + + static void destroy_(void *ptr); + + static int fallocate_(const char *path, int mode, off_t offset, off_t length, + struct fuse_file_info *fi); + + static int fgetattr_(const char *path, struct stat *st, struct fuse_file_info *fi); + +#ifdef __APPLE__ + static int fsetattr_x_(const char *path, struct setattr_x *attr, struct fuse_file_info *fi); +#endif // __APPLE__ + + static int fsync_(const char *path, int datasync, struct fuse_file_info *fi); + + static int ftruncate_(const char *path, off_t size, struct fuse_file_info *fi); + + static int getattr_(const char *path, struct stat *st); + +#ifdef __APPLE__ + static int getxtimes_(const char *path, struct timespec *bkuptime, struct timespec *crtime); +#endif // __APPLE__ + + static void *init_(struct fuse_conn_info *conn); + + static int mkdir_(const char *path, mode_t mode); + + static int open_(const char *path, struct fuse_file_info *fi); + + static int opendir_(const char *path, struct fuse_file_info *fi); + + static int read_(const char *path, char *buffer, size_t read_size, off_t read_offset, + struct fuse_file_info *fi); + + static int readdir_(const char *path, void *buf, fuse_fill_dir_t fuse_fill_dir, off_t offset, + struct fuse_file_info *fi); + + static int release_(const char *path, struct fuse_file_info *fi); + + static int releasedir_(const char *path, struct fuse_file_info *fi); + + static int rename_(const char *from, const char *to); + + static int rmdir_(const char *path); + +#ifdef HAS_SETXATTR +#ifdef __APPLE__ + static int getxattr_(const char *path, const char *name, char *value, size_t size, + uint32_t position); + +#else // __APPLE__ + static int getxattr_(const char *path, const char *name, char *value, size_t size); +#endif // __APPLE__ + + static int listxattr_(const char *path, char *buffer, size_t size); + + static int removexattr_(const char *path, const char *name); + +#ifdef __APPLE__ + static int setxattr_(const char *path, const char *name, const char *value, size_t size, + int flags, uint32_t position); + +#else // __APPLE__ + static int setxattr_(const char *path, const char *name, const char *value, size_t size, + int flags); +#endif // __APPLE__ +#endif // HAS_SETXATTR + +#ifdef __APPLE__ + static int setattr_x_(const char *path, struct setattr_x *attr); + + static int setbkuptime_(const char *path, const struct timespec *bkuptime); + + static int setchgtime_(const char *path, const struct timespec *chgtime); + + static int setcrtime_(const char *path, const struct timespec *crtime); + + static int setvolname_(const char *volname); + + static int statfs_x_(const char *path, struct statfs *stbuf); + +#else // __APPLE__ + static int statfs_(const char *path, struct statvfs *stbuf); +#endif // __APPLE__ + + static int truncate_(const char *path, off_t size); + + static int unlink_(const char *path); + + static int utimens_(const char *path, const struct timespec tv[2]); + + static int write_(const char *path, const char *buffer, size_t write_size, off_t write_offset, + struct fuse_file_info *fi); + +protected: + api_error check_access(const std::string &api_path, int mask) const; + + api_error check_and_perform(const std::string &api_path, int parent_mask, + const std::function &action); + + uid_t get_effective_uid() const; + + gid_t get_effective_gid() const; + + static api_error check_open_flags(const int &flags, const int &mask, const api_error &fail_error); + + api_error check_owner(const api_meta_map &meta) const; + + static api_error check_readable(const int &flags, const api_error &fail_error); + + static api_error check_writeable(const int &flags, const api_error &fail_error); + +#ifdef __APPLE__ + static __uint32_t get_flags_from_meta(const api_meta_map &meta); +#endif // __APPLE__ + + static gid_t get_gid_from_meta(const api_meta_map &meta); + + static mode_t get_mode_from_meta(const api_meta_map &meta); + + static void get_timespec_from_meta(const api_meta_map &meta, const std::string &name, + struct timespec &ts); + + static uid_t get_uid_from_meta(const api_meta_map &meta); + + static void populate_stat(const std::string &api_path, const std::uint64_t &size_or_count, + const api_meta_map &meta, const bool &directory, i_provider &provider, + struct stat *st); + + static void set_timespec_from_meta(const api_meta_map &meta, const std::string &name, + struct timespec &ts); + +protected: + virtual api_error access_impl(std::string api_path, int mask) { + return check_access(api_path, mask); + } + +#ifdef __APPLE__ + virtual api_error chflags_impl(std::string /*api_path*/, uint32_t /*flags*/) { + return api_error::not_implemented; + } +#endif // __APPLE__ + + virtual api_error chmod_impl(std::string /*api_path*/, mode_t /*mode*/) { + return api_error::not_implemented; + } + + virtual api_error chown_impl(std::string /*api_path*/, uid_t /*uid*/, gid_t /*gid*/) { + return api_error::not_implemented; + } + + virtual api_error create_impl(std::string /*api_path*/, mode_t /*mode*/, + struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual void destroy_impl(void * /*ptr*/) { return; } + + virtual api_error fallocate_impl(std::string /*api_path*/, int /*mode*/, off_t /*offset*/, + off_t /*length*/, struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual api_error fgetattr_impl(std::string /*api_path*/, struct stat * /*st*/, + struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual api_error fsetattr_x_impl(std::string /*api_path*/, struct setattr_x * /*attr*/, + struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual api_error fsync_impl(std::string /*api_path*/, int /*datasync*/, + struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual api_error ftruncate_impl(std::string /*api_path*/, off_t /*size*/, + struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual api_error getattr_impl(std::string /*api_path*/, struct stat * /*st*/) { + return api_error::not_implemented; + } + +#ifdef __APPLE__ + virtual api_error getxtimes_impl(std::string /*api_path*/, struct timespec * /*bkuptime*/, + struct timespec * /*crtime*/) { + return api_error::not_implemented; + } +#endif // __APPLE__ + + virtual void *init_impl(struct fuse_conn_info *conn); + + virtual api_error mkdir_impl(std::string /*api_path*/, mode_t /*mode*/) { + return api_error::not_implemented; + } + + virtual api_error open_impl(std::string /*api_path*/, struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual api_error opendir_impl(std::string /*api_path*/, struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual api_error read_impl(std::string /*api_path*/, char * /*buffer*/, size_t /*read_size*/, + off_t /*read_offset*/, struct fuse_file_info * /*fi*/, + std::size_t & /*bytes_read*/) { + return api_error::not_implemented; + } + + virtual api_error readdir_impl(std::string /*api_path*/, void * /*buf*/, + fuse_fill_dir_t /*fuse_fill_dir*/, off_t /*offset*/, + struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual api_error release_impl(std::string /*api_path*/, struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual api_error releasedir_impl(std::string /*api_path*/, struct fuse_file_info * /*fi*/) { + return api_error::not_implemented; + } + + virtual api_error rename_impl(std::string /*from_api_path*/, std::string /*to_api_path*/) { + return api_error::not_implemented; + } + + virtual api_error rmdir_impl(std::string /*api_path*/) { return api_error::not_implemented; } + +#ifdef HAS_SETXATTR +#ifdef __APPLE__ + virtual api_error getxattr_impl(std::string /*api_path*/, const char * /*name*/, char * /*value*/, + size_t /*size*/, uint32_t /*position*/, + int & /*attribute_size*/) { + return api_error::not_implemented; + } +#else // __APPLE__ + virtual api_error getxattr_impl(std::string /*api_path*/, const char * /*name*/, char * /*value*/, + size_t /*size*/, int & /*attribute_size*/) { + return api_error::not_implemented; + } +#endif // __APPLE__ + + virtual api_error listxattr_impl(std::string /*api_path*/, char * /*buffer*/, size_t /*size*/, + int & /*required_size*/, bool & /*return_size*/) { + return api_error::not_implemented; + } + + virtual api_error removexattr_impl(std::string /*api_path*/, const char * /*name*/) { + return api_error::not_implemented; + } + +#ifdef __APPLE__ + virtual api_error setxattr_impl(std::string /*api_path*/, const char * /*name*/, + const char * /*value*/, size_t /*size*/, int /*flags*/, + uint32_t /*position*/) { + return api_error::not_implemented; + } +#else // __APPLE__ + virtual api_error setxattr_impl(std::string /*api_path*/, const char * /*name*/, + const char * /*value*/, size_t /*size*/, int /*flags*/) { + return api_error::not_implemented; + } +#endif // __APPLE__ +#endif // HAS_SETXATTR + +#ifdef __APPLE__ + virtual api_error setattr_x_impl(std::string /*api_path*/, struct setattr_x * /*attr*/) { + return api_error::not_implemented; + } + + virtual api_error setbkuptime_impl(std::string /*api_path*/, + const struct timespec * /*bkuptime*/) { + return api_error::not_implemented; + } + + virtual api_error setchgtime_impl(std::string /*api_path*/, const struct timespec * /*chgtime*/) { + return api_error::not_implemented; + } + + virtual api_error setcrtime_impl(std::string /*api_path*/, const struct timespec * /*crtime*/) { + return api_error::not_implemented; + } + + virtual api_error setvolname_impl(const char * /*volname*/) { return api_error::not_implemented; } + + virtual api_error statfs_x_impl(std::string /*api_path*/, struct statfs * /*stbuf*/) { + return api_error::not_implemented; + } +#else // __APPLE__ + virtual api_error statfs_impl(std::string /*api_path*/, struct statvfs * /*stbuf*/) { + return api_error::not_implemented; + } +#endif // __APPLE__ + + virtual api_error truncate_impl(std::string /*api_path*/, off_t /*size*/) { + return api_error::not_implemented; + } + + virtual api_error unlink_impl(std::string /*api_path*/) { return api_error::not_implemented; } + + virtual api_error utimens_impl(std::string /*api_path*/, const struct timespec /*tv*/[2]) { + return api_error::not_implemented; + } + + virtual api_error write_impl(std::string /*api_path*/, const char * /*buffer*/, + size_t /*write_size*/, off_t /*write_offset*/, + struct fuse_file_info * /*fi*/, std::size_t & /*bytes_written*/) { + return api_error::not_implemented; + } + +protected: + virtual void notify_fuse_args_parsed(const std::vector & /*args*/) {} + + virtual void notify_fuse_main_exit(int & /*ret*/) {} + + virtual int parse_args(std::vector &args); + +#ifdef __APPLE__ + api_error parse_xattr_parameters(const char *name, const uint32_t &position, + std::string &attribute_name, const std::string &api_path); +#else + api_error parse_xattr_parameters(const char *name, std::string &attribute_name, + const std::string &api_path); +#endif + +#ifdef __APPLE__ + api_error parse_xattr_parameters(const char *name, const char *value, size_t size, + const uint32_t &position, std::string &attribute_name, + const std::string &api_path); +#else + api_error parse_xattr_parameters(const char *name, const char *value, size_t size, + std::string &attribute_name, const std::string &api_path); +#endif + + virtual int shutdown(); + +public: + static void display_options(int argc, char *argv[]); + + static void display_version_information(int argc, char *argv[]); + + api_error check_parent_access(const std::string &api_path, int mask) const override; + + std::string get_mount_location() const { return mount_location_; } + + int mount(std::vector args); +}; +} // namespace repertory + +#endif // _WIN32 +#endif // INCLUDE_DRIVES_FUSE_FUSE_BASE_HPP_ diff --git a/include/drives/fuse/fuse_drive.hpp b/include/drives/fuse/fuse_drive.hpp new file mode 100644 index 00000000..6659b000 --- /dev/null +++ b/include/drives/fuse/fuse_drive.hpp @@ -0,0 +1,217 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_FUSE_FUSE_DRIVE_HPP_ +#define INCLUDE_DRIVES_FUSE_FUSE_DRIVE_HPP_ +#ifndef _WIN32 + +#include "common.hpp" +#include "drives/fuse/fuse_base.hpp" +#include "drives/open_file_table.hpp" + +namespace repertory { +class i_provider; +class app_config; +class console_consumer; +class directory_cache; +class download_manager; +class eviction; +class full_server; +class lock_data; +class logging_consumer; +namespace remote_fuse { +class remote_server; +} + +class fuse_drive final : public fuse_base { +public: + fuse_drive(app_config &config, lock_data &lock_data, i_provider &provider); + + ~fuse_drive() override = default; + +private: + lock_data &lock_data_; + i_provider &provider_; + + std::shared_ptr console_consumer_; + std::shared_ptr directory_cache_; + std::shared_ptr download_manager_; + std::shared_ptr eviction_; + std::shared_ptr logging_consumer_; + std::shared_ptr> oft_; + std::shared_ptr remote_server_; + std::shared_ptr server_; + bool was_mounted_ = false; + +protected: +#ifdef __APPLE__ + api_error chflags_impl(std::string api_path, uint32_t flags) override; +#endif // __APPLE__ + + api_error chmod_impl(std::string api_path, mode_t mode) override; + + api_error chown_impl(std::string api_path, uid_t uid, gid_t gid) override; + + api_error create_impl(std::string api_path, mode_t mode, struct fuse_file_info *fi) override; + + void destroy_impl(void *ptr) override; + + api_error fallocate_impl(std::string api_path, int mode, off_t offset, off_t length, + struct fuse_file_info *fi) override; + + api_error fgetattr_impl(std::string api_path, struct stat *st, + struct fuse_file_info *fi) override; + +#ifdef __APPLE__ + api_error fsetattr_x_impl(std::string api_path, struct setattr_x *attr, + struct fuse_file_info *fi) override; +#endif // __APPLE__ + + api_error fsync_impl(std::string api_path, int datasync, struct fuse_file_info *fi) override; + + api_error ftruncate_impl(std::string api_path, off_t size, struct fuse_file_info *fi) override; + + api_error getattr_impl(std::string api_path, struct stat *st) override; + +#ifdef __APPLE__ + api_error getxtimes_impl(std::string api_path, struct timespec *bkuptime, + struct timespec *crtime) override; +#endif // __APPLE__ + + void *init_impl(struct fuse_conn_info *conn) override; + + api_error mkdir_impl(std::string api_path, mode_t mode) override; + + api_error open_impl(std::string api_path, struct fuse_file_info *fi) override; + + api_error opendir_impl(std::string api_path, struct fuse_file_info *fi) override; + + api_error read_impl(std::string api_path, char *buffer, size_t read_size, off_t read_offset, + struct fuse_file_info *fi, std::size_t &bytes_read) override; + + api_error readdir_impl(std::string api_path, void *buf, fuse_fill_dir_t fuse_fill_dir, + off_t offset, struct fuse_file_info *fi) override; + + api_error release_impl(std::string api_path, struct fuse_file_info *fi) override; + + api_error releasedir_impl(std::string api_path, struct fuse_file_info *fi) override; + + api_error rename_impl(std::string from_api_path, std::string to_api_path) override; + + api_error rmdir_impl(std::string api_path) override; + +#ifdef HAS_SETXATTR + api_error getxattr_common(std::string api_path, const char *name, char *value, size_t size, + int &attribute_size, uint32_t *position); + +#ifdef __APPLE__ + api_error getxattr_impl(std::string api_path, const char *name, char *value, size_t size, + uint32_t position, int &attribute_size) override; +#else // __APPLE__ + api_error getxattr_impl(std::string api_path, const char *name, char *value, size_t size, + int &attribute_size) override; +#endif // __APPLE__ + + api_error listxattr_impl(std::string api_path, char *buffer, size_t size, int &required_size, + bool &return_size) override; + + api_error removexattr_impl(std::string api_path, const char *name) override; + +#ifdef __APPLE__ + api_error setxattr_impl(std::string api_path, const char *name, const char *value, size_t size, + int flags, uint32_t position) override; +#else // __APPLE__ + api_error setxattr_impl(std::string api_path, const char *name, const char *value, size_t size, + int flags) override; +#endif // __APPLE__ +#endif // HAS_SETXATTR + +#ifdef __APPLE__ + api_error setattr_x_impl(std::string api_path, struct setattr_x *attr) override; + + api_error setbkuptime_impl(std::string api_path, const struct timespec *bkuptime) override; + + api_error setchgtime_impl(std::string api_path, const struct timespec *chgtime) override; + + api_error setcrtime_impl(std::string api_path, const struct timespec *crtime) override; + + api_error setvolname_impl(const char *volname) override; + + api_error statfs_x_impl(std::string api_path, struct statfs *stbuf) override; +#else // __APPLE__ + api_error statfs_impl(std::string api_path, struct statvfs *stbuf) override; +#endif // __APPLE__ + + api_error truncate_impl(std::string api_path, off_t size) override; + + api_error unlink_impl(std::string api_path) override; + + api_error utimens_impl(std::string api_path, const struct timespec tv[2]) override; + + api_error write_impl(std::string api_path, const char *buffer, size_t write_size, + off_t write_offset, struct fuse_file_info *fi, + std::size_t &bytes_written) override; + +protected: + void notify_fuse_args_parsed(const std::vector &args) override; + + void notify_fuse_main_exit(int &ret) override; + + int shutdown() override; + + void update_accessed_time(const std::string &api_path); + +public: + std::uint64_t get_directory_item_count(const std::string &api_path) const override; + + directory_item_list get_directory_items(const std::string &api_path) const override; + + std::uint64_t get_file_size(const std::string &api_path) const override; + + api_error get_item_meta(const std::string &api_path, api_meta_map &meta) const override; + + api_error get_item_meta(const std::string &api_path, const std::string &name, + std::string &value) const override; + + std::uint64_t get_total_drive_space() const override; + + std::uint64_t get_total_item_count() const override; + + std::uint64_t get_used_drive_space() const override; + + void get_volume_info(UINT64 &total_size, UINT64 &free_size, + std::string &volume_label) const override; + + bool is_processing(const std::string &api_path) const override; + + void populate_stat(const directory_item &di, struct stat &st) const override; + + int rename_directory(const std::string &from_api_path, const std::string &to_api_path) override; + + int rename_file(const std::string &from_api_path, const std::string &to_api_path, + const bool &overwrite) override; + + void set_item_meta(const std::string &api_path, const std::string &key, + const std::string &value) override; + + void update_directory_item(directory_item &di) const override; +}; +} // namespace repertory + +#endif // _WIN32 +#endif // INCLUDE_DRIVES_FUSE_FUSE_DRIVE_HPP_ diff --git a/include/drives/fuse/i_fuse_drive.hpp b/include/drives/fuse/i_fuse_drive.hpp new file mode 100644 index 00000000..8a644b3a --- /dev/null +++ b/include/drives/fuse/i_fuse_drive.hpp @@ -0,0 +1,71 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_FUSE_I_FUSE_DRIVE_HPP_ +#define INCLUDE_DRIVES_FUSE_I_FUSE_DRIVE_HPP_ +#ifndef _WIN32 + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class i_fuse_drive { + INTERFACE_SETUP(i_fuse_drive); + +public: + virtual api_error check_parent_access(const std::string &api_path, int mask) const = 0; + + virtual std::uint64_t get_directory_item_count(const std::string &api_path) const = 0; + + virtual directory_item_list get_directory_items(const std::string &api_path) const = 0; + + virtual std::uint64_t get_file_size(const std::string &api_path) const = 0; + + virtual api_error get_item_meta(const std::string &api_path, api_meta_map &meta) const = 0; + + virtual api_error get_item_meta(const std::string &api_path, const std::string &name, + std::string &value) const = 0; + + virtual std::uint64_t get_total_drive_space() const = 0; + + virtual std::uint64_t get_total_item_count() const = 0; + + virtual std::uint64_t get_used_drive_space() const = 0; + + virtual void get_volume_info(UINT64 &total_size, UINT64 &free_size, + std::string &volume_label) const = 0; + + virtual bool is_processing(const std::string &api_path) const = 0; + + virtual void populate_stat(const directory_item &di, struct stat &st) const = 0; + + virtual int rename_directory(const std::string &from_api_path, + const std::string &to_api_path) = 0; + + virtual int rename_file(const std::string &from_api_path, const std::string &to_api_path, + const bool &overwrite) = 0; + + virtual void set_item_meta(const std::string &api_path, const std::string &key, + const std::string &value) = 0; + + virtual void update_directory_item(directory_item &di) const = 0; +}; +} // namespace repertory + +#endif +#endif // INCLUDE_DRIVES_FUSE_I_FUSE_DRIVE_HPP_ diff --git a/include/drives/fuse/remotefuse/i_remote_instance.hpp b/include/drives/fuse/remotefuse/i_remote_instance.hpp new file mode 100644 index 00000000..465869ae --- /dev/null +++ b/include/drives/fuse/remotefuse/i_remote_instance.hpp @@ -0,0 +1,151 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_FUSE_REMOTEFUSE_I_REMOTE_INSTANCE_HPP_ +#define INCLUDE_DRIVES_FUSE_REMOTEFUSE_I_REMOTE_INSTANCE_HPP_ + +#include "common.hpp" +#include "drives/remote/i_remote_json.hpp" +#include "types/remote.hpp" + +namespace repertory::remote_fuse { +class i_remote_instance : public virtual i_remote_json { + INTERFACE_SETUP(i_remote_instance); + +public: + virtual packet::error_type fuse_access(const char *path, const std::int32_t &mask) = 0; + + virtual packet::error_type fuse_chflags(const char *path, const std::uint32_t &flags) = 0; + + virtual packet::error_type fuse_chmod(const char *path, const remote::file_mode &mode) = 0; + + virtual packet::error_type fuse_chown(const char *path, const remote::user_id &uid, + const remote::group_id &gid) = 0; + + virtual packet::error_type fuse_create(const char *path, const remote::file_mode &mode, + const remote::open_flags &flags, + remote::file_handle &handle) = 0; + virtual packet::error_type fuse_destroy() = 0; + + /*virtual packet::error_type fuse_fallocate(const char *path, const std::int32_t &mode, + const remote::file_offset &offset, + const remote::file_offset &length, + const remote::file_offset &length, + const remote::file_handle &handle) = 0;*/ + + virtual packet::error_type fuse_fgetattr(const char *path, remote::stat &st, bool &directory, + const remote::file_handle &handle) = 0; + + virtual packet::error_type fuse_fsetattr_x(const char *path, const remote::setattr_x &attr, + const remote::file_handle &handle) = 0; + + virtual packet::error_type fuse_fsync(const char *path, const std::int32_t &datasync, + const remote::file_handle &handle) = 0; + + virtual packet::error_type fuse_ftruncate(const char *path, const remote::file_offset &size, + const remote::file_handle &handle) = 0; + + virtual packet::error_type fuse_getattr(const char *path, remote::stat &st, bool &directory) = 0; + + /*virtual packet::error_type fuse_getxattr(const char *path, const char *name, char *value, + const remote::file_size &size) = 0; + + virtual packet::error_type fuse_getxattrOSX(const char *path, const char *name, char *value, + const remote::file_size &size, + const std::uint32_t &position) = 0;*/ + + virtual packet::error_type fuse_getxtimes(const char *path, remote::file_time &bkuptime, + remote::file_time &crtime) = 0; + + virtual packet::error_type fuse_init() = 0; + + /*virtual packet::error_type fuse_listxattr(const char *path, char *buffer, + const remote::file_size &size) = 0;*/ + + virtual packet::error_type fuse_mkdir(const char *path, const remote::file_mode &mode) = 0; + + virtual packet::error_type fuse_open(const char *path, const remote::open_flags &flags, + remote::file_handle &handle) = 0; + + virtual packet::error_type fuse_opendir(const char *path, remote::file_handle &handle) = 0; + + virtual packet::error_type fuse_read(const char *path, char *buffer, + const remote::file_size &readSize, + const remote::file_offset &readOffset, + const remote::file_handle &handle) = 0; + + virtual packet::error_type fuse_readdir(const char *path, const remote::file_offset &offset, + const remote::file_handle &handle, std::string &itemPath) = 0; + + virtual packet::error_type fuse_release(const char *path, const remote::file_handle &handle) = 0; + + virtual packet::error_type fuse_releasedir(const char *path, const remote::file_handle &handle) = 0; + + // virtual packet::error_type fuse_removexattr(const char *path, const char *name) = 0; + + virtual packet::error_type fuse_rename(const char *from, const char *to) = 0; + + virtual packet::error_type fuse_rmdir(const char *path) = 0; + + virtual packet::error_type fuse_setattr_x(const char *path, remote::setattr_x &attr) = 0; + + virtual packet::error_type fuse_setbkuptime(const char *path, const remote::file_time &bkuptime) = 0; + + virtual packet::error_type fuse_setchgtime(const char *path, const remote::file_time &chgtime) = 0; + + virtual packet::error_type fuse_setcrtime(const char *path, const remote::file_time &crtime) = 0; + + virtual packet::error_type fuse_setvolname(const char *volname) = 0; + + /*virtual packet::error_type fuse_setxattr(const char *path, const char *name, + const char *value, const remote::file_size &size, + const std::int32_t &flags) = 0; + virtual packet::error_type fuse_setxattr_osx(const char *path, const char *name, + const char *value, const remote::file_size &size, + const std::int32_t &flags, + const std::uint32_t &position) = 0;*/ + + virtual packet::error_type fuse_statfs(const char *path, const std::uint64_t &frsize, + remote::statfs &st) = 0; + + virtual packet::error_type fuse_statfs_x(const char *path, const std::uint64_t &bsize, + remote::statfs_x &st) = 0; + + virtual packet::error_type fuse_truncate(const char *path, const remote::file_offset &size) = 0; + + virtual packet::error_type fuse_unlink(const char *path) = 0; + + virtual packet::error_type fuse_utimens(const char *path, const remote::file_time *tv, + const std::uint64_t &op0, const std::uint64_t &op1) = 0; + + virtual packet::error_type fuse_write(const char *path, const char *buffer, + const remote::file_size &writeSize, + const remote::file_offset &writeOffset, + const remote::file_handle &handle) = 0; + + virtual packet::error_type fuse_write_base64(const char *path, const char *buffer, + const remote::file_size &writeSize, + const remote::file_offset &writeOffset, + const remote::file_handle &handle) = 0; + + virtual void set_fuse_uid_gid(const remote::user_id &uid, const remote::group_id &gid) = 0; +}; +typedef std::function()> remote_instance_factory; +} // namespace repertory::remote_fuse + +#endif // INCLUDE_DRIVES_FUSE_REMOTEFUSE_I_REMOTE_INSTANCE_HPP_ diff --git a/include/drives/fuse/remotefuse/remote_client.hpp b/include/drives/fuse/remotefuse/remote_client.hpp new file mode 100644 index 00000000..6c2db669 --- /dev/null +++ b/include/drives/fuse/remotefuse/remote_client.hpp @@ -0,0 +1,172 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_CLIENT_HPP_ +#define INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_CLIENT_HPP_ + +#include "common.hpp" +#include "comm/packet/packet_client.hpp" +#include "drives/fuse/remotefuse/i_remote_instance.hpp" +#include "events/event_system.hpp" +#include "types/remote.hpp" + +namespace repertory { +class app_config; + +namespace remote_fuse { +class remote_client final : public i_remote_instance { +public: + explicit remote_client(const app_config &config); + +private: + const app_config &config_; + packet_client packet_client_; + remote::user_id uid_ = 0; + remote::group_id gid_ = 0; + +public: + packet::error_type fuse_access(const char *path, const std::int32_t &mask) override; + + packet::error_type fuse_chflags(const char *path, const std::uint32_t &flags) override; + + packet::error_type fuse_chmod(const char *path, const remote::file_mode &mode) override; + + packet::error_type fuse_chown(const char *path, const remote::user_id &uid, + const remote::group_id &gid) override; + + packet::error_type fuse_destroy() override; + + /*packet::error_type fuse_fallocate(const char *path, const std::int32_t &mode, + const remote::file_offset &offset, + const remote::file_offset &length, + const remote::file_handle &handle) override ;*/ + + packet::error_type fuse_fgetattr(const char *path, remote::stat &st, bool &directory, + const remote::file_handle &handle) override; + + packet::error_type fuse_fsetattr_x(const char *path, const remote::setattr_x &attr, + const remote::file_handle &handle) override; + + packet::error_type fuse_fsync(const char *path, const std::int32_t &datasync, + const remote::file_handle &handle) override; + + packet::error_type fuse_ftruncate(const char *path, const remote::file_offset &size, + const remote::file_handle &handle) override; + + packet::error_type fuse_getattr(const char *path, remote::stat &st, bool &directory) override; + + /*packet::error_type fuse_getxattr(const char *path, const char *name, char *value, + const remote::file_size &size) override ; + + packet::error_type fuse_getxattrOSX(const char *path, const char *name, char *value, + const remote::file_size &size, + const std::uint32_t &position) override ;*/ + + packet::error_type fuse_getxtimes(const char *path, remote::file_time &bkuptime, + remote::file_time &crtime) override; + + packet::error_type fuse_init() override; + + /*packet::error_type fuse_listxattr(const char *path, char *buffer, + const remote::file_size &size) override ;*/ + + packet::error_type fuse_mkdir(const char *path, const remote::file_mode &mode) override; + + packet::error_type fuse_opendir(const char *path, remote::file_handle &handle) override; + + packet::error_type fuse_create(const char *path, const remote::file_mode &mode, + const remote::open_flags &flags, remote::file_handle &handle) override; + + packet::error_type fuse_open(const char *path, const remote::open_flags &flags, + remote::file_handle &handle) override; + + packet::error_type fuse_read(const char *path, char *buffer, const remote::file_size &read_size, + const remote::file_offset &read_offset, + const remote::file_handle &handle) override; + + packet::error_type fuse_rename(const char *from, const char *to) override; + + packet::error_type fuse_readdir(const char *path, const remote::file_offset &offset, + const remote::file_handle &handle, std::string &item_path) override; + + packet::error_type fuse_release(const char *path, const remote::file_handle &handle) override; + + packet::error_type fuse_releasedir(const char *path, const remote::file_handle &handle) override; + + /*packet::error_type fuse_removexattr(const char *path, const char *name) override ;*/ + + packet::error_type fuse_rmdir(const char *path) override; + + packet::error_type fuse_setattr_x(const char *path, remote::setattr_x &attr) override; + + packet::error_type fuse_setbkuptime(const char *path, const remote::file_time &bkuptime) override; + + packet::error_type fuse_setchgtime(const char *path, const remote::file_time &chgtime) override; + + packet::error_type fuse_setcrtime(const char *path, const remote::file_time &crtime) override; + + packet::error_type fuse_setvolname(const char *volname) override; + + /*packet::error_type fuse_setxattr(const char *path, const char *name, const char *value, + const remote::file_size &size, + const std::int32_t &flags) override ; + + packet::error_type fuse_setxattr_osx(const char *path, const char *name, const char *value, + const remote::file_size &size, const std::int32_t &flags, + const std::uint32_t &position) override ;*/ + + packet::error_type fuse_statfs(const char *path, const std::uint64_t &frsize, + remote::statfs &st) override; + + packet::error_type fuse_statfs_x(const char *path, const std::uint64_t &bsize, + remote::statfs_x &st) override; + + packet::error_type fuse_truncate(const char *path, const remote::file_offset &size) override; + + packet::error_type fuse_unlink(const char *path) override; + + packet::error_type fuse_utimens(const char *path, const remote::file_time *tv, + const std::uint64_t &op0, const std::uint64_t &op1) override; + + packet::error_type fuse_write(const char *path, const char *buffer, + const remote::file_size &write_size, + const remote::file_offset &write_offset, + const remote::file_handle &handle) override; + + packet::error_type fuse_write_base64(const char *path, const char *buffer, + const remote::file_size &write_size, + const remote::file_offset &write_offset, + const remote::file_handle &handle) override; + + packet::error_type json_create_directory_snapshot(const std::string &path, + json &json_data) override; + + packet::error_type json_read_directory_snapshot(const std::string &path, + const remote::file_handle &handle, + const std::uint32_t &page, + json &json_data) override; + + packet::error_type json_release_directory_snapshot(const std::string &path, + const remote::file_handle &handle) override; + + void set_fuse_uid_gid(const remote::user_id &uid, const remote::group_id &gid) override; +}; +} // namespace remote_fuse +} // namespace repertory + +#endif // INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_CLIENT_HPP_ diff --git a/include/drives/fuse/remotefuse/remote_fuse_drive.hpp b/include/drives/fuse/remotefuse/remote_fuse_drive.hpp new file mode 100644 index 00000000..8f6a37cc --- /dev/null +++ b/include/drives/fuse/remotefuse/remote_fuse_drive.hpp @@ -0,0 +1,257 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_FUSE_DRIVE_HPP_ +#define INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_FUSE_DRIVE_HPP_ +#ifndef _WIN32 + +#include "common.hpp" +#include "drives/fuse/remotefuse/i_remote_instance.hpp" +#include "events/event_system.hpp" + +namespace repertory { +class app_config; +class console_consumer; +class logging_consumer; +class lock_data; +class server; + +namespace remote_fuse { +class remote_fuse_drive final { + E_CONSUMER(); + +public: + remote_fuse_drive(app_config &config, lock_data &lock, remote_instance_factory factory); + + ~remote_fuse_drive() { E_CONSUMER_RELEASE(); } + +private: + app_config &config_; + lock_data &lock_; + remote_instance_factory factory_; + std::string mount_location_; + +private: + static void shutdown(std::string mount_location); + +private: + class remote_fuse_impl final { + public: + static app_config *config_; + static lock_data *lock_; + static std::string *mount_location_; + static remote_instance_factory *factory_; + static std::unique_ptr console_consumer_; + static std::unique_ptr logging_consumer_; + static std::unique_ptr remote_instance_; + static std::unique_ptr server_; + static std::optional forced_gid_; + static std::optional forced_uid_; + static std::optional forced_umask_; + static bool console_enabled_; + static bool was_mounted_; + + public: + static void tear_down(const int &ret); + + private: + static void populate_stat(const remote::stat &r, const bool &directory, struct stat &st); + + public: + static int repertory_access(const char *path, int mask); + +#ifdef __APPLE__ + static int repertory_chflags(const char *path, uint32_t flags); +#endif + + static int repertory_chmod(const char *path, mode_t mode); + + static int repertory_chown(const char *path, uid_t uid, gid_t gid); + + static int repertory_create(const char *path, mode_t mode, struct fuse_file_info *fi); + + static void repertory_destroy(void * /*ptr*/); + + /*static int repertory_fallocate(const char *path, int mode, off_t offset, off_t length, + struct fuse_file_info *fi) ;*/ + + static int repertory_fgetattr(const char *path, struct stat *st, struct fuse_file_info *fi); + +#ifdef __APPLE__ + static int repertory_fsetattr_x(const char *path, struct setattr_x *attr, + struct fuse_file_info *fi); +#endif + + static int repertory_fsync(const char *path, int datasync, struct fuse_file_info *fi); + + static int repertory_ftruncate(const char *path, off_t size, struct fuse_file_info *fi); + + static int repertory_getattr(const char *path, struct stat *st); + +#ifdef __APPLE__ + static int repertory_getxtimes(const char *path, struct timespec *bkuptime, + struct timespec *crtime); +#endif + + static void *repertory_init(struct fuse_conn_info *conn); + + static int repertory_mkdir(const char *path, mode_t mode); + + static int repertory_open(const char *path, struct fuse_file_info *fi); + + static int repertory_opendir(const char *path, struct fuse_file_info *fi); + + static int repertory_read(const char *path, char *buffer, size_t readSize, off_t readOffset, + struct fuse_file_info *fi); + + static int repertory_readdir(const char *path, void *buf, fuse_fill_dir_t fuseFillDir, + off_t offset, struct fuse_file_info *fi); + + static int repertory_release(const char *path, struct fuse_file_info *fi); + + static int repertory_releasedir(const char *path, struct fuse_file_info *fi); + + static int repertory_rename(const char *from, const char *to); + + static int repertory_rmdir(const char *path); +/* +#ifdef HAS_SETXATTR +#ifdef __APPLE__ + static int repertory_getxattr(const char *path, const char *name, char *value, size_t size, + uint32_t position) ; +#else + static int repertory_getxattr(const char *path, const char *name, char *value, size_t size) ; + +#endif + static int repertory_listxattr(const char *path, char *buffer, size_t size) ; + + static int repertory_removexattr(const char *path, const char *name) ; +#ifdef __APPLE__ + static int repertory_setxattr(const char *path, const char *name, const char *value, + size_t size, int flags, uint32_t position) ; +#else + static int repertory_setxattr(const char *path, const char *name, const char *value, + size_t size, int flags) ; +#endif +#endif + */ +#ifdef __APPLE__ + static int repertory_setattr_x(const char *path, struct setattr_x *attr); + + static int repertory_setbkuptime(const char *path, const struct timespec *bkuptime); + + static int repertory_setchgtime(const char *path, const struct timespec *chgtime); + + static int repertory_setcrtime(const char *path, const struct timespec *crtime); + + static int repertory_setvolname(const char *volname); + + static int repertory_statfs_x(const char *path, struct statfs *stbuf); +#else + + static int repertory_statfs(const char *path, struct statvfs *stbuf); + +#endif + + static int repertory_truncate(const char *path, off_t size); + + static int repertory_unlink(const char *path); + + static int repertory_utimens(const char *path, const struct timespec tv[2]); + + static int repertory_write(const char *path, const char *buffer, size_t writeSize, + off_t writeOffset, struct fuse_file_info *fi); + }; + +private: + // clang-format off + struct fuse_operations fuse_ops_ { + .getattr = remote_fuse_impl::repertory_getattr, + .readlink = nullptr, // int (*readlink) (const char *, char *, size_t); + .getdir = nullptr, // int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t); + .mknod = nullptr, // int (*mknod) (const char *, mode_t, dev_t); + .mkdir = remote_fuse_impl::repertory_mkdir, + .unlink = remote_fuse_impl::repertory_unlink, + .rmdir = remote_fuse_impl::repertory_rmdir, + .symlink = nullptr, // int (*symlink) (const char *, const char *); + .rename = remote_fuse_impl::repertory_rename, + .link = nullptr, // int (*link) (const char *, const char *); + .chmod = remote_fuse_impl::repertory_chmod, + .chown = remote_fuse_impl::repertory_chown, + .truncate = remote_fuse_impl::repertory_truncate, + .utime = nullptr, // int (*utime) (const char *, struct utimbuf *); + .open = remote_fuse_impl::repertory_open, + .read = remote_fuse_impl::repertory_read, + .write = remote_fuse_impl::repertory_write, +#ifdef __APPLE__ + .statfs = nullptr, +#else + .statfs = remote_fuse_impl::repertory_statfs, +#endif + .flush = nullptr, // int (*flush) (const char *, struct fuse_file_info *); + .release = remote_fuse_impl::repertory_release, + .fsync = remote_fuse_impl::repertory_fsync, +#if HAS_SETXATTR + .setxattr = nullptr, // remote_fuse_impl::repertory_setxattr, + .getxattr = nullptr, // remote_fuse_impl::repertory_getxattr, + .listxattr = nullptr, // remote_fuse_impl::repertory_listxattr, + .removexattr = nullptr, // remote_fuse_impl::repertory_removexattr, +#else + .setxattr = nullptr, + .getxattr = nullptr, + .listxattr = nullptr, + .removexattr = nullptr, +#endif + .opendir = remote_fuse_impl::repertory_opendir, + .readdir = remote_fuse_impl::repertory_readdir, + .releasedir = remote_fuse_impl::repertory_releasedir, + .fsyncdir = nullptr, // int (*fsyncdir) (const char *, int, struct fuse_file_info *); + .init = remote_fuse_impl::repertory_init, + .destroy = remote_fuse_impl::repertory_destroy, + .access = remote_fuse_impl::repertory_access, + .create = remote_fuse_impl::repertory_create, + .ftruncate = remote_fuse_impl::repertory_ftruncate, + .fgetattr = remote_fuse_impl::repertory_fgetattr, + .lock = nullptr, // int (*lock) (const char *, struct fuse_file_info *, int cmd, struct flock *); + .utimens = remote_fuse_impl::repertory_utimens, + .bmap = nullptr, // int (*bmap) (const char *, size_t blocksize, uint64_t *idx); + .flag_nullpath_ok = 0, + .flag_nopath = 0, + .flag_utime_omit_ok = 1, + .flag_reserved = 0, + .ioctl = nullptr, // int (*ioctl) (const char *, int cmd, void *arg, struct fuse_file_info *, unsigned int flags, void *data); + .poll = nullptr, // int (*poll) (const char *, struct fuse_file_info *, struct fuse_pollhandle *ph, unsigned *reventsp); + .write_buf = nullptr, // int (*write_buf) (const char *, struct fuse_bufvec *buf, off_t off, struct fuse_file_info *); + .read_buf = nullptr, // int (*read_buf) (const char *, struct fuse_bufvec **bufp, size_t size, off_t off, struct fuse_file_info *); + .flock = nullptr, // int (*flock) (const char *, struct fuse_file_info *, int op); + .fallocate = nullptr // remote_fuse_impl::repertory_fallocate, + }; + // clang-format on + +public: + int mount(std::vector drive_args); + + static void display_options(int argc, char *argv[]); + + static void display_version_information(int argc, char *argv[]); +}; +} // namespace remote_fuse +} // namespace repertory + +#endif // _WIN32 +#endif // INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_FUSE_DRIVE_HPP_ diff --git a/include/drives/fuse/remotefuse/remote_fuse_drive2.hpp b/include/drives/fuse/remotefuse/remote_fuse_drive2.hpp new file mode 100644 index 00000000..d712c604 --- /dev/null +++ b/include/drives/fuse/remotefuse/remote_fuse_drive2.hpp @@ -0,0 +1,101 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_FUSE_DRIVE2_HPP_ +#define INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_FUSE_DRIVE2_HPP_ +#ifndef _WIN32 +#if 0 + +#include "common.hpp" +#include "drives/fuse/fuse_base.hpp" +#include "drives/fuse/remotefuse/i_remote_instance.hpp" +#include "events/event_system.hpp" + +namespace repertory { +class app_config; +class console_consumer; +class logging_consumer; +class lock_data; +class server; + +namespace utils { +api_error to_api_error(packet::error_type e) { return api_error::success; } +} // namespace utils + +namespace remote_fuse { +class remote_fuse_drive2 final : public fuse_base { + E_CONSUMER(); + +public: + ~remote_fuse_drive2() override = default; + +private: + std::unique_ptr remote_instance_; + +protected: + api_error access_impl(std::string api_path, int mask) override; + +#ifdef __APPLE__ + api_error chflags_impl(std::string api_path, uint32_t flags) override; +#endif // __APPLE__ + + api_error chmod_impl(std::string api_path, mode_t mode) override; + +public: + api_error check_parent_access(const std::string &api_path, int mask) const override; + + std::uint64_t get_directory_item_count(const std::string &api_path) const override; + + directory_item_list get_directory_items(const std::string &api_path) const override; + + std::uint64_t get_file_size(const std::string &api_path) const override; + + api_error get_item_meta(const std::string &api_path, api_meta_map &meta) const override; + + api_error get_item_meta(const std::string &api_path, const std::string &name, + std::string &value) const override; + + std::uint64_t get_total_drive_space() const override; + + std::uint64_t get_total_item_count() const override; + + std::uint64_t get_used_drive_space() const override; + + void get_volume_info(UINT64 &total_size, UINT64 &free_size, + std::string &volume_label) const override; + + bool is_processing(const std::string &api_path) const override; + + void populate_stat(const directory_item &di, struct stat &st) const override; + + int rename_directory(const std::string &from_api_path, const std::string &to_api_path) override; + + int rename_file(const std::string &from_api_path, const std::string &to_api_path, + const bool &overwrite) override; + + void set_item_meta(const std::string &api_path, const std::string &key, + const std::string &value) override; + + void update_directory_item(directory_item &di) const override; +}; +} // namespace remote_fuse +} // namespace repertory + +#endif // 0 +#endif // _WIN32 +#endif // INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_FUSE_DRIVE2_HPP_ diff --git a/include/drives/fuse/remotefuse/remote_server.hpp b/include/drives/fuse/remotefuse/remote_server.hpp new file mode 100644 index 00000000..10951d76 --- /dev/null +++ b/include/drives/fuse/remotefuse/remote_server.hpp @@ -0,0 +1,253 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_SERVER_HPP_ +#define INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_SERVER_HPP_ +#ifndef _WIN32 + +#include "common.hpp" +#include "drives/directory_cache.hpp" +#include "drives/fuse/i_fuse_drive.hpp" +#include "drives/remote/remote_server_base.hpp" + +namespace repertory { +class app_config; + +namespace remote_fuse { +class remote_server final : public virtual remote_server_base { +public: + remote_server(app_config &config, i_fuse_drive &drive, const std::string &mount_location); + +private: + directory_cache directory_cache_; + +private: + std::string construct_path(std::string path); + + std::string construct_path(const std::wstring &path); + + static std::string empty_as_zero(const json &data); + + packet::error_type populate_file_info(const std::string &api_path, remote::file_info &file_info); + + void populate_file_info(const std::string &api_path, const UINT64 &file_size, + const UINT32 &attributes, remote::file_info &file_info); + + static void populate_stat(const struct stat &st1, remote::stat &st); + + json &update_to_windows_format(json &item); + +protected: + void delete_open_directory(void *dir) override; + +public: + // FUSE Layer + packet::error_type fuse_access(const char *path, const std::int32_t &mask) override; + + packet::error_type fuse_chflags(const char *path, const std::uint32_t &flags) override; + + packet::error_type fuse_chmod(const char *path, const remote::file_mode &mode) override; + + packet::error_type fuse_chown(const char *path, const remote::user_id &uid, + const remote::group_id &gid) override; + + packet::error_type fuse_create(const char *path, const remote::file_mode &mode, + const remote::open_flags &flags, remote::file_handle &handle) override; + + packet::error_type fuse_destroy() override; + + /*packet::error_type fuse_fallocate(const char *path, const std::int32_t &mode, + const remote::file_offset &offset, + const remote::file_offset &length, + const remote::file_handle &handle) override ;*/ + + packet::error_type fuse_fgetattr(const char *path, remote::stat &st, bool &directory, + const remote::file_handle &handle) override; + + packet::error_type fuse_fsetattr_x(const char *path, const remote::setattr_x &attr, + const remote::file_handle &handle) override; + + packet::error_type fuse_fsync(const char *path, const std::int32_t &datasync, + const remote::file_handle &handle) override; + + packet::error_type fuse_ftruncate(const char *path, const remote::file_offset &size, + const remote::file_handle &handle) override; + + packet::error_type fuse_getattr(const char *path, remote::stat &st, bool &directory) override; + + /*packet::error_type fuse_getxattr(const char *path, const char *name, char *value, + const remote::file_size &size) override ; + + packet::error_type fuse_getxattrOSX(const char *path, const char *name, char *value, + const remote::file_size &size, + const std::uint32_t &position) override ;*/ + + packet::error_type fuse_getxtimes(const char *path, remote::file_time &bkuptime, + remote::file_time &crtime) override; + + packet::error_type fuse_init() override; + + /*packet::error_type fuse_listxattr(const char *path, char *buffer, + const remote::file_size &size) override ;*/ + + packet::error_type fuse_mkdir(const char *path, const remote::file_mode &mode) override; + + packet::error_type fuse_open(const char *path, const remote::open_flags &flags, + remote::file_handle &handle) override; + + packet::error_type fuse_opendir(const char *path, remote::file_handle &handle) override; + + packet::error_type fuse_read(const char *path, char *buffer, const remote::file_size &read_size, + const remote::file_offset &read_offset, + const remote::file_handle &handle) override; + + packet::error_type fuse_rename(const char *from, const char *to) override; + + packet::error_type fuse_readdir(const char *path, const remote::file_offset &offset, + const remote::file_handle &handle, std::string &item_path) override; + + packet::error_type fuse_release(const char *path, const remote::file_handle &handle) override; + + packet::error_type fuse_releasedir(const char *path, const remote::file_handle &handle) override; + + /*packet::error_type fuse_removexattr(const char *path, const char *name) override ;*/ + + packet::error_type fuse_rmdir(const char *path) override; + + packet::error_type fuse_setattr_x(const char *path, remote::setattr_x &attr) override; + + packet::error_type fuse_setbkuptime(const char *path, const remote::file_time &bkuptime) override; + + packet::error_type fuse_setchgtime(const char *path, const remote::file_time &chgtime) override; + + packet::error_type fuse_setcrtime(const char *path, const remote::file_time &crtime) override; + + packet::error_type fuse_setvolname(const char *volname) override; + + /*packet::error_type fuse_setxattr(const char *path, const char *name, const char *value, + const remote::file_size &size, + const std::int32_t &flags) override ; + + packet::error_type fuse_setxattr_osx(const char *path, const char *name, const char *value, + const remote::file_size &size, const std::int32_t &flags, + const std::uint32_t &position) override ;*/ + + packet::error_type fuse_statfs(const char *path, const std::uint64_t &frsize, + remote::statfs &st) override; + + packet::error_type fuse_statfs_x(const char *path, const std::uint64_t &bsize, + remote::statfs_x &st) override; + + packet::error_type fuse_truncate(const char *path, const remote::file_offset &size) override; + + packet::error_type fuse_unlink(const char *path) override; + + packet::error_type fuse_utimens(const char *path, const remote::file_time *tv, + const std::uint64_t &op0, const std::uint64_t &op1) override; + + packet::error_type fuse_write(const char *path, const char *buffer, + const remote::file_size &write_size, + const remote::file_offset &write_offset, + const remote::file_handle &handle) override; + + packet::error_type fuse_write_base64(const char *path, const char *buffer, + const remote::file_size &write_size, + const remote::file_offset &write_offset, + const remote::file_handle &handle) override; + + void set_fuse_uid_gid(const remote::user_id &, const remote::group_id &) override {} + + // JSON Layer + packet::error_type winfsp_get_dir_buffer(PVOID /*file_desc*/, PVOID *& /*ptr*/) override { + return STATUS_INVALID_HANDLE; + } + + packet::error_type json_create_directory_snapshot(const std::string &path, + json &jsonData) override; + + packet::error_type json_read_directory_snapshot(const std::string &path, + const remote::file_handle &handle, + const std::uint32_t &page, + json &jsonData) override; + + packet::error_type json_release_directory_snapshot(const std::string &path, + const remote::file_handle &handle) override; + + // WinFSP Layer + packet::error_type winfsp_can_delete(PVOID file_desc, PWSTR file_name) override; + + packet::error_type winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, + BOOLEAN &wasClosed) override; + + packet::error_type winfsp_close(PVOID file_desc) override; + + packet::error_type winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, + UINT32 attributes, UINT64 /*allocation_size*/, PVOID *file_desc, + remote::file_info *file_info, std::string &normalized_name, + BOOLEAN &exists) override; + + packet::error_type winfsp_flush(PVOID file_desc, remote::file_info *file_info) override; + + packet::error_type winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) override; + + packet::error_type winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, + std::uint64_t * /*securityDescriptorSize*/, + std::wstring & /*strDescriptor*/) override; + + packet::error_type winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, + std::string &volume_label) override; + + packet::error_type winfsp_mounted(const std::wstring &location) override; + + packet::error_type winfsp_open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, + PVOID *file_desc, remote::file_info *file_info, + std::string &normalized_name) override; + + packet::error_type winfsp_overwrite(PVOID file_desc, UINT32 attributes, + BOOLEAN replace_attributes, UINT64 /*allocation_size*/, + remote::file_info *file_info) override; + + packet::error_type winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, + PUINT32 bytes_transferred) override; + + packet::error_type winfsp_read_directory(PVOID file_desc, PWSTR /*pattern*/, PWSTR marker, + json &itemList) override; + + packet::error_type winfsp_rename(PVOID /*file_desc*/, PWSTR file_name, PWSTR new_file_name, + BOOLEAN replace_if_exists) override; + + packet::error_type winfsp_set_basic_info(PVOID file_desc, UINT32 attributes, UINT64 creation_time, + UINT64 last_access_time, UINT64 last_write_time, + UINT64 change_time, + remote::file_info *file_info) override; + + packet::error_type winfsp_set_file_size(PVOID file_desc, UINT64 newSize, + BOOLEAN set_allocation_size, + remote::file_info *file_info) override; + + packet::error_type winfsp_unmounted(const std::wstring &location) override; + + packet::error_type winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, + BOOLEAN write_to_end, BOOLEAN constrained_io, + PUINT32 bytes_transferred, remote::file_info *file_info) override; +}; +} // namespace remote_fuse +} // namespace repertory + +#endif +#endif // INCLUDE_DRIVES_FUSE_REMOTEFUSE_REMOTE_SERVER_HPP_ diff --git a/include/drives/i_open_file_table.hpp b/include/drives/i_open_file_table.hpp new file mode 100644 index 00000000..990cb104 --- /dev/null +++ b/include/drives/i_open_file_table.hpp @@ -0,0 +1,64 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_I_OPEN_FILE_TABLE_HPP_ +#define INCLUDE_DRIVES_I_OPEN_FILE_TABLE_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class i_provider; +class i_open_file_table { + INTERFACE_SETUP(i_open_file_table); + +public: + typedef std::function + locked_operation_callback; + +public: + virtual void close(const std::uint64_t &handle) = 0; + + virtual bool contains_restore(const std::string &api_path) const = 0; + + virtual bool evict_file(const std::string &api_path) = 0; + + virtual void force_schedule_upload(const filesystem_item &fsi) = 0; + + virtual directory_item_list get_directory_items(const std::string &api_path) const = 0; + + virtual std::uint64_t get_open_count(const std::string &api_path) const = 0; + + virtual bool get_open_file(const std::string &api_path, filesystem_item *&fsi) = 0; + + virtual std::unordered_map get_open_files() const = 0; + + virtual bool has_no_open_file_handles() const = 0; + + virtual api_error open(const filesystem_item &fsi, std::uint64_t &handle) = 0; + + virtual bool perform_locked_operation(locked_operation_callback locked_operation) = 0; + + virtual api_error set_item_meta(const std::string &api_path, const std::string &key, + const std::string &value) = 0; + + virtual void update_directory_item(directory_item &di) const = 0; +}; +} // namespace repertory + +#endif // INCLUDE_DRIVES_I_OPEN_FILE_TABLE_HPP_ diff --git a/include/drives/open_file_table.hpp b/include/drives/open_file_table.hpp new file mode 100644 index 00000000..6681129c --- /dev/null +++ b/include/drives/open_file_table.hpp @@ -0,0 +1,751 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_OPEN_FILE_TABLE_HPP_ +#define INCLUDE_DRIVES_OPEN_FILE_TABLE_HPP_ + +#include "common.hpp" +#include "app_config.hpp" +#include "db/retry_db.hpp" +#include "download/i_download_manager.hpp" +#include "drives/i_open_file_table.hpp" +#include "providers/i_provider.hpp" +#include "types/repertory.hpp" +#include "utils/file_utils.hpp" +#include "utils/global_data.hpp" +#include "utils/native_file.hpp" +#include "utils/path_utils.hpp" +#include "utils/polling.hpp" + +namespace repertory { +template class open_file_table final : public virtual i_open_file_table { +public: + open_file_table(i_provider &provider, const app_config &config, i_download_manager &dm) + : provider_(provider), config_(config), dm_(dm), retry_db_(config) { + // Set initial value for used cache space + global_data::instance().initialize_used_cache_space( + utils::file::calculate_used_space(config_.get_cache_directory(), false)); + polling::instance().set_callback( + {"last_close_clear", false, [this] { + std::vector keys; + unique_mutex_lock l(last_close_mutex_); + std::transform(last_close_lookup_.begin(), last_close_lookup_.end(), + std::back_inserter(keys), [](const auto &kv) { return kv.first; }); + l.unlock(); + for (const auto &key : keys) { + l.lock(); + remove_if_expired(key, last_close_lookup_[key]); + l.unlock(); + } + }}); + } + + ~open_file_table() override { polling::instance().remove_callback("last_close_clear"); } + +private: + struct open_file_info { + filesystem_item item; + api_meta_map meta; + }; + +private: + i_provider &provider_; + const app_config &config_; + i_download_manager &dm_; + retry_db retry_db_; + std::unordered_map> open_file_lookup_; + mutable std::recursive_mutex open_file_mutex_; + std::unordered_map open_handle_lookup_; + std::uint64_t next_handle_ = 1u; + bool stop_requested_ = false; + std::mutex retry_mutex_; + std::unique_ptr retry_thread_; + std::condition_variable retry_notify_; + std::mutex start_stop_mutex_; + std::mutex last_close_mutex_; + std::unordered_map last_close_lookup_; + +private: + api_error get_filesystem_item(const std::string &api_path, const bool &directory, + filesystem_item &fsi) { + auto ret = api_error::item_not_found; + + const auto it = open_file_lookup_.find(api_path); + if (it != open_file_lookup_.end()) { + fsi = it->second->item; + ret = api_error::success; + } else { + ret = provider_.get_filesystem_item(api_path, directory, fsi); + } + + return ret; + } + + std::uint64_t get_next_handle() { + std::uint64_t ret = 0u; + while ((ret = next_handle_++) == 0u) { + } + return ret; + } + + api_error handle_file_rename(const std::string &from_api_path, const std::string &to_api_path) { + auto ret = api_error::file_in_use; + if (dm_.pause_download(from_api_path)) { + if ((ret = provider_.rename_file(from_api_path, to_api_path)) == api_error::success) { + swap_renamed_items(from_api_path, to_api_path); + dm_.rename_download(from_api_path, to_api_path); + dm_.resume_download(to_api_path); + + retry_db_.rename(from_api_path, to_api_path); + } else { + dm_.resume_download(from_api_path); + } + } + + return ret; + } + + void handle_file_upload(filesystem_item &fsi) { + fsi.changed = false; + handle_file_upload(&fsi); + } + + void handle_file_upload(const filesystem_item *fsi) { + // Remove from retry queue, if present + retry_db_.remove(fsi->api_path); + + // Upload file and add to retry queue on failure + auto nf = native_file::attach(fsi->handle); + nf->flush(); + if (provider_.upload_file(fsi->api_path, fsi->source_path, fsi->encryption_token) != + api_error::success) { + retry_db_.set(fsi->api_path); + event_system::instance().raise(fsi->api_path); + } + } + + bool remove_if_expired(const std::string &api_path, const std::uint64_t &time) { + auto ret = false; +#ifdef _WIN32 + const auto delay = std::chrono::minutes(config_.get_eviction_delay_mins()); + const auto last_check = std::chrono::system_clock::from_time_t(time); + if ((ret = ((last_check + delay) <= std::chrono::system_clock::now()))) +#else + if ((ret = ((time + ((config_.get_eviction_delay_mins() * 60L) * NANOS_PER_SECOND)) <= + utils::get_time_now()))) +#endif + { + last_close_lookup_.erase(api_path); + } + return ret; + } + + bool retry_delete_file(const std::string &file) { + auto deleted = false; + for (std::uint8_t i = 0u; not(deleted = utils::file::delete_file(file)) && (i < 100u); i++) { + std::this_thread::sleep_for(10ms); + } + return deleted; + } + + void swap_renamed_items(std::string from_api_path, std::string to_api_path) { + const auto it = open_file_lookup_.find(from_api_path); + if (it != open_file_lookup_.end()) { + open_file_lookup_[to_api_path] = open_file_lookup_[from_api_path]; + open_file_lookup_.erase(from_api_path); + auto &fsi = open_file_lookup_[to_api_path]->item; + fsi.api_path = to_api_path; + fsi.api_parent = utils::path::get_parent_api_path(to_api_path); + } + } + +public: + bool has_no_open_file_handles() const override { + recur_mutex_lock l(open_file_mutex_); + return std::find_if(open_file_lookup_.cbegin(), open_file_lookup_.cend(), [](const auto &kv) { + return not kv.second->item.directory; + }) == open_file_lookup_.cend(); + } + + void close(const std::uint64_t &handle) override { + recur_mutex_lock l(open_file_mutex_); + const auto it = open_handle_lookup_.find(handle); + if (it != open_handle_lookup_.end()) { + auto *oi = it->second; + open_handle_lookup_.erase(handle); + + auto &fsi = oi->item; + const auto was_changed = fsi.changed; + + // Handle meta change + if (fsi.meta_changed) { + if (provider_.set_item_meta(fsi.api_path, oi->meta) == api_error::success) { + fsi.meta_changed = false; + } else { + event_system::instance().raise( + __FUNCTION__, "failed to set file meta: " + fsi.api_path); + } + } + + // Handle source path change + if (not fsi.directory && fsi.source_path_changed) { + if (provider_.set_source_path(fsi.api_path, fsi.source_path) == api_error::success) { + fsi.source_path_changed = false; + } else { + event_system::instance().raise( + __FUNCTION__, "failed to set source path: " + fsi.api_path + "|" + fsi.source_path); + } + } + + // Update last close time in lookup table + if (not fsi.directory) { + mutex_lock l2(last_close_mutex_); + last_close_lookup_[fsi.api_path] = utils::get_time_now(); + } + + // Handle file change +#ifdef __APPLE__ + // Special handling for OS X - only upload if handle being closed is writable + if (not fsi.directory && was_changed && (fsi.open_data[handle] & O_ACCMODE)) +#else + if (not fsi.directory && was_changed) +#endif + { + handle_file_upload(fsi); + } + + // Close internal handle if no more open files + auto &od = fsi.open_data; + od.erase(handle); + event_system::instance().raise( + fsi.api_path, handle, fsi.source_path, fsi.directory, was_changed); + if (od.empty()) { + native_file::attach(fsi.handle)->close(); + + event_system::instance().raise(fsi.api_path, fsi.source_path, + fsi.directory, was_changed); + open_file_lookup_.erase(fsi.api_path); + } + } + } + +#ifdef _WIN32 + void close_all(const std::string &api_path) { + recur_mutex_lock l(open_file_mutex_); + const auto it = open_file_lookup_.find(api_path); + if (it != open_file_lookup_.end()) { + auto *oi = it->second.get(); + std::vector handles; + for (const auto &kv : open_handle_lookup_) { + if (kv.second == oi) { + handles.emplace_back(kv.first); + } + } + + while (!handles.empty()) { + close(handles.back()); + handles.pop_back(); + } + } + } +#endif // _WIN32 + + bool contains_restore(const std::string &api_path) const override { + return dm_.contains_restore(api_path); + } + + api_error derive_file_size(const std::string &api_path, std::uint64_t &file_size) { + auto ret = api_error::success; + file_size = 0u; + + if (provider_.is_file(api_path)) { + unique_recur_mutex_lock l(open_file_mutex_); + const auto it = open_file_lookup_.find(api_path); + if (it == open_file_lookup_.end()) { + l.unlock(); + ret = provider_.get_file_size(api_path, file_size); + } else { + file_size = open_file_lookup_[api_path]->item.size; + } + } + + return ret; + } + + api_error derive_item_data(const std::string &api_path, api_meta_map &meta) { + auto ret = api_error::success; + meta.clear(); + + unique_recur_mutex_lock l(open_file_mutex_); + const auto it = open_file_lookup_.find(api_path); + if (it == open_file_lookup_.end()) { + l.unlock(); + ret = provider_.get_item_meta(api_path, meta); + } else { + meta = open_file_lookup_[api_path]->meta; + } + + return ret; + } + + api_error derive_item_data(const directory_item &di, std::uint64_t &file_size, + api_meta_map &meta) { + return derive_item_data(di.api_path, di.directory, file_size, meta); + } + + api_error derive_item_data(const std::string &api_path, const bool &directory, + std::uint64_t &file_size, api_meta_map &meta) { + auto ret = api_error::success; + meta.clear(); + file_size = 0; + + unique_recur_mutex_lock l(open_file_mutex_); + const auto it = open_file_lookup_.find(api_path); + if (it == open_file_lookup_.end()) { + l.unlock(); + ret = provider_.get_item_meta(api_path, meta); + if ((ret == api_error::success) && not directory) { + ret = provider_.get_file_size(api_path, file_size); + } + } else { + meta = open_file_lookup_[api_path]->meta; + if (not directory) { + file_size = open_file_lookup_[api_path]->item.size; + } + } + + return ret; + } + + bool evict_file(const std::string &api_path) override { + auto ret = false; + auto allow_eviction = true; + // Ensure enough time has passed since file was closed + { + mutex_lock l(last_close_mutex_); + const auto it = last_close_lookup_.find(api_path); + if (it != last_close_lookup_.end()) { + allow_eviction = remove_if_expired(api_path, it->second); + } + } + + if (allow_eviction) { + recur_mutex_lock l(open_file_mutex_); + // Ensure item is not in upload retry queue + if (not retry_db_.exists(api_path) && (get_open_count(api_path) == 0u)) { + // Ensure item is not currently downloading + if (not dm_.is_processing(api_path)) { + filesystem_item fsi{}; + if (provider_.get_filesystem_item(api_path, false, fsi) == api_error::success) { + std::uint64_t file_size = 0u; + if ((ret = (utils::file::get_file_size(fsi.source_path, file_size) && + retry_delete_file(fsi.source_path)))) { + global_data::instance().update_used_space(file_size, 0, true); + event_system::instance().raise(fsi.api_path, + fsi.source_path); + } + } + } + } + } + + return ret; + } + + void force_schedule_upload(const filesystem_item &fsi) override { + recur_mutex_lock l(open_file_mutex_); + filesystem_item *fsi_ptr = nullptr; + if (get_open_file(fsi.api_path, fsi_ptr)) { + handle_file_upload(*fsi_ptr); + } else { + handle_file_upload(&fsi); + } + } + + directory_item_list get_directory_items(const std::string &api_path) const override { + directory_item_list list; + provider_.get_directory_items(api_path, list); + return list; + } + + std::uint64_t get_open_count(const std::string &api_path) const override { + std::uint64_t ret = 0u; + recur_mutex_lock l(open_file_mutex_); + const auto it = open_file_lookup_.find(api_path); + if (it != open_file_lookup_.end()) { + ret = it->second->item.open_data.size(); + } + return ret; + } + + bool get_open_file(const std::string &api_path, filesystem_item *&fsi) override { + auto ret = false; + + recur_mutex_lock l(open_file_mutex_); + const auto it = open_file_lookup_.find(api_path); + if (it != open_file_lookup_.end()) { + fsi = &it->second->item; + ret = true; + } + return ret; + } + + bool get_open_file(const std::uint64_t &handle, filesystem_item *&fsi) { + auto ret = false; + recur_mutex_lock l(open_file_mutex_); + const auto it = open_handle_lookup_.find(handle); + if (it != open_handle_lookup_.end()) { + fsi = &it->second->item; + ret = true; + } + return ret; + } + + std::unordered_map get_open_files() const override { + std::unordered_map ret; + unique_recur_mutex_lock l(open_file_mutex_); + for (const auto &kv : open_file_lookup_) { + ret.insert({kv.first, kv.second->item.open_data.size()}); + } + l.unlock(); + return ret; + } + + api_error open(const filesystem_item &fsi, std::uint64_t &handle) override { + auto ret = api_error::success; + + recur_mutex_lock l(open_file_mutex_); + if (open_file_lookup_.find(fsi.api_path) == open_file_lookup_.end()) { + api_meta_map meta; + if ((ret = provider_.get_item_meta(fsi.api_path, meta)) == api_error::success) { + auto oi = std::make_shared(); + oi->meta = meta; + oi->item = fsi; + oi->item.lock = std::make_shared(); + open_file_lookup_.insert({fsi.api_path, oi}); + + event_system::instance().raise( + oi->item.api_path, oi->item.source_path, oi->item.directory); + } + } + + if (ret == api_error::success) { + ret = Open(fsi.api_path, fsi.directory, utils::file::get_read_write_open_flags(), handle); + } + + return ret; + } + + api_error Open(const std::string &api_path, const bool &directory, const flags &f, + std::uint64_t &handle) { + auto ret = api_error::success; + + recur_mutex_lock l(open_file_mutex_); + if (open_file_lookup_.find(api_path) == open_file_lookup_.end()) { + api_meta_map meta; + if ((ret = provider_.get_item_meta(api_path, meta)) == api_error::success) { + auto oi = std::make_shared(); + oi->meta = meta; + if ((ret = provider_.get_filesystem_item(api_path, directory, oi->item)) == + api_error::success) { + open_file_lookup_.insert({api_path, oi}); + event_system::instance().raise( + oi->item.api_path, oi->item.source_path, oi->item.directory); + } + } + } + + if (ret == api_error::success) { + auto *oi = open_file_lookup_[api_path].get(); + auto &fsi = oi->item; + if (fsi.directory == directory) { + handle = get_next_handle(); + fsi.open_data.insert({handle, f}); + open_handle_lookup_.insert({handle, oi}); + } else { + ret = directory ? api_error::file_exists : api_error::directory_exists; + } + } + + return ret; + } + + bool perform_locked_operation(locked_operation_callback locked_operation) override { + recur_mutex_lock l(open_file_mutex_); + return locked_operation(*this, provider_); + } + + api_error remove_file(const std::string &api_path) { + recur_mutex_lock l(open_file_mutex_); + + filesystem_item fsi{}; + auto ret = api_error::file_in_use; + if ((get_open_count(api_path) == 0u) && + ((ret = provider_.get_filesystem_item(api_path, false, fsi)) == api_error::success) && + ((ret = provider_.remove_file(api_path)) == api_error::success)) { + std::uint64_t file_size = 0u; + utils::file::get_file_size(fsi.source_path, file_size); + if (retry_delete_file(fsi.source_path) && file_size) { + global_data::instance().update_used_space(file_size, 0, false); + } + } + + return ret; + } + +#ifdef HAS_SETXATTR + api_error remove_xattr_meta(const std::string &api_path, const std::string &name) { + auto ret = api_error::xattr_not_found; + if (utils::collection_excludes(META_USED_NAMES, name)) { + unique_recur_mutex_lock l(open_file_mutex_); + if (open_file_lookup_.find(api_path) == open_file_lookup_.end()) { + l.unlock(); + ret = provider_.remove_item_meta(api_path, name); + } else if (open_file_lookup_[api_path]->meta.find(name) != + open_file_lookup_[api_path]->meta.end()) { + open_file_lookup_[api_path]->item.meta_changed = true; + open_file_lookup_[api_path]->meta.erase(name); + ret = api_error::success; + } + } + + return ret; + } +#endif + + api_error rename_directory(const std::string &from_api_path, const std::string &to_api_path) { + unique_recur_mutex_lock l(open_file_mutex_); + auto ret = api_error::not_implemented; + if (provider_.is_rename_supported()) { + ret = api_error::directory_not_found; + // Ensure source directory exists + if (provider_.is_directory(from_api_path)) { + ret = api_error::directory_exists; + // Ensure destination directory does not exist + if (not provider_.is_directory(to_api_path)) { + ret = api_error::file_exists; + // Ensure destination is not a file + if (not provider_.is_file(from_api_path)) { + ret = api_error::directory_not_found; + // Ensure parent destination directory exists + directory_item_list list; + if (provider_.is_directory(utils::path::get_parent_api_path(to_api_path)) && + ((ret = provider_.create_directory_clone_source_meta(from_api_path, to_api_path)) == + api_error::success) && + ((ret = provider_.get_directory_items(from_api_path, list)) == + api_error::success)) { + // Rename all items - directories MUST BE returned first + for (std::size_t i = 0u; (ret == api_error::success) && (i < list.size()); i++) { + const auto &api_path = list[i].api_path; + if ((api_path != ".") && (api_path != "..")) { + const auto old_api_path = api_path; + const auto new_api_path = utils::path::create_api_path(utils::path::combine( + to_api_path, {old_api_path.substr(from_api_path.size())})); + if (list[i].directory) { + ret = rename_directory(old_api_path, new_api_path); + } else { + ret = rename_file(old_api_path, new_api_path); + } + } + } + + if (ret == api_error::success) { + swap_renamed_items(from_api_path, to_api_path); + ret = provider_.remove_directory(from_api_path); + } + } + } + } + } + } + + return ret; + } + + api_error rename_file(const std::string &from_api_path, const std::string &to_api_path, + const bool &overwrite = true) { + auto ret = api_error::not_implemented; + if (provider_.is_rename_supported()) { + // Don't rename if paths are the same + if ((ret = (from_api_path == to_api_path) ? api_error::file_exists : api_error::success) == + api_error::success) { + retry_db_.pause(); + + unique_recur_mutex_lock l(open_file_mutex_); + // Check allow overwrite if file exists + if (not overwrite && provider_.is_file(to_api_path)) { + l.unlock(); + ret = api_error::file_exists; + } else { + // Don't rename if source does not exist + if ((ret = provider_.is_file(from_api_path) + ? api_error::success + : api_error::item_not_found) == api_error::success) { + // Don't rename if destination file is downloading + if ((ret = dm_.is_processing(to_api_path) ? api_error::file_in_use + : api_error::success) == api_error::success) { + // Don't rename if destination file has open handles + ret = api_error::file_in_use; + if (get_open_count(to_api_path) == 0u) { + if (provider_.is_file( + to_api_path)) { // Handle destination file exists (should overwrite) + filesystem_item fsi{}; + if ((ret = get_filesystem_item(to_api_path, false, fsi)) == api_error::success) { + ret = api_error::os_error; + std::uint64_t file_size = 0u; + if (utils::file::get_file_size(fsi.source_path, file_size)) { + ret = provider_.remove_file(to_api_path); + if ((ret == api_error::success) || (ret == api_error::item_not_found)) { + if (retry_delete_file(fsi.source_path) && file_size) { + global_data::instance().update_used_space(file_size, 0, false); + } + ret = handle_file_rename(from_api_path, to_api_path); + } + } + } + l.unlock(); + } else if (provider_.is_directory(to_api_path)) { // Handle destination is directory + l.unlock(); + ret = api_error::directory_exists; + } else if (provider_.is_directory(utils::path::get_parent_api_path( + to_api_path))) { // Handle rename if destination directory exists + ret = handle_file_rename(from_api_path, to_api_path); + l.unlock(); + } else { // Destination directory not found + l.unlock(); + ret = api_error::directory_not_found; + } + } + } else if (provider_.is_directory(from_api_path)) { + l.unlock(); + ret = api_error::directory_exists; + } + } + } + + retry_db_.resume(); + } + } + + return ret; + } + + api_error set_item_meta(const std::string &api_path, const std::string &key, + const std::string &value) override { + unique_recur_mutex_lock l(open_file_mutex_); + if (open_file_lookup_.find(api_path) == open_file_lookup_.end()) { + l.unlock(); + return provider_.set_item_meta(api_path, key, value); + } + + if (open_file_lookup_[api_path]->meta[key] != value) { + open_file_lookup_[api_path]->item.meta_changed = true; + open_file_lookup_[api_path]->meta[key] = value; + } + + return api_error::success; + } + + api_error set_item_meta(const std::string &api_path, const api_meta_map &meta) { + auto ret = api_error::success; + auto it = meta.begin(); + for (std::size_t i = 0u; (ret == api_error::success) && (i < meta.size()); i++) { + ret = set_item_meta(api_path, it->first, it->second); + it++; + } + + return ret; + } + + void start() { + mutex_lock start_stop_lock(start_stop_mutex_); + if (not retry_thread_) { + stop_requested_ = false; + retry_thread_ = std::make_unique([this] { + while (not stop_requested_) { + const auto processed = retry_db_.process_all([this](const std::string &api_path) -> bool { + auto success = false; + event_system::instance().raise(api_path); + unique_recur_mutex_lock open_file_lock(open_file_mutex_); + if (open_file_lookup_.find(api_path) == open_file_lookup_.end()) { + open_file_lock.unlock(); + + filesystem_item fsi{}; + const auto res = provider_.get_filesystem_item(api_path, false, fsi); + if ((res == api_error::success) || + ((res == api_error::item_not_found) && provider_.is_file(api_path))) { + if (provider_.upload_file(api_path, fsi.source_path, fsi.encryption_token) == + api_error::success) { + success = true; + } + } + + // Remove deleted files + if (not success && not provider_.is_file(api_path)) { + success = true; + } + } else { + // File is open, so force re-upload on close + open_file_lookup_[api_path]->item.changed = true; + open_file_lock.unlock(); + success = true; + } + + return success; + }); + if (not processed && not stop_requested_) { + unique_mutex_lock retryLock(retry_mutex_); + if (not stop_requested_) { + retry_notify_.wait_for(retryLock, 5s); + } + } + } + }); + } + } + + void stop() { + mutex_lock start_stop_lock(start_stop_mutex_); + if (retry_thread_) { + event_system::instance().raise("open_file_table"); + stop_requested_ = true; + + unique_mutex_lock retry_lock(retry_mutex_); + retry_notify_.notify_all(); + retry_lock.unlock(); + + retry_thread_->join(); + retry_thread_.reset(); + } + } + + void update_directory_item(directory_item &di) const override { + recur_mutex_lock l(open_file_mutex_); + const auto it = open_file_lookup_.find(di.api_path); + if (it != open_file_lookup_.end()) { + const auto &ofi = open_file_lookup_.at(di.api_path); + di.meta = ofi->meta; + if (not di.directory) { + di.size = ofi->item.size; + } + } + } +}; +} // namespace repertory + +#endif // INCLUDE_DRIVES_OPEN_FILE_TABLE_HPP_ diff --git a/include/drives/remote/i_remote_json.hpp b/include/drives/remote/i_remote_json.hpp new file mode 100644 index 00000000..694f3362 --- /dev/null +++ b/include/drives/remote/i_remote_json.hpp @@ -0,0 +1,44 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_REMOTE_I_REMOTEJSON_HPP_ +#define INCLUDE_DRIVES_REMOTE_I_REMOTEJSON_HPP_ + +#include "common.hpp" +#include "comm/packet/packet.hpp" + +namespace repertory { +class i_remote_json { + INTERFACE_SETUP(i_remote_json); + +public: + virtual packet::error_type json_create_directory_snapshot(const std::string &path, + json &json_data) = 0; + + virtual packet::error_type json_read_directory_snapshot(const std::string &path, + const remote::file_handle &handle, + const std::uint32_t &page, + json &json_data) = 0; + + virtual packet::error_type + json_release_directory_snapshot(const std::string &path, + const remote::file_handle &handle) = 0; +}; +} // namespace repertory + +#endif // INCLUDE_DRIVES_REMOTE_I_REMOTEJSON_HPP_ diff --git a/include/drives/remote/remote_open_file_table.hpp b/include/drives/remote/remote_open_file_table.hpp new file mode 100644 index 00000000..9e5419ea --- /dev/null +++ b/include/drives/remote/remote_open_file_table.hpp @@ -0,0 +1,95 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_REMOTE_REMOTE_OPEN_FILE_TABLE_HPP_ +#define INCLUDE_DRIVES_REMOTE_REMOTE_OPEN_FILE_TABLE_HPP_ + +#include "common.hpp" +#include "types/remote.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class remote_open_file_table { +protected: + remote_open_file_table() = default; + + virtual ~remote_open_file_table() = default; + +protected: + struct compat_open_info { + std::size_t count = 0u; + std::string client_id = ""; + }; + + struct open_info { + std::size_t count = 0u; + std::string client_id = ""; + PVOID directory_buffer = nullptr; + std::string path; + }; + +private: + std::unordered_map compat_lookup_; + std::mutex compat_mutex_; + std::unordered_map> directory_lookup_; + std::mutex directory_mutex_; + std::unordered_map file_lookup_; + std::mutex file_mutex_; + +protected: + void add_directory(const std::string &client_id, void *dir); + + void close_all(const std::string &client_id); + + virtual void delete_open_directory(void *dir) = 0; + +#ifdef _WIN32 + bool get_directory_buffer(const OSHandle &handle, PVOID *&buffer); +#endif + + bool get_open_info(const OSHandle &handle, open_info &oi); + + std::string get_open_file_path(const OSHandle &handle); + + bool has_open_directory(const std::string &client_id, void *dir); + + int has_compat_open_info(const remote::file_handle &handle, const int &error_return); + + template + error_type has_open_info(const OSHandle &handle, const error_type &error_return) { + mutex_lock file_lock(file_mutex_); + return ((file_lookup_.find(handle) == file_lookup_.end()) ? error_return : 0); + } + + void remove_compat_open_info(const remote::file_handle &handle); + + bool remove_directory(const std::string &client_id, void *dir); + + void remove_open_info(const OSHandle &handle); + + void set_client_id(const OSHandle &handle, const std::string &client_id); + + void set_compat_client_id(const remote::file_handle &handle, const std::string &client_id); + + void set_compat_open_info(const remote::file_handle &handle); + + void set_open_info(const OSHandle &handle, open_info oi); +}; +} // namespace repertory + +#endif // INCLUDE_DRIVES_REMOTE_REMOTE_OPEN_FILE_TABLE_HPP_ diff --git a/include/drives/remote/remote_server_base.hpp b/include/drives/remote/remote_server_base.hpp new file mode 100644 index 00000000..7bfd70eb --- /dev/null +++ b/include/drives/remote/remote_server_base.hpp @@ -0,0 +1,1348 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_REMOTE_REMOTE_SERVER_BASE_HPP_ +#define INCLUDE_DRIVES_REMOTE_REMOTE_SERVER_BASE_HPP_ + +#include "common.hpp" +#include "comm/packet/client_pool.hpp" +#include "comm/packet/packet.hpp" +#include "comm/packet/packet_server.hpp" +#include "app_config.hpp" +#include "drives/directory_iterator.hpp" +#include "drives/fuse/remotefuse/i_remote_instance.hpp" +#include "drives/remote/i_remote_json.hpp" +#include "drives/remote/remote_open_file_table.hpp" +#include "drives/winfsp/remotewinfsp/i_remote_instance.hpp" +#include "types/remote.hpp" +#include "types/repertory.hpp" +#include "utils/Base64.hpp" +#include "utils/path_utils.hpp" + +#define REPERTORY_DIRECTORY_PAGE_SIZE std::size_t(100u) + +namespace repertory { +template +class remote_server_base : public remote_open_file_table, + public virtual remote_winfsp::i_remote_instance, + public virtual remote_fuse::i_remote_instance { +public: + remote_server_base(app_config &config, drive &d, std::string mount_location) + : config_(config), drive_(d), mount_location_(std::move(mount_location)), + client_pool_(config.get_remote_client_pool_size()) { + handler_lookup_.insert( + {"::winfsp_can_delete", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + std::wstring file_name; + DECODE_OR_RETURN(request, file_name); + + ret = this->winfsp_can_delete(file_desc, &file_name[0]); + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_cleanup", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + std::wstring file_name; + DECODE_OR_RETURN(request, file_name); + + UINT32 flags; + DECODE_OR_RETURN(request, flags); + + BOOLEAN was_closed; + ret = this->winfsp_cleanup(file_desc, &file_name[0], flags, was_closed); + response.encode(was_closed); + + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_close", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + ret = this->winfsp_close(file_desc); + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_create", + [this](const std::uint32_t &, const std::string &client_id, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + std::wstring file_name; + DECODE_OR_RETURN(request, file_name); + + UINT32 create_options; + DECODE_OR_RETURN(request, create_options); + + UINT32 granted_access; + DECODE_OR_RETURN(request, granted_access); + + UINT32 attributes; + DECODE_OR_RETURN(request, attributes); + + UINT64 allocation_size; + DECODE_OR_RETURN(request, allocation_size); + + BOOLEAN exists = 0; + remote::file_info file_info{}; + std::string normalized_name; + PVOID file_desc; + ret = this->winfsp_create(&file_name[0], create_options, granted_access, attributes, + allocation_size, &file_desc, &file_info, normalized_name, + exists); + if (ret == STATUS_SUCCESS) { +#ifdef _WIN32 + this->set_client_id(file_desc, client_id); +#else + this->set_client_id(reinterpret_cast(file_desc), client_id); +#endif + response.encode(file_desc); + response.encode(file_info); + response.encode(normalized_name); + response.encode(exists); + } + + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_flush", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + remote::file_info file_info{}; + ret = this->winfsp_flush(file_desc, &file_info); + if (ret == STATUS_SUCCESS) { + response.encode(file_info); + } + + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_get_file_info", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + remote::file_info file_info{}; + ret = this->winfsp_get_file_info(file_desc, &file_info); + if (ret == STATUS_SUCCESS) { + response.encode(file_info); + } + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_get_security_by_name", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + std::wstring file_name; + DECODE_OR_RETURN(request, file_name); + + std::uint64_t descriptor_size; + DECODE_OR_RETURN(request, descriptor_size); + + std::uint8_t get_attributes; + DECODE_OR_RETURN(request, get_attributes); + + UINT32 attributes; + auto *attrPtr = get_attributes ? &attributes : nullptr; + std::wstring string_descriptor; + ret = this->winfsp_get_security_by_name(&file_name[0], attrPtr, + descriptor_size ? &descriptor_size : nullptr, + string_descriptor); + if (ret == STATUS_SUCCESS) { + response.encode(string_descriptor); + if (get_attributes) { + response.encode(attributes); + } + } + + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_get_volume_info", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + UINT64 total_size = 0u; + UINT64 free_size = 0u; + std::string volume_label; + if ((ret = this->winfsp_get_volume_info(total_size, free_size, volume_label)) == + STATUS_SUCCESS) { + response.encode(total_size); + response.encode(free_size); + response.encode(volume_label); + } + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_mounted", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + std::string version; + DECODE_OR_RETURN(request, version); + + std::wstring location; + DECODE_OR_RETURN(request, location); + + ret = this->winfsp_mounted(location); + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_open", + [this](const std::uint32_t &, const std::string &client_id, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + std::wstring file_name; + DECODE_OR_RETURN(request, file_name); + + UINT32 create_options; + DECODE_OR_RETURN(request, create_options); + + UINT32 granted_access; + DECODE_OR_RETURN(request, granted_access); + + remote::file_info file_info{}; + std::string normalized_name; + PVOID file_desc; + ret = this->winfsp_open(&file_name[0], create_options, granted_access, &file_desc, + &file_info, normalized_name); + if (ret == STATUS_SUCCESS) { +#ifdef _WIN32 + this->set_client_id(file_desc, client_id); +#else + this->set_client_id(reinterpret_cast(file_desc), client_id); +#endif + response.encode(file_desc); + response.encode(file_info); + response.encode(normalized_name); + } + + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_overwrite", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + UINT32 attributes; + DECODE_OR_RETURN(request, attributes); + + BOOLEAN replace_attributes; + DECODE_OR_RETURN(request, replace_attributes); + + UINT64 allocation_size; + DECODE_OR_RETURN(request, allocation_size); + + remote::file_info file_info{}; + ret = this->winfsp_overwrite(file_desc, attributes, replace_attributes, allocation_size, + &file_info); + if (ret == STATUS_SUCCESS) { + response.encode(file_info); + } + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_read", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + UINT64 offset; + DECODE_OR_RETURN(request, offset); + + UINT32 length; + DECODE_OR_RETURN(request, length); + + std::vector buffer(length); + UINT32 bytes_transferred = 0; + ret = this->winfsp_read(file_desc, &buffer[0], offset, length, &bytes_transferred); + if (ret == STATUS_SUCCESS) { + response.encode(static_cast(bytes_transferred)); + if (bytes_transferred) { + response.encode(&buffer[0], bytes_transferred); + } + } + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_read_directory", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + std::wstring pattern; + DECODE_OR_IGNORE(request, pattern); + + std::wstring marker; + DECODE_OR_IGNORE(request, marker); + + json itemList; + ret = this->winfsp_read_directory( + file_desc, &pattern[0], wcsnlen(&marker[0], marker.size()) ? &marker[0] : nullptr, + itemList); + if (ret == STATUS_SUCCESS) { + response.encode(itemList.dump(0)); + } + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_rename", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + std::wstring file_name; + DECODE_OR_RETURN(request, file_name); + + std::wstring new_file_name; + DECODE_OR_RETURN(request, new_file_name); + + BOOLEAN replace_if_exists; + DECODE_OR_RETURN(request, replace_if_exists); + + ret = + this->winfsp_rename(file_desc, &file_name[0], &new_file_name[0], replace_if_exists); + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_set_basic_info", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + UINT32 attributes; + DECODE_OR_RETURN(request, attributes); + + UINT64 creation_time; + DECODE_OR_RETURN(request, creation_time); + + UINT64 last_access_time; + DECODE_OR_RETURN(request, last_access_time); + + UINT64 last_write_time; + DECODE_OR_RETURN(request, last_write_time); + + UINT64 change_time; + DECODE_OR_RETURN(request, change_time); + + remote::file_info file_info{}; + ret = this->winfsp_set_basic_info(file_desc, attributes, creation_time, last_access_time, + last_write_time, change_time, &file_info); + if (ret == STATUS_SUCCESS) { + response.encode(file_info); + } + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_set_file_size", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + UINT64 new_size; + DECODE_OR_RETURN(request, new_size); + + BOOLEAN set_allocation_size; + DECODE_OR_RETURN(request, set_allocation_size); + + remote::file_info file_info{}; + ret = this->winfsp_set_file_size(file_desc, new_size, set_allocation_size, &file_info); + if (ret == STATUS_SUCCESS) { + response.encode(file_info); + } + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_unmounted", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + std::wstring location; + DECODE_OR_RETURN(request, location); + + ret = this->winfsp_unmounted(location); + return ret; + }}); + handler_lookup_.insert( + {"::winfsp_write", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = STATUS_SUCCESS; + + HANDLE file_desc; + DECODE_OR_RETURN(request, file_desc); + + UINT32 length; + DECODE_OR_RETURN(request, length); + + UINT64 offset; + DECODE_OR_RETURN(request, offset); + + BOOLEAN write_to_end; + DECODE_OR_RETURN(request, write_to_end); + + BOOLEAN constrained_io; + DECODE_OR_RETURN(request, constrained_io); + + auto *buffer = request->current_pointer(); + + UINT32 bytes_transferred = 0; + remote::file_info file_info{}; + ret = this->winfsp_write(file_desc, buffer, offset, length, write_to_end, constrained_io, + &bytes_transferred, &file_info); + if (ret == STATUS_SUCCESS) { + response.encode(bytes_transferred); + response.encode(file_info); + } + return ret; + }}); + handler_lookup_.insert( + {"::fuse_access", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::int32_t mask; + DECODE_OR_RETURN(request, mask); + + return this->fuse_access(&path[0], mask); + }}); + handler_lookup_.insert( + {"::fuse_chflags", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::uint32_t flags; + DECODE_OR_RETURN(request, flags); + + return this->fuse_chflags(&path[0], flags); + }}); + handler_lookup_.insert( + {"::fuse_chmod", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_mode mode; + DECODE_OR_RETURN(request, mode); + + return this->fuse_chmod(&path[0], mode); + }}); + handler_lookup_.insert( + {"::fuse_chown", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::user_id uid; + DECODE_OR_RETURN(request, uid); + + remote::group_id gid; + DECODE_OR_RETURN(request, gid); + + return this->fuse_chown(&path[0], uid, gid); + }}); + handler_lookup_.insert( + {"::fuse_create", + [this](const std::uint32_t &, const std::string &client_id, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_mode mode; + DECODE_OR_RETURN(request, mode); + + remote::open_flags flags; + DECODE_OR_RETURN(request, flags); + + remote::file_handle handle; + if ((ret = this->fuse_create(&path[0], mode, flags, handle)) >= 0) { +#ifdef _WIN32 + this->set_compat_client_id(handle, client_id); +#else + this->set_client_id(handle, client_id); +#endif + response.encode(handle); + } + return ret; + }}); + handler_lookup_.insert( + {"::fuse_destroy", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *, + packet &) -> packet::error_type { return this->fuse_destroy(); }}); + /*handlerLookup_.insert({"::fuse_fallocate", + [this](const std::uint32_t &serviceFlags, const std::string &client_id, + const std::uint64_t &threadId, const std::string &method, + packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::int32_t mode; + DECODE_OR_RETURN(request, mode); + + remote::file_offset offset; + DECODE_OR_RETURN(request, offset); + + remote::file_offset length; + DECODE_OR_RETURN(request, length); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + return this->fuse_fallocate(&path[0], mode, offset, length, + handle); + }});*/ + handler_lookup_.insert( + {"::fuse_fgetattr", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + remote::user_id uid; + DECODE_OR_RETURN(request, uid); + + remote::group_id gid; + DECODE_OR_RETURN(request, gid); + + remote::stat st{}; + bool directory = false; + ret = this->fuse_fgetattr(&path[0], st, directory, handle); + if (ret == 0) { + st.st_uid = uid; + st.st_gid = gid; + response.encode(st); + response.encode(static_cast(directory)); + } + + return ret; + }}); + handler_lookup_.insert( + {"::fuse_fsetattr_x", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::setattr_x attr{}; + DECODE_OR_RETURN(request, attr); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + return this->fuse_fsetattr_x(&path[0], attr, handle); + }}); + handler_lookup_.insert( + {"::fuse_fsync", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::int32_t dataSync; + DECODE_OR_RETURN(request, dataSync); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + return this->fuse_fsync(&path[0], dataSync, handle); + }}); + handler_lookup_.insert( + {"::fuse_ftruncate", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_offset size; + DECODE_OR_RETURN(request, size); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + return this->fuse_ftruncate(&path[0], size, handle); + }}); + handler_lookup_.insert( + {"::fuse_getattr", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::user_id uid; + DECODE_OR_RETURN(request, uid); + + remote::group_id gid; + DECODE_OR_RETURN(request, gid); + + remote::stat st{}; + bool directory = false; + ret = this->fuse_getattr(&path[0], st, directory); + if (ret == 0) { + st.st_uid = uid; + st.st_gid = gid; + response.encode(st); + response.encode(static_cast(directory)); + } + return ret; + }}); + /*handlerLookup_.insert({"::fuse_getxattr", + [this](const std::uint32_t &serviceFlags, const std::string &client_id, + const std::uint64_t &threadId, const std::string &method, + packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::string name; + DECODE_OR_RETURN(request, name); + + remote::file_size size; + DECODE_OR_RETURN(request, size); + + return this->fuse_getxattr(&path[0], &name[0], nullptr, size); + }}); + handlerLookup_.insert({"::fuse_getxattr_osx", + [this](const std::uint32_t &serviceFlags, const std::string &client_id, + const std::uint64_t &threadId, const std::string &method, + packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::string name; + DECODE_OR_RETURN(request, name); + + remote::file_size size; + DECODE_OR_RETURN(request, size); + + std::uint32_t position; + DECODE_OR_RETURN(request, position); + + return this->fuse_getxattr_osx(&path[0], &name[0], nullptr, size, + position); + }});*/ + handler_lookup_.insert( + {"::fuse_getxtimes", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_time bkuptime{}; + remote::file_time crtime{}; + if ((ret = this->fuse_getxtimes(&path[0], bkuptime, crtime)) == 0) { + response.encode(bkuptime); + response.encode(crtime); + } + + return ret; + }}); + handler_lookup_.insert({"::fuse_init", + [this](const std::uint32_t &, const std::string &, + const std::uint64_t &, const std::string &, packet *, + packet &) -> packet::error_type { return this->fuse_init(); }}); + /*handlerLookup_.insert({"::remote_fuseListxattr", + [this](const std::uint32_t &serviceFlags, const std::string &client_id, + const std::uint64_t &threadId, const std::string &method, + packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_size size; + DECODE_OR_RETURN(request, size); + + return this->fuse_listxattr(&path[0], nullptr, size); + }});*/ + handler_lookup_.insert( + {"::fuse_mkdir", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_mode mode; + DECODE_OR_RETURN(request, mode); + + return this->fuse_mkdir(&path[0], mode); + }}); + handler_lookup_.insert( + {"::fuse_open", + [this](const std::uint32_t &, const std::string &client_id, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::open_flags flags; + DECODE_OR_RETURN(request, flags); + + remote::file_handle handle; + if ((ret = this->fuse_open(&path[0], flags, handle)) >= 0) { +#ifdef _WIN32 + this->set_compat_client_id(handle, client_id); +#else + this->set_client_id(handle, client_id); +#endif + response.encode(handle); + } + return ret; + }}); + handler_lookup_.insert( + {"::fuse_opendir", + [this](const std::uint32_t &, const std::string &client_id, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_handle handle = 0; + if ((ret = this->fuse_opendir(&path[0], handle)) >= 0) { + this->add_directory(client_id, reinterpret_cast(handle)); + response.encode(handle); + } + return ret; + }}); + handler_lookup_.insert( + {"::fuse_read", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_size read_size; + DECODE_OR_RETURN(request, read_size); + + remote::file_offset read_offset; + DECODE_OR_RETURN(request, read_offset); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + std::vector buffer; + if ((ret = this->fuse_read(&path[0], reinterpret_cast(&buffer), read_size, + read_offset, handle)) > 0) { + response.encode(&buffer[0], buffer.size()); + } + return ret; + }}); + handler_lookup_.insert( + {"::fuse_readdir", + [this](const std::uint32_t &, const std::string &client_id, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_offset offset; + DECODE_OR_RETURN(request, offset); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + if (this->has_open_directory(client_id, reinterpret_cast(handle))) { + std::string filePath; + ret = this->fuse_readdir(&path[0], offset, handle, filePath); + if (ret == 0) { + response.encode(filePath); + } + } else { + ret = -EBADF; + } + + return ret; + }}); + handler_lookup_.insert( + {"::fuse_release", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + return this->fuse_release(&path[0], handle); + }}); + handler_lookup_.insert( + {"::fuse_releasedir", + [this](const std::uint32_t &, const std::string &client_id, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + ret = this->fuse_releasedir(&path[0], handle); + if (this->remove_directory(client_id, reinterpret_cast(handle))) { + return ret; + } + return -EBADF; + }}); + /*handlerLookup_.insert({"::fuse_removexattr", + [this](const std::uint32_t &serviceFlags, const std::string &client_id, + const std::uint64_t &threadId, const std::string &method, + packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::string name; + DECODE_OR_RETURN(request, name); + + return this->fuse_removexattr(&path[0], &name[0]); + }});*/ + handler_lookup_.insert( + {"::fuse_rename", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string from; + DECODE_OR_RETURN(request, from); + + std::string to; + DECODE_OR_RETURN(request, to); + + return this->fuse_rename(&from[0], &to[0]); + }}); + handler_lookup_.insert( + {"::fuse_rmdir", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + return this->fuse_rmdir(&path[0]); + }}); + handler_lookup_.insert( + {"::fuse_setattr_x", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::setattr_x attr{}; + DECODE_OR_RETURN(request, attr); + + return this->fuse_setattr_x(&path[0], attr); + }}); + handler_lookup_.insert( + {"::fuse_setbkuptime", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_time bkuptime; + DECODE_OR_RETURN(request, bkuptime); + + return this->fuse_setbkuptime(&path[0], bkuptime); + }}); + handler_lookup_.insert( + {"::fuse_setchgtime", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_time chgtime; + DECODE_OR_RETURN(request, chgtime); + + return this->fuse_setchgtime(&path[0], chgtime); + }}); + handler_lookup_.insert( + {"::fuse_setcrtime", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_time crtime; + DECODE_OR_RETURN(request, crtime); + + return this->fuse_setcrtime(&path[0], crtime); + }}); + handler_lookup_.insert( + {"::fuse_setvolname", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string name; + DECODE_OR_RETURN(request, name); + + return this->fuse_setvolname(&name[0]); + }}); + /*handlerLookup_.insert({"::fuse_setxattr", + [this](const std::uint32_t &serviceFlags, const std::string &client_id, + const std::uint64_t &threadId, const std::string &method, + packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::string name; + DECODE_OR_RETURN(request, name); + + remote::file_size size; + DECODE_OR_RETURN(request, size); + + if (size > std::numeric_limits::max()) { + return -ERANGE; + } + + std::vector value(static_cast(size)); + ret = request->Decode(&value[0], value.size()); + if (ret == 0) { + std::int32_t flags; + DECODE_OR_RETURN(request, flags); + + ret = this->fuse_setxattr(&path[0], &name[0], &value[0], size, + flags); + } + return ret; + }}); + handlerLookup_.insert({"::fuse_setxattr_osx", + [this](const std::uint32_t &serviceFlags, const std::string &client_id, + const std::uint64_t &threadId, const std::string &method, + packet *request, packet &response) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::string name; + DECODE_OR_RETURN(request, name); + + remote::file_size size; + DECODE_OR_RETURN(request, size); + + if (size > std::numeric_limits::max()) { + return -ERANGE; + } + + std::vector value(static_cast(size)); + ret = request->Decode(&value[0], value.size()); + if (ret == 0) { + std::int32_t flags; + DECODE_OR_RETURN(request, flags); + + std::uint32_t position; + DECODE_OR_RETURN(request, position); + + ret = this->fuse_setxattr_osx(&path[0], &name[0], &value[0], + size, flags, position); + } + return ret; + }});*/ + handler_lookup_.insert( + {"::fuse_statfs", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = -1; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::uint64_t frsize; + DECODE_OR_RETURN(request, frsize); + + remote::statfs st{}; + ret = this->fuse_statfs(&path[0], frsize, st); + if (ret == 0) { + response.encode(st); + } + return ret; + }}); + handler_lookup_.insert( + {"::fuse_statfs_x", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + auto ret = -1; + + std::string path; + DECODE_OR_RETURN(request, path); + + std::uint64_t bsize; + DECODE_OR_RETURN(request, bsize); + + remote::statfs_x st{}; + ret = this->fuse_statfs_x(&path[0], bsize, st); + if (ret == 0) { + response.encode(st); + } + return ret; + }}); + handler_lookup_.insert( + {"::fuse_truncate", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_offset size; + DECODE_OR_IGNORE(request, size); + + return this->fuse_truncate(&path[0], size); + }}); + handler_lookup_.insert( + {"::fuse_unlink", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + return this->fuse_unlink(&path[0]); + }}); + handler_lookup_.insert( + {"::fuse_utimens", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_time tv[2] = {0}; + if ((ret = request->decode(&tv[0], sizeof(remote::file_time) * 2)) == 0) { + std::uint64_t op0; + DECODE_OR_RETURN(request, op0); + + std::uint64_t op1; + DECODE_OR_RETURN(request, op1); + + ret = this->fuse_utimens(&path[0], tv, op0, op1); + } + return ret; + }}); + handler_lookup_.insert( + {"::fuse_write", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + std::int32_t ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_size writeSize; + DECODE_OR_RETURN(request, writeSize); + + if (writeSize > std::numeric_limits::max()) { + return -ERANGE; + } + + std::vector buffer(static_cast(writeSize)); + if ((ret = request->decode(&buffer[0], buffer.size())) == 0) { + remote::file_offset write_offset; + DECODE_OR_RETURN(request, write_offset); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + ret = this->fuse_write(&path[0], &buffer[0], writeSize, write_offset, handle); + } + return ret; + }}); + handler_lookup_.insert( + {"::fuse_write_base64", + [this](const std::uint32_t &, const std::string &, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + std::int32_t ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_size write_size; + DECODE_OR_RETURN(request, write_size); + + if (write_size > std::numeric_limits::max()) { + return -ERANGE; + } + + std::vector buffer(static_cast(write_size)); + if ((ret = request->decode(&buffer[0], buffer.size())) == 0) { + buffer = macaron::Base64::Decode(std::string(buffer.begin(), buffer.end())); + write_size = buffer.size(); + + remote::file_offset write_offset; + DECODE_OR_RETURN(request, write_offset); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + ret = this->fuse_write(&path[0], &buffer[0], write_size, write_offset, handle); + } + return ret; + }}); + handler_lookup_.insert( + {"::json_create_directory_snapshot", + [this](const std::uint32_t &, const std::string &client_id, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + std::int32_t ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + json json_data; + json_data["handle"] = -1; + json_data["page_count"] = 0; + json_data["path"] = path; + if ((ret = this->json_create_directory_snapshot(&path[0], json_data)) == 0) { + this->add_directory( + client_id, reinterpret_cast(json_data["handle"].get())); + response.encode(json_data.dump(0)); + } + return ret; + }}); + handler_lookup_.insert( + {"::json_read_directory_snapshot", + [this](const std::uint32_t &, const std::string &client_id, const std::uint64_t &, + const std::string &, packet *request, packet &response) -> packet::error_type { + std::int32_t ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + std::uint32_t page; + DECODE_OR_RETURN(request, page); + + ret = -EBADF; + if (this->has_open_directory(client_id, reinterpret_cast(handle))) { + json json_data; + json_data["directory_list"] = std::vector(); + json_data["page"] = page; + ret = this->json_read_directory_snapshot(path, handle, page, json_data); + if ((ret == 0) || (ret == -120)) { + response.encode(json_data.dump(0)); + } + } + + return ret; + }}); + handler_lookup_.insert( + {"::json_release_directory_snapshot", + [this](const std::uint32_t &, const std::string &client_id, const std::uint64_t &, + const std::string &, packet *request, packet &) -> packet::error_type { + auto ret = 0; + + std::string path; + DECODE_OR_RETURN(request, path); + + remote::file_handle handle; + DECODE_OR_RETURN(request, handle); + + ret = this->json_release_directory_snapshot(&path[0], handle); + if (this->remove_directory(client_id, reinterpret_cast(handle))) { + return ret; + } + return -EBADF; + }}); + + packet_server_ = std::make_unique( + config_.get_remote_port(), config_.get_remote_token(), 10, + [this](const std::string &client_id) { return this->closed_handler(client_id); }, + [this](const std::uint32_t &service_flags, const std::string &client_id, + const std::uint64_t &thread_id, const std::string &method, packet *request, + packet &response, packet_server::message_complete_callback message_complete) { + return this->message_handler(service_flags, client_id, thread_id, method, request, + response, message_complete); + }); + } + + ~remote_server_base() override { + event_system::instance().raise("remote_server_base"); + client_pool_.shutdown(); + packet_server_.reset(); + } + +public: + typedef std::function + handler_callback; + +protected: + app_config &config_; + drive &drive_; + const std::string mount_location_; + +private: + client_pool client_pool_; + std::unique_ptr packet_server_; + std::unordered_map handler_lookup_; + +private: + void closed_handler(const std::string &client_id) { + client_pool_.remove_client(client_id); + close_all(client_id); + } + + void message_handler(const std::uint32_t &service_flags, const std::string &client_id, + const std::uint64_t &thread_id, const std::string &method, packet *request, + packet &response, + packet_server::message_complete_callback message_complete) { + const auto idx = method.find_last_of("::"); + const auto lookup_method_name = + ((idx == std::string::npos) ? "::" + method : method.substr(idx - 1)); + if (handler_lookup_.find(lookup_method_name) == handler_lookup_.end()) { + message_complete(STATUS_NOT_IMPLEMENTED); + } else { + client_pool_.execute( + client_id, thread_id, + [this, lookup_method_name, service_flags, client_id, thread_id, method, request, + &response]() -> packet::error_type { + return this->handler_lookup_[lookup_method_name](service_flags, client_id, thread_id, + method, request, response); + }, + message_complete); + } + } + +protected: + std::string construct_api_path(std::string path) { + path = utils::path::create_api_path(path.substr(mount_location_.size())); + return path; + } + + void delete_open_directory(void *dir) override { + if (dir) { + delete reinterpret_cast(dir); + } + } +}; +} // namespace repertory + +#endif // INCLUDE_DRIVES_REMOTE_REMOTE_SERVER_BASE_HPP_ diff --git a/include/drives/winfsp/i_winfsp_drive.hpp b/include/drives/winfsp/i_winfsp_drive.hpp new file mode 100644 index 00000000..e3312bf5 --- /dev/null +++ b/include/drives/winfsp/i_winfsp_drive.hpp @@ -0,0 +1,61 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_WINFSP_I_WINFSP_DRIVE_HPP_ +#define INCLUDE_DRIVES_WINFSP_I_WINFSP_DRIVE_HPP_ +#ifdef _WIN32 + +#include "common.hpp" +#include "types/remote.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class i_winfsp_drive { + INTERFACE_SETUP(i_winfsp_drive); + +public: + virtual std::uint64_t get_directory_item_count(const std::string &api_path) const = 0; + + virtual directory_item_list get_directory_items(const std::string &api_path) const = 0; + + virtual std::uint64_t get_file_size(const std::string &api_path) const = 0; + + virtual api_error get_item_meta(const std::string &api_path, const std::string &name, + std::string &value) const = 0; + + virtual api_error get_item_meta(const std::string &api_path, api_meta_map &meta) const = 0; + + virtual NTSTATUS get_security_by_name(PWSTR file_name, PUINT32 attributes, + PSECURITY_DESCRIPTOR descriptor, + std::uint64_t *descriptor_size) = 0; + + virtual std::uint64_t get_total_drive_space() const = 0; + + virtual std::uint64_t get_total_item_count() const = 0; + + virtual std::uint64_t get_used_drive_space() const = 0; + + virtual void get_volume_info(UINT64 &total_size, UINT64 &free_size, + std::string &volume_label) const = 0; + + virtual api_error populate_file_info(const std::string &api_path, remote::file_info &fi) = 0; +}; +} // namespace repertory + +#endif // _WIN32 +#endif // INCLUDE_DRIVES_WINFSP_I_WINFSP_DRIVE_HPP_ diff --git a/include/drives/winfsp/remotewinfsp/i_remote_instance.hpp b/include/drives/winfsp/remotewinfsp/i_remote_instance.hpp new file mode 100644 index 00000000..f785b658 --- /dev/null +++ b/include/drives/winfsp/remotewinfsp/i_remote_instance.hpp @@ -0,0 +1,94 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_I_REMOTE_INSTANCE_HPP_ +#define INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_I_REMOTE_INSTANCE_HPP_ + +#include "common.hpp" +#include "drives/remote/i_remote_json.hpp" + +namespace repertory::remote_winfsp { +class i_remote_instance : public virtual i_remote_json { + INTERFACE_SETUP(i_remote_instance); + +public: + virtual packet::error_type winfsp_can_delete(PVOID fileDesc, PWSTR fileName) = 0; + + virtual packet::error_type winfsp_cleanup(PVOID fileDesc, PWSTR fileName, UINT32 flags, + BOOLEAN &wasClosed) = 0; + + virtual packet::error_type winfsp_close(PVOID fileDesc) = 0; + + virtual packet::error_type winfsp_create(PWSTR fileName, UINT32 createOptions, + UINT32 grantedAccess, UINT32 fileAttributes, + UINT64 allocationSize, PVOID *fileDesc, + remote::file_info *fileInfo, std::string &normalizedName, + BOOLEAN &exists) = 0; + + virtual packet::error_type winfsp_flush(PVOID fileDesc, remote::file_info *fileInfo) = 0; + + virtual packet::error_type winfsp_get_dir_buffer(PVOID fileDesc, PVOID *&ptr) = 0; + + virtual packet::error_type winfsp_get_file_info(PVOID fileDesc, remote::file_info *fileInfo) = 0; + + virtual packet::error_type winfsp_get_security_by_name(PWSTR fileName, PUINT32 fileAttributes, + std::uint64_t *securityDescriptorSize, + std::wstring &strDescriptor) = 0; + + virtual packet::error_type winfsp_get_volume_info(UINT64 &totalSize, UINT64 &freeSize, + std::string &volumeLabel) = 0; + + virtual packet::error_type winfsp_mounted(const std::wstring &location) = 0; + + virtual packet::error_type winfsp_open(PWSTR fileName, UINT32 createOptions, UINT32 grantedAccess, + PVOID *fileDesc, remote::file_info *fileInfo, + std::string &normalizedName) = 0; + + virtual packet::error_type winfsp_overwrite(PVOID fileDesc, UINT32 fileAttributes, + BOOLEAN replaceFileAttributes, UINT64 allocationSize, + remote::file_info *fileInfo) = 0; + + virtual packet::error_type winfsp_read(PVOID fileDesc, PVOID buffer, UINT64 offset, UINT32 length, + PUINT32 bytesTransferred) = 0; + + virtual packet::error_type winfsp_read_directory(PVOID fileDesc, PWSTR pattern, PWSTR marker, + json &itemList) = 0; + + virtual packet::error_type winfsp_rename(PVOID fileDesc, PWSTR fileName, PWSTR newFileName, + BOOLEAN replaceIfExists) = 0; + + virtual packet::error_type winfsp_set_basic_info(PVOID fileDesc, UINT32 fileAttributes, + UINT64 creationTime, UINT64 lastAccessTime, + UINT64 lastWriteTime, UINT64 changeTime, + remote::file_info *fileInfo) = 0; + + virtual packet::error_type winfsp_set_file_size(PVOID fileDesc, UINT64 newSize, + BOOLEAN setAllocationSize, + remote::file_info *fileInfo) = 0; + + virtual packet::error_type winfsp_unmounted(const std::wstring &location) = 0; + + virtual packet::error_type winfsp_write(PVOID fileDesc, PVOID buffer, UINT64 offset, + UINT32 length, BOOLEAN writeToEndOfFile, + BOOLEAN constrainedIo, PUINT32 bytesTransferred, + remote::file_info *fileInfo) = 0; +}; +typedef std::function()> remote_instance_factory; +} // namespace repertory::remote_winfsp + +#endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_I_REMOTE_INSTANCE_HPP_ diff --git a/include/drives/winfsp/remotewinfsp/remote_client.hpp b/include/drives/winfsp/remotewinfsp/remote_client.hpp new file mode 100644 index 00000000..36985783 --- /dev/null +++ b/include/drives/winfsp/remotewinfsp/remote_client.hpp @@ -0,0 +1,125 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_CLIENT_HPP_ +#define INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_CLIENT_HPP_ + +#include "common.hpp" +#include "comm/packet/packet.hpp" +#include "comm/packet/packet_client.hpp" +#include "drives/winfsp/remotewinfsp/i_remote_instance.hpp" +#include "drives/remote/remote_open_file_table.hpp" + +namespace repertory { +class app_config; +namespace remote_winfsp { +class remote_client final : public remote_open_file_table, public virtual i_remote_instance { +public: + explicit remote_client(const app_config &config); + +private: + const app_config &config_; + packet_client packet_client_; + +private: +#ifdef _WIN32 +#define to_handle(x) (x) +#else + static OSHandle to_handle(PVOID file_desc) { + return static_cast(reinterpret_cast(file_desc)); + } +#endif + +protected: + void delete_open_directory(void * /*dir*/) override {} + +public: + packet::error_type json_create_directory_snapshot(const std::string &path, + json &json_data) override; + + packet::error_type json_read_directory_snapshot(const std::string &path, + const remote::file_handle &handle, + const std::uint32_t &page, + json &json_data) override; + + packet::error_type json_release_directory_snapshot(const std::string &path, + const remote::file_handle &handle) override; + + packet::error_type winfsp_can_delete(PVOID file_desc, PWSTR file_name) override; + + packet::error_type winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, + BOOLEAN &was_closed) override; + + packet::error_type winfsp_close(PVOID file_desc) override; + + packet::error_type winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, + UINT32 attributes, UINT64 allocation_size, PVOID *file_desc, + remote::file_info *file_info, std::string &normalized_name, + BOOLEAN &exists) override; + + packet::error_type winfsp_flush(PVOID file_desc, remote::file_info *file_info) override; + + packet::error_type winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) override; + + packet::error_type winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) override; + + packet::error_type winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, + std::uint64_t *descriptor_size, + std::wstring &string_descriptor) override; + + packet::error_type winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, + std::string &volume_label) override; + + packet::error_type winfsp_mounted(const std::wstring &location) override; + + packet::error_type winfsp_open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, + PVOID *file_desc, remote::file_info *file_info, + std::string &normalized_name) override; + + packet::error_type winfsp_overwrite(PVOID file_desc, UINT32 attributes, + BOOLEAN replace_attributes, UINT64 allocation_size, + remote::file_info *file_info) override; + + packet::error_type winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, + PUINT32 bytes_transferred) override; + + packet::error_type winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker, + json &itemList) override; + + packet::error_type winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, + BOOLEAN replace_if_exists) override; + + packet::error_type winfsp_set_basic_info(PVOID file_desc, UINT32 attributes, UINT64 creation_time, + UINT64 last_access_time, UINT64 last_write_time, + UINT64 change_time, + remote::file_info *file_info) override; + + packet::error_type winfsp_set_file_size(PVOID file_desc, UINT64 new_size, + BOOLEAN set_allocation_size, + remote::file_info *file_info) override; + + packet::error_type winfsp_unmounted(const std::wstring &location) override; + + packet::error_type winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, + BOOLEAN write_to_end, BOOLEAN constrained_io, + PUINT32 bytes_transferred, remote::file_info *file_info) override; +}; +} // namespace remote_winfsp +} // namespace repertory + +#endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_CLIENT_HPP_ diff --git a/include/drives/winfsp/remotewinfsp/remote_server.hpp b/include/drives/winfsp/remotewinfsp/remote_server.hpp new file mode 100644 index 00000000..7e734f6a --- /dev/null +++ b/include/drives/winfsp/remotewinfsp/remote_server.hpp @@ -0,0 +1,241 @@ +/* + Copyright <2018-2022> + + 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. +*/ +// NOTE: Most of the WinFSP pass-through code has been modified from: +// https://github.com/billziss-gh/winfsp/blob/master/tst/passthrough-cpp/passthrough-cpp.cpp +#ifndef INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_SERVER_HPP_ +#define INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_SERVER_HPP_ +#ifdef _WIN32 + +#include "common.hpp" +#include "comm/packet/packet.hpp" +#include "drives/remote/remote_server_base.hpp" +#include "drives/winfsp/i_winfsp_drive.hpp" + +namespace repertory { +class app_config; +namespace remote_winfsp { +class remote_server final : public virtual remote_server_base { +public: + remote_server(app_config &config, i_winfsp_drive &drive, const std::string &mount_location) + : remote_server_base(config, drive, mount_location) {} + +private: + std::string construct_path(std::string path); + + packet::error_type populate_file_info(const std::string &api_path, remote::file_info &file_info); + + void populate_stat(const char *path, const bool &directory, remote::stat &st, + const struct _stat64 &st1); + +public: + // FUSE Layer + packet::error_type fuse_access(const char *path, const std::int32_t &mask) override; + + packet::error_type fuse_chflags(const char *path, const std::uint32_t &flags) override; + + packet::error_type fuse_chmod(const char *path, const remote::file_mode &mode) override; + + packet::error_type fuse_chown(const char *path, const remote::user_id &uid, + const remote::group_id &gid) override; + + packet::error_type fuse_destroy() override; + + /*packet::error_type fuse_fallocate(const char *path, const std::int32_t &mode, + const remote::file_offset &offset, + const remote::file_offset &length, + const remote::file_handle &handle) override ;*/ + + packet::error_type fuse_fgetattr(const char *path, remote::stat &st, bool &directory, + const remote::file_handle &handle) override; + + packet::error_type fuse_fsetattr_x(const char *path, const remote::setattr_x &attr, + const remote::file_handle &handle) override; + + packet::error_type fuse_fsync(const char *path, const std::int32_t &datasync, + const remote::file_handle &handle) override; + + packet::error_type fuse_ftruncate(const char *path, const remote::file_offset &size, + const remote::file_handle &handle) override; + + packet::error_type fuse_getattr(const char *path, remote::stat &st, bool &directory) override; + + /*packet::error_type fuse_getxattr(const char *path, const char *name, char *value, + const remote::file_size &size) override ; + + packet::error_type fuse_getxattrOSX(const char *path, const char *name, char *value, + const remote::file_size &size, + const std::uint32_t &position) override ;*/ + + packet::error_type fuse_getxtimes(const char *path, remote::file_time &bkuptime, + remote::file_time &crtime) override; + + packet::error_type fuse_init() override; + + /*packet::error_type fuse_listxattr(const char *path, char *buffer, + const remote::file_size &size) override ;*/ + + packet::error_type fuse_mkdir(const char *path, const remote::file_mode &mode) override; + + packet::error_type fuse_opendir(const char *path, remote::file_handle &handle) override; + + packet::error_type fuse_create(const char *path, const remote::file_mode &mode, + const remote::open_flags &flags, + remote::file_handle &handle) override; + + packet::error_type fuse_open(const char *path, const remote::open_flags &flags, + remote::file_handle &handle) override; + + packet::error_type fuse_read(const char *path, char *buffer, const remote::file_size &read_size, + const remote::file_offset &read_offset, + const remote::file_handle &handle) override; + + packet::error_type fuse_rename(const char *from, const char *to) override; + + packet::error_type fuse_write(const char *path, const char *buffer, + const remote::file_size &write_size, + const remote::file_offset &write_offset, + const remote::file_handle &handle) override; + + packet::error_type fuse_write_base64(const char *path, const char *buffer, + const remote::file_size &write_size, + const remote::file_offset &write_offset, + const remote::file_handle &handle) override; + + packet::error_type fuse_readdir(const char *path, const remote::file_offset &offset, + const remote::file_handle &handle, + std::string &item_path) override; + + packet::error_type fuse_release(const char *path, const remote::file_handle &handle) override; + + packet::error_type fuse_releasedir(const char *path, const remote::file_handle &handle) override; + + /*packet::error_type fuse_removexattr(const char *path, const char *name) override ;*/ + + packet::error_type fuse_rmdir(const char *path) override; + + packet::error_type fuse_setattr_x(const char *path, remote::setattr_x &attr) override; + + packet::error_type fuse_setbkuptime(const char *path, const remote::file_time &bkuptime) override; + + packet::error_type fuse_setchgtime(const char *path, const remote::file_time &chgtime) override; + + packet::error_type fuse_setcrtime(const char *path, const remote::file_time &crtime) override; + + packet::error_type fuse_setvolname(const char *volname) override; + + /*packet::error_type fuse_setxattr(const char *path, const char *name, const char *value, + const remote::file_size &size, + const std::int32_t &flags) override ; + + packet::error_type fuse_setxattr_osx(const char *path, const char *name, const char *value, + const remote::file_size &size, const std::int32_t &flags, + const std::uint32_t &position) override ;*/ + + packet::error_type fuse_statfs(const char *path, const std::uint64_t &frsize, + remote::statfs &st) override; + + packet::error_type fuse_statfs_x(const char *path, const std::uint64_t &bsize, + remote::statfs_x &st) override; + + packet::error_type fuse_truncate(const char *path, const remote::file_offset &size) override; + + packet::error_type fuse_unlink(const char *path) override; + + packet::error_type fuse_utimens(const char *path, const remote::file_time *tv, + const std::uint64_t &op0, const std::uint64_t &op1) override; + + void set_fuse_uid_gid(const remote::user_id &, const remote::group_id &) override {} + + // JSON Layer + packet::error_type json_create_directory_snapshot(const std::string &path, + json &json_data) override; + + packet::error_type json_read_directory_snapshot(const std::string &path, + const remote::file_handle &handle, + const std::uint32_t &page, + json &json_data) override; + + packet::error_type json_release_directory_snapshot(const std::string &path, + const remote::file_handle &handle) override; + + // WinFSP Layer + packet::error_type winfsp_can_delete(PVOID file_desc, PWSTR file_name) override; + + packet::error_type winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, + BOOLEAN &was_closed) override; + + packet::error_type winfsp_close(PVOID file_desc) override; + + packet::error_type winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, + UINT32 attributes, UINT64 allocation_size, PVOID *file_desc, + remote::file_info *file_info, std::string &normalized_name, + BOOLEAN &exists) override; + + packet::error_type winfsp_flush(PVOID file_desc, remote::file_info *file_info) override; + + packet::error_type winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) override; + + packet::error_type winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) override; + + packet::error_type winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, + std::uint64_t *descriptor_size, + std::wstring &string_descriptor) override; + + packet::error_type winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, + std::string &volume_label) override; + + packet::error_type winfsp_mounted(const std::wstring &location) override; + + packet::error_type winfsp_open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, + PVOID *file_desc, remote::file_info *file_info, + std::string &normalized_name) override; + + packet::error_type winfsp_overwrite(PVOID file_desc, UINT32 attributes, + BOOLEAN replace_attributes, UINT64 allocation_size, + remote::file_info *file_info) override; + + packet::error_type winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, + PUINT32 bytes_transferred) override; + + packet::error_type winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker, + json &item_list) override; + + packet::error_type winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, + BOOLEAN replace_if_exists) override; + + packet::error_type winfsp_set_basic_info(PVOID file_desc, UINT32 attributes, UINT64 creation_time, + UINT64 last_access_time, UINT64 last_write_time, + UINT64 change_time, + remote::file_info *file_info) override; + + packet::error_type winfsp_set_file_size(PVOID file_desc, UINT64 newSize, + BOOLEAN set_allocation_size, + remote::file_info *file_info) override; + + packet::error_type winfsp_unmounted(const std::wstring &location) override; + + packet::error_type winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, + BOOLEAN write_to_end, BOOLEAN constrained_io, + PUINT32 bytes_transferred, remote::file_info *file_info) override; +}; +} // namespace remote_winfsp +} // namespace repertory + +#endif // _WIN32 +#endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_SERVER_HPP_ diff --git a/include/drives/winfsp/remotewinfsp/remote_winfsp_drive.hpp b/include/drives/winfsp/remotewinfsp/remote_winfsp_drive.hpp new file mode 100644 index 00000000..ded6063a --- /dev/null +++ b/include/drives/winfsp/remotewinfsp/remote_winfsp_drive.hpp @@ -0,0 +1,140 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_WINFSP_DRIVE_HPP_ +#define INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_WINFSP_DRIVE_HPP_ +#ifdef _WIN32 + +#include "common.hpp" +#include "drives/winfsp/remotewinfsp/i_remote_instance.hpp" +#include "events/event_system.hpp" + +namespace repertory { +class app_config; +class lock_data; +class server; +namespace remote_winfsp { +class remote_winfsp_drive final : public virtual FileSystemBase { + E_CONSUMER(); + +public: + remote_winfsp_drive(app_config &config, lock_data &lockData, + remote_instance_factory remoteInstanceFactory); + + ~remote_winfsp_drive() override { E_CONSUMER_RELEASE(); } + +public: + class winfsp_service : virtual public Service { + public: + winfsp_service(lock_data &lock, remote_winfsp_drive &drive, std::vector drive_args, + app_config &config); + + ~winfsp_service() override = default; + + private: + app_config &config_; + lock_data &lock_; + remote_winfsp_drive &drive_; + const std::vector drive_args_; + FileSystemHost host_; + + protected: + NTSTATUS OnStart(ULONG, PWSTR *) override; + + NTSTATUS OnStop() override; + }; + +private: + app_config &config_; + lock_data &lock_; + remote_instance_factory factory_; + std::unique_ptr remote_instance_; + std::unique_ptr server_; + std::string mount_location_; + +private: + void PopulateFileInfo(const json &item, FSP_FSCTL_FILE_INFO &file_info); + + static void SetFileInfo(FileInfo &dest, const remote::file_info &src); + +public: + NTSTATUS CanDelete(PVOID file_node, PVOID file_desc, PWSTR file_name) override; + + VOID Cleanup(PVOID file_node, PVOID file_desc, PWSTR file_name, ULONG flags) override; + + VOID Close(PVOID file_node, PVOID file_desc) override; + + NTSTATUS Create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, UINT32 attributes, + PSECURITY_DESCRIPTOR descriptor, UINT64 allocation_size, PVOID *file_node, + PVOID *file_desc, OpenFileInfo *ofi) override; + + NTSTATUS Flush(PVOID file_node, PVOID file_desc, FileInfo *file_info) override; + + NTSTATUS GetFileInfo(PVOID file_node, PVOID file_desc, FileInfo *file_info) override; + + NTSTATUS GetSecurityByName(PWSTR file_name, PUINT32 attributes, PSECURITY_DESCRIPTOR descriptor, + SIZE_T *descriptor_size) override; + + NTSTATUS GetVolumeInfo(VolumeInfo *volume_info) override; + + NTSTATUS Init(PVOID host) override; + + int mount(const std::vector &drive_args); + + NTSTATUS Mounted(PVOID host) override; + + NTSTATUS Open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, PVOID *file_node, + PVOID *file_desc, OpenFileInfo *ofi) override; + + NTSTATUS Overwrite(PVOID file_node, PVOID file_desc, UINT32 attributes, + BOOLEAN replace_attributes, UINT64 allocation_size, + FileInfo *file_info) override; + + NTSTATUS Read(PVOID file_node, PVOID file_desc, PVOID buffer, UINT64 offset, ULONG length, + PULONG bytes_transferred) override; + + NTSTATUS ReadDirectory(PVOID file_node, PVOID file_desc, PWSTR pattern, PWSTR marker, + PVOID buffer, ULONG buffer_length, PULONG bytes_transferred) override; + + NTSTATUS Rename(PVOID file_node, PVOID file_desc, PWSTR file_name, PWSTR new_file_name, + BOOLEAN replace_if_exists) override; + + NTSTATUS SetBasicInfo(PVOID file_node, PVOID file_desc, UINT32 attributes, UINT64 creation_time, + UINT64 last_access_time, UINT64 last_write_time, UINT64 change_time, + FileInfo *file_info) override; + + NTSTATUS SetFileSize(PVOID file_node, PVOID file_desc, UINT64 new_size, + BOOLEAN set_allocation_size, FileInfo *file_info) override; + + VOID Unmounted(PVOID host) override; + + NTSTATUS Write(PVOID file_node, PVOID file_desc, PVOID buffer, UINT64 offset, ULONG length, + BOOLEAN write_to_end, BOOLEAN constrained_io, PULONG bytes_transferred, + FileInfo *file_info) override; + + void shutdown() { ::GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); } + + static void display_options(int argc, char *argv[]) {} + + static void display_version_information(int argc, char *argv[]) {} +}; +} // namespace remote_winfsp +} // namespace repertory + +#endif // _WIN32 +#endif // INCLUDE_DRIVES_WINFSP_REMOTEWINFSP_REMOTE_WINFSP_DRIVE_HPP_ diff --git a/include/drives/winfsp/winfsp_drive.hpp b/include/drives/winfsp/winfsp_drive.hpp new file mode 100644 index 00000000..6f1f59ea --- /dev/null +++ b/include/drives/winfsp/winfsp_drive.hpp @@ -0,0 +1,177 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_DRIVES_WINFSP_WINFSP_DRIVE_HPP_ +#define INCLUDE_DRIVES_WINFSP_WINFSP_DRIVE_HPP_ +#ifdef _WIN32 + +#include "common.hpp" +#include "download/download_manager.hpp" +#include "drives/eviction.hpp" +#include "drives/i_open_file_table.hpp" +#include "drives/open_file_table.hpp" +#include "drives/winfsp/i_winfsp_drive.hpp" +#include "drives/winfsp/remotewinfsp/remote_server.hpp" +#include "events/event_system.hpp" +#include "rpc/server/full_server.hpp" + +namespace repertory { +class app_config; +class lock_data; +class i_provider; +class winfsp_drive final : public virtual i_winfsp_drive, public virtual FileSystemBase { + E_CONSUMER(); + +public: + winfsp_drive(app_config &config, lock_data &lockData, i_provider &provider); + + ~winfsp_drive() override { E_CONSUMER_RELEASE(); } + +private: + class winfsp_service final : virtual public Service { + public: + winfsp_service(lock_data &lock, winfsp_drive &drive, std::vector drive_args, + app_config &config); + + ~winfsp_service() override = default; + + private: + lock_data &lock_; + winfsp_drive &drive_; + const std::vector drive_args_; + FileSystemHost host_; + app_config &config_; + + protected: + NTSTATUS OnStart(ULONG, PWSTR *) override; + + NTSTATUS OnStop() override; + }; + +private: + i_provider &provider_; + app_config &config_; + lock_data &lock_; + std::unique_ptr server_; + std::unique_ptr> oft_; + std::unique_ptr download_manager_; + std::unique_ptr eviction_; + std::unique_ptr remote_server_; + +private: + static std::string parse_mount_location(const std::wstring &mount_location); + + void populate_file_info(const std::string &api_path, const std::uint64_t &file_size, + const api_meta_map &meta, FSP_FSCTL_OPEN_FILE_INFO &ofi); + + void populate_file_info(const std::uint64_t &file_size, api_meta_map meta, + FSP_FSCTL_FILE_INFO &fi); + + static void set_file_info(remote::file_info &dest, const FSP_FSCTL_FILE_INFO &src); + +public: + NTSTATUS CanDelete(PVOID file_node, PVOID file_desc, PWSTR file_name) override; + + VOID Cleanup(PVOID file_node, PVOID file_desc, PWSTR file_name, ULONG flags) override; + + VOID Close(PVOID file_node, PVOID file_desc) override; + + NTSTATUS Create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, UINT32 attributes, + PSECURITY_DESCRIPTOR descriptor, UINT64 allocation_size, PVOID *file_node, + PVOID *file_desc, OpenFileInfo *ofi) override; + + NTSTATUS Flush(PVOID file_node, PVOID file_desc, FileInfo *file_info) override; + + std::uint64_t get_directory_item_count(const std::string &api_path) const override; + + directory_item_list get_directory_items(const std::string &api_path) const override; + + NTSTATUS GetFileInfo(PVOID file_node, PVOID file_desc, FileInfo *file_info) override; + + std::uint64_t get_file_size(const std::string &api_path) const override; + + api_error get_item_meta(const std::string &api_path, api_meta_map &meta) const override; + + api_error get_item_meta(const std::string &api_path, const std::string &name, + std::string &value) const override; + + NTSTATUS get_security_by_name(PWSTR file_name, PUINT32 attributes, + PSECURITY_DESCRIPTOR descriptor, + std::uint64_t *descriptor_size) override; + + NTSTATUS GetSecurityByName(PWSTR file_name, PUINT32 attributes, PSECURITY_DESCRIPTOR descriptor, + SIZE_T *descriptor_size) override; + + std::uint64_t get_total_drive_space() const override; + + std::uint64_t get_total_item_count() const override; + + std::uint64_t get_used_drive_space() const override; + + void get_volume_info(UINT64 &total_size, UINT64 &free_size, + std::string &volume_label) const override; + + NTSTATUS GetVolumeInfo(VolumeInfo *volume_info) override; + + NTSTATUS Init(PVOID host) override; + + int mount(const std::vector &drive_args); + + NTSTATUS Mounted(PVOID host) override; + + NTSTATUS Open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, PVOID *file_node, + PVOID *file_desc, OpenFileInfo *ofi) override; + + NTSTATUS Overwrite(PVOID file_node, PVOID file_desc, UINT32 attributes, + BOOLEAN replace_attributes, UINT64 allocation_size, + FileInfo *file_info) override; + + api_error populate_file_info(const std::string &api_path, remote::file_info &file_info) override; + + NTSTATUS Read(PVOID file_node, PVOID file_desc, PVOID buffer, UINT64 offset, ULONG length, + PULONG bytes_transferred) override; + + NTSTATUS ReadDirectory(PVOID file_node, PVOID file_desc, PWSTR pattern, PWSTR marker, + PVOID buffer, ULONG bufferLength, PULONG bytes_transferred) override; + + NTSTATUS Rename(PVOID file_node, PVOID file_desc, PWSTR file_name, PWSTR newFileName, + BOOLEAN replace_if_exists) override; + + NTSTATUS SetBasicInfo(PVOID file_node, PVOID file_desc, UINT32 attributes, UINT64 creation_time, + UINT64 last_access_time, UINT64 last_write_time, UINT64 change_time, + FileInfo *file_info) override; + + NTSTATUS SetFileSize(PVOID file_node, PVOID file_desc, UINT64 new_size, + BOOLEAN set_allocation_size, FileInfo *file_info) override; + + VOID Unmounted(PVOID host) override; + + NTSTATUS Write(PVOID file_node, PVOID file_desc, PVOID buffer, UINT64 offset, ULONG length, + BOOLEAN write_to_end, BOOLEAN constrained_io, PULONG bytes_transferred, + FileInfo *file_info) override; + + void shutdown() { ::GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); } + + static void display_options(int argc, char *argv[]) {} + + static void display_version_information(int argc, char *argv[]) {} +}; +} // namespace repertory + +#endif // _WIN32 +#endif // INCLUDE_DRIVES_WINFSP_WINFSP_DRIVE_HPP_ diff --git a/include/events/consumers/console_consumer.hpp b/include/events/consumers/console_consumer.hpp new file mode 100644 index 00000000..d2e6f458 --- /dev/null +++ b/include/events/consumers/console_consumer.hpp @@ -0,0 +1,51 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_EVENTS_CONSUMERS_CONSOLE_CONSUMER_HPP_ +#define INCLUDE_EVENTS_CONSUMERS_CONSOLE_CONSUMER_HPP_ + +#include "common.hpp" +#include "events/event_system.hpp" + +namespace repertory { +class console_consumer final { + E_CONSUMER(); + +public: + console_consumer() { E_SUBSCRIBE_ALL(process_event); } + +public: + ~console_consumer() { E_CONSUMER_RELEASE(); } + +private: + void process_event(const event &e) { +#ifdef _WIN32 +#ifdef _DEBUG + OutputDebugString((e.get_single_line() + "\n").c_str()); +#endif +#endif + if (e.get_event_level() == event_level::error) { + std::cerr << e.get_single_line() << std::endl; + } else { + std::cout << e.get_single_line() << std::endl; + } + } +}; +} // namespace repertory + +#endif // INCLUDE_EVENTS_CONSUMERS_CONSOLE_CONSUMER_HPP_ diff --git a/include/events/consumers/logging_consumer.hpp b/include/events/consumers/logging_consumer.hpp new file mode 100644 index 00000000..f61e0682 --- /dev/null +++ b/include/events/consumers/logging_consumer.hpp @@ -0,0 +1,62 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_EVENTS_CONSUMERS_LOGGING_CONSUMER_HPP_ +#define INCLUDE_EVENTS_CONSUMERS_LOGGING_CONSUMER_HPP_ + +#include "common.hpp" +#include "events/event_system.hpp" + +namespace repertory { +class logging_consumer { + E_CONSUMER(); + +public: + logging_consumer(const std::string &log_directory, const event_level &level); + + ~logging_consumer(); + +private: + const std::uint8_t MAX_LOG_FILES = 5; + const std::uint64_t MAX_LOG_FILE_SIZE = (1024 * 1024 * 5); + +private: + event_level event_level_ = event_level::normal; + const std::string log_directory_; + const std::string log_path_; + bool logging_active_ = true; + std::mutex log_mutex_; + std::condition_variable log_notify_; + std::deque> event_queue_; + std::unique_ptr logging_thread_; + FILE *log_file_ = nullptr; + +private: + void check_log_roll(const size_t &count); + + void close_log_file(); + + void logging_thread(const bool &drain = false); + + void process_event(const event &event); + + void reopen_log_file(); +}; +} // namespace repertory + +#endif // INCLUDE_EVENTS_CONSUMERS_LOGGING_CONSUMER_HPP_ diff --git a/include/events/event.hpp b/include/events/event.hpp new file mode 100644 index 00000000..6e3fe947 --- /dev/null +++ b/include/events/event.hpp @@ -0,0 +1,63 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_EVENTS_EVENT_HPP_ +#define INCLUDE_EVENTS_EVENT_HPP_ + +#include "common.hpp" + +namespace repertory { +enum class event_level { error, warn, normal, debug, verbose }; + +event_level event_level_from_string(std::string level); + +std::string event_level_to_string(const event_level &level); + +class event { +protected: + explicit event(const bool &allow_async) : allow_async_(allow_async) {} + + event(const std::stringstream &ss, json j, const bool &allow_async) + : allow_async_(allow_async), ss_(ss.str()), j_(std::move(j)) {} + +public: + virtual ~event() = default; + +private: + const bool allow_async_; + +protected: + std::stringstream ss_; + json j_; + +public: + virtual std::shared_ptr clone() const = 0; + + bool get_allow_async() const { return allow_async_; } + + virtual event_level get_event_level() const = 0; + + json get_json() const { return j_; } + + virtual std::string get_name() const = 0; + + virtual std::string get_single_line() const = 0; +}; +} // namespace repertory + +#endif // INCLUDE_EVENTS_EVENT_HPP_ diff --git a/include/events/event_system.hpp b/include/events/event_system.hpp new file mode 100644 index 00000000..595ef2ff --- /dev/null +++ b/include/events/event_system.hpp @@ -0,0 +1,243 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_EVENTS_EVENT_SYSTEM_HPP_ +#define INCLUDE_EVENTS_EVENT_SYSTEM_HPP_ + +#include "common.hpp" +#include "events/event.hpp" +#include "events/t_event_system.hpp" +#include "utils/string_utils.hpp" + +namespace repertory { +typedef t_event_system event_system; +typedef event_system::event_consumer event_consumer; + +#define E_CAST(t) ((std::string)t) +#define E_DOUBLE(d) utils::string::from_double(d) +#define E_DOUBLE_PRECISE(d) \ + ([](const double &d) -> std::string { \ + std::stringstream ss; \ + ss << std::fixed << std::setprecision(2) << d; \ + return ss.str(); \ + })(d) +#define E_FROM_BOOL(t) utils::string::from_bool(t) +#define E_FROM_EXCEPTION(e) std::string(e.what() ? e.what() : "") +#define E_FROM_INT32(t) utils::string::from_int32(t) +#define E_FROM_INT64(t) utils::string::from_int64(t) +#define E_FROM_UINT16(t) utils::string::from_uint16(t) +#define E_FROM_STRING_ARRAY(a) \ + ([](const auto &array) -> std::string { \ + std::stringstream ret; \ + for (const auto &item : array) { \ + ret << (std::string(item) + " "); \ + } \ + return std::string(ret).TrimRight(); \ + })(a) + +#define E_PERCENT(d) \ + ([](const double &d) -> std::string { \ + std::stringstream ss; \ + ss << std::fixed << std::setprecision(2) << d; \ + ss << "%"; \ + return ss; \ + })(d) +#define E_STRING(t) t +#define E_FROM_UINT8(t) utils::string::from_uint8(t) +#define E_FROM_UINT32(t) utils::string::from_uint32(t) +#define E_FROM_UINT64(t) utils::string::from_uint64(t) +#define E_FROM_SIZE_T(t) std::to_string(t) +#define E_FROM_API_FILE_ERROR(e) api_error_to_string(e) + +#define E_PROP(type, name, short_name, ts) \ +private: \ + void init_##short_name(const type &tv) { \ + ss_ << "|" << #short_name << "|" << ts(tv); \ + j_[#name] = ts(tv); \ + } \ + \ +public: \ + json get_##name() const { return j_[#name]; } + +#define E_BEGIN(name, el) \ + class name final : public virtual event { \ + private: \ + name(const std::stringstream &ss, const json &j, const bool &allow_async) \ + : event(ss, j, allow_async) {} \ + \ + public: \ + ~name() override = default; \ + \ + public: \ + static const event_level level = event_level::el; \ + \ + public: \ + std::string get_name() const override { return #name; } \ + \ + event_level get_event_level() const override { return name::level; } \ + \ + std::string get_single_line() const override { \ + const auto s = ss_.str(); \ + return get_name() + (s.empty() ? "" : s); \ + } \ + \ + std::shared_ptr clone() const override { \ + return std::shared_ptr(new name(ss_, j_, get_allow_async())); \ + } +#define E_END() } + +#define E_SIMPLE(event_name, el, allow_async) \ + E_BEGIN(event_name, el) \ +public: \ + event_name() : event(allow_async) {} \ + E_END() + +#define E_SIMPLE1(event_name, el, allow_async, type, name, short_name, tc) \ + E_BEGIN(event_name, el) \ + explicit event_name(const type &tv) : event(allow_async) { init_##short_name(tv); } \ + E_PROP(type, name, short_name, tc) \ + E_END() + +#define E_SIMPLE2(event_name, el, allow_async, type, name, short_name, tc, type2, name2, \ + short_name2, tc2) \ + E_BEGIN(event_name, el) \ + explicit event_name(const type &tv, const type2 &tv2) : event(allow_async) { \ + init_##short_name(tv); \ + init_##short_name2(tv2); \ + } \ + E_PROP(type, name, short_name, tc) \ + E_PROP(type2, name2, short_name2, tc2) \ + E_END() + +#define E_SIMPLE3(event_name, el, allow_async, type, name, short_name, tc, type2, name2, \ + short_name2, tc2, type3, name3, short_name3, tc3) \ + E_BEGIN(event_name, el) \ + explicit event_name(const type &tv, const type2 &tv2, const type3 &tv3) : event(allow_async) { \ + init_##short_name(tv); \ + init_##short_name2(tv2); \ + init_##short_name3(tv3); \ + } \ + E_PROP(type, name, short_name, tc) \ + E_PROP(type2, name2, short_name2, tc2) \ + E_PROP(type3, name3, short_name3, tc3) \ + E_END() + +#define E_SIMPLE4(event_name, el, allow_async, type, name, short_name, tc, type2, name2, \ + short_name2, tc2, type3, name3, short_name3, tc3, type4, name4, short_name4, \ + tc4) \ + E_BEGIN(event_name, el) \ + explicit event_name(const type &tv, const type2 &tv2, const type3 &tv3, const type4 &tv4) \ + : event(allow_async) { \ + init_##short_name(tv); \ + init_##short_name2(tv2); \ + init_##short_name3(tv3); \ + init_##short_name4(tv4); \ + } \ + E_PROP(type, name, short_name, tc) \ + E_PROP(type2, name2, short_name2, tc2) \ + E_PROP(type3, name3, short_name3, tc3) \ + E_PROP(type4, name4, short_name4, tc4) \ + E_END() + +#define E_SIMPLE5(event_name, el, allow_async, type, name, short_name, tc, type2, name2, \ + short_name2, tc2, type3, name3, short_name3, tc3, type4, name4, short_name4, \ + tc4, type5, name5, short_name5, tc5) \ + E_BEGIN(event_name, el) \ + explicit event_name(const type &tv, const type2 &tv2, const type3 &tv3, const type4 &tv4, \ + const type5 &tv5) \ + : event(allow_async) { \ + init_##short_name(tv); \ + init_##short_name2(tv2); \ + init_##short_name3(tv3); \ + init_##short_name4(tv4); \ + init_##short_name5(tv5); \ + } \ + E_PROP(type, name, short_name, tc) \ + E_PROP(type2, name2, short_name2, tc2) \ + E_PROP(type3, name3, short_name3, tc3) \ + E_PROP(type4, name4, short_name4, tc4) \ + E_PROP(type5, name5, short_name5, tc5) \ + E_END() + +#define E_SIMPLE6(event_name, el, allow_async, type, name, short_name, tc, type2, name2, \ + short_name2, tc2, type3, name3, short_name3, tc3, type4, name4, short_name4, \ + tc4, type5, name5, short_name5, tc5, type6, name6, short_name6, tc6) \ + E_BEGIN(event_name, el) \ + explicit event_name(const type &tv, const type2 &tv2, const type3 &tv3, const type4 &tv4, \ + const type5 &tv5, const type6 &tv6) \ + : event(allow_async) { \ + init_##short_name(tv); \ + init_##short_name2(tv2); \ + init_##short_name3(tv3); \ + init_##short_name4(tv4); \ + init_##short_name5(tv5); \ + init_##short_name6(tv6); \ + } \ + E_PROP(type, name, short_name, tc) \ + E_PROP(type2, name2, short_name2, tc2) \ + E_PROP(type3, name3, short_name3, tc3) \ + E_PROP(type4, name4, short_name4, tc4) \ + E_PROP(type5, name5, short_name5, tc5) \ + E_PROP(type6, name6, short_name6, tc6) \ + E_END() + +#define E_SIMPLE7(event_name, el, allow_async, type, name, short_name, tc, type2, name2, \ + short_name2, tc2, type3, name3, short_name3, tc3, type4, name4, short_name4, \ + tc4, type5, name5, short_name5, tc5, type6, name6, short_name6, tc6, type7, \ + name7, short_name7, tc7) \ + E_BEGIN(event_name, el) \ + explicit event_name(const type &tv, const type2 &tv2, const type3 &tv3, const type4 &tv4, \ + const type5 &tv5, const type6 &tv6, const type7 &tv7) \ + : event(allow_async) { \ + init_##short_name(tv); \ + init_##short_name2(tv2); \ + init_##short_name3(tv3); \ + init_##short_name4(tv4); \ + init_##short_name5(tv5); \ + init_##short_name6(tv6); \ + init_##short_name7(tv7); \ + } \ + E_PROP(type, name, short_name, tc) \ + E_PROP(type2, name2, short_name2, tc2) \ + E_PROP(type3, name3, short_name3, tc3) \ + E_PROP(type4, name4, short_name4, tc4) \ + E_PROP(type5, name5, short_name5, tc5) \ + E_PROP(type6, name6, short_name6, tc6) \ + E_PROP(type7, name7, short_name7, tc7) \ + E_END() + +#define E_CONSUMER() \ +private: \ + std::vector> event_consumers_ + +#define E_CONSUMER_RELEASE() event_consumers_.clear() + +#define E_SUBSCRIBE(name, callback) \ + event_consumers_.emplace_back( \ + std::make_shared(#name, [this](const event &e) { callback(e); })) + +#define E_SUBSCRIBE_EXACT(name, callback) \ + event_consumers_.emplace_back(std::make_shared( \ + #name, [this](const event &e) { callback(dynamic_cast(e)); })) + +#define E_SUBSCRIBE_ALL(callback) \ + event_consumers_.emplace_back( \ + std::make_shared([this](const event &e) { callback(e); })) +} // namespace repertory + +#endif // INCLUDE_EVENTS_EVENT_SYSTEM_HPP_ diff --git a/include/events/events.hpp b/include/events/events.hpp new file mode 100644 index 00000000..12561ba8 --- /dev/null +++ b/include/events/events.hpp @@ -0,0 +1,417 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_EVENTS_EVENTS_HPP_ +#define INCLUDE_EVENTS_EVENTS_HPP_ + +#include "common.hpp" +#include "events/event_system.hpp" +#include "types/repertory.hpp" +#include "utils/utils.hpp" + +namespace repertory { +// clang-format off +E_SIMPLE3(cache_file_processed, normal, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING, + api_error, result, res, E_FROM_API_FILE_ERROR +); + +E_SIMPLE2(comm_auth_begin, normal, true, + std::string, url, url, E_STRING, + std::string, user, user, E_STRING +); + +E_SIMPLE4(comm_auth_end, normal, true, + std::string, url, url, E_STRING, + std::string, user, user, E_STRING, + CURLcode, curl, curl, E_FROM_INT32, + int, http, http, E_FROM_INT32 +); + +E_SIMPLE2(comm_auth_logout_begin, normal, true, + std::string, url, url, E_STRING, + std::string, user, user, E_STRING +); + +E_SIMPLE4(comm_auth_logout_end, normal, true, + std::string, url, url, E_STRING, + std::string, user, user, E_STRING, + CURLcode, curl, curl, E_FROM_INT32, + int, http, http, E_FROM_INT32 +); + +E_SIMPLE1(comm_get_begin, verbose, true, + std::string, url, url, E_STRING +); + +E_SIMPLE4(comm_get_end, verbose, true, + std::string, url, url, E_STRING, + CURLcode, curl, curl, E_FROM_INT32, + int, http, http, E_FROM_INT32, + std::string, result, res, E_STRING +); + +E_SIMPLE1(comm_get_range_begin, verbose, true, + std::string, url, url, E_STRING +); + +E_SIMPLE4(comm_get_range_end, verbose, true, + std::string, url, url, E_STRING, + CURLcode, curl, curl, E_FROM_INT32, + int, http, http, E_FROM_INT32, + std::string, error, err, E_STRING +); + +E_SIMPLE1(comm_get_raw_begin, verbose, true, + std::string, url, url, E_STRING +); + +E_SIMPLE4(comm_get_raw_end, verbose, true, + std::string, url, url, E_STRING, + CURLcode, curl, curl, E_FROM_INT32, + int, http, http, E_FROM_INT32, + std::string, error, err, E_STRING +); + +E_SIMPLE2(comm_post_begin, verbose, true, + std::string, url, url, E_STRING, + std::string, fields, fields, E_STRING +); + +E_SIMPLE4(comm_post_end, verbose, true, + std::string, url, url, E_STRING, + CURLcode, curl, curl, E_FROM_INT32, + int, http, http, E_FROM_INT32, + std::string, result, res, E_STRING +); + +E_SIMPLE2(comm_duration, normal, true, + std::string, url, url, E_STRING, + std::string, duration, duration, E_STRING +); + +E_SIMPLE1(comm_post_file_begin, debug, true, + std::string, url, url, E_STRING +); + +E_SIMPLE4(comm_post_file_end, debug, true, + std::string, url, url, E_STRING, + CURLcode, curl, curl, E_FROM_INT32, + int, http, http, E_FROM_INT32, + std::string, error, err, E_STRING +); + +E_SIMPLE1(comm_post_multi_part_file_begin, debug, true, + std::string, url, url, E_STRING +); + +E_SIMPLE4(comm_post_multi_part_file_end, debug, true, + std::string, url, url, E_STRING, + CURLcode, curl, curl, E_FROM_INT32, + int, http, http, E_FROM_INT32, + std::string, error, err, E_STRING +); + +E_SIMPLE4(comm_tus_upload_begin, debug, true, + std::string, file_name, fn, E_STRING, + std::string, url, url, E_STRING, + std::uint64_t, remain, rem, E_FROM_UINT64, + std::uint64_t, offset, off, E_FROM_UINT64 +); + +E_SIMPLE6(comm_tus_upload_end, debug, true, + std::string, file_name, fn, E_STRING, + std::string, url, url, E_STRING, + std::uint64_t, remain, rem, E_FROM_UINT64, + std::uint64_t, offset, OFF, E_FROM_UINT64, + CURLcode, curl, curl, E_FROM_INT32, + int, http, http, E_FROM_INT32 +); + +E_SIMPLE2(comm_tus_upload_create_begin, debug, true, + std::string, file_name, fn, E_STRING, + std::string, url, url, E_STRING +); + +E_SIMPLE4(comm_tus_upload_create_end, debug, true, + std::string, file_name, fn, E_STRING, + std::string, url, url, E_STRING, + CURLcode, curl, curl, E_FROM_INT32, + int, http, http, E_FROM_INT32 +); + +E_SIMPLE3(debug_log, debug, true, + std::string, function, func, E_STRING, + std::string, api_path, ap, E_STRING, + std::string, data, data, E_STRING +); + +E_SIMPLE1(directory_removed, normal, true, + std::string, api_path, ap, E_STRING +); + +E_SIMPLE2(directory_remove_failed, error, true, + std::string, api_path, ap, E_STRING, + std::string, error, err, E_STRING +); + +E_SIMPLE2(drive_mount_failed, error, true, + std::string, location, loc, E_STRING, + std::string, result, res, E_STRING +); + +E_SIMPLE1(drive_mounted, normal, true, + std::string, location, loc, E_STRING +); + +E_SIMPLE1(drive_mount_result, normal, true, + std::string, result, res, E_STRING +); + +E_SIMPLE1(drive_unmount_pending, normal, true, + std::string, location, loc, E_STRING +); + +E_SIMPLE1(drive_unmounted, normal, true, + std::string, location, loc, E_STRING +); + +E_SIMPLE1(event_level_changed, normal, true, + std::string, new_event_level, level, E_STRING +); + +E_SIMPLE1(failed_upload_queued, error, true, + std::string, api_path, ap, E_STRING +); + +E_SIMPLE1(failed_upload_removed, warn, true, + std::string, api_path, ap, E_STRING +); + +E_SIMPLE1(failed_upload_retry, normal, true, + std::string, api_path, ap, E_STRING +); + +E_SIMPLE2(file_get_failed, error, true, + std::string, api_path, ap, E_STRING, + std::string, error, err, E_STRING +); + +E_SIMPLE1(file_get_api_list_failed, error, true, + std::string, error, err, E_STRING +); + +E_SIMPLE1(file_pinned, normal, true, + std::string, api_path, ap, E_STRING +); + +E_SIMPLE3(file_read_bytes_failed, error, true, + std::string, api_path, ap, E_STRING, + std::string, error, err, E_STRING, + std::size_t, retry, retry, E_FROM_SIZE_T +); + +E_SIMPLE1(file_removed, normal, true, + std::string, api_path, ap, E_STRING +); + +E_SIMPLE2(file_removed_externally, warn, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING +); + +E_SIMPLE2(file_remove_failed, error, true, + std::string, api_path, ap, E_STRING, + std::string, error, err, E_STRING +); + +E_SIMPLE3(file_rename_failed, error, true, + std::string, from_api_path, FROM, E_STRING, + std::string, to_api_path, TO, E_STRING, + std::string, error, err, E_STRING +); + +E_SIMPLE2(file_get_size_failed, error, true, + std::string, api_path, ap, E_STRING, + std::string, error, err, E_STRING +); + +E_SIMPLE3(filesystem_item_added, normal, true, + std::string, api_path, ap, E_STRING, + std::string, parent, parent, E_STRING, + bool, directory, dir, E_FROM_BOOL +); + +E_SIMPLE4(filesystem_item_closed, verbose, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING, + bool, directory, dir, E_FROM_BOOL, + bool, changed, changed, E_FROM_BOOL +); + +E_SIMPLE5(filesystem_item_handle_closed, verbose, true, + std::string, api_path, ap, E_STRING, + std::uint64_t, handle, handle, E_FROM_UINT64, + std::string, source, src, E_STRING, + bool, directory, dir, E_FROM_BOOL, + bool, changed, changed, E_FROM_BOOL +); + +E_SIMPLE2(filesystem_item_evicted, normal, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING +); + +E_SIMPLE2(filesystem_item_get_failed, error, true, + std::string, api_path, ap, E_STRING, + std::string, error, err, E_STRING +); + +E_SIMPLE3(filesystem_item_opened, verbose, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING, + bool, directory, dir, E_FROM_BOOL +); + +E_SIMPLE1(file_unpinned, normal, true, + std::string, api_path, ap, E_STRING +); + +E_SIMPLE2(file_upload_begin, normal, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING +); + +E_SIMPLE2(file_upload_completed, normal, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING +); + +E_SIMPLE3(file_upload_end, normal, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING, + api_error, result, res, E_FROM_API_FILE_ERROR +); + +E_SIMPLE3(file_upload_failed, error, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING, + std::string, error, err, E_STRING +); + +E_SIMPLE2(file_upload_not_found, warn, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING +); + +E_SIMPLE2(file_upload_queued, normal, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING +); + +E_SIMPLE2(file_upload_removed, debug, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING +); + +E_SIMPLE2(file_upload_retry, normal, true, + std::string, api_path, ap, E_STRING, + std::string, source, src, E_STRING +); + +E_SIMPLE(item_scan_begin, normal, true); + +E_SIMPLE(item_scan_end, normal, true); + +E_SIMPLE1(orphaned_file_deleted, warn, true, + std::string, source, src, E_STRING +); + +E_SIMPLE1(orphaned_file_detected, warn, true, + std::string, source, src, E_STRING +); + +E_SIMPLE2(orphaned_file_processed, warn, true, + std::string, source, src, E_STRING, + std::string, dest, dest, E_STRING +); + +E_SIMPLE3(orphaned_file_processing_failed, error, true, + std::string, source, src, E_STRING, + std::string, dest, dest, E_STRING, + std::string, result, res, E_STRING +); + +E_SIMPLE1(polling_item_begin, debug, true, + std::string, item_name, item, E_STRING +); + +E_SIMPLE1(polling_item_end, debug, true, + std::string, item_name, item, E_STRING +); + +E_SIMPLE2(provider_offline, error, true, + std::string, host_name_or_ip, host, E_STRING, + std::uint16_t, port, port, E_FROM_UINT16 +); + +E_SIMPLE2(repertory_exception, error, true, + std::string, function, func, E_STRING, + std::string, message, msg, E_STRING +); + +E_SIMPLE1(rpc_server_exception, error, true, + std::string, exception, exception, E_STRING +); + +E_SIMPLE1(service_shutdown, debug, true, + std::string, service, svc, E_STRING +); + +E_SIMPLE3(skynet_import_decryption_failed, error, true, + std::string, skylink, skylink, E_STRING, + std::string, sub_file, sf, E_STRING, + api_error, result, res, E_FROM_API_FILE_ERROR +); + +E_SIMPLE3(skynet_import_directory_failed, error, true, + std::string, skylink, skylink, E_STRING, + std::string, sub_directory, sd, E_STRING, + api_error, result, res, E_FROM_API_FILE_ERROR +); + +E_SIMPLE3(skynet_import_file_failed, error, true, + std::string, skylink, skylink, E_STRING, + std::string, sub_file, sf, E_STRING, + api_error, result, res, E_FROM_API_FILE_ERROR +); + +E_SIMPLE(skynet_portal_list_changed, normal, true); + +E_SIMPLE(unmount_requested, normal, true); +#ifndef _WIN32 +E_SIMPLE2(unmount_result, normal, true, + std::string, location, loc, E_STRING, + std::string, result, res, E_STRING +); +#endif +// clang-format on +} // namespace repertory + +#endif // INCLUDE_EVENTS_EVENTS_HPP_ diff --git a/include/events/t_event_system.hpp b/include/events/t_event_system.hpp new file mode 100644 index 00000000..981d6b4d --- /dev/null +++ b/include/events/t_event_system.hpp @@ -0,0 +1,178 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_EVENTS_T_EVENT_SYSTEM_HPP_ +#define INCLUDE_EVENTS_T_EVENT_SYSTEM_HPP_ + +#include "common.hpp" +#include "events/event.hpp" +#include "utils/utils.hpp" + +namespace repertory { +template class t_event_system final { +public: + t_event_system(const t_event_system &) = delete; + t_event_system(t_event_system &&) = delete; + t_event_system &operator=(const t_event_system &) = delete; + t_event_system &operator=(t_event_system &&) = delete; + +protected: + t_event_system() = default; + + ~t_event_system() { stop(); } + +public: + class event_consumer final { + public: + explicit event_consumer(std::function callback) + : callback_(std::move(callback)) { + t_event_system::instance().attach(this); + } + + event_consumer(const std::string &event_name, std::function callback) + : callback_(std::move(callback)) { + t_event_system::instance().attach(event_name, this); + } + + ~event_consumer() { t_event_system::instance().release(this); } + + private: + std::function callback_; + + public: + void notify_event(const event &event) { callback_(event); } + }; + +private: + static t_event_system event_system_; + +public: + static t_event_system &instance(); + +private: + std::unordered_map> event_consumers_; + std::recursive_mutex consumer_mutex_; + std::vector> event_list_; + std::condition_variable event_notify_; + std::mutex event_mutex_; + std::unique_ptr event_thread_; + std::mutex run_mutex_; + bool stop_requested_ = false; + +private: + void process_events() { + std::vector> events; + { + unique_mutex_lock l(event_mutex_); + if (not stop_requested_ && event_list_.empty()) { + event_notify_.wait_for(l, 5s); + } + + if (not event_list_.empty()) { + events.insert(events.end(), event_list_.begin(), event_list_.end()); + event_list_.clear(); + } + } + + const auto notify_events = [this](const std::string &name, const event_type &event) { + std::deque> futures; + recur_mutex_lock l(consumer_mutex_); + if (event_consumers_.find(name) != event_consumers_.end()) { + for (auto *ec : event_consumers_[name]) { + if (event.get_allow_async()) { + futures.emplace_back( + std::async(std::launch::async, [ec, &event]() { ec->notify_event(event); })); + } else { + ec->notify_event(event); + } + } + } + + while (not futures.empty()) { + futures.front().get(); + futures.pop_front(); + } + }; + + for (const auto &e : events) { + notify_events("", *e.get()); + notify_events(e->get_name(), *e.get()); + } + } + + void queue_event(event_type *e) { + mutex_lock l(event_mutex_); + event_list_.emplace_back(std::shared_ptr(e)); + event_notify_.notify_all(); + } + +public: + void attach(event_consumer *ec) { + recur_mutex_lock l(consumer_mutex_); + event_consumers_[""].push_back(ec); + } + + void attach(const std::string &event_name, event_consumer *ec) { + recur_mutex_lock l(consumer_mutex_); + event_consumers_[event_name].push_back(ec); + } + + template void raise(args &&...a) { + queue_event(new t(std::forward(a)...)); + } + + void release(event_consumer *ec) { + recur_mutex_lock l(consumer_mutex_); + auto it = + std::find_if(event_consumers_.begin(), event_consumers_.end(), [&](const auto &kv) -> bool { + return utils::collection_includes(kv.second, ec); + }); + + if (it != event_consumers_.end()) { + auto &q = (*it).second; + utils::remove_element_from(q, ec); + } + } + + void start() { + mutex_lock l(run_mutex_); + if (not event_thread_) { + stop_requested_ = false; + event_thread_ = std::make_unique([this]() { + while (not stop_requested_) { + process_events(); + } + }); + } + } + + void stop() { + mutex_lock l(run_mutex_); + if (event_thread_) { + stop_requested_ = true; + event_notify_.notify_all(); + event_thread_->join(); + event_thread_.reset(); + process_events(); + stop_requested_ = false; + } + } +}; +} // namespace repertory + +#endif // INCLUDE_EVENTS_T_EVENT_SYSTEM_HPP_ diff --git a/include/platform/platform.hpp b/include/platform/platform.hpp new file mode 100644 index 00000000..eadaa585 --- /dev/null +++ b/include/platform/platform.hpp @@ -0,0 +1,25 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_PLATFORM_PLATFORM_HPP_ +#define INCLUDE_PLATFORM_PLATFORM_HPP_ + +#include "platform/unix_platform.hpp" +#include "platform/win32_platform.hpp" + +#endif // INCLUDE_PLATFORM_PLATFORM_HPP_ diff --git a/include/platform/unix_platform.hpp b/include/platform/unix_platform.hpp new file mode 100644 index 00000000..2f921b23 --- /dev/null +++ b/include/platform/unix_platform.hpp @@ -0,0 +1,62 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_PLATFORM_UNIXPLATFORM_HPP_ +#define INCLUDE_PLATFORM_UNIXPLATFORM_HPP_ +#ifndef _WIN32 + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class lock_data final { +public: + explicit lock_data(const provider_type &pt, std::string unique_id /*= ""*/); + + lock_data(); + + ~lock_data(); + +private: + const provider_type pt_; + const std::string unique_id_; + const std::string mutex_id_; + int lock_fd_; + int lock_status_ = EWOULDBLOCK; + +private: + static std::string get_state_directory(); + + static std::string get_lock_data_file(); + + std::string get_lock_file(); + +private: + static int wait_for_lock(const int &fd, const std::uint8_t &retry_count = 30u); + +public: + bool get_mount_state(json &mount_state); + + lock_result grab_lock(const std::uint8_t &retry_count = 30u); + + bool set_mount_state(const bool &active, const std::string &mount_location, const int &pid); +}; +} // namespace repertory + +#endif // _WIN32 +#endif // INCLUDE_PLATFORM_UNIXPLATFORM_HPP_ diff --git a/include/platform/win32_platform.hpp b/include/platform/win32_platform.hpp new file mode 100644 index 00000000..cf1a5f7c --- /dev/null +++ b/include/platform/win32_platform.hpp @@ -0,0 +1,65 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_PLATFORM_WINPLATFORM_HPP_ +#define INCLUDE_PLATFORM_WINPLATFORM_HPP_ +#ifdef _WIN32 + +#include "common.hpp" +#include "app_config.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class lock_data final { +public: + explicit lock_data(const provider_type &pt, std::string unique_id /*= ""*/) + : pt_(pt), unique_id_(std::move(unique_id)), + mutex_id_("repertory_" + app_config::get_provider_name(pt) + "_" + unique_id_), + mutex_handle_(::CreateMutex(nullptr, FALSE, &mutex_id_[0u])) {} + + lock_data() + : pt_(provider_type::sia), unique_id_(""), mutex_id_(""), + mutex_handle_(INVALID_HANDLE_VALUE) {} + + ~lock_data() { release(); } + +private: + const provider_type pt_; + const std::string unique_id_; + const std::string mutex_id_; + HANDLE mutex_handle_; + DWORD mutex_state_ = WAIT_FAILED; + +public: + bool get_mount_state(const provider_type &pt, json &mount_state); + + bool get_mount_state(json &mount_state); + + std::string get_unique_id() const { return unique_id_; } + + lock_result grab_lock(const std::uint8_t &retryCount = 30); + + void release(); + + bool set_mount_state(const bool &active, const std::string &mountLocation, + const std::int64_t &pid); +}; +} // namespace repertory + +#endif // _WIN32 +#endif // INCLUDE_PLATFORM_WINPLATFORM_HPP_ diff --git a/include/providers/base_provider.hpp b/include/providers/base_provider.hpp new file mode 100644 index 00000000..243f1c17 --- /dev/null +++ b/include/providers/base_provider.hpp @@ -0,0 +1,123 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_PROVIDERS_BASE_PROVIDER_HPP_ +#define INCLUDE_PROVIDERS_BASE_PROVIDER_HPP_ + +#include "common.hpp" +#include "db/meta_db.hpp" +#include "providers/i_provider.hpp" + +namespace repertory { +class app_config; +class base_provider : public i_provider { +public: + explicit base_provider(app_config &config); + + ~base_provider() override = default; + +private: + app_config &config_; + +protected: + api_item_added_callback api_item_added_; + meta_db meta_db_; + mutable std::recursive_mutex notify_added_mutex_; + i_open_file_table *oft_ = nullptr; + +protected: + app_config &get_config() { return config_; } + + app_config &get_config() const { return config_; } + + virtual std::string format_api_path(std::string api_path) const { return api_path; } + + virtual std::string &restore_api_path(std::string &api_path) const { return api_path; } + + void notify_directory_added(const std::string &api_path, const std::string &api_parent) const { + const_cast(this)->notify_directory_added(api_path, api_parent); + } + + virtual void notify_directory_added(const std::string &api_path, const std::string &api_parent); + + api_error notify_file_added(const std::string &api_path, const std::string &api_parent, + const std::uint64_t &size) const { + return const_cast(this)->notify_file_added(api_path, api_parent, size); + } + + virtual api_error notify_file_added(const std::string &api_path, const std::string &api_parent, + const std::uint64_t &size) = 0; + + void remove_item_meta(const std::string &api_path) { + return meta_db_.remove_item_meta(format_api_path(api_path)); + } + + void update_filesystem_item(const bool &directory, const api_error &error, + const std::string &api_path, filesystem_item &fsi) const; + +public: + api_error create_directory_clone_source_meta(const std::string &source_api_path, + const std::string &api_path) override; + + api_error create_file(const std::string &api_path, api_meta_map &meta) override; + + api_error get_api_path_from_source(const std::string &source_path, + std::string &api_path) const override; + + api_error get_filesystem_item(const std::string &api_path, const bool &directory, + filesystem_item &fsi) const override; + + api_error get_filesystem_item_and_file(const std::string &api_path, api_file &file, + filesystem_item &fsi) const override; + + api_error get_filesystem_item_from_source_path(const std::string &source_path, + filesystem_item &fsi) const override; + + api_error get_item_meta(const std::string &api_path, api_meta_map &meta) const override; + + api_error get_item_meta(const std::string &api_path, const std::string &key, + std::string &value) const override; + + std::vector get_pinned_files() const override { return meta_db_.get_pinned_files(); } + + std::uint64_t get_used_drive_space() const override; + + bool is_file_writeable(const std::string &) const override { return true; } + + api_error remove_item_meta(const std::string &api_path, const std::string &key) override { + return meta_db_.remove_item_meta(format_api_path(api_path), key); + } + + api_error set_item_meta(const std::string &api_path, const std::string &key, + const std::string &value) override { + return meta_db_.set_item_meta(format_api_path(api_path), key, value); + } + + api_error set_item_meta(const std::string &api_path, const api_meta_map &meta) override { + return meta_db_.set_item_meta(format_api_path(api_path), meta); + } + + api_error set_source_path(const std::string &api_path, const std::string &source_path) override { + return meta_db_.set_source_path(format_api_path(api_path), source_path); + } + + bool start(api_item_added_callback api_item_added, i_open_file_table *oft) override; +}; +} // namespace repertory + +#endif // INCLUDE_PROVIDERS_BASE_PROVIDER_HPP_ diff --git a/include/providers/i_provider.hpp b/include/providers/i_provider.hpp new file mode 100644 index 00000000..30f4a29d --- /dev/null +++ b/include/providers/i_provider.hpp @@ -0,0 +1,115 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_PROVIDERS_I_PROVIDER_HPP_ +#define INCLUDE_PROVIDERS_I_PROVIDER_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class i_open_file_table; +class i_provider { + INTERFACE_SETUP(i_provider); + +public: + virtual api_error create_directory(const std::string &api_path, const api_meta_map &meta) = 0; + + virtual api_error create_directory_clone_source_meta(const std::string &source_api_path, + const std::string &api_path) = 0; + + virtual api_error create_file(const std::string &api_path, api_meta_map &meta) = 0; + + virtual api_error get_api_path_from_source(const std::string &source_path, + std::string &api_path) const = 0; + + virtual api_error get_file_list(api_file_list &list) const = 0; + + virtual std::uint64_t get_directory_item_count(const std::string &api_path) const = 0; + + virtual api_error get_directory_items(const std::string &api_path, + directory_item_list &list) const = 0; + + virtual api_error get_file(const std::string &api_path, api_file &file) const = 0; + + virtual api_error get_file_size(const std::string &api_path, std::uint64_t &file_size) const = 0; + + virtual api_error get_filesystem_item(const std::string &api_path, const bool &directory, + filesystem_item &fsi) const = 0; + + virtual api_error get_filesystem_item_and_file(const std::string &api_path, api_file &file, + filesystem_item &fsi) const = 0; + + virtual api_error get_filesystem_item_from_source_path(const std::string &source_path, + filesystem_item &fsi) const = 0; + + virtual std::vector get_pinned_files() const = 0; + + virtual api_error get_item_meta(const std::string &api_path, api_meta_map &meta) const = 0; + + virtual api_error get_item_meta(const std::string &api_path, const std::string &key, + std::string &value) const = 0; + + virtual std::uint64_t get_total_drive_space() const = 0; + + virtual std::uint64_t get_total_item_count() const = 0; + + virtual provider_type get_provider_type() const = 0; + + virtual std::uint64_t get_used_drive_space() const = 0; + + virtual bool is_directory(const std::string &api_path) const = 0; + + virtual bool is_file(const std::string &api_path) const = 0; + + virtual bool is_file_writeable(const std::string &api_path) const = 0; + + virtual bool is_online() const = 0; + + virtual bool is_rename_supported() const = 0; + + virtual api_error read_file_bytes(const std::string &api_path, const std::size_t &size, + const std::uint64_t &offset, std::vector &data, + const bool &stop_requested) = 0; + + virtual api_error remove_directory(const std::string &api_path) = 0; + + virtual api_error remove_file(const std::string &api_path) = 0; + + virtual api_error remove_item_meta(const std::string &api_path, const std::string &key) = 0; + + virtual api_error rename_file(const std::string &fromApiPath, const std::string &toApiPath) = 0; + + virtual api_error set_item_meta(const std::string &api_path, const std::string &key, + const std::string &value) = 0; + + virtual api_error set_item_meta(const std::string &api_path, const api_meta_map &meta) = 0; + + virtual api_error set_source_path(const std::string &api_path, + const std::string &source_path) = 0; + + virtual bool start(api_item_added_callback api_item_added, i_open_file_table *oft) = 0; + + virtual void stop() = 0; + + virtual api_error upload_file(const std::string &api_path, const std::string &source_path, + const std::string &encryption_token) = 0; +}; +} // namespace repertory + +#endif // INCLUDE_PROVIDERS_I_PROVIDER_HPP_ diff --git a/include/providers/passthrough/passthroughprovider.hpp b/include/providers/passthrough/passthroughprovider.hpp new file mode 100644 index 00000000..8594f06f --- /dev/null +++ b/include/providers/passthrough/passthroughprovider.hpp @@ -0,0 +1,115 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_PROVIDERS_PASSTHROUGH_PASSTHROUGHPROVIDER_HPP_ +#define INCLUDE_PROVIDERS_PASSTHROUGH_PASSTHROUGHPROVIDER_HPP_ +#if defined(REPERTORY_TESTING_NEW) + +#include "common.hpp" +#include "providers/basebase_provider.hpp" + +namespace repertory { +class app_config; +class CPassthroughProvider final : public base_provider { +public: + explicit CPassthroughProvider(app_config &config) + : base_provider(config), passthroughLocation_("" /*config.GetPassthroughConfig().Location*/) { + } + ~CPassthroughProvider() override = default; + +private: + const std::string passthroughLocation_; + +private: + std::string ConstructFullPath(const std::string &api_path) const; + +protected: + api_error notify_file_added(const std::string &api_path, const std::string &api_parent, + const std::uint64_t &size) override; + +public: + api_error CreateDirectory(const std::string &api_path, const api_meta_map &metaMap) override; + + api_error get_file_list(ApiFileList &fileList) const override; + + std::uint64_t get_directory_item_count(const std::string &api_path) const override; + + api_error get_directory_items(const std::string &api_path, + directory_item_list &list) const override; + + api_error GetFile(const std::string &api_path, ApiFile &file) const override; + + api_error GetFileSize(const std::string &api_path, std::uint64_t &fileSize) const override; + + api_error get_filesystem_item(const std::string &api_path, const bool &directory, + FileSystemItem &fileSystemItem) const override; + + api_error get_filesystem_item_from_source_path(const std::string &sourceFilePath, + FileSystemItem &fileSystemItem) const override; + + api_error get_item_meta(const std::string &api_path, api_meta_map &meta) const override; + + api_error get_item_meta(const std::string &api_path, const std::string &key, + std::string &value) const override; + + provider_type get_provider_type() const override { return provider_type::passthrough; } + + std::uint64_t get_total_drive_space() const override; + + std::uint64_t get_total_item_count() const override; + + std::uint64_t get_used_drive_space() const override; + + bool IsDirectory(const std::string &api_path) const override; + + bool IsFile(const std::string &api_path) const override; + + bool IsOnline() const override { return true; } + + bool is_rename_supported() const override { return true; } + + api_error read_file_bytes(const std::string &apiFilepath, const std::size_t &size, + const std::uint64_t &offset, std::vector &data, + const bool &stop_requested) override; + + api_error RemoveDirectory(const std::string &api_path) override; + + api_error RemoveFile(const std::string &api_path) override; + + api_error RenameFile(const std::string &fromApiPath, const std::string &toApiPath) override; + + api_error remove_item_meta(const std::string &api_path, const std::string &key) override; + + api_error set_item_meta(const std::string &api_path, const std::string &key, + const std::string &value) override; + + api_error set_item_meta(const std::string &api_path, const api_meta_map &meta) override; + + api_error set_source_path(const std::string &api_path, const std::string &sourcePath) override; + + bool Start(api_item_added_callback apiItemAdded, i_open_file_table *openFileTable) override; + + void Stop() override; + + api_error upload_file(const std::string &api_path, const std::string &sourcePath, + const std::string &encryptionToken) override; +}; +} // namespace repertory + +#endif // REPERTORY_TESTING_NEW +#endif // INCLUDE_PROVIDERS_PASSTHROUGH_PASSTHROUGHPROVIDER_HPP_ diff --git a/include/providers/provider.hpp b/include/providers/provider.hpp new file mode 100644 index 00000000..cd3b7f51 --- /dev/null +++ b/include/providers/provider.hpp @@ -0,0 +1,31 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_PROVIDERS_PROVIDER_HPP_ +#define INCLUDE_PROVIDERS_PROVIDER_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class app_config; +class i_provider; +std::unique_ptr create_provider(const provider_type &pt, app_config &config); +} // namespace repertory + +#endif // INCLUDE_PROVIDERS_PROVIDER_HPP_ diff --git a/include/providers/s3/s3_provider.hpp b/include/providers/s3/s3_provider.hpp new file mode 100644 index 00000000..ea5dfd1d --- /dev/null +++ b/include/providers/s3/s3_provider.hpp @@ -0,0 +1,114 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_PROVIDERS_S3_S3_PROVIDER_HPP_ +#define INCLUDE_PROVIDERS_S3_S3_PROVIDER_HPP_ +#if defined(REPERTORY_ENABLE_S3) + +#include "common.hpp" +#include "db/directory_db.hpp" +#include "providers/base_provider.hpp" +#include "upload/upload_manager.hpp" + +namespace repertory { +class app_config; +class i_s3_comm; +class s3_provider final : public base_provider { +public: + s3_provider(app_config &config, i_s3_comm &s3_comm); + +private: + i_s3_comm &s3_comm_; + directory_db directory_db_; + upload_manager upload_manager_; + std::uint64_t total_item_count_ = 0u; + +private: + void build_directories(); + + void update_item_meta(directory_item &di, const bool &format_path) const; + + void upload_completed(const std::string &, const std::string &, const json &) {} + + api_error upload_handler(const upload_manager::upload &upload, json &, json &); + +protected: + std::string format_api_path(std::string api_path) const override; + + void notify_directory_added(const std::string &api_path, const std::string &api_parent) override; + + api_error notify_file_added(const std::string &api_path, const std::string &api_parent, + const std::uint64_t &size) override; + + std::string &restore_api_path(std::string &api_path) const override; + +public: + api_error create_directory(const std::string &api_path, const api_meta_map &meta) override; + + api_error create_file(const std::string &api_path, api_meta_map &meta) override; + + api_error get_file_list(api_file_list &list) const override; + + std::uint64_t get_directory_item_count(const std::string &api_path) const override; + + api_error get_directory_items(const std::string &api_path, + directory_item_list &list) const override; + + api_error get_file(const std::string &api_path, api_file &file) const override; + + api_error get_file_size(const std::string &api_path, std::uint64_t &file_size) const override; + + provider_type get_provider_type() const override { return provider_type::s3; } + + std::uint64_t get_total_drive_space() const override { + return std::numeric_limits::max() / std::int64_t(2); + } + + std::uint64_t get_total_item_count() const override { return total_item_count_; } + + bool is_directory(const std::string &api_path) const override; + + bool is_file(const std::string &api_path) const override; + + bool is_online() const override; + + bool is_processing(const std::string &api_path) const; + + bool is_rename_supported() const override { return false; } + + api_error read_file_bytes(const std::string &api_path, const std::size_t &size, + const std::uint64_t &offset, std::vector &data, + const bool &stop_requested) override; + + api_error remove_directory(const std::string &api_path) override; + + api_error remove_file(const std::string &api_path) override; + + api_error rename_file(const std::string &from_api_path, const std::string &to_api_path) override; + + bool start(api_item_added_callback api_item_added, i_open_file_table *oft) override; + + void stop() override; + + api_error upload_file(const std::string &api_path, const std::string &source_path, + const std::string &encryption_token) override; +}; +} // namespace repertory + +#endif // REPERTORY_ENABLE_S3 +#endif // INCLUDE_PROVIDERS_S3_S3_PROVIDER_HPP_ diff --git a/include/providers/sia/sia_provider.hpp b/include/providers/sia/sia_provider.hpp new file mode 100644 index 00000000..d06355e1 --- /dev/null +++ b/include/providers/sia/sia_provider.hpp @@ -0,0 +1,136 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_PROVIDERS_SIA_SIAPROVIDER_HPP_ +#define INCLUDE_PROVIDERS_SIA_SIAPROVIDER_HPP_ + +#include "common.hpp" +#include "providers/base_provider.hpp" + +namespace repertory { +class app_config; +class i_comm; +class sia_provider : public base_provider { +public: + sia_provider(app_config &config, i_comm &comm); + + ~sia_provider() override = default; + +private: + i_comm &comm_; + std::uint64_t total_drive_space_ = 0u; + bool stop_requested_ = false; + std::mutex start_stop_mutex_; + std::condition_variable start_stop_notify_; + std::unique_ptr drive_space_thread_; + +private: + api_item_added_callback &get_api_item_added() { return api_item_added_; } + + i_comm &get_comm() { return comm_; } + + i_comm &get_comm() const { return comm_; } // TODO Fix non-const reference return + +private: + void calculate_total_drive_space(); + + api_error calculate_used_drive_space(std::uint64_t &used_space); + + void drive_space_thread(); + + bool processed_orphaned_file(const std::string &source_path, + const std::string &api_path = "") const; + + void remove_deleted_files(); + + void remove_expired_orphaned_files(); + + void remove_unknown_source_files(); + +protected: + api_error check_file_exists(const std::string &api_path) const; + + bool check_directory_found(const json &error) const; + + bool check_not_found(const json &error) const; + + virtual void cleanup(); + + void create_api_file(const json &json_file, const std::string &path_name, api_file &file) const; + + api_error get_directory(const std::string &api_path, json &result, json &error) const; + + api_error notify_file_added(const std::string &api_path, const std::string &api_parent, + const std::uint64_t &size) override; + + void set_api_file_dates(const json &file, api_file &apiFile) const; + +public: + api_error create_directory(const std::string &api_path, const api_meta_map &meta) override; + + std::uint64_t get_directory_item_count(const std::string &api_path) const override; + + api_error get_directory_items(const std::string &api_path, + directory_item_list &list) const override; + + api_error get_file(const std::string &api_path, api_file &file) const override; + + api_error get_file_list(api_file_list &list) const override; + + api_error get_file_size(const std::string &api_path, std::uint64_t &file_size) const override; + + api_error get_filesystem_item(const std::string &api_path, const bool &directory, + filesystem_item &fsi) const override; + + api_error get_filesystem_item_and_file(const std::string &api_path, api_file &apiFile, + filesystem_item &fsi) const override; + + provider_type get_provider_type() const override { return provider_type::sia; } + + std::uint64_t get_total_drive_space() const override { return total_drive_space_; } + + std::uint64_t get_total_item_count() const override; + + bool is_directory(const std::string &api_path) const override; + + bool is_file(const std::string &api_path) const override; + + bool is_online() const override; + + bool is_rename_supported() const override { return true; } + + api_error read_file_bytes(const std::string &api_path, const std::size_t &size, + const std::uint64_t &offset, std::vector &buffer, + const bool &stop_requested) override; + + api_error remove_directory(const std::string &api_path) override; + + api_error remove_file(const std::string &api_path) override; + + api_error rename_file(const std::string &from_api_path, const std::string &to_api_path) override; + + bool start(api_item_added_callback api_item_added, i_open_file_table *oft) override; + + void stop() override; + + api_error upload_file(const std::string &api_path, const std::string &source_path, + const std::string &) override; +}; +} // namespace repertory + +#endif // INCLUDE_PROVIDERS_SIA_SIAPROVIDER_HPP_ diff --git a/include/providers/skynet/skynet_provider.hpp b/include/providers/skynet/skynet_provider.hpp new file mode 100644 index 00000000..eec041cc --- /dev/null +++ b/include/providers/skynet/skynet_provider.hpp @@ -0,0 +1,139 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_PROVIDERS_SKYNET_SKYNET_PROVIDER_HPP_ +#define INCLUDE_PROVIDERS_SKYNET_SKYNET_PROVIDER_HPP_ +#if defined(REPERTORY_ENABLE_SKYNET) + +#include "common.hpp" +#include "db/directory_db.hpp" +#include "db/meta_db.hpp" +#include "events/event_system.hpp" +#include "providers/base_provider.hpp" +#include "upload/upload_manager.hpp" + +namespace repertory { +class app_config; +class i_comm; +class skynet_provider final : public base_provider { + E_CONSUMER(); + +public: + skynet_provider(app_config &config, i_comm &comm); + + ~skynet_provider() override { E_CONSUMER_RELEASE(); } + +private: + i_comm &comm_; + directory_db directory_db_; + upload_manager upload_manager_; + bool stop_requested_ = false; + std::atomic next_download_index_; + std::atomic next_upload_index_; + std::shared_ptr> download_list_; + std::shared_ptr> upload_list_; + mutable std::mutex portal_mutex_; + +private: + std::size_t get_retry_count() const; + + void populate_api_file(api_file &file) const; + + void process_export(json &result, const std::string &api_path) const; + + void upload_completed(const std::string &api_path, const std::string &, const json &data); + + api_error upload_handler(const upload_manager::upload &upload, json &data, json &error); + +protected: + void notify_directory_added(const std::string &api_path, const std::string &api_parent) override; + + api_error notify_file_added(const std::string &, const std::string &, + const std::uint64_t &) override; + +public: + api_error create_directory(const std::string &api_path, const api_meta_map &meta) override; + + api_error create_file(const std::string &api_path, api_meta_map &meta) override; + + json export_all() const; + + json export_list(const std::vector &api_path_list) const; + + std::uint64_t get_directory_item_count(const std::string &api_path) const override; + + api_error get_directory_items(const std::string &api_path, + directory_item_list &list) const override; + + api_error get_file(const std::string &api_path, api_file &file) const override; + + api_error get_file_list(api_file_list &list) const override; + + api_error get_file_size(const std::string &api_path, std::uint64_t &file_size) const override; + + host_config get_host_config(const bool &upload); + + provider_type get_provider_type() const override { return provider_type::skynet; } + + api_error get_skynet_metadata(const std::string &skylink, json &json_meta); + + std::uint64_t get_total_drive_space() const override { + return std::numeric_limits::max() / std::int64_t(2); + } + + std::uint64_t get_total_item_count() const override { + return directory_db_.get_total_item_count(); + } + + api_error import_skylink(const skylink_import &si); + + bool is_directory(const std::string &api_path) const override; + + bool is_file(const std::string &api_path) const override; + + bool is_file_writeable(const std::string &api_path) const override; + + bool is_online() const override { return true; } + + bool is_processing(const std::string &api_path) const; + + bool is_rename_supported() const override { return true; } + + api_error read_file_bytes(const std::string &api_path, const std::size_t &size, + const std::uint64_t &offset, std::vector &data, + const bool &stop_requested) override; + + api_error remove_directory(const std::string &api_path) override; + + api_error remove_file(const std::string &api_path) override; + + api_error rename_file(const std::string &from_api_path, const std::string &to_api_path) override; + + bool start(api_item_added_callback api_item_added, i_open_file_table *oft) override; + + void stop() override; + + bool update_portal_list(); + + api_error upload_file(const std::string &api_path, const std::string &source_path, + const std::string &encryption_token) override; +}; +} // namespace repertory + +#endif // REPERTORY_ENABLE_SKYNET +#endif // INCLUDE_PROVIDERS_SKYNET_SKYNET_PROVIDER_HPP_ diff --git a/include/rpc/client/client.hpp b/include/rpc/client/client.hpp new file mode 100644 index 00000000..18d5484e --- /dev/null +++ b/include/rpc/client/client.hpp @@ -0,0 +1,70 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_RPC_CLIENT_CLIENT_HPP_ +#define INCLUDE_RPC_CLIENT_CLIENT_HPP_ + +#include "common.hpp" +#include "types/rpc.hpp" +#include "types/skynet.hpp" + +namespace repertory { +class client { +public: + explicit client(rpc_host_info host_info); + +private: + const rpc_host_info host_info_; + std::atomic request_id_; + +private: + rpc_response make_request(const std::string &command, const std::vector &args, + std::uint32_t timeout_ms = 10000u); + +public: + rpc_response export_list(const std::vector &paths); + + rpc_response export_all(); + + rpc_response get_drive_information(); + + rpc_response get_config(); + + rpc_response get_config_value_by_name(const std::string &name); + + rpc_response get_directory_items(const std::string &api_path); + + rpc_response get_open_files(); + + rpc_response get_pinned_files(); + + rpc_response import_skylink(const skylink_import_list &list); + + rpc_response pin_file(const std::string &api_file); + + rpc_response pinned_status(const std::string &api_file); + + rpc_response set_config_value_by_name(const std::string &name, const std::string &value); + + rpc_response unmount(); + + rpc_response unpin_file(const std::string &api_file); +}; +} // namespace repertory + +#endif // INCLUDE_RPC_CLIENT_CLIENT_HPP_ diff --git a/include/rpc/server/full_server.hpp b/include/rpc/server/full_server.hpp new file mode 100644 index 00000000..5c1b72c2 --- /dev/null +++ b/include/rpc/server/full_server.hpp @@ -0,0 +1,44 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_RPC_SERVER_FULL_SERVER_HPP_ +#define INCLUDE_RPC_SERVER_FULL_SERVER_HPP_ + +#include "common.hpp" +#include "rpc/server/server.hpp" + +namespace repertory { +class i_open_file_table; +class i_provider; +class full_server final : public server { +public: + explicit full_server(app_config &config, i_provider &provider, i_open_file_table &oft); + + ~full_server() override = default; + +private: + i_provider &provider_; + i_open_file_table &oft_; + +protected: + bool handle_request(jsonrpcpp::request_ptr &request, + std::unique_ptr &response) override; +}; +} // namespace repertory + +#endif // INCLUDE_RPC_SERVER_FULL_SERVER_HPP_ diff --git a/include/rpc/server/server.hpp b/include/rpc/server/server.hpp new file mode 100644 index 00000000..57a6ddd6 --- /dev/null +++ b/include/rpc/server/server.hpp @@ -0,0 +1,99 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_RPC_SERVER_SERVER_HPP_ +#define INCLUDE_RPC_SERVER_SERVER_HPP_ + +#include "common.hpp" +#include "types/rpc.hpp" + +namespace repertory { +class app_config; +class server { + typedef std::map query_map; + +private: + class json_response final : public httpserver::http_response { + public: + json_response() = default; + + explicit json_response(const json &content, + int response_code = httpserver::http::http_utils::http_ok, + const std::string &content_type = "application/json") + : http_response(response_code, content_type), content(content.dump(0)) {} + + json_response(const json_response &other) = default; + json_response(json_response &&other) noexcept = default; + + json_response &operator=(const json_response &b) = default; + json_response &operator=(json_response &&b) = default; + + ~json_response() override = default; + + MHD_Response *get_raw_response() override { + const auto size = content.length(); + return MHD_create_response_from_buffer(size, (void *)content.c_str(), MHD_RESPMEM_PERSISTENT); + } + + private: + std::string content = ""; + }; + + class rpc_resource final : public httpserver::http_resource { + public: + explicit rpc_resource(server &owner); + + private: + server &owner_; + + public: + const std::shared_ptr + render(const httpserver::http_request &request) override; + }; + +public: + explicit server(app_config &config); + + virtual ~server() { stop(); } + +private: + app_config &config_; + rpc_resource resource_; + std::unique_ptr ws_; + std::mutex start_stop_mutex_; + bool started_ = false; + +private: + bool check_authorization(const httpserver::http_request &request); + +protected: + app_config &get_config() { return config_; } + + const app_config &get_config() const { return config_; } + + virtual bool handle_request(jsonrpcpp::request_ptr &request, + std::unique_ptr &response); + +public: + void start(); + + void stop(); +}; +} // namespace repertory + +#endif // INCLUDE_RPC_SERVER_SERVER_HPP_ diff --git a/include/types/remote.hpp b/include/types/remote.hpp new file mode 100644 index 00000000..558dcf65 --- /dev/null +++ b/include/types/remote.hpp @@ -0,0 +1,147 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_TYPES_REMOTE_HPP_ +#define INCLUDE_TYPES_REMOTE_HPP_ + +#include "common.hpp" + +#define PACKET_SERVICE_FUSE std::uint32_t(1) +#define PACKET_SERVICE_WINFSP std::uint32_t(2) + +#ifdef _WIN32 +#define PACKET_SERVICE_FLAGS PACKET_SERVICE_WINFSP +#else +#define PACKET_SERVICE_FLAGS PACKET_SERVICE_FUSE +#endif + +namespace repertory::remote { +typedef std::uint64_t block_count; +typedef std::uint32_t block_size; +typedef std::uint64_t file_handle; +typedef std::uint16_t file_mode; +typedef std::uint16_t file_nlink; +typedef std::uint64_t file_offset; +typedef std::uint64_t file_size; +typedef std::uint64_t file_time; +typedef std::uint32_t group_id; +typedef std::uint32_t user_id; + +enum class open_flags : std::uint32_t { + read_only = 0u, + write_only = 1u, + read_write = 2u, + create = 4u, + excl = 8u, + no_ctty = 16u, + truncate = 32u, + append = 64u, + non_blocking = 128u, + sync = 256u, + async = 512u, + directory = 1024u, + no_follow = 2048u, + clo_exec = 4096u, + direct = 8192u, + no_atime = 16384u, + path = 32768u, + temp_file = 65536u, + dsync = 131072u, +}; + +static open_flags operator|(const open_flags &a, const open_flags &b) { + using t = std::underlying_type_t; + return static_cast(static_cast(a) | static_cast(b)); +} + +static open_flags &operator|=(open_flags &a, const open_flags &b) { + a = a | b; + return a; +} + +static open_flags operator&(const open_flags &a, const open_flags &b) { + using t = std::underlying_type_t; + return static_cast(static_cast(a) & static_cast(b)); +} + +#pragma pack(1) +struct file_info { + UINT32 FileAttributes; + UINT32 ReparseTag; + UINT64 AllocationSize; + UINT64 FileSize; + UINT64 CreationTime; + UINT64 LastAccessTime; + UINT64 LastWriteTime; + UINT64 ChangeTime; + UINT64 IndexNumber; + UINT32 HardLinks; + UINT32 EaSize; +}; + +struct setattr_x { + std::int32_t valid; + file_mode mode; + user_id uid; + group_id gid; + file_size size; + file_time acctime; + file_time modtime; + file_time crtime; + file_time chgtime; + file_time bkuptime; + std::uint32_t flags; +}; + +struct stat { + file_mode st_mode; + file_nlink st_nlink; + user_id st_uid; + group_id st_gid; + file_time st_atimespec; + file_time st_mtimespec; + file_time st_ctimespec; + file_time st_birthtimespec; + file_size st_size; + block_count st_blocks; + block_size st_blksize; + std::uint32_t st_flags; +}; + +struct statfs { + std::uint64_t f_bavail; + std::uint64_t f_bfree; + std::uint64_t f_blocks; + std::uint64_t f_favail; + std::uint64_t f_ffree; + std::uint64_t f_files; +}; + +struct statfs_x : public statfs { + char f_mntfromname[1024]; +}; +#pragma pack() + +#ifndef _WIN32 +open_flags create_open_flags(const std::uint32_t &flags); + +std::uint32_t create_os_open_flags(const open_flags &flags); +#endif +} // namespace repertory::remote + +#endif // INCLUDE_TYPES_REMOTE_HPP_ diff --git a/include/types/repertory.hpp b/include/types/repertory.hpp new file mode 100644 index 00000000..fee7c187 --- /dev/null +++ b/include/types/repertory.hpp @@ -0,0 +1,310 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_TYPES_REPERTORY_HPP_ +#define INCLUDE_TYPES_REPERTORY_HPP_ + +#include "common.hpp" + +namespace repertory { +#define META_ACCESSED "accessed" +#define META_ATTRIBUTES "attributes" +#define META_BACKUP "backup" +#define META_CHANGED "changed" +#define META_CREATION "creation" +#define META_ENCRYPTION_TOKEN "token2" +#define META_GID "gid" +#define META_ID "id" +#define META_KEY "key" +#define META_MODE "mode" +#define META_MODIFIED "modified" +#define META_OSXFLAGS "flags" +#define META_PINNED "pinned" +#define META_SIZE "size" +#define META_SOURCE "source" +#define META_UID "uid" +#define META_WRITTEN "written" + +const std::vector META_USED_NAMES = { + META_ACCESSED, META_ATTRIBUTES, META_BACKUP, META_CHANGED, META_CREATION, META_ENCRYPTION_TOKEN, + META_GID, META_ID, META_KEY, META_MODE, META_MODIFIED, META_OSXFLAGS, + META_PINNED, META_SIZE, META_SOURCE, META_UID, META_WRITTEN, +}; + +typedef std::unordered_map api_meta_map; + +enum class api_error { + success = 0, + access_denied, + bad_address, + buffer_overflow, + buffer_too_small, + comm_error, + decryption_error, + directory_end_of_files, + directory_exists, + directory_not_empty, + directory_not_found, + download_failed, + download_incomplete, + download_stopped, + download_timeout, + empty_ring_buffer_chunk_size, + empty_ring_buffer_size, + error, + file_exists, + file_in_use, + incompatible_version, + invalid_handle, + invalid_operation, + invalid_ring_buffer_multiple, + invalid_ring_buffer_size, + invalid_version, + item_is_file, + item_not_found, + not_implemented, + not_supported, + os_error, + permission_denied, + upload_failed, + upload_stopped, + xattr_buffer_small, + xattr_exists, + xattr_invalid_namespace, + xattr_not_found, + xattr_osx_invalid, + xattr_too_big, + ERROR_COUNT +}; + +const std::string &api_error_to_string(const api_error &error); + +enum class download_type { direct, fallback, ring_buffer }; + +enum class exit_code { + success, + communication_error = -1, + file_creation_failed = -2, + incompatible_version = -3, + invalid_syntax = -4, + lock_failed = -5, + mount_active = -6, + mount_result = -7, + not_mounted = -8, + startup_exception = -9, + failed_to_get_mount_state = -10, + export_failed = -11, + import_failed = -12, + option_not_found = -13, + invalid_provider_type = -14, + set_option_not_found = -15, + pin_failed = -16, + unpin_failed = -17, +}; + +enum class lock_result { + success, + locked, + failure, +}; + +enum class provider_type { + sia, + remote, + s3, + skynet, + passthrough, + unknown, +}; + +#ifdef _WIN32 +struct open_file_data { + void *directory_buffer = nullptr; +}; +#else +typedef int open_file_data; +#endif + +struct api_file { + std::string api_path{}; + std::string api_parent{}; + std::uint64_t accessed_date = 0u; + std::uint64_t changed_date = 0u; + std::uint64_t created_date = 0u; + std::string encryption_token{}; + std::uint64_t file_size = 0u; + std::uint64_t modified_date = 0u; + bool recoverable = false; + double redundancy = 0.0; + std::string source_path{}; +}; + +struct directory_item { + std::string api_path{}; + std::string api_parent{}; + bool directory = false; + std::uint64_t size = 0u; + api_meta_map meta{}; + bool resolved = false; + + static directory_item from_json(const json &item) { + directory_item ret{}; + ret.api_path = item["path"].get(); + ret.api_parent = item["parent"].get(); + ret.directory = item["directory"].get(); + ret.size = item["size"].get(); + ret.meta = item["meta"].get>(); + return ret; + } + + json to_json() const { + return {{"path", api_path}, + {"parent", api_parent}, + {"size", size}, + {"directory", directory}, + {"meta", meta}}; + } +}; + +struct filesystem_item { + std::string api_path{}; + std::string api_parent{}; + bool changed = false; + bool directory = false; + std::string encryption_token{}; + OSHandle handle = REPERTORY_INVALID_HANDLE; + std::shared_ptr lock; + bool meta_changed = false; + std::unordered_map open_data; + std::uint64_t size = 0u; + std::string source_path{}; + bool source_path_changed = false; + + bool is_encrypted() const { return not encryption_token.empty(); } +}; + +struct host_config { + std::string agent_string{}; + std::string api_password{}; + std::uint16_t api_port = 0u; + std::string host_name_or_ip = "localhost"; + std::string path{}; + std::string protocol = "http"; + std::uint32_t timeout_ms = 60000u; + std::string auth_url{}; + std::string auth_user{}; + std::string auth_password{}; + + bool operator==(const host_config &hc) const noexcept { + if (&hc != this) { + return agent_string == hc.agent_string && api_password == hc.api_password && + api_port == hc.api_port && host_name_or_ip == hc.host_name_or_ip && path == hc.path && + protocol == hc.protocol && timeout_ms == hc.timeout_ms && auth_url == hc.auth_url && + auth_user == hc.auth_user && auth_password == hc.auth_password; + } + return true; + } + + bool operator!=(const host_config &hc) const noexcept { + if (&hc != this) { + return not(hc == *this); + } + return false; + } +}; + +static void to_json(json &j, const host_config &hc) { + j = json{{"AgentString", hc.agent_string}, + {"ApiPassword", hc.api_password}, + {"ApiPort", hc.api_port}, + {"AuthPassword", hc.auth_password}, + {"AuthURL", hc.auth_url}, + {"AuthUser", hc.auth_user}, + {"HostNameOrIp", hc.host_name_or_ip}, + {"Path", hc.path}, + {"Protocol", hc.protocol}, + {"TimeoutMs", hc.timeout_ms}}; +} + +static void from_json(const json &j, host_config &hc) { + j.at("AgentString").get_to(hc.agent_string); + j.at("ApiPassword").get_to(hc.api_password); + j.at("ApiPort").get_to(hc.api_port); + j.at("AuthPassword").get_to(hc.auth_password); + j.at("AuthURL").get_to(hc.auth_url); + j.at("AuthUser").get_to(hc.auth_user); + j.at("HostNameOrIp").get_to(hc.host_name_or_ip); + j.at("Path").get_to(hc.path); + j.at("Protocol").get_to(hc.protocol); + j.at("TimeoutMs").get_to(hc.timeout_ms); +} + +struct http_range { + std::uint64_t begin = 0u; + std::uint64_t end = 0u; +}; + +#if 0 +struct PassthroughConfig { + std::string Location{}; + std::string Name{}; +}; +#endif + +struct s3_config { + std::string access_key{}; + std::string bucket{}; + std::uint16_t cache_timeout_secs = 60u; + std::string encryption_token{}; + std::string region = "any"; + std::string secret_key{}; + std::uint32_t timeout_ms = 60000u; + std::string url; +}; + +typedef ttmath::Big<1, 30> api_currency; + +typedef std::vector api_file_list; +typedef std::vector directory_item_list; +typedef ttmath::UInt<64> hastings; +typedef std::unordered_map http_headers; +typedef std::unordered_map http_parameters; +typedef std::vector http_ranges; + +typedef std::lock_guard mutex_lock; +typedef std::lock_guard recur_mutex_lock; +typedef std::unique_lock unique_mutex_lock; +typedef std::unique_lock unique_recur_mutex_lock; + +typedef std::function api_file_provider_callback; + +typedef std::function + api_item_added_callback; + +typedef std::function &data, + const bool &stop_requested)> + api_reader_callback; + +typedef std::function meta_provider_callback; +} // namespace repertory + +#endif // INCLUDE_TYPES_REPERTORY_HPP_ diff --git a/include/types/rpc.hpp b/include/types/rpc.hpp new file mode 100644 index 00000000..073bb73e --- /dev/null +++ b/include/types/rpc.hpp @@ -0,0 +1,56 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_TYPES_RPC_HPP_ +#define INCLUDE_TYPES_RPC_HPP_ + +#include "common.hpp" + +namespace repertory { +struct rpc_host_info { + std::string host; + std::string password; + std::uint16_t port; + std::string user; +}; + +enum class rpc_response_type { success, config_value_not_found, curl_error, http_error }; + +struct rpc_response { + rpc_response_type response_type; + json data; +}; + +namespace rpc_method { +const std::string export_links = "export"; +const std::string get_config = "get_config"; +const std::string get_config_value_by_name = "get_config_value_by_name"; +const std::string set_config_value_by_name = "set_config_value_by_name"; +const std::string get_directory_items = "get_directory_items"; +const std::string get_drive_information = "get_drive_information"; +const std::string get_open_files = "get_open_files"; +const std::string get_pinned_files = "get_pinned_files"; +const std::string import = "import"; +const std::string unmount = "unmount"; +const std::string pin_file = "pin_file"; +const std::string pinned_status = "pinned_status"; +const std::string unpin_file = "unpin_file"; +} // namespace rpc_method +} // namespace repertory + +#endif // INCLUDE_TYPES_RPC_HPP_ diff --git a/include/types/skynet.hpp b/include/types/skynet.hpp new file mode 100644 index 00000000..ce43734e --- /dev/null +++ b/include/types/skynet.hpp @@ -0,0 +1,60 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_TYPES_SKYNET_HPP_ +#define INCLUDE_TYPES_SKYNET_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +static const std::array DEFAULT_SKYNET_URLS = { + "siasky.net", + "https://account.siasky.net", +}; + +struct skynet_config { + std::string encryption_token; + std::vector portal_list = { + {"", "", 443, DEFAULT_SKYNET_URLS[0u], "", "https", 60000, DEFAULT_SKYNET_URLS[1u], "", ""}, + }; + + static std::vector from_string(const std::string &list); + + std::string to_string() const { return to_string(portal_list); } + + static std::string to_string(const std::vector &list); +}; + +struct skylink_import { + std::string directory; + std::string file_name; // Ignored - informational only + std::string skylink; + std::string token; + + static skylink_import from_json(const json &j); + + static skylink_import from_string(const std::string &str); + + json to_json() const; +}; + +typedef std::vector skylink_import_list; +} // namespace repertory + +#endif // INCLUDE_TYPES_SKYNET_HPP_ diff --git a/include/types/startup_exception.hpp b/include/types/startup_exception.hpp new file mode 100644 index 00000000..4633ff1d --- /dev/null +++ b/include/types/startup_exception.hpp @@ -0,0 +1,31 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_TYPES_STARTUP_EXCEPTION_HPP_ +#define INCLUDE_TYPES_STARTUP_EXCEPTION_HPP_ + +#include "common.hpp" + +namespace repertory { +class startup_exception : public virtual std::runtime_error { +public: + explicit startup_exception(const std::string &msg) : std::runtime_error(msg) {} +}; +} // namespace repertory + +#endif // INCLUDE_TYPES_STARTUP_EXCEPTION_HPP_ diff --git a/include/upload/upload_manager.hpp b/include/upload/upload_manager.hpp new file mode 100644 index 00000000..01baa86c --- /dev/null +++ b/include/upload/upload_manager.hpp @@ -0,0 +1,97 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_UPLOAD_UPLOAD_MANAGER_HPP_ +#define INCLUDE_UPLOAD_UPLOAD_MANAGER_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory { +class app_config; +class upload_manager final { +public: + struct upload { + std::string api_path; + bool cancel = false; + std::string encryption_token; + std::string source_path; + std::unique_ptr thread; + bool completed = true; + bool retry = false; + + void wait() { + while (not completed) { + std::this_thread::sleep_for(1ms); + } + } + }; + + typedef std::function api_file_exists_callback; + typedef std::function get_host_config_callback; + typedef std::function + upload_completed_callback; + typedef std::function + upload_handler_callback; + +public: + upload_manager(const app_config &config, api_file_exists_callback api_file_exists, + upload_handler_callback upload_handler, + upload_completed_callback upload_completed); + + ~upload_manager(); + +private: + const app_config &config_; + const api_file_exists_callback api_file_exists_; + upload_handler_callback upload_handler_; + const upload_completed_callback upload_completed_; + std::unique_ptr upload_db_; + std::unordered_map> upload_lookup_; + std::deque upload_queue_; + std::deque active_uploads_; + const std::string ROCKS_DB_NAME = "upload_db"; + bool stop_requested_ = false; + mutable std::mutex upload_mutex_; + std::condition_variable upload_notify_; + std::unique_ptr upload_thread_; + +private: + void upload_thread(); + +public: + bool execute_if_not_processing(const std::vector &api_paths, + const std::function &action) const; + + std::size_t get_count() const { return upload_lookup_.size(); } + + bool is_processing(const std::string &api_path) const; + + api_error queue_upload(const std::string &api_path, const std::string &source_path, + const std::string &encryption_token); + + api_error remove_upload(const std::string &api_path); + + void start(); + + void stop(); +}; +} // namespace repertory + +#endif // INCLUDE_UPLOAD_UPLOAD_MANAGER_HPP_ diff --git a/include/utils/Base64.hpp b/include/utils/Base64.hpp new file mode 100644 index 00000000..490db0e4 --- /dev/null +++ b/include/utils/Base64.hpp @@ -0,0 +1,123 @@ +#ifndef _MACARON_BASE64_H_ +#define _MACARON_BASE64_H_ + +/** + * The MIT License (MIT) + * Copyright (c) 2016 tomykaira + * + * 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. + */ + +#include +#include + +namespace macaron { +namespace Base64 { +static std::string Encode(const char *data, const size_t &len) { + static constexpr char sEncodingTable[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; + + size_t in_len = len; + std::string ret; + if (in_len > 0) { + size_t out_len = 4 * ((in_len + 2) / 3); + ret = std::string(out_len, '\0'); + size_t i; + char *p = const_cast(ret.c_str()); + + for (i = 0; i < in_len - 2; i += 3) { + *p++ = sEncodingTable[(data[i] >> 2) & 0x3F]; + *p++ = sEncodingTable[((data[i] & 0x3) << 4) | ((int)(data[i + 1] & 0xF0) >> 4)]; + *p++ = sEncodingTable[((data[i + 1] & 0xF) << 2) | ((int)(data[i + 2] & 0xC0) >> 6)]; + *p++ = sEncodingTable[data[i + 2] & 0x3F]; + } + if (i < in_len) { + *p++ = sEncodingTable[(data[i] >> 2) & 0x3F]; + if (i == (in_len - 1)) { + *p++ = sEncodingTable[((data[i] & 0x3) << 4)]; + *p++ = '='; + } else { + *p++ = sEncodingTable[((data[i] & 0x3) << 4) | ((int)(data[i + 1] & 0xF0) >> 4)]; + *p++ = sEncodingTable[((data[i + 1] & 0xF) << 2)]; + } + *p++ = '='; + } + } + + return ret; +} + +static std::string Encode(const std::string &data) { return Encode(&data[0], data.size()); } + +static std::vector Decode(const std::string &input) { + static constexpr unsigned char kDecodingTable[] = { + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, + 64, 64, 64, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, 64, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 64, 64, 64, 64, 64, 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}; + + std::vector out; + if (not input.empty()) { + size_t in_len = input.size(); + if (in_len % 4 != 0) + throw std::runtime_error("Input data size is not a multiple of 4"); + + size_t out_len = in_len / 4 * 3; + if (input[in_len - 1] == '=') + out_len--; + if (input[in_len - 2] == '=') + out_len--; + + out.resize(out_len); + + for (size_t i = 0, j = 0; i < in_len;) { + uint32_t a = input[i] == '=' ? 0 & i++ : kDecodingTable[static_cast(input[i++])]; + uint32_t b = input[i] == '=' ? 0 & i++ : kDecodingTable[static_cast(input[i++])]; + uint32_t c = input[i] == '=' ? 0 & i++ : kDecodingTable[static_cast(input[i++])]; + uint32_t d = input[i] == '=' ? 0 & i++ : kDecodingTable[static_cast(input[i++])]; + + uint32_t triple = (a << 3 * 6) + (b << 2 * 6) + (c << 1 * 6) + (d << 0 * 6); + + if (j < out_len) + out[j++] = (triple >> 2 * 8) & 0xFF; + if (j < out_len) + out[j++] = (triple >> 1 * 8) & 0xFF; + if (j < out_len) + out[j++] = (triple >> 0 * 8) & 0xFF; + } + } + + return out; +} +} // namespace Base64 +} // namespace macaron + +#endif /* _MACARON_BASE64_H_ */ diff --git a/include/utils/cli_utils.hpp b/include/utils/cli_utils.hpp new file mode 100644 index 00000000..c53d3f3e --- /dev/null +++ b/include/utils/cli_utils.hpp @@ -0,0 +1,119 @@ +/* + Copyright <2018-2022> + + 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. +*/ +#ifndef INCLUDE_UTILS_CLI_UTILS_HPP_ +#define INCLUDE_UTILS_CLI_UTILS_HPP_ + +#include "common.hpp" +#include "types/repertory.hpp" + +namespace repertory::utils::cli { +typedef std::array option; + +namespace options { +static const option check_version_option = {"-cv", "--check_version"}; +static const option display_config_option = {"-dc", "--display_config"}; +static const option data_directory_option = {"-dd", "--data_directory"}; +static const option drive_information_option = {"-di", "--drive_information"}; +static const option export_option = {"-ex", "--export"}; +static const option export_all_option = {"-ea", "--export_all"}; +#if defined(REPERTORY_ENABLE_S3) +static const option s3_option = {"-s3", "--s3"}; +static const option name_option = {"-na", "--name"}; +#endif // defined(REPERTORY_ENABLE_S3) +static const option generate_config_option = {"-gc", "--generate_config"}; +static const option get_option = {"-get", "--get"}; +static const option get_directory_items_option = {"-gdi", "--get_directory_items"}; +static const option get_pinned_files_option = {"-gpf", "--get_pinned_files"}; +static const option help_option = {"-h", "--help"}; +static const option hidden_option = {"-hidden", "--hidden"}; +static const option import_option = {"-im", "--import"}; +static const option import_json_option = {"-ij", "--import_json"}; +static const option open_files_option = {"-of", "--open_files"}; +static const option pin_file_option = {"-pf", "--pin_file"}; +static const option pinned_status_option = {"-ps", "--pinned_status"}; +static const option password_option = {"-pw", "--password"}; +#if defined(REPERTORY_ENABLE_SKYNET) +static const option skynet_option = {"-sk", "--skynet"}; +static const option test_skynet_auth_option = {"-tsa", "--test_skynet_auth"}; +#endif // defined(REPERTORY_ENABLE_SKYNET) +static const option remote_mount_option = {"-rm", "--remote_mount"}; +static const option set_option = {"-set", "--set"}; +static const option status_option = {"-status", "--status"}; +static const option unmount_option = {"-unmount", "--unmount"}; +static const option unpin_file_option = {"-uf", "--unpin_file"}; +static const option user_option = {"-us", "--user"}; +static const option version_option = {"-V", "--version"}; + +static const std::vector

    06o#}h!39+L~*xP2VxDrN5(ATd4RESJlv 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 literal 0 HcmV?d00001 diff --git a/bin/curl/mk-ca-bundle.pl b/bin/curl/mk-ca-bundle.pl new file mode 100644 index 00000000..33977f32 --- /dev/null +++ b/bin/curl/mk-ca-bundle.pl @@ -0,0 +1,558 @@ +#!/usr/bin/env perl +# *************************************************************************** +# * _ _ ____ _ +# * Project ___| | | | _ \| | +# * / __| | | | |_) | | +# * | (__| |_| | _ <| |___ +# * \___|\___/|_| \_\_____| +# * +# * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. +# * +# * This software is licensed as described in the file COPYING, which +# * you should have received as part of this distribution. The terms +# * are also available at https://curl.haxx.se/docs/copyright.html. +# * +# * You may opt to use, copy, modify, merge, publish, distribute and/or sell +# * copies of the Software, and permit persons to whom the Software is +# * furnished to do so, under the terms of the COPYING file. +# * +# * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# * KIND, either express or implied. +# * +# *************************************************************************** +# This Perl script creates a fresh ca-bundle.crt file for use with libcurl. +# It downloads certdata.txt from Mozilla's source tree (see URL below), +# then parses certdata.txt and extracts CA Root Certificates into PEM format. +# These are then processed with the OpenSSL commandline tool to produce the +# final ca-bundle.crt file. +# The script is based on the parse-certs script written by Roland Krikava. +# This Perl script works on almost any platform since its only external +# dependency is the OpenSSL commandline tool for optional text listing. +# Hacked by Guenter Knauf. +# +use Encode; +use Getopt::Std; +use MIME::Base64; +use strict; +use warnings; +use vars qw($opt_b $opt_d $opt_f $opt_h $opt_i $opt_k $opt_l $opt_m $opt_n $opt_p $opt_q $opt_s $opt_t $opt_u $opt_v $opt_w); +use List::Util; +use Text::Wrap; +my $MOD_SHA = "Digest::SHA"; +eval "require $MOD_SHA"; +if ($@) { + $MOD_SHA = "Digest::SHA::PurePerl"; + eval "require $MOD_SHA"; +} +eval "require LWP::UserAgent"; + +my %urls = ( + 'nss' => + 'https://hg.mozilla.org/projects/nss/raw-file/default/lib/ckfw/builtins/certdata.txt', + 'central' => + 'https://hg.mozilla.org/mozilla-central/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt', + 'beta' => + 'https://hg.mozilla.org/releases/mozilla-beta/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt', + 'release' => + 'https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt', +); + +$opt_d = 'release'; + +# If the OpenSSL commandline is not in search path you can configure it here! +my $openssl = 'openssl'; + +my $version = '1.27'; + +$opt_w = 76; # default base64 encoded lines length + +# default cert types to include in the output (default is to include CAs which may issue SSL server certs) +my $default_mozilla_trust_purposes = "SERVER_AUTH"; +my $default_mozilla_trust_levels = "TRUSTED_DELEGATOR"; +$opt_p = $default_mozilla_trust_purposes . ":" . $default_mozilla_trust_levels; + +my @valid_mozilla_trust_purposes = ( + "DIGITAL_SIGNATURE", + "NON_REPUDIATION", + "KEY_ENCIPHERMENT", + "DATA_ENCIPHERMENT", + "KEY_AGREEMENT", + "KEY_CERT_SIGN", + "CRL_SIGN", + "SERVER_AUTH", + "CLIENT_AUTH", + "CODE_SIGNING", + "EMAIL_PROTECTION", + "IPSEC_END_SYSTEM", + "IPSEC_TUNNEL", + "IPSEC_USER", + "TIME_STAMPING", + "STEP_UP_APPROVED" +); + +my @valid_mozilla_trust_levels = ( + "TRUSTED_DELEGATOR", # CAs + "NOT_TRUSTED", # Don't trust these certs. + "MUST_VERIFY_TRUST", # This explicitly tells us that it ISN'T a CA but is otherwise ok. In other words, this should tell the app to ignore any other sources that claim this is a CA. + "TRUSTED" # This cert is trusted, but only for itself and not for delegates (i.e. it is not a CA). +); + +my $default_signature_algorithms = $opt_s = "MD5"; + +my @valid_signature_algorithms = ( + "MD5", + "SHA1", + "SHA256", + "SHA384", + "SHA512" +); + +$0 =~ s@.*(/|\\)@@; +$Getopt::Std::STANDARD_HELP_VERSION = 1; +getopts('bd:fhiklmnp:qs:tuvw:'); + +if(!defined($opt_d)) { + # to make plain "-d" use not cause warnings, and actually still work + $opt_d = 'release'; +} + +# Use predefined URL or else custom URL specified on command line. +my $url; +if(defined($urls{$opt_d})) { + $url = $urls{$opt_d}; + if(!$opt_k && $url !~ /^https:\/\//i) { + die "The URL for '$opt_d' is not HTTPS. Use -k to override (insecure).\n"; + } +} +else { + $url = $opt_d; +} + +my $curl = `curl -V`; + +if ($opt_i) { + print ("=" x 78 . "\n"); + print "Script Version : $version\n"; + print "Perl Version : $]\n"; + print "Operating System Name : $^O\n"; + print "Getopt::Std.pm Version : ${Getopt::Std::VERSION}\n"; + print "Encode::Encoding.pm Version : ${Encode::Encoding::VERSION}\n"; + print "MIME::Base64.pm Version : ${MIME::Base64::VERSION}\n"; + print "LWP::UserAgent.pm Version : ${LWP::UserAgent::VERSION}\n" if($LWP::UserAgent::VERSION); + print "LWP.pm Version : ${LWP::VERSION}\n" if($LWP::VERSION); + print "Digest::SHA.pm Version : ${Digest::SHA::VERSION}\n" if ($Digest::SHA::VERSION); + print "Digest::SHA::PurePerl.pm Version : ${Digest::SHA::PurePerl::VERSION}\n" if ($Digest::SHA::PurePerl::VERSION); + print ("=" x 78 . "\n"); +} + +sub warning_message() { + if ( $opt_d =~ m/^risk$/i ) { # Long Form Warning and Exit + print "Warning: Use of this script may pose some risk:\n"; + print "\n"; + print " 1) If you use HTTP URLs they are subject to a man in the middle attack\n"; + print " 2) Default to 'release', but more recent updates may be found in other trees\n"; + print " 3) certdata.txt file format may change, lag time to update this script\n"; + print " 4) Generally unwise to blindly trust CAs without manual review & verification\n"; + print " 5) Mozilla apps use additional security checks aren't represented in certdata\n"; + print " 6) Use of this script will make a security engineer grind his teeth and\n"; + print " swear at you. ;)\n"; + exit; + } else { # Short Form Warning + print "Warning: Use of this script may pose some risk, -d risk for more details.\n"; + } +} + +sub HELP_MESSAGE() { + print "Usage:\t${0} [-b] [-d] [-f] [-i] [-k] [-l] [-n] [-p] [-q] [-s] [-t] [-u] [-v] [-w] []\n"; + print "\t-b\tbackup an existing version of ca-bundle.crt\n"; + print "\t-d\tspecify Mozilla tree to pull certdata.txt or custom URL\n"; + print "\t\t Valid names are:\n"; + print "\t\t ", join( ", ", map { ( $_ =~ m/$opt_d/ ) ? "$_ (default)" : "$_" } sort keys %urls ), "\n"; + print "\t-f\tforce rebuild even if certdata.txt is current\n"; + print "\t-i\tprint version info about used modules\n"; + print "\t-k\tallow URLs other than HTTPS, enable HTTP fallback (insecure)\n"; + print "\t-l\tprint license info about certdata.txt\n"; + print "\t-m\tinclude meta data in output\n"; + print "\t-n\tno download of certdata.txt (to use existing)\n"; + print wrap("\t","\t\t", "-p\tlist of Mozilla trust purposes and levels for certificates to include in output. Takes the form of a comma separated list of purposes, a colon, and a comma separated list of levels. (default: $default_mozilla_trust_purposes:$default_mozilla_trust_levels)"), "\n"; + print "\t\t Valid purposes are:\n"; + print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_mozilla_trust_purposes ) ), "\n"; + print "\t\t Valid levels are:\n"; + print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_mozilla_trust_levels ) ), "\n"; + print "\t-q\tbe really quiet (no progress output at all)\n"; + print wrap("\t","\t\t", "-s\tcomma separated list of certificate signatures/hashes to output in plain text mode. (default: $default_signature_algorithms)\n"); + print "\t\t Valid signature algorithms are:\n"; + print wrap("\t\t ","\t\t ", join( ", ", "ALL", @valid_signature_algorithms ) ), "\n"; + print "\t-t\tinclude plain text listing of certificates\n"; + print "\t-u\tunlink (remove) certdata.txt after processing\n"; + print "\t-v\tbe verbose and print out processed CAs\n"; + print "\t-w \twrap base64 output lines after chars (default: ${opt_w})\n"; + exit; +} + +sub VERSION_MESSAGE() { + print "${0} version ${version} running Perl ${]} on ${^O}\n"; +} + +warning_message() unless ($opt_q || $url =~ m/^(ht|f)tps:/i ); +HELP_MESSAGE() if ($opt_h); + +sub report($@) { + my $output = shift; + + print STDERR $output . "\n" unless $opt_q; +} + +sub is_in_list($@) { + my $target = shift; + + return defined(List::Util::first { $target eq $_ } @_); +} + +# Parses $param_string as a case insensitive comma separated list with optional whitespace +# validates that only allowed parameters are supplied +sub parse_csv_param($$@) { + my $description = shift; + my $param_string = shift; + my @valid_values = @_; + + my @values = map { + s/^\s+//; # strip leading spaces + s/\s+$//; # strip trailing spaces + uc $_ # return the modified string as upper case + } split( ',', $param_string ); + + # Find all values which are not in the list of valid values or "ALL" + my @invalid = grep { !is_in_list($_,"ALL",@valid_values) } @values; + + if ( scalar(@invalid) > 0 ) { + # Tell the user which parameters were invalid and print the standard help message which will exit + print "Error: Invalid ", $description, scalar(@invalid) == 1 ? ": " : "s: ", join( ", ", map { "\"$_\"" } @invalid ), "\n"; + HELP_MESSAGE(); + } + + @values = @valid_values if ( is_in_list("ALL",@values) ); + + return @values; +} + +sub sha256 { + my $result; + if ($Digest::SHA::VERSION || $Digest::SHA::PurePerl::VERSION) { + open(FILE, $_[0]) or die "Can't open '$_[0]': $!"; + binmode(FILE); + $result = $MOD_SHA->new(256)->addfile(*FILE)->hexdigest; + close(FILE); + } else { + # Use OpenSSL command if Perl Digest::SHA modules not available + $result = `"$openssl" dgst -r -sha256 "$_[0]"`; + $result =~ s/^([0-9a-f]{64}) .+/$1/is; + } + return $result; +} + + +sub oldhash { + my $hash = ""; + open(C, "<$_[0]") || return 0; + while() { + chomp; + if($_ =~ /^\#\# SHA256: (.*)/) { + $hash = $1; + last; + } + } + close(C); + return $hash; +} + +if ( $opt_p !~ m/:/ ) { + print "Error: Mozilla trust identifier list must include both purposes and levels\n"; + HELP_MESSAGE(); +} + +(my $included_mozilla_trust_purposes_string, my $included_mozilla_trust_levels_string) = split( ':', $opt_p ); +my @included_mozilla_trust_purposes = parse_csv_param( "trust purpose", $included_mozilla_trust_purposes_string, @valid_mozilla_trust_purposes ); +my @included_mozilla_trust_levels = parse_csv_param( "trust level", $included_mozilla_trust_levels_string, @valid_mozilla_trust_levels ); + +my @included_signature_algorithms = parse_csv_param( "signature algorithm", $opt_s, @valid_signature_algorithms ); + +sub should_output_cert(%) { + my %trust_purposes_by_level = @_; + + foreach my $level (@included_mozilla_trust_levels) { + # for each level we want to output, see if any of our desired purposes are included + return 1 if ( defined( List::Util::first { is_in_list( $_, @included_mozilla_trust_purposes ) } @{$trust_purposes_by_level{$level}} ) ); + } + + return 0; +} + +my $crt = $ARGV[0] || 'ca-bundle.crt'; +(my $txt = $url) =~ s@(.*/|\?.*)@@g; + +my $stdout = $crt eq '-'; +my $resp; +my $fetched; + +my $oldhash = oldhash($crt); + +report "SHA256 of old file: $oldhash"; + +if(!$opt_n) { + report "Downloading $txt ..."; + + # If we have an HTTPS URL then use curl + if($url =~ /^https:\/\//i) { + if($curl) { + if($curl =~ /^Protocols:.* https( |$)/m) { + report "Get certdata with curl!"; + my $proto = !$opt_k ? "--proto =https" : ""; + my $quiet = $opt_q ? "-s" : ""; + my @out = `curl -w %{response_code} $proto $quiet -o "$txt" "$url"`; + if(!$? && @out && $out[0] == 200) { + $fetched = 1; + report "Downloaded $txt"; + } + else { + report "Failed downloading via HTTPS with curl"; + if(-e $txt && !unlink($txt)) { + report "Failed to remove '$txt': $!"; + } + } + } + else { + report "curl lacks https support"; + } + } + else { + report "curl not found"; + } + } + + # If nothing was fetched then use LWP + if(!$fetched) { + if($url =~ /^https:\/\//i) { + report "Falling back to HTTP"; + $url =~ s/^https:\/\//http:\/\//i; + } + if(!$opt_k) { + report "URLs other than HTTPS are disabled by default, to enable use -k"; + exit 1; + } + report "Get certdata with LWP!"; + if(!defined(${LWP::UserAgent::VERSION})) { + report "LWP is not available (LWP::UserAgent not found)"; + exit 1; + } + my $ua = new LWP::UserAgent(agent => "$0/$version"); + $ua->env_proxy(); + $resp = $ua->mirror($url, $txt); + if($resp && $resp->code eq '304') { + report "Not modified"; + exit 0 if -e $crt && !$opt_f; + } + else { + $fetched = 1; + report "Downloaded $txt"; + } + if(!$resp || $resp->code !~ /^(?:200|304)$/) { + report "Unable to download latest data: " + . ($resp? $resp->code . ' - ' . $resp->message : "LWP failed"); + exit 1 if -e $crt || ! -r $txt; + } + } +} + +my $filedate = $resp ? $resp->last_modified : (stat($txt))[9]; +my $datesrc = "as of"; +if(!$filedate) { + # mxr.mozilla.org gave us a time, hg.mozilla.org does not! + $filedate = time(); + $datesrc="downloaded on"; +} + +# get the hash from the download file +my $newhash= sha256($txt); + +if(!$opt_f && $oldhash eq $newhash) { + report "Downloaded file identical to previous run\'s source file. Exiting"; + if($opt_u && -e $txt && !unlink($txt)) { + report "Failed to remove $txt: $!\n"; + } + exit; +} + +report "SHA256 of new file: $newhash"; + +my $currentdate = scalar gmtime($filedate); + +my $format = $opt_t ? "plain text and " : ""; +if( $stdout ) { + open(CRT, '> -') or die "Couldn't open STDOUT: $!\n"; +} else { + open(CRT,">$crt.~") or die "Couldn't open $crt.~: $!\n"; +} +print CRT <) { + if (/\*\*\*\*\* BEGIN LICENSE BLOCK \*\*\*\*\*/) { + print CRT; + print if ($opt_l); + while () { + print CRT; + print if ($opt_l); + last if (/\*\*\*\*\* END LICENSE BLOCK \*\*\*\*\*/); + } + } + elsif(/^# (Issuer|Serial Number|Subject|Not Valid Before|Not Valid After |Fingerprint \(MD5\)|Fingerprint \(SHA1\)):/) { + push @precert, $_; + next; + } + elsif(/^#|^\s*$/) { + undef @precert; + next; + } + chomp; + + # this is a match for the start of a certificate + if (/^CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE/) { + $start_of_cert = 1 + } + if ($start_of_cert && /^CKA_LABEL UTF8 \"(.*)\"/) { + $caname = $1; + } + my %trust_purposes_by_level; + if ($start_of_cert && /^CKA_VALUE MULTILINE_OCTAL/) { + my $data; + while () { + last if (/^END/); + chomp; + my @octets = split(/\\/); + shift @octets; + for (@octets) { + $data .= chr(oct); + } + } + # scan forwards until the trust part + while () { + last if (/^CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST/); + chomp; + } + # now scan the trust part to determine how we should trust this cert + while () { + last if (/^#/); + if (/^CKA_TRUST_([A-Z_]+)\s+CK_TRUST\s+CKT_NSS_([A-Z_]+)\s*$/) { + if ( !is_in_list($1,@valid_mozilla_trust_purposes) ) { + report "Warning: Unrecognized trust purpose for cert: $caname. Trust purpose: $1. Trust Level: $2"; + } elsif ( !is_in_list($2,@valid_mozilla_trust_levels) ) { + report "Warning: Unrecognized trust level for cert: $caname. Trust purpose: $1. Trust Level: $2"; + } else { + push @{$trust_purposes_by_level{$2}}, $1; + } + } + } + + if ( !should_output_cert(%trust_purposes_by_level) ) { + $skipnum ++; + report "Skipping: $caname" if ($opt_v); + } else { + my $encoded = MIME::Base64::encode_base64($data, ''); + $encoded =~ s/(.{1,${opt_w}})/$1\n/g; + my $pem = "-----BEGIN CERTIFICATE-----\n" + . $encoded + . "-----END CERTIFICATE-----\n"; + print CRT "\n$caname\n"; + print CRT @precert if($opt_m); + my $maxStringLength = length(decode('UTF-8', $caname, Encode::FB_CROAK | Encode::LEAVE_SRC)); + if ($opt_t) { + foreach my $key (keys %trust_purposes_by_level) { + my $string = $key . ": " . join(", ", @{$trust_purposes_by_level{$key}}); + $maxStringLength = List::Util::max( length($string), $maxStringLength ); + print CRT $string . "\n"; + } + } + print CRT ("=" x $maxStringLength . "\n"); + if (!$opt_t) { + print CRT $pem; + } else { + my $pipe = ""; + foreach my $hash (@included_signature_algorithms) { + $pipe = "|$openssl x509 -" . $hash . " -fingerprint -noout -inform PEM"; + if (!$stdout) { + $pipe .= " >> $crt.~"; + close(CRT) or die "Couldn't close $crt.~: $!"; + } + open(TMP, $pipe) or die "Couldn't open openssl pipe: $!"; + print TMP $pem; + close(TMP) or die "Couldn't close openssl pipe: $!"; + if (!$stdout) { + open(CRT, ">>$crt.~") or die "Couldn't open $crt.~: $!"; + } + } + $pipe = "|$openssl x509 -text -inform PEM"; + if (!$stdout) { + $pipe .= " >> $crt.~"; + close(CRT) or die "Couldn't close $crt.~: $!"; + } + open(TMP, $pipe) or die "Couldn't open openssl pipe: $!"; + print TMP $pem; + close(TMP) or die "Couldn't close openssl pipe: $!"; + if (!$stdout) { + open(CRT, ">>$crt.~") or die "Couldn't open $crt.~: $!"; + } + } + report "Parsing: $caname" if ($opt_v); + $certnum ++; + $start_of_cert = 0; + } + undef @precert; + } + +} +close(TXT) or die "Couldn't close $txt: $!\n"; +close(CRT) or die "Couldn't close $crt.~: $!\n"; +unless( $stdout ) { + if ($opt_b && -e $crt) { + my $bk = 1; + while (-e "$crt.~${bk}~") { + $bk++; + } + rename $crt, "$crt.~${bk}~" or die "Failed to create backup $crt.~$bk}~: $!\n"; + } elsif( -e $crt ) { + unlink( $crt ) or die "Failed to remove $crt: $!\n"; + } + rename "$crt.~", $crt or die "Failed to rename $crt.~ to $crt: $!\n"; +} +if($opt_u && -e $txt && !unlink($txt)) { + report "Failed to remove $txt: $!\n"; +} +report "Done ($certnum CA certs processed, $skipnum skipped)."; diff --git a/bin/grep.exe b/bin/grep.exe new file mode 100644 index 0000000000000000000000000000000000000000..110c6f0f1c4de4851b5d611712fedfc09590ca7d GIT binary patch literal 96256 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 literal 0 HcmV?d00001 diff --git a/bin/libiconv2.dll b/bin/libiconv2.dll new file mode 100644 index 0000000000000000000000000000000000000000..544dd92f56d05f4caf06bfac3194431ddd1bc97f GIT binary patch literal 1008128 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 z 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

    $yTK9Ts5pQK6R6&zh^%@^`L3Yi;vh+F1% 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 Zd+NpUgX4n|_@D$nD1i@3;6GCW{|n7ZCxZY0 literal 0 HcmV?d00001 diff --git a/bin/b64.exe b/bin/b64.exe new file mode 100644 index 0000000000000000000000000000000000000000..712798d410d68369a811be688748d337a3384c8c GIT binary patch literal 7680 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 + +Steve Holme (18 May 2019) +- http_ntlm_wb: Handle auth for only a single request + + Currently when the server responds with 401 on NTLM authenticated + connection (re-used) we consider it to have failed. However this is + legitimate and may happen when for example IIS is set configured to + 'authPersistSingleRequest' or when the request goes thru a proxy (with + 'via' header). + + Implemented by imploying an additional state once a connection is + re-used to indicate that if we receive 401 we need to restart + authentication. + + Missed in fe6049f0. + +- http_ntlm_wb: Cleanup handshake after clean NTLM failure + + Missed in 50b87c4e. + +- http_ntlm_wb: Return the correct error on receiving an empty auth message + + Missed in fe20826b as it wasn't implemented in http.c in b4d6db83. + + Closes #3894 + +Daniel Stenberg (18 May 2019) +- curl: make code work with protocol-disabled libcurl + + Closes #3844 + +- libcurl: #ifdef away more code for disabled features/protocols + +- progress: CURL_DISABLE_PROGRESS_METER + +- hostip: CURL_DISABLE_SHUFFLE_DNS + +- netrc: CURL_DISABLE_NETRC + +Viktor Szakats (16 May 2019) +- docs: Markdown and misc improvements [ci skip] + + Approved-by: Daniel Stenberg + Closes #3896 + +- docs/RELEASE-PROCEDURE: link to live iCalendar [ci skip] + + Ref: https://github.com/curl/curl/commit/0af41b40b2c7bd379b2251cbe7cd618e21fa0ea1#commitcomment-33563135 + Approved-by: Daniel Stenberg + Closes #3895 + +Daniel Stenberg (16 May 2019) +- travis: add an osx http-only build + + Closes #3887 + +- cleanup: remove FIXME and TODO comments + + They serve very little purpose and mostly just add noise. Most of them + have been around for a very long time. I read them all before removing + or rephrasing them. + + Ref: #3876 + Closes #3883 + +- curl: don't set FTP options for FTP-disabled builds + + ... since libcurl has started to be totally unaware of options for + disabled protocols they now return error. + + Bug: https://github.com/curl/curl/commit/c9c5304dd4747cbe75d2f24be85920d572fcb5b8#commitcomment-33533937 + + Reported-by: Marcel Raad + Closes #3886 + +Steve Holme (16 May 2019) +- http_ntlm_wb: Move the type-2 message processing into a dedicated function + + This brings the code inline with the other HTTP authentication mechanisms. + + Closes #3890 + +Daniel Stenberg (15 May 2019) +- RELEASE-NOTES: synced + +- docs/RELEASE-PROCEDURE: updated coming releases dates [ci skip] + +- CURLOPT_READFUNCTION.3: see also CURLOPT_UPLOAD_BUFFERSIZE [ci skip] + + Reported-by: Roy Bellingan + Bug: #3885 + +- parse_proxy: use the URL parser API + + As we treat a given proxy as a URL we should use the unified URL parser + to extract the parts out of it. + + Closes #3878 + +Steve Holme (15 May 2019) +- http_negotiate: Move the Negotiate state out of the negotiatedata structure + + Given that this member variable is not used by the SASL based protocols + there is no need to have it here. + + Closes #3882 + +- http_ntlm: Move the NTLM state out of the ntlmdata structure + + Given that this member variable is not used by the SASL based protocols + there is no need to have it here. + +- url: Move the negotiate state type into a dedicated enum + +- url: Remove duplicate clean up of the winbind variables in conn_shutdown() + + Given that Curl_disconnect() calls Curl_http_auth_cleanup_ntlm() prior + to calling conn_shutdown() and it in turn performs this, there is no + need to perform the same action in conn_shutdown(). + + Closes #3881 + +Daniel Stenberg (14 May 2019) +- urlapi: require a non-zero host name length when parsing URL + + Updated test 1560 to verify. + + Closes #3880 + +- configure: error out if OpenSSL wasn't detected when asked for + + If --with-ssl is used and configure still couldn't enable SSL this + creates an error instead of just silently ignoring the fact. + + Suggested-by: Isaiah Norton + Fixes #3824 + Closes #3830 + +Daniel Gustafsson (14 May 2019) +- imap: Fix typo in comment + +Steve Holme (14 May 2019) +- url: Remove unnecessary initialisation from allocate_conn() + + No need to set variables to zero as calloc() does this for us. + + Closes #3879 + +Daniel Stenberg (14 May 2019) +- CURLOPT_CAINFO.3: with Schannel, you want Windows 8 or later [ci skip] + + Clues-provided-by: Jay Satiro + Clues-provided-by: Jeroen Ooms + Fixes #3711 + Closes #3874 + +Daniel Gustafsson (13 May 2019) +- vtls: fix potential ssl_buffer stack overflow + + In Curl_multissl_version() it was possible to overflow the passed in + buffer if the generated version string exceeded the size of the buffer. + Fix by inverting the logic, and also make sure to not exceed the local + buffer during the string generation. + + Closes #3863 + Reported-by: nevv on HackerOne/curl + Reviewed-by: Jay Satiro + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (13 May 2019) +- RELEASE-NOTES: synced + +- appveyor: also build "/ci" branches like travis + +- pingpong: disable more when no pingpong enabled + +- proxy: acknowledge DISABLE_PROXY more + +- parsedate: CURL_DISABLE_PARSEDATE + +- sasl: only enable if there's a protocol enabled using it + +- mime: acknowledge CURL_DISABLE_MIME + +- wildcard: disable from build when FTP isn't present + +- http: CURL_DISABLE_HTTP_AUTH + +- base64: build conditionally if there are users + +- doh: CURL_DISABLE_DOH + +Steve Holme (12 May 2019) +- auth: Rename the various authentication clean up functions + + For consistency and to a avoid confusion. + + Closes #3869 + +Daniel Stenberg (12 May 2019) +- [Jay Satiro brought this change] + + docs/INSTALL: fix broken link [ci skip] + + Reported-by: Joombalaya on github + Fixes #3818 + +Marcel Raad (12 May 2019) +- easy: fix another "clarify calculation precedence" warning + + I missed this one in commit 6b3dde7fe62ea5a557fd1fd323fac2bcd0c2e9be. + +- build: fix "clarify calculation precedence" warnings + + Codacy/CppCheck warns about this. Consistently use parentheses as we + already do in some places to silence the warning. + + Closes https://github.com/curl/curl/pull/3866 + +- cmake: restore C89 compatibility of CurlTests.c + + I broke it in d1b5cf830bfe169745721b21245d2217d2c2453e and + 97de97daefc2ed084c91eff34af2426f2e55e134. + + Reported-by: Viktor Szakats + Ref: https://github.com/curl/curl/commit/97de97daefc2ed084c91eff34af2426f2e55e134#commitcomment-33499044 + Closes https://github.com/curl/curl/pull/3868 + +Steve Holme (11 May 2019) +- http_ntlm: Corrected the name of the include guard + + Missed in f0bdd72c. + + Closes #3867 + +- http_digest: Don't expose functions when HTTP and Crypto Auth are disabled + + Closes #3861 + +- http_negotiate: Don't expose functions when HTTP is disabled + +Daniel Stenberg (11 May 2019) +- SECURITY-PROCESS: fix links [ci skip] + +Marcel Raad (11 May 2019) +- CMake: suppress unused variable warnings + + I missed these in commit d1b5cf830bfe169745721b21245d2217d2c2453e. + +Daniel Stenberg (11 May 2019) +- doh: disable DOH for the cases it doesn't work + + Due to limitations in Curl_resolver_wait_resolv(), it doesn't work for + DOH resolves. This fix disables DOH for those. + + Limitation added to KNOWN_BUGS. + + Fixes #3850 + Closes #3857 + +Jay Satiro (11 May 2019) +- checksrc.bat: Ignore snprintf warnings in docs/examples + + .. because we allow snprintf use in docs/examples. + + Closes https://github.com/curl/curl/pull/3862 + +Steve Holme (10 May 2019) +- vauth: Fix incorrect function description for Curl_auth_user_contains_domain() + + ...and misalignment of these comments. From a78c61a4. + + Closes #3860 + +Jay Satiro (10 May 2019) +- Revert "multi: support verbose conncache closure handle" + + This reverts commit b0972bc. + + - No longer show verbose output for the conncache closure handle. + + The offending commit was added so that the conncache closure handle + would inherit verbose mode from the user's easy handle. (Note there is + no way for the user to set options for the closure handle which is why + that was necessary.) Other debug settings such as the debug function + were not also inherited since we determined that could lead to crashes + if the user's per-handle private data was used on an unexpected handle. + + The reporter here says he has a debug function to capture the verbose + output, and does not expect or want any output to stderr; however + because the conncache closure handle does not inherit the debug function + the verbose output for that handle does go to stderr. + + There are other plausible scenarios as well such as the user redirects + stderr on their handle, which is also not inherited since it could lead + to crashes when used on an unexpected handle. + + Short of allowing the user to set options for the conncache closure + handle I don't think there's much we can safely do except no longer + inherit the verbose setting. + + Bug: https://curl.haxx.se/mail/lib-2019-05/0021.html + Reported-by: Kristoffer Gleditsch + + Ref: https://github.com/curl/curl/pull/3598 + Ref: https://github.com/curl/curl/pull/3618 + + Closes https://github.com/curl/curl/pull/3856 + +Steve Holme (10 May 2019) +- ntlm: Fix misaligned function comments for Curl_auth_ntlm_cleanup() + + From 6012fa5a. + + Closes #3858 + +Daniel Stenberg (9 May 2019) +- BUG-BOUNTY: minor formatting fixes [ci skip] + +- RELEASE-NOTES: synced + +- BUG-BOUNTY.md: add the Dropbox "bonus" extra payout ability [ci skip] + + Closes #3839 + +Kamil Dudka (9 May 2019) +- http_negotiate: do not treat failure of gss_init_sec_context() as fatal + + Fixes #3726 + Closes #3849 + +- spnego_gssapi: fix return code on gss_init_sec_context() failure + + Fixes #3726 + Closes #3849 + +Steve Holme (9 May 2019) +- gen_resp_file.bat: Removed unnecessary @ from all but the first command + + There is need to use @ on every command once echo has been turned off. + + Closes #3854 + +Jay Satiro (8 May 2019) +- http: Ignore HTTP/2 prior knowledge setting for HTTP proxies + + - Do not switch to HTTP/2 for an HTTP proxy that is not tunnelling to + the destination host. + + We already do something similar for HTTPS proxies by not sending h2. [1] + + Prior to this change setting CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE would + incorrectly use HTTP/2 to talk to the proxy, which is not something we + support (yet?). Also it's debatable whether or not that setting should + apply to HTTP/2 proxies. + + [1]: https://github.com/curl/curl/commit/17c5d05 + + Bug: https://github.com/curl/curl/issues/3570 + Bug: https://github.com/curl/curl/issues/3832 + + Closes https://github.com/curl/curl/pull/3853 + +Marcel Raad (8 May 2019) +- travis: update mesalink build to xenial + + Closes https://github.com/curl/curl/pull/3842 + +Daniel Stenberg (8 May 2019) +- [Ricky Leverence brought this change] + + OpenSSL: Report -fips in version if OpenSSL is built with FIPS + + Older versions of OpenSSL report FIPS availabilty via an OPENSSL_FIPS + define. It uses this define to determine whether to publish -fips at + the end of the version displayed. Applications that utilize the version + reported by OpenSSL will see a mismatch if they compare it to what curl + reports, as curl is not modifying the version in the same way. This + change simply adds a check to see if OPENSSL_FIPS is defined, and will + alter the reported version to match what OpenSSL itself provides. This + only appears to be applicable in versions of OpenSSL <1.1.1 + + Closes #3771 + +Kamil Dudka (7 May 2019) +- [Frank Gevaerts brought this change] + + nss: allow fifos and character devices for certificates. + + Currently you can do things like --cert <(cat ./cert.crt) with (at least) the + openssl backend, but that doesn't work for nss because is_file rejects fifos. + + I don't actually know if this is sufficient, nss might do things internally + (like seeking back) that make this not work, so actual testing is needed. + + Closes #3807 + +Daniel Gustafsson (6 May 2019) +- test2100: Fix typos in test description + +Daniel Stenberg (6 May 2019) +- ssh: define USE_SSH if SSH is enabled (any backend) + + Closes #3846 + +Steve Holme (5 May 2019) +- winbuild: Add our standard copyright header to the winbuild batch files + +- makedebug: Fix ERRORLEVEL detection after running where.exe + + Closes #3838 + +Daniel Stenberg (5 May 2019) +- urlapi: add CURLUPART_ZONEID to set and get + + The zoneid can be used with IPv6 numerical addresses. + + Updated test 1560 to verify. + + Closes #3834 + +- [Taiyu Len brought this change] + + WRITEFUNCTION: add missing set_in_callback around callback + + Closes #3837 + +- RELEASE-NOTES: synced + +- CURLMOPT_TIMERFUNCTION.3: warn about the recursive risk [ci skip] + + Reported-by: Ricardo Gomes + + Bug: #3537 + Closes #3836 + +- CURLOPT_CHUNK_BGN_FUNCTION.3: document the struct and time value + + The time field in the curl_fileinfo struct will always be zero. No code + was ever implemented to actually convert the date string to a time_t. + + Fixes #3829 + Closes #3835 + +- OS400/ccsidcurl.c: code style fixes + +- OS400/ccsidcurl: replace use of Curl_vsetopt + + (and make the code style comply) + + Fixes #3833 + +- urlapi: strip off scope id from numerical IPv6 addresses + + ... to make the host name "usable". Store the scope id and put it back + when extracting a URL out of it. + + Also makes curl_url_set() syntax check CURLUPART_HOST. + + Fixes #3817 + Closes #3822 + +- RELEASE-NOTES: synced + +- multiif.h: remove unused protos + + ... for functions related to pipelining. Those functions were removed in + 2f44e94efb3df. + + Closes #3828 + +- [Yiming Jing brought this change] + + travis: mesalink: temporarily disable test 3001 + + ... due to SHA-1 signatures in test certs + +- [Yiming Jing brought this change] + + travis: upgrade the MesaLink TLS backend to v1.0.0 + + Closes #3823 + Closes #3776 + +- ConnectionExists: improve non-multiplexing use case + + - better log output + + - make sure multiplex is enabled for it to be used + +- multi: provide Curl_multiuse_state to update information + + As soon as a TLS backend gets ALPN conformation about the specific HTTP + version it can now set the multiplex situation for the "bundle" and + trigger moving potentially queued up transfers to the CONNECT state. + +- process_pending_handles: mark queued transfers as previously pending + + With transfers being queued up, we only move one at a a time back to the + CONNECT state but now we mark moved transfers so that when a moved + transfer is confirmed "successful" (it connected) it will trigger the + move of another pending transfer. Previously, it would otherwise wait + until the transfer was done before doing this. This makes queued up + pending transfers get processed (much) faster. + +- http: mark bundle as not for multiuse on < HTTP/2 response + + Fixes #3813 + Closes #3815 + +Daniel Gustafsson (1 May 2019) +- cookie: Guard against possible NULL ptr deref + + In case the name pointer isn't set (due to memory pressure most likely) + we need to skip the prefix matching and reject with a badcookie to avoid + a possible NULL pointer dereference. + + Closes #3820 #3821 + Reported-by: Jonathan Moerman + Reviewed-by: Daniel Stenberg + +Patrick Monnerat (30 Apr 2019) +- os400: Add CURLOPT_MAXAGE_CONN to ILE/RPG bindings + +Kamil Dudka (29 Apr 2019) +- nss: provide more specific error messages on failed init + + Closes #3808 + +Daniel Stenberg (29 Apr 2019) +- [Reed Loden brought this change] + + docs: minor polish to the bug bounty / security docs + + Closes #3811 + +- CURL_MAX_INPUT_LENGTH: largest acceptable string input size + + This limits all accepted input strings passed to libcurl to be less than + CURL_MAX_INPUT_LENGTH (8000000) bytes, for these API calls: + curl_easy_setopt() and curl_url_set(). + + The 8000000 number is arbitrary picked and is meant to detect mistakes + or abuse, not to limit actual practical use cases. By limiting the + acceptable string lengths we also reduce the risk of integer overflows + all over. + + NOTE: This does not apply to `CURLOPT_POSTFIELDS`. + + Test 1559 verifies. + + Closes #3805 + +- [Tseng Jun brought this change] + + curlver.h: use parenthesis in CURL_VERSION_BITS macro + + Closes #3809 + +Marcel Raad (27 Apr 2019) +- [Simon Warta brought this change] + + cmake: rename CMAKE_USE_DARWINSSL to CMAKE_USE_SECTRANSP + + Closes https://github.com/curl/curl/pull/3769 + +Steve Holme (23 Apr 2019) +- ntlm: Missed pre-processor || (or) during rebase for cd15acd0 + +- ntlm: Support the NT response in the type-3 when OpenSSL doesn't include MD4 + + Just like we do for mbed TLS, use our local implementation of MD4 when + OpenSSL doesn't support it. This allows a type-3 message to include the + NT response. + +Daniel Gustafsson (23 Apr 2019) +- INTERNALS: fix misindentation of ToC item + + Kerberos was incorrectly indented as a subsection under FTP, which is + incorrect as they are both top level sections. A fix for this was first + attempted in commit fef38a0898322f285401c5ff2f5e7c90dbf3be63 but that + was a few paddles short of being complete. + +- [Aron Bergman brought this change] + + INTERNALS: Add structs to ToC + + Add the subsections under "Structs in libcurl" to the table of contents. + + Reviewed-by: Daniel Stenberg + Reviewed-by: Daniel Gustafsson + +- [Aron Bergman brought this change] + + INTERNALS: Add code highlighting + + Make all struct members under the Curl_handler section + print in monospace font. + + Closes #3801 + Reviewed-by: Daniel Stenberg + Reviewed-by: Daniel Gustafsson + +Daniel Stenberg (22 Apr 2019) +- docs/BUG-BOUNTY: bug bounty time [skip ci] + + Introducing the curl bug bounty program on hackerone. We now recommend + filing security issues directly in the hackerone ticket system which + only is readable to curl security team members. + + Assisted-by: Daniel Gustafsson + + Closes #3488 + +Steve Holme (22 Apr 2019) +- sasl: Don't send authcid as authzid for the PLAIN mechanism as per RFC 4616 + + RFC 4616 specifies the authzid is optional in the client authentication + message and that the server will derive the authorisation identity + (authzid) from the authentication identity (authcid) when not specified + by the client. + +Jay Satiro (22 Apr 2019) +- [Gisle Vanem brought this change] + + memdebug: fix variable name + + Follow-up to 76b6348 which renamed logfile as curl_dbg_logfile. + + Ref: https://github.com/curl/curl/commit/76b6348#r33259088 + +Steve Holme (21 Apr 2019) +- vauth/cleartext: Don't send the authzid if it is empty + + Follow up to 762a292f. + +Daniel Stenberg (21 Apr 2019) +- test 196,197,198: add 'retry' keyword [skip ci] + +- RELEASE-NOTES: synced + +- CURLOPT_MAXAGE_CONN: set the maximum allowed age for conn reuse + + ... and disconnect too old ones instead of trying to reuse. + + Default max age is set to 118 seconds. + + Ref: #3722 + Closes #3782 + +Daniel Gustafsson (20 Apr 2019) +- [Po-Chuan Hsieh brought this change] + + altsvc: Fix building with cookies disables + + ALTSVC requires Curl_get_line which is defined in lib/cookie.c inside a #if + check of HTTP and COOKIES. That makes Curl_get_line undefined if COOKIES is + disabled. Fix by splitting out the function into a separate file which can + be included where needed. + + Closes #3717 + Reviewed-by: Daniel Gustafsson + Reviewed-by: Marcel Raad + +Daniel Stenberg (20 Apr 2019) +- test1002: correct the name [skip ci] + +- test660: verify CONNECT_ONLY with IMAP + + which basically just makes sure LOGOUT is *not* issued on disconnect + +- Curl_disconnect: treat all CONNECT_ONLY connections as "dead" + + Since the connection has been used by the "outside" we don't know the + state of it anymore and curl should not use it anymore. + + Bug: https://curl.haxx.se/mail/lib-2019-04/0052.html + + Closes #3795 + +- multi: fix the statenames (follow-up fix from 2f44e94efb3df8e) + + The list of names must be in sync with the defined states in the header + file! + +Steve Holme (16 Apr 2019) +- openvms: Remove pre-processors for Windows as VMS cannot support them + +- openvms: Remove pre-processor for SecureTransport as VMS cannot support it + + Fixes #3768 + Closes #3785 + +Jay Satiro (16 Apr 2019) +- TODO: Add issue link to an existing entry + +Daniel Stenberg (16 Apr 2019) +- RELEASE-NOTES: synced + +Jay Satiro (16 Apr 2019) +- tool_help: Warn if curl and libcurl versions do not match + + .. because functionality may be affected if the versions differ. + + This commit implements TODO 18.7 "warning if curl version is not in sync + with libcurl version". + + Ref: https://github.com/curl/curl/blob/curl-7_64_1/docs/TODO#L1028-L1033 + + Closes https://github.com/curl/curl/pull/3774 + +Steve Holme (16 Apr 2019) +- md5: Update the function signature following d84da52d + +- md5: Forgot to update the code alignment in d84da52d + +- md5: Return CURLcode from the internally accessible functions + + Following 28f826b3 to return CURLE_OK instead of numeric 0. + +Daniel Gustafsson (15 Apr 2019) +- tests: Run global cleanup at end of tests + + Make sure to run curl_global_cleanup() when shutting down the test + suite to release any resources allocated in the SSL setup. This is + clearly visible when running tests with PolarSSL where the thread + lock calloc() memory which isn't released when not running cleanup. + Below is an excerpt from the autobuild logs: + + ==12368== 96 bytes in 1 blocks are possibly lost in loss record 1 of 2 + ==12368== at 0x4837B65: calloc (vg_replace_malloc.c:752) + ==12368== by 0x11A76E: curl_dbg_calloc (memdebug.c:205) + ==12368== by 0x145CDF: Curl_polarsslthreadlock_thread_setup + (polarssl_threadlock.c:54) + ==12368== by 0x145B37: Curl_polarssl_init (polarssl.c:865) + ==12368== by 0x14129D: Curl_ssl_init (vtls.c:171) + ==12368== by 0x118B4C: global_init (easy.c:158) + ==12368== by 0x118BF5: curl_global_init (easy.c:221) + ==12368== by 0x118D0B: curl_easy_init (easy.c:299) + ==12368== by 0x114E96: test (lib1906.c:32) + ==12368== by 0x115495: main (first.c:174) + + Closes #3783 + Reviewed-by: Marcel Raad + Reviewed-by: Daniel Stenberg + +Marcel Raad (15 Apr 2019) +- travis: use mbedtls from Xenial + + No need to build it from source anymore. + + Closes https://github.com/curl/curl/pull/3779 + +- travis: use libpsl from Xenial + + This makes building libpsl and libidn2 from source unnecessary and + removes the need for the autopoint and libunistring-dev packages. + + Closes https://github.com/curl/curl/pull/3779 + +Daniel Stenberg (15 Apr 2019) +- runtests: start socksd like other servers + + ... without a $srcdir prefix. Triggered by the failures in several + autobuilds. + + Closes #3781 + +Daniel Gustafsson (14 Apr 2019) +- socksd: Fix typos + + Reviewed-by: Daniel Stenberg + +- socksd: Properly decorate static variables + + Mark global variables static to avoid compiler warning in Clang when + using -Wmissing-variable-declarations. + + Closes #3778 + Reviewed-by: Daniel Stenberg + +Steve Holme (14 Apr 2019) +- md(4|5): Fixed indentation oddities with the importation of replacement code + + The indentation from 211d5329 and 57d6d253 was a little strange as + parts didn't align correctly, uses 4 spaces rather than 2. Checked + the indentation of the original source so it aligns, albeit, using + curl style. + +- md5: Code style to return CURLE_OK rather than numeric 0 + +- md5: Corrected code style for some pointer arguments + +Marcel Raad (13 Apr 2019) +- travis: update some builds to xenial + + Xenial comes with more up-to-date software versions and more available + packages, some of which we currently build from source. Unfortunately, + some builds would fail with Xenial because of assertion failures in + Valgrind when using OpenSSL, so leave these at Trusty. + + Closes https://github.com/curl/curl/pull/3777 + +Daniel Stenberg (13 Apr 2019) +- test: make tests and test scripts use socksd for SOCKS + + Make all SOCKS tests use socksd instead of ssh. + +- socksd: new SOCKS 4+5 server for tests + + Closes #3752 + +- singleipconnect: show port in the verbose "Trying ..." message + + To aid debugging better. + +- [tmilburn brought this change] + + CURLOPT_ADDRESS_SCOPE: fix range check and more + + Commit 9081014 fixed most of the confusing issues between scope id and + scope however 844896d added bad limits checking assuming that the scope + is being set and not the scope id. + + I have fixed the documentation so it all refers to scope ids. + + In addition Curl_if2ip refered to the scope id as remote_scope_id which + is incorrect, so I renamed it to local_scope_id. + + Adjusted-by: Daniel Stenberg + + Closes #3655 + Closes #3765 + Fixes #3713 + +- urlapi: stricter CURLUPART_PORT parsing + + Only allow well formed decimal numbers in the input. + + Document that the number MUST be between 1 and 65535. + + Add tests to test 1560 to verify the above. + + Ref: https://github.com/curl/curl/issues/3753 + Closes #3762 + +Jay Satiro (13 Apr 2019) +- [Jan Ehrhardt brought this change] + + winbuild: Support MultiSSL builds + + - Remove the lines in winbuild/Makefile.vc that generate an error with + multiple SSL backends. + + - Add /DCURL_WITH_MULTI_SSL in winbuild/MakefileBuild.vc if multiple SSL + backends are set. + + Closes https://github.com/curl/curl/pull/3772 + +Daniel Stenberg (12 Apr 2019) +- travis: remove mesalink builds (temporarily?) + + Since the mesalink build started to fail on travis, even though we build + a fixed release version, we disable it to prevent it from blocking + progress. + + Closes #3767 + +- openssl: mark connection for close on TLS close_notify + + Without this, detecting and avoid reusing a closed TLS connection + (without a previous GOAWAY) when doing HTTP/2 is tricky. + + Reported-by: Tom van der Woerdt + Fixes #3750 + Closes #3763 + +- RELEASE-NOTES: synced + +Steve Holme (11 Apr 2019) +- vauth/cleartext: Update the PLAIN login function signature to match RFC 4616 + + Functionally this doesn't change anything as we still use the username + for both the authorisation identity and the authentication identity. + + Closes #3757 + +Daniel Stenberg (11 Apr 2019) +- test1906: verify CURLOPT_CURLU + CURLOPT_PORT usage + + Based-on-code-by: Poul T Lomholt + +- url: always clone the CUROPT_CURLU handle + + Since a few code paths actually update that data. + + Fixes #3753 + Closes #3761 + + Reported-by: Poul T Lomholt + +- CURLOPT_DNS_USE_GLOBAL_CACHE: remove + + Remove the code too. The functionality has been disabled in code since + 7.62.0. Setting this option will from now on simply be ignored and have + no function. + + Closes #3654 + +Marcel Raad (11 Apr 2019) +- travis: install libgnutls28-dev only for --with-gnutls build + + Reduces the time needed for the other jobs a little. + + Closes https://github.com/curl/curl/pull/3721 + +- travis: install libnss3-dev only for --with-nss build + + Reduces the time needed for the other jobs a little. + + Closes https://github.com/curl/curl/pull/3721 + +- travis: install libssh2-dev only for --with-libssh2 build + + Reduces the time needed for the other jobs a little. + + Closes https://github.com/curl/curl/pull/3721 + +- travis: install libssh-dev only for --with-libssh build + + Reduces the time needed for the other jobs a little. + + Closes https://github.com/curl/curl/pull/3721 + +- travis: install krb5-user only for --with-gssapi build + + Reduces the time needed for the other jobs a little. + + Closes https://github.com/curl/curl/pull/3721 + +- travis: install lcov only for the coverage job + + Reduces the time needed for the other jobs a little. + + Closes https://github.com/curl/curl/pull/3721 + +- travis: install clang only when needed + + This reduces the GCC job runtimes a little and it's needed to + selectively update clang builds to xenial. + + Closes https://github.com/curl/curl/pull/3721 + +- AppVeyor: enable testing for WinSSL build + + Closes https://github.com/curl/curl/pull/3725 + +- build: fix Codacy/CppCheck warnings + + - remove unused variables + - declare conditionally used variables conditionally + - suppress unused variable warnings in the CMake tests + - remove dead variable stores + - consistently use WIN32 macro to detect Windows + + Closes https://github.com/curl/curl/pull/3739 + +- polarssl_threadlock: remove conditionally unused code + + Make functions no-ops if neither both USE_THREADS_POSIX and + HAVE_PTHREAD_H nor both USE_THREADS_WIN32 and HAVE_PROCESS_H are + defined. Previously, if only one of them was defined, there was either + code compiled that did nothing useful or the wrong header included for + the functions used. + + Also, move POLARSSL_MUTEX_T define to implementation file as it's not + used externally. + + Closes https://github.com/curl/curl/pull/3739 + +- lib557: initialize variables + + These variables are only conditionally initialized. + + Closes https://github.com/curl/curl/pull/3739 + +- lib509: add missing include for strdup + + Closes https://github.com/curl/curl/pull/3739 + +- README.md: fix no-consecutive-blank-lines Codacy warning + + Consistently use one blank line between blocks. + + Closes https://github.com/curl/curl/pull/3739 + +- tests/server/util: fix Windows Unicode build + + Always use the ANSI version of FormatMessage as we don't have the + curl_multibyte gear available here. + + Closes https://github.com/curl/curl/pull/3758 + +Daniel Stenberg (11 Apr 2019) +- curl_easy_getinfo.3: fix minor formatting mistake + +Daniel Gustafsson (11 Apr 2019) +- xattr: skip unittest on unsupported platforms + + The stripcredentials unittest fails to compile on platforms without + xattr support, for example the Solaris member in the buildfarm which + fails with the following: + + CC unit1621-unit1621.o + CC ../libtest/unit1621-first.o + CCLD unit1621 + Undefined first referenced + symbol in file + stripcredentials unit1621-unit1621.o + goto problem 2 + ld: fatal: symbol referencing errors. No output written to .libs/unit1621 + collect2: error: ld returned 1 exit status + gmake[2]: *** [Makefile:996: unit1621] Error 1 + + Fix by excluding the test on such platforms by using the reverse + logic from where stripcredentials() is defined. + + Closes #3759 + Reviewed-by: Daniel Stenberg + +Steve Holme (11 Apr 2019) +- emailL Added reference to RFC8314 for implicit TLS + +- README: Schannel, stop calling it "winssl" + + Stick to "Schannel" everywhere - follow up to 180501cb. + +Jakub Zakrzewski (10 Apr 2019) +- cmake: clear CMAKE_REQUIRED_LIBRARIES after each use + + This fixes GSSAPI builds with the libraries in a non-standard location. + The testing for recv() were failing because it failed to link + the Kerberos libraries, which are not needed for this or subsequent + tests. + + fixes #3743 + closes #3744 + +- cmake: avoid linking executable for some tests with cmake 3.6+ + + With CMAKE_TRY_COMPILE_TARGET_TYPE set to STATIC_LIBRARY, the try_compile() + (which is used by check_c_source_compiles()) will build static library + instead of executable. This avoids linking additional libraries in and thus + speeds up those checks a little. + + This commit also avoids #3743 (GSSAPI build errors) on itself with cmake + 3.6 or above. That issue was fixed separately for all versions. + + Ref: #3744 + +- cmake: minor cleanup + + - Remove nneeded include_regular_expression. + It was setting what is already a default. + + - Remove duplicated include. + + - Don't check for pre-3.0.0 CMake version. + We already require at least 3.0.0, so it's just clutter. + + Ref: #3744 + +Steve Holme (8 Apr 2019) +- build-openssl.bat: Fixed support for OpenSSL v1.1.0+ + +- build-openssl.bat: Perfer the use of if statements rather than goto (where possible) + +- build-openssl.bat: Perform the install for each build type directly after the build + +- build-openssl.bat: Split the install of static and shared build types + +- build-openssl.bat: Split the building of static and shared build types + +- build-openssl.bat: Move the installation into a separate function + +- build-openssl.bat: Move the build step into a separate function + +- build-openssl.bat: Move the OpenSSL configuration into a separate function + +- build-openssl.bat: Fixed the BUILD_CONFIG variable not being initialised + + Should the parent environment set this variable then the build might + not be performed as the user intended. + +Daniel Stenberg (8 Apr 2019) +- socks: fix error message + +- config.d: clarify that initial : and = might need quoting [skip ci] + + Fixes #3738 + Closes #3749 + +- RELEASE-NOTES: synced + + bumped to 7.65.0 for next release + +- socks5: user name and passwords must be shorter than 256 + + bytes... since the protocol needs to store the length in a single byte field. + + Reported-by: XmiliaH on github + Fixes #3737 + Closes #3740 + +- [Jakub Zakrzewski brought this change] + + test: urlapi: urlencode characters above 0x7f correctly + +- [Jakub Zakrzewski brought this change] + + urlapi: urlencode characters above 0x7f correctly + + fixes #3741 + Closes #3742 + +- [Even Rouault brought this change] + + multi_runsingle(): fix use-after-free + + Fixes #3745 + Closes #3746 + + The following snippet + ``` + + int main() + { + CURL* hCurlHandle = curl_easy_init(); + curl_easy_setopt(hCurlHandle, CURLOPT_URL, "http://example.com"); + curl_easy_setopt(hCurlHandle, CURLOPT_PROXY, "1"); + curl_easy_perform(hCurlHandle); + curl_easy_cleanup(hCurlHandle); + return 0; + } + ``` + triggers the following Valgrind warning + + ``` + ==4125== Invalid read of size 8 + ==4125== at 0x4E7D1EE: Curl_llist_remove (llist.c:97) + ==4125== by 0x4E7EF5C: detach_connnection (multi.c:798) + ==4125== by 0x4E80545: multi_runsingle (multi.c:1451) + ==4125== by 0x4E8197C: curl_multi_perform (multi.c:2072) + ==4125== by 0x4E766A0: easy_transfer (easy.c:625) + ==4125== by 0x4E76915: easy_perform (easy.c:719) + ==4125== by 0x4E7697C: curl_easy_perform (easy.c:738) + ==4125== by 0x4008BE: main (in /home/even/curl/test) + ==4125== Address 0x9b3d1d0 is 1,120 bytes inside a block of size 1,600 free'd + ==4125== at 0x4C2ECF0: free (vg_replace_malloc.c:530) + ==4125== by 0x4E62C36: conn_free (url.c:756) + ==4125== by 0x4E62D34: Curl_disconnect (url.c:818) + ==4125== by 0x4E48DF9: Curl_once_resolved (hostip.c:1097) + ==4125== by 0x4E8052D: multi_runsingle (multi.c:1446) + ==4125== by 0x4E8197C: curl_multi_perform (multi.c:2072) + ==4125== by 0x4E766A0: easy_transfer (easy.c:625) + ==4125== by 0x4E76915: easy_perform (easy.c:719) + ==4125== by 0x4E7697C: curl_easy_perform (easy.c:738) + ==4125== by 0x4008BE: main (in /home/even/curl/test) + ==4125== Block was alloc'd at + ==4125== at 0x4C2F988: calloc (vg_replace_malloc.c:711) + ==4125== by 0x4E6438E: allocate_conn (url.c:1654) + ==4125== by 0x4E685B4: create_conn (url.c:3496) + ==4125== by 0x4E6968F: Curl_connect (url.c:4023) + ==4125== by 0x4E802E7: multi_runsingle (multi.c:1368) + ==4125== by 0x4E8197C: curl_multi_perform (multi.c:2072) + ==4125== by 0x4E766A0: easy_transfer (easy.c:625) + ==4125== by 0x4E76915: easy_perform (easy.c:719) + ==4125== by 0x4E7697C: curl_easy_perform (easy.c:738) + ==4125== by 0x4008BE: main (in /home/even/curl/test) + ``` + + This has been bisected to commit 2f44e94 + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14109 + Credit to OSS Fuzz + +- pipelining: removed + + As previously planned and documented in DEPRECATE.md, all pipelining + code is removed. + + Closes #3651 + +- [cclauss brought this change] + + tests: make Impacket (SMB server) Python 3 compatible + + Closes #3731 + Fixes #3289 + +Marcel Raad (6 Apr 2019) +- [Simon Warta brought this change] + + cmake: set SSL_BACKENDS + + This groups all SSL backends into the feature "SSL" and sets the + SSL_BACKENDS analogue to configure.ac + + Closes https://github.com/curl/curl/pull/3736 + +- [Simon Warta brought this change] + + cmake: don't run SORT on empty list + + In case of an empty list, SORTing leads to the cmake error "list + sub-command SORT requires list to be present." + + Closes https://github.com/curl/curl/pull/3736 + +Daniel Gustafsson (5 Apr 2019) +- [Eli Schwartz brought this change] + + configure: fix default location for fish completions + + Fish defines a vendor completions directory for completions that are not + installed as part of the fish project itself, and the vendor completions + are preferred if they exist. This prevents trying to overwrite the + builtin curl.fish completion (or creating file conflicts in distro + packaging). + + Prefer the pkg-config defined location exported by fish, if it can be + found, and fall back to the correct directory defined by most systems. + + Closes #3723 + Reviewed-by: Daniel Gustafsson + +Marcel Raad (5 Apr 2019) +- ftplistparser: fix LGTM alert "Empty block without comment" + + Removing the block is consistent with line 954/957. + + Closes https://github.com/curl/curl/pull/3732 + +- transfer: fix LGTM alert "Comparison is always true" + + Just remove the redundant condition, which also makes it clear that + k->buf is always 0-terminated if this break is not hit. + + Closes https://github.com/curl/curl/pull/3732 + +Jay Satiro (4 Apr 2019) +- [Rikard Falkeborn brought this change] + + smtp: fix compiler warning + + - Fix clang string-plus-int warning. + + Clang 8 warns about adding a string to an int does not append to the + string. Indeed it doesn't, but that was not the intention either. Use + array indexing as suggested to silence the warning. There should be no + functional changes. + + (In other words clang warns about "foo"+2 but not &"foo"[2] so use the + latter.) + + smtp.c:1221:29: warning: adding 'int' to a string does not append to the + string [-Wstring-plus-int] + eob = strdup(SMTP_EOB + 2); + ~~~~~~~~~~~~~~~~^~~~ + + Closes https://github.com/curl/curl/pull/3729 + +Marcel Raad (4 Apr 2019) +- VS projects: use Unicode for VC10+ + + All Windows APIs have been natively UTF-16 since Windows 2000 and the + non-Unicode variants are just wrappers around them. Only Windows 9x + doesn't understand Unicode without the UnicoWS DLL. As later Visual + Studio versions cannot target Windows 9x anyway, using the ANSI API + doesn't really have any benefit there. + + This avoids issues like KNOWN_BUGS 6.5. + + Ref: https://github.com/curl/curl/issues/2120 + Closes https://github.com/curl/curl/pull/3720 + +Daniel Gustafsson (3 Apr 2019) +- RELEASE-NOTES: synced + + Bump the version in progress to 7.64.2, if we merge any "change" + before the cut-off date we can update the version. + +- [Tim Rühsen brought this change] + + documentation: Fix several typos + + Closes #3724 + Reviewed-by: Jakub Zakrzewski + Reviewed-by: Daniel Gustafsson + +Jay Satiro (2 Apr 2019) +- [Mert Yazıcıoğlu brought this change] + + vauth/oauth2: Fix OAUTHBEARER token generation + + OAUTHBEARER tokens were incorrectly generated in a format similar to + XOAUTH2 tokens. These changes make OAUTHBEARER tokens conform to the + RFC7628. + + Fixes: #2487 + Reported-by: Paolo Mossino + + Closes https://github.com/curl/curl/pull/3377 + +Marcel Raad (2 Apr 2019) +- tool_cb_wrt: fix bad-function-cast warning + + Commit f5bc578f4cdfdc6c708211dfc2962a0e9d79352d reintroduced the + warning fixed in commit 2f5f31bb57d68b54e03bffcd9648aece1fe564f8. + Extend fhnd's scope and reuse that variable instead of calling + _get_osfhandle a second time to fix the warning again. + + Closes https://github.com/curl/curl/pull/3718 + +- VC15 project: remove MinimalRebuild + + Already done in commit d5cfefd0ea8e331b884186bff484210fad36e345 for the + library project, but I forgot the tool project template. Now also + removed for that. + +Dan Fandrich (1 Apr 2019) +- cirrus: Customize the disabled tests per FreeBSD version + + Try to run as many test cases as possible on each OS version. + 12.0 passes 13 more tests than the older versions, so we might as well + run them. + +Daniel Stenberg (1 Apr 2019) +- tool_help: include for strcasecmp + + Reported-by: Wyatt O'Day + Fixes #3715 + Closes #3716 + +Daniel Gustafsson (31 Mar 2019) +- scripts: fix typos + +Dan Fandrich (28 Mar 2019) +- travis: allow builds on branches named "ci" + + This allows a way to test changes other than through PRs. + +Daniel Stenberg (27 Mar 2019) +- [Brad Spencer brought this change] + + resolve: apply Happy Eyeballs philosophy to parallel c-ares queries + + Closes #3699 + +- multi: improved HTTP_1_1_REQUIRED handling + + Make sure to downgrade to 1.1 even when we get this HTTP/2 stream error + on first flight. + + Reported-by: niner on github + Fixes #3696 + Closes #3707 + +- [Leonardo Taccari brought this change] + + configure: avoid unportable `==' test(1) operator + + Closes #3709 + +Version 7.64.1 (27 Mar 2019) + +Daniel Stenberg (27 Mar 2019) +- RELEASE: 7.64.1 + +- Revert "ntlm: remove USE_WIN32_CRYPTO check to get USE_NTLM2SESSION set" + + This reverts commit 9130ead9fcabdb6b8fbdb37c0b38be2d326adb00. + + Fixes #3708 + +- [Christian Schmitz brought this change] + + ntlm: remove USE_WIN32_CRYPTO check to get USE_NTLM2SESSION set + + Closes #3704 + +Jay Satiro (26 Mar 2019) +- tool_cb_wrt: fix writing to Windows null device NUL + + - Improve console detection. + + Prior to this change WriteConsole could be called to write to a handle + that may not be a console, which would cause an error. This issue is + limited to character devices that are not also consoles such as the null + device NUL. + + Bug: https://github.com/curl/curl/issues/3175#issuecomment-439068724 + Reported-by: Gisle Vanem + +- CURLMOPT_PIPELINING.3: fix typo + +Daniel Stenberg (25 Mar 2019) +- TODO: config file parsing + + Closes #3698 + +Jay Satiro (24 Mar 2019) +- os400: Disable Alt-Svc by default since it's experimental + + Follow-up to 520f0b4 which added Alt-Svc support and enabled it by + default for OS400. Since the feature is experimental, it should be + disabled by default. + + Ref: https://github.com/curl/curl/commit/520f0b4#commitcomment-32792332 + Ref: https://curl.haxx.se/mail/lib-2019-02/0008.html + + Closes https://github.com/curl/curl/pull/3688 + +Dan Fandrich (24 Mar 2019) +- tests: Fixed XML validation errors in some test files. + +- tests: Fix some incorrect precheck error messages. + + [ci skip] + +Daniel Stenberg (22 Mar 2019) +- curl_url.3: this is not experimental anymore + +- travis: bump the used wolfSSL version to 4.0.0 + + Test 311 is now fine, leaving only 313 (CRL) disabled. + + Test 313 details can be found here: + https://github.com/wolfSSL/wolfssl/issues/1546 + + Closes #3697 + +Daniel Gustafsson (22 Mar 2019) +- lib: Fix typos in comments + +David Woodhouse (20 Mar 2019) +- openssl: if cert type is ENG and no key specified, key is ENG too + + Fixes #3692 + Closes #3692 + +Daniel Stenberg (20 Mar 2019) +- sectransp: tvOS 11 is required for ALPN support + + Reported-by: nianxuejie on github + Assisted-by: Nick Zitzmann + Assisted-by: Jay Satiro + Fixes #3689 + Closes #3690 + +- test1541: threaded connection sharing + + The threaded-shared-conn.c example turned into test case. Only works if + pthread was detected. + + An attempt to detect future regressions such as e3a53e3efb942a5 + + Closes #3687 + +Patrick Monnerat (17 Mar 2019) +- os400: alt-svc support. + + Although experimental, enable it in the platform config file. + Upgrade ILE/RPG binding. + +Daniel Stenberg (17 Mar 2019) +- conncache: use conn->data to know if a transfer owns it + + - make sure an already "owned" connection isn't returned unless + multiplexed. + + - clear ->data when returning the connection to the cache again + + Regression since 7.62.0 (probably in commit 1b76c38904f0) + + Bug: https://curl.haxx.se/mail/lib-2019-03/0064.html + + Closes #3686 + +- RELEASE-NOTES: synced + +- [Chris Young brought this change] + + configure: add --with-amissl + + AmiSSL is an Amiga native library which provides a wrapper over OpenSSL. + It also requires all programs using it to use bsdsocket.library + directly, rather than accessing socket functions through clib, which + libcurl was not necessarily doing previously. Configure will now check + for the headers and ensure they are included if found. + + Closes #3677 + +- [Chris Young brought this change] + + vtls: rename some of the SSL functions + + ... in the SSL structure as AmiSSL is using macros for the socket API + functions. + +- [Chris Young brought this change] + + tool_getpass: termios.h is present on AmigaOS 3, but no tcgetattr/tcsetattr + +- [Chris Young brought this change] + + tool_operate: build on AmigaOS + +- makefile: make checksrc and hugefile commands "silent" + + ... to match the style already used for compiling, linking + etc. Acknowledges 'make V=1' to enable verbose. + + Closes #3681 + +- curl.1: --user and --proxy-user are hidden from ps output + + Suggested-by: Eric Curtin + Improved-by: Dan Fandrich + Ref: #3680 + + Closes #3683 + +- curl.1: mark the argument to --cookie as + + From a discussion in #3676 + + Suggested-by: Tim Rühsen + + Closes #3682 + +Dan Fandrich (14 Mar 2019) +- fuzzer: Only clone the latest fuzzer code, for speed. + +Daniel Stenberg (14 Mar 2019) +- [Dominik Hölzl brought this change] + + Negotiate: fix for HTTP POST with Negotiate + + * Adjusted unit tests 2056, 2057 + * do not generally close connections with CURLAUTH_NEGOTIATE after every request + * moved negotiatedata from UrlState to connectdata + * Added stream rewind logic for CURLAUTH_NEGOTIATE + * introduced negotiatedata::GSS_AUTHDONE and negotiatedata::GSS_AUTHSUCC + * Consider authproblem state for CURLAUTH_NEGOTIATE + * Consider reuse_forbid for CURLAUTH_NEGOTIATE + * moved and adjusted negotiate authentication state handling from + output_auth_headers into Curl_output_negotiate + * Curl_output_negotiate: ensure auth done is always set + * Curl_output_negotiate: Set auth done also if result code is + GSS_S_CONTINUE_NEEDED/SEC_I_CONTINUE_NEEDED as this result code may + also indicate the last challenge request (only works with disabled + Expect: 100-continue and CURLOPT_KEEP_SENDING_ON_ERROR -> 1) + * Consider "Persistent-Auth" header, detect if not present; + Reset/Cleanup negotiate after authentication if no persistent + authentication + * apply changes introduced with #2546 for negotiate rewind logic + + Fixes #1261 + Closes #1975 + +- [Marc Schlatter brought this change] + + http: send payload when (proxy) authentication is done + + The check that prevents payload from sending in case of authentication + doesn't check properly if the authentication is done or not. + + They're cases where the proxy respond "200 OK" before sending + authentication challenge. This change takes care of that. + + Fixes #2431 + Closes #3669 + +- file: fix "Checking if unsigned variable 'readcount' is less than zero." + + Pointed out by codacy + + Closes #3672 + +- memdebug: log pointer before freeing its data + + Coverity warned for two potentional "Use after free" cases. Both are false + positives because the memory wasn't used, it was only the actual pointer + value that was logged. + + The fix still changes the order of execution to avoid the warnings. + + Coverity CID 1443033 and 1443034 + + Closes #3671 + +- RELEASE-NOTES: synced + +Marcel Raad (12 Mar 2019) +- travis: actually use updated compiler versions + + For the Linux builds, GCC 8 and 7 and clang 7 were installed, but the + new GCC versions were only used for the coverage build and for building + nghttp2, while the new clang version was not used at all. + + BoringSSL needs to use the default GCC as it respects CC, but not CXX, + so it would otherwise pass gcc 8 options to g++ 4.8 and fail. + + Also remove GCC 7, it's not needed anymore. + + Ref: https://docs.travis-ci.com/user/languages/c/#c11c11-and-beyond-and-toolchain-versioning + + Closes https://github.com/curl/curl/pull/3670 + +- travis: update clang to version 7 + + Closes https://github.com/curl/curl/pull/3670 + +Jay Satiro (11 Mar 2019) +- [Andre Guibert de Bruet brought this change] + + examples/externalsocket: add missing close socket calls + + .. and for Windows also call WSACleanup since we call WSAStartup. + + The example is to demonstrate handling the socket independently of + libcurl. In this case libcurl is not responsible for creating, opening + or closing the socket, it is handled by the application (our example). + + Fixes https://github.com/curl/curl/pull/3663 + +Daniel Stenberg (11 Mar 2019) +- multi: removed unused code for request retries + + This code was once used for the non multi-interface using code path, but + ever since easy_perform was turned into a wrapper around the multi + interface, this code path never runs. + + Closes #3666 + +Jay Satiro (11 Mar 2019) +- doh: inherit some SSL options from user's easy handle + + - Inherit SSL options for the doh handle but not SSL client certs, + SSL ALPN/NPN, SSL engine, SSL version, SSL issuer cert, + SSL pinned public key, SSL ciphers, SSL id cache setting, + SSL kerberos or SSL gss-api settings. + + - Fix inheritance of verbose setting. + + - Inherit NOSIGNAL. + + There is no way for the user to set options for the doh (DNS-over-HTTPS) + handles and instead we inherit some options from the user's easy handle. + + My thinking for the SSL options not inherited is they are most likely + not intended by the user for the DOH transfer. I did inherit insecure + because I think that should still be in control of the user. + + Prior to this change doh did not work for me because CAINFO was not + inherited. Also verbose was set always which AFAICT was a bug (#3660). + + Fixes https://github.com/curl/curl/issues/3660 + Closes https://github.com/curl/curl/pull/3661 + +Daniel Stenberg (9 Mar 2019) +- test331: verify set-cookie for dotless host name + + Reproduced bug #3649 + Closes #3659 + +- Revert "cookies: extend domain checks to non psl builds" + + This reverts commit 3773de378d48b06c09931e44dca4d274d0bfdce0. + + Regression shipped in 7.64.0 + Fixes #3649 + +- memdebug: make debug-specific functions use curl_dbg_ prefix + + To not "collide" or use up the regular curl_ name space. Also makes them + easier to detect in helper scripts. + + Closes #3656 + +- cmdline-opts/proxytunnel.d: the option tunnnels all protocols + + Clarify the language and simplify. + + Reported-by: Daniel Lublin + Closes #3658 + +- KNOWN_BUGS: Client cert (MTLS) issues with Schannel + + Closes #3145 + +- ROADMAP: updated to some more current things to work on + +- tests: fix multiple may be used uninitialized warnings + +- RELEASE-NOTES: synced + +- source: fix two 'nread' may be used uninitialized warnings + + Both seem to be false positives but we don't like warnings. + + Closes #3646 + +- gopher: remove check for path == NULL + + Since it can't be NULL and it makes Coverity believe we lack proper NULL + checks. Verified by test 659, landed in commit 15401fa886b. + + Pointed out by Coverity CID 1442746. + + Assisted-by: Dan Fandrich + Fixes #3617 + Closes #3642 + +- examples: only include + + That's the only public curl header we should encourage use of. + + Reviewed-by: Marcel Raad + Closes #3645 + +- ssh: loop the state machine if not done and not blocking + + If the state machine isn't complete, didn't fail and it didn't return + due to blocking it can just as well loop again. + + This addresses the problem with SFTP directory listings where we would + otherwise return back to the parent and as the multi state machine + doesn't have any code for using CURLM_CALL_MULTI_PERFORM for as long the + doing phase isn't complete, it would return out when in reality there + was more data to deal with. + + Fixes #3506 + Closes #3644 + +Jay Satiro (5 Mar 2019) +- multi: support verbose conncache closure handle + + - Change closure handle to receive verbose setting from the easy handle + most recently added via curl_multi_add_handle. + + The closure handle is a special easy handle used for closing cached + connections. It receives limited settings from the easy handle most + recently added to the multi handle. Prior to this change that did not + include verbose which was a problem because on connection shutdown + verbose mode was not acknowledged. + + Ref: https://github.com/curl/curl/pull/3598 + + Co-authored-by: Daniel Stenberg + + Closes https://github.com/curl/curl/pull/3618 + +Daniel Stenberg (4 Mar 2019) +- CURLU: fix NULL dereference when used over proxy + + Test 659 verifies + + Also fixed the test 658 name + + Closes #3641 + +- altsvc_out: check the return code from Curl_gmtime + + Pointed out by Coverity, CID 1442956. + + Closes #3640 + +- docs/ALTSVC.md: docs describing the approach + + Closes #3498 + +- alt-svc: add a travis build + +- alt-svc: add test 355 and 356 to verify with command line curl + +- alt-svc: the curl command line bits + +- alt-svc: the libcurl bits + +- travis: add build using gnutls + + Closes #3637 + +- RELEASE-NOTES: synced + +- [Simon Legner brought this change] + + scripts/completion.pl: also generate fish completion file + + This is the renamed script formerly known as zsh.pl + + Closes #3545 + +- gnutls: remove call to deprecated gnutls_compression_get_name + + It has been deprecated by GnuTLS since a year ago and now causes build + warnings. + + Ref: https://gitlab.com/gnutls/gnutls/commit/b0041897d2846737f5fb0f + Docs: https://www.gnutls.org/manual/html_node/Compatibility-API.html + + Closes #3636 + +Jay Satiro (2 Mar 2019) +- system_win32: move win32_init here from easy.c + + .. since system_win32 is a more appropriate location for the functions + and to extern the globals. + + Ref: https://github.com/curl/curl/commit/ca597ad#r32446578 + Reported-by: Gisle Vanem + + Closes https://github.com/curl/curl/pull/3625 + +Daniel Stenberg (1 Mar 2019) +- curl_easy_duphandle.3: clarify that a duped handle has no shares + + Reported-by: Sara Golemon + + Fixes #3592 + Closes #3634 + +- 10-at-a-time.c: fix too long line + +- [Arnaud Rebillout brought this change] + + examples: various fixes in ephiperfifo.c + + The main change here is the timer value that was wrong, it was given in + usecs (ms * 1000), while the itimerspec struct wants nsecs (ms * 1000 * + 1000). This resulted in the callback being invoked WAY TOO OFTEN. + + As a quick check you can run this command before and after applying this + commit: + + # shell 1 + ./ephiperfifo 2>&1 | tee ephiperfifo.log + # shell 2 + echo http://hacking.elboulangero.com > hiper.fifo + + Then just compare the size of the logs files. + + Closes #3633 + Fixes #3632 + Signed-off-by: Arnaud Rebillout + +- urldata: simplify bytecounters + + - no need to have them protocol specific + + - no need to set pointers to them with the Curl_setup_transfer() call + + - make Curl_setup_transfer() operate on a transfer pointer, not + connection + + - switch some counters from long to the more proper curl_off_t type + + Closes #3627 + +- examples/10-at-a-time.c: improve readability and simplify + + - use better variable names to explain their purposes + - convert logic to curl_multi_wait() + +- threaded-resolver: shutdown the resolver thread without error message + + When a transfer is done, the resolver thread will be brought down. That + could accidentally generate an error message in the error buffer even + though this is not an error situationand the transfer would still return + OK. An application that still reads the error buffer could find a + "Could not resolve host: [host name]" message there and get confused. + + Reported-by: Michael Schmid + Fixes #3629 + Closes #3630 + +- [Ԝеѕ brought this change] + + docs: update max-redirs.d phrasing + + clarify redir - "in absurdum" doesn't seem to make sense in this context + + Closes #3631 + +- ssh: fix Condition '!status' is always true + + in the same sftp_done function in both SSH backends. Simplify them + somewhat. + + Pointed out by Codacy. + + Closes #3628 + +- test578: make it read data from the correct test + +- Curl_easy: remove req.maxfd - never used! + + Introduced in 8b6314ccfb, but not used anymore in current code. Unclear + since when. + + Closes #3626 + +- http: set state.infilesize when sending formposts + + Without it set, we would unwillingly triger the "HTTP error before end + of send, stop sending" condition even if the entire POST body had been + sent (since it wouldn't know the expected size) which would + unnecessarily log that message and close the connection when it didn't + have to. + + Reported-by: Matt McClure + Bug: https://curl.haxx.se/mail/archive-2019-02/0023.html + Closes #3624 + +- INSTALL: refer to the current TLS library names and configure options + +- FAQ: minor updates and spelling fixes + +- GOVERNANCE.md: minor spelling fixes + +- Secure Transport: no more "darwinssl" + + Everyone calls it Secure Transport, now we do too. + + Reviewed-by: Nick Zitzmann + + Closes #3619 + +Marcel Raad (27 Feb 2019) +- AppVeyor: add classic MinGW build + + But use the MSYS2 shell rather than the default MSYS shell because of + POSIX path conversion issues. Classic MinGW is only available on the + Visual Studio 2015 image. + + Closes https://github.com/curl/curl/pull/3623 + +- AppVeyor: add MinGW-w64 build + + Add a MinGW-w64 build using CMake's MSYS Makefiles generator. + Use the Visual Studio 2015 image as it has GCC 8, while the + Visual Studio 2017 image only has GCC 7.2. + + Closes https://github.com/curl/curl/pull/3623 + +Daniel Stenberg (27 Feb 2019) +- cookies: only save the cookie file if the engine is enabled + + Follow-up to 8eddb8f4259. + + If the cookieinfo pointer is NULL there really is nothing to save. + + Without this fix, we got a problem when a handle was using shared object + with cookies and is told to "FLUSH" it to file (which worked) and then + the share object was removed and when the easy handle was closed just + afterwards it has no cookieinfo and no cookies so it decided to save an + empty jar (overwriting the file just flushed). + + Test 1905 now verifies that this works. + + Assisted-by: Michael Wallner + Assisted-by: Marcel Raad + + Closes #3621 + +- [DaVieS brought this change] + + cacertinmem.c: use multiple certificates for loading CA-chain + + Closes #3421 + +- urldata: convert bools to bitfields and move to end + + This allows the compiler to pack and align the structs better in + memory. For a rather feature-complete build on x86_64 Linux, gcc 8.1.2 + makes the Curl_easy struct 4.9% smaller. From 6312 bytes to 6000. + + Removed an unused struct field. + + No functionality changes. + + Closes #3610 + +- [Don J Olmstead brought this change] + + curl.h: use __has_declspec_attribute for shared builds + + Closes #3616 + +- curl: display --version features sorted alphabetically + + Closes #3611 + +- runtests: detect "schannel" as an alias for "winssl" + + Follow-up to 180501cb02 + + Reported-by: Marcel Raad + Fixes #3609 + Closes #3620 + +Marcel Raad (26 Feb 2019) +- AppVeyor: update to Visual Studio 2017 + + Switch all Visual Studio 2015 builds to Visual Studio 2017. It's not a + moving target anymore as the last update, Update 9, has been released. + + Closes https://github.com/curl/curl/pull/3606 + +- AppVeyor: switch VS 2015 builds to VS 2017 image + + The Visual Studio 2017 image has Visual Studio 2015 and 2017 installed. + + Closes https://github.com/curl/curl/pull/3606 + +- AppVeyor: explicitly select worker image + + Currently, we're using the default Visual Studio 2015 image for + everything. + + Closes https://github.com/curl/curl/pull/3606 + +Daniel Stenberg (26 Feb 2019) +- strerror: make the strerror function use local buffers + + Instead of using a fixed 256 byte buffer in the connectdata struct. + + In my build, this reduces the size of the connectdata struct by 11.8%, + from 2160 to 1904 bytes with no functionality or performance loss. + + This also fixes a bug in schannel's Curl_verify_certificate where it + called Curl_sspi_strerror when it should have called Curl_strerror for + string from GetLastError. the only effect would have been no text or the + wrong text being shown for the error. + + Co-authored-by: Jay Satiro + + Closes #3612 + +- [Michael Wallner brought this change] + + cookies: fix NULL dereference if flushing cookies with no CookieInfo set + + Regression brought by a52e46f3900fb0 (shipped in 7.63.0) + + Closes #3613 + +Marcel Raad (26 Feb 2019) +- AppVeyor: re-enable test 500 + + It's passing now. + + Closes https://github.com/curl/curl/pull/3615 + +- AppVeyor: remove redundant builds + + Remove the Visual Studio 2012 and 2013 builds as they add little value. + + Ref: https://github.com/curl/curl/pull/3606 + Closes https://github.com/curl/curl/pull/3614 + +Daniel Stenberg (25 Feb 2019) +- RELEASE-NOTES: synced + +- [Bernd Mueller brought this change] + + OpenSSL: add support for TLS ASYNC state + + Closes #3591 + +Jay Satiro (25 Feb 2019) +- [Michael Felt brought this change] + + acinclude: add additional libraries to check for LDAP support + + - Add an additional check for LDAP that also checks for OpenSSL since + on AIX those libraries may be required to link LDAP properly. + + Fixes https://github.com/curl/curl/issues/3595 + Closes https://github.com/curl/curl/pull/3596 + +- [georgeok brought this change] + + schannel: support CALG_ECDH_EPHEM algorithm + + Add support for Ephemeral elliptic curve Diffie-Hellman key exchange + algorithm option when selecting ciphers. This became available on the + Win10 SDK. + + Closes https://github.com/curl/curl/pull/3608 + +Daniel Stenberg (24 Feb 2019) +- multi: call multi_done on connect timeouts + + Failing to do so would make the CURLINFO_TOTAL_TIME timeout to not get + updated correctly and could end up getting reported to the application + completely wrong (way too small). + + Reported-by: accountantM on github + Fixes #3602 + Closes #3605 + +- examples: remove recursive calls to curl_multi_socket_action + + From within the timer callbacks. Recursive is problematic for several + reasons. They should still work, but this way the examples and the + documentation becomes simpler. I don't think we need to encourage + recursive calls. + + Discussed in #3537 + Closes #3601 + +Marcel Raad (23 Feb 2019) +- configure: remove CURL_CHECK_FUNC_FDOPEN call + + The macro itself has been removed in commit + 11974ac859c5d82def59e837e0db56fef7f6794e. + + Closes https://github.com/curl/curl/pull/3604 + +Daniel Stenberg (23 Feb 2019) +- wolfssl: stop custom-adding curves + + since wolfSSL PR https://github.com/wolfSSL/wolfssl/pull/717 (shipped in + wolfSSL 3.10.2 and later) it sends these curves by default already. + + Pointed-out-by: David Garske + + Closes #3599 + +- configure: remove the unused fdopen macro + + and the two remaining #ifdefs for it + + Closes #3600 + +Jay Satiro (22 Feb 2019) +- url: change conn shutdown order to unlink data as last step + + - Split off connection shutdown procedure from Curl_disconnect into new + function conn_shutdown. + + - Change the shutdown procedure to close the sockets before + disassociating the transfer. + + Prior to this change the sockets were closed after disassociating the + transfer so SOCKETFUNCTION wasn't called since the transfer was already + disassociated. That likely came about from recent work started in + Jan 2019 (#3442) to separate transfers from connections. + + Bug: https://curl.haxx.se/mail/lib-2019-02/0101.html + Reported-by: Pavel Löbl + + Closes https://github.com/curl/curl/issues/3597 + Closes https://github.com/curl/curl/pull/3598 + +Marcel Raad (22 Feb 2019) +- Fix strict-prototypes GCC warning + + As seen in the MinGW autobuilds. Caused by commit + f26bc29cfec0be84c67cf74065cf8e5e78fd68b7. + +Dan Fandrich (21 Feb 2019) +- tests: Fixed XML validation errors in some test files. + +Daniel Stenberg (20 Feb 2019) +- TODO: Allow SAN names in HTTP/2 server push + + Suggested-by: Nicolas Grekas + +- RELEASE-NOTES: synced + +- curl: remove MANUAL from -M output + + ... and remove it from the dist tarball. It has served its time, it + barely gets updated anymore and "everything curl" is now convering all + this document once tried to include, and does it more and better. + + In the compressed scenario, this removes ~15K data from the binary, + which is 25% of the -M output. + + It remains in the git repo for now for as long as the web site builds a + page using that as source. It renders poorly on the site (especially for + mobile users) so its not even good there. + + Closes #3587 + +- http2: verify :athority in push promise requests + + RFC 7540 says we should verify that the push is for an "authoritative" + server. We make sure of this by only allowing push with an :athority + header that matches the host that was asked for in the URL. + + Fixes #3577 + Reported-by: Nicolas Grekas + Bug: https://curl.haxx.se/mail/lib-2019-02/0057.html + Closes #3581 + +- singlesocket: fix the 'sincebefore' placement + + The variable wasn't properly reset within the loop and thus could remain + set for sockets that hadn't been set before and miss notifying the app. + + This is a follow-up to 4c35574 (shipped in curl 7.64.0) + + Reported-by: buzo-ffm on github + Detected-by: Jan Alexander Steffens + Fixes #3585 + Closes #3589 + +- connection: never reuse CONNECT_ONLY conections + + and make CONNECT_ONLY conections never reuse any existing ones either. + + Reported-by: Pavel Löbl + Bug: https://curl.haxx.se/mail/lib-2019-02/0064.html + Closes #3586 + +Patrick Monnerat (19 Feb 2019) +- cli tool: fix mime post with --disable-libcurl-option configure option + + Reported-by: Marcel Raad + Fixes #3576 + Closes #3583 + +Daniel Stenberg (19 Feb 2019) +- x509asn1: cleanup and unify code layout + + - rename 'n' to buflen in functions, and use size_t for them. Don't pass + in negative buffer lengths. + + - move most function comments to above the function starts like we use + to + + - remove several unnecessary typecasts (especially of NULL) + + Reviewed-by: Patrick Monnerat + Closes #3582 + +- curl_multi_remove_handle.3: use at any time, just not from within callbacks + + [ci skip] + +- http: make adding a blank header thread-safe + + Previously the function would edit the provided header in-place when a + semicolon is used to signify an empty header. This made it impossible to + use the same set of custom headers in multiple threads simultaneously. + + This approach now makes a local copy when it needs to edit the string. + + Reported-by: d912e3 on github + Fixes #3578 + Closes #3579 + +- unit1651: survive curl_easy_init() fails + +- [Frank Gevaerts brought this change] + + rand: Fix a mismatch between comments in source and header. + + Reported-by: Björn Stenberg + Closes #3584 + +Patrick Monnerat (18 Feb 2019) +- x509asn1: replace single char with an array + + Although safe in this context, using a single char as an array may + cause invalid accesses to adjacent memory locations. + + Detected by Coverity. + +Daniel Stenberg (18 Feb 2019) +- examples/http2-serverpush: add some sensible error checks + + To avoid NULL pointer dereferences etc in the case of problems. + + Closes #3580 + +Jay Satiro (18 Feb 2019) +- easy: fix win32 init to work without CURL_GLOBAL_WIN32 + + - Change the behavior of win32_init so that the required initialization + procedures are not affected by CURL_GLOBAL_WIN32 flag. + + libcurl via curl_global_init supports initializing for win32 with an + optional flag CURL_GLOBAL_WIN32, which if omitted was meant to stop + Winsock initialization. It did so internally by skipping win32_init() + when that flag was set. Since then win32_init() has been expanded to + include required initialization routines that are separate from + Winsock and therefore must be called in all cases. This commit fixes + it so that CURL_GLOBAL_WIN32 only controls the optional win32 + initialization (which is Winsock initialization, according to our doc). + + The only users affected by this change are those that don't pass + CURL_GLOBAL_WIN32 to curl_global_init. For them this commit removes the + risk of a potential crash. + + Ref: https://github.com/curl/curl/pull/3573 + + Fixes https://github.com/curl/curl/issues/3313 + Closes https://github.com/curl/curl/pull/3575 + +Daniel Gustafsson (17 Feb 2019) +- cookie: Add support for cookie prefixes + + The draft-ietf-httpbis-rfc6265bis-02 draft, specify a set of prefixes + and how they should affect cookie initialization, which has been + adopted by the major browsers. This adds support for the two prefixes + defined, __Host- and __Secure, and updates the testcase with the + supplied examples from the draft. + + Closes #3554 + Reviewed-by: Daniel Stenberg + +- mbedtls: release sessionid resources on error + + If mbedtls_ssl_get_session() fails, it may still have allocated + memory that needs to be freed to avoid leaking. Call the library + API function to release session resources on this errorpath as + well as on Curl_ssl_addsessionid() errors. + + Closes: #3574 + Reported-by: Michał Antoniak + Reviewed-by: Daniel Stenberg + +Patrick Monnerat (16 Feb 2019) +- cli tool: refactor encoding conversion sequence for switch case fallthrough. + +- version.c: silent scan-build even when librtmp is not enabled + +Daniel Stenberg (15 Feb 2019) +- RELEASE-NOTES: synced + +- Curl_now: figure out windows version in win32_init + + ... and avoid use of static variables that aren't thread safe. + + Fixes regression from e9ababd4f5a (present in the 7.64.0 release) + + Reported-by: Paul Groke + Fixes #3572 + Closes #3573 + +Marcel Raad (15 Feb 2019) +- unit1307: just fail without FTP support + + I missed to check this in with commit + 71786c0505926aaf7e9b2477b2fb7ee16a915ec6, which only disabled the test. + This fixes the actual linker error. + + Closes https://github.com/curl/curl/pull/3568 + +Daniel Stenberg (15 Feb 2019) +- travis: enable valgrind for the iconv tests too + + Closes #3571 + +- travis: add scan-build + + Closes #3564 + +- examples/sftpuploadresume: Value stored to 'result' is never read + + Detected by scan-build + +- examples/http2-upload: cleaned up + + Fix scan-build warnings, no globals, no silly handle scan. Also remove + handles from the multi before cleaning up. + +- examples/http2-download: cleaned up + + To avoid scan-build warnings and global variables. + +- examples/postinmemory: Potential leak of memory pointed to by 'chunk.memory' + + Detected by scan-build + +- examples/httpcustomheader: Value stored to 'res' is never read + + Detected by scan-build + +- examples: remove superfluous null-pointer checks + + in ftpget, ftpsget and sftpget, so that scan-build stops warning for + potential NULL pointer dereference below! + + Detected by scan-build + +- strip_trailing_dot: make sure NULL is never used for strlen + + scan-build warning: Null pointer passed as an argument to a 'nonnull' + parameter + +- [Jay Satiro brought this change] + + connection_check: restore original conn->data after the check + + - Save the original conn->data before it's changed to the specified + data transfer for the connection check and then restore it afterwards. + + This is a follow-up to 38d8e1b 2019-02-11. + + History: + + It was discovered a month ago that before checking whether to extract a + dead connection that that connection should be associated with a "live" + transfer for the check (ie original conn->data ignored and set to the + passed in data). A fix was landed in 54b201b which did that and also + cleared conn->data after the check. The original conn->data was not + restored, so presumably it was thought that a valid conn->data was no + longer needed. + + Several days later it was discovered that a valid conn->data was needed + after the check and follow-up fix was landed in bbae24c which partially + reverted the original fix and attempted to limit the scope of when + conn->data was changed to only when pruning dead connections. In that + case conn->data was not cleared and the original conn->data not + restored. + + A month later it was discovered that the original fix was somewhat + correct; a "live" transfer is needed for the check in all cases + because original conn->data could be null which could cause a bad deref + at arbitrary points in the check. A fix was landed in 38d8e1b which + expanded the scope to all cases. conn->data was not cleared and the + original conn->data not restored. + + A day later it was discovered that not restoring the original conn->data + may lead to busy loops in applications that use the event interface, and + given this observation it's a pretty safe assumption that there is some + code path that still needs the original conn->data. This commit is the + follow-up fix for that, it restores the original conn->data after the + connection check. + + Assisted-by: tholin@users.noreply.github.com + Reported-by: tholin@users.noreply.github.com + + Fixes https://github.com/curl/curl/issues/3542 + Closes #3559 + +- memdebug: bring back curl_mark_sclose + + Used by debug builds with NSS. + + Reverted from 05b100aee247bb + +Patrick Monnerat (14 Feb 2019) +- transfer.c: do not compute length of undefined hex buffer. + + On non-ascii platforms, the chunked hex header was measured for char code + conversion length, even for chunked trailers that do not have an hex header. + In addition, the efective length is already known: use it. + Since the hex length can be zero, only convert if needed. + + Reported by valgrind. + +Daniel Stenberg (14 Feb 2019) +- KNOWN_BUGS: Cannot compile against a static build of OpenLDAP + + Closes #2367 + +Patrick Monnerat (14 Feb 2019) +- x509asn1: "Dereference of null pointer" + + Detected by scan-build (false positive). + +Daniel Stenberg (14 Feb 2019) +- configure: show features as well in the final summary + + Closes #3569 + +- KNOWN_BUGS: curl compiled on OSX 10.13 failed to run on OSX 10.10 + + Closes #2905 + +- KNOWN_BUGS: Deflate error after all content was received + + Closes #2719 + +- gssapi: fix deprecated header warnings + + Heimdal includes on FreeBSD spewed out lots of them. Less so now. + + Closes #3566 + +- TODO: Upgrade to websockets + + Closes #3523 + +- TODO: cmake test suite improvements + + Closes #3109 + +Patrick Monnerat (13 Feb 2019) +- curl: "Dereference of null pointer" + + Rephrase to satisfy scan-build. + +Marcel Raad (13 Feb 2019) +- unit1307: require FTP support + + This test doesn't link without FTP support after + fc7ab4835b5fd09d0a6f57000633bb6bb6edfda1, which made Curl_fnmatch + unavailable without FTP support. + + Closes https://github.com/curl/curl/pull/3565 + +Daniel Stenberg (13 Feb 2019) +- TODO: TFO support on Windows + + Nobody works on this now. + + Closes #3378 + +- multi: Dereference of null pointer + + Mostly a false positive, but this makes the code easier to read anyway. + + Detected by scan-build. + + Closes #3563 + +- urlglob: Argument with 'nonnull' attribute passed null + + Detected by scan-build. + +Jay Satiro (12 Feb 2019) +- schannel: restore some debug output but only for debug builds + + Follow-up to 84c10dc from earlier today which wrapped a lot of the noisy + debug output in DEBUGF but omitted a few lines. + + Ref: https://github.com/curl/curl/commit/84c10dc#r32292900 + +- examples/crawler: Fix the Accept-Encoding setting + + - Pass an empty string to CURLOPT_ACCEPT_ENCODING to use the default + supported encodings. + + Prior to this change the specific encodings of gzip and deflate were set + but there's no guarantee they'd be supported by the user's libcurl. + +Daniel Stenberg (12 Feb 2019) +- mime: put the boundary buffer into the curl_mime struct + + ... instead of allocating it separately and point to it. It is + fixed-size and always used for each part. + + Closes #3561 + +- schannel: be quiet + + Convert numerous infof() calls into debug-build only messages since they + are annoyingly verbose for regular applications. Removed a few. + + Bug: https://curl.haxx.se/mail/lib-2019-02/0027.html + Reported-by: Volker Schmid + Closes #3552 + +- [Romain Geissler brought this change] + + Curl_resolv: fix a gcc -Werror=maybe-uninitialized warning + + Closes #3562 + +- http2: multi_connchanged() moved from multi.c, only used for h2 + + Closes #3557 + +- curl: "Function call argument is an uninitialized value" + + Follow-up to cac0e4a6ad14b42471eb + + Detected by scan-build + Closes #3560 + +- pretransfer: don't strlen() POSTFIELDS set for GET requests + + ... since that data won't be used in the request anyway. + + Fixes #3548 + Reported-by: Renaud Allard + Close #3549 + +- multi: remove verbose "Expire in" ... messages + + Reported-by: James Brown + Bug: https://curl.haxx.se/mail/archive-2019-02/0013.html + Closes #3558 + +- mbedtls: make it build even if MBEDTLS_VERSION_C isn't set + + Reported-by: MAntoniak on github + Fixes #3553 + Closes #3556 + +Daniel Gustafsson (12 Feb 2019) +- non-ascii.c: fix typos in comments + + Fix two occurrences of s/convers/converts/ spotted while reading code. + +Daniel Stenberg (12 Feb 2019) +- fnmatch: disable if FTP is disabled + + Closes #3551 + +- curl_path: only enabled for SSH builds + +- [Frank Gevaerts brought this change] + + tests: add stderr comparison to the test suite + + The code is more or less copied from the stdout comparison code, maybe + some better reuse is possible. + + test 1457 is adjusted to make the output actually match (by using --silent) + test 506 used without actually needing it, so that block is removed + + Closes #3536 + +Patrick Monnerat (11 Feb 2019) +- cli tool: do not use mime.h private structures. + + Option -F generates an intermediate representation of the mime structure + that is used later to create the libcurl mime structure and generate + the --libcurl statements. + + Reported-by: Daniel Stenberg + Fixes #3532 + Closes #3546 + +Daniel Stenberg (11 Feb 2019) +- curlver: bump to 7.64.1-dev + +- RELEASE-NOTES: synced + + and bump the version in progress to 7.64.1. If we merge any "change" + before the cut-off date, we update again. + +Daniel Gustafsson (11 Feb 2019) +- curl: follow-up to 3f16990ec84 + + Commit 3f16990ec84cc4b followed-up a bug in b49652ac66cc0 but was + inadvertently introducing a new bug in the ternary expression. + + Close #3555 + Reviewed-by: Daniel Stenberg + +- dns: release sharelock as soon as possible + + There is no benefit to holding the data sharelock when freeing the + addrinfo in case it fails, so ensure releaseing it as soon as we can + rather than holding on to it. This also aligns the code with other + consumers of sharelocks. + + Closes #3516 + Reviewed-by: Daniel Stenberg + +Daniel Stenberg (11 Feb 2019) +- curl: follow-up to b49652ac66cc0 + + On FreeBSD, return non-zero on error otherwise zero. + + Reported-by: Marcel Raad + +- multi: (void)-prefix when ignoring return values + + ... and added braces to two function calls which fixes warnings if they + are replace by empty macros at build-time. + +- curl: fix FreeBSD compiler warning in the --xattr code + + Closes #3550 + +- connection_check: set ->data to the transfer doing the check + + The http2 code for connection checking needs a transfer to use. Make + sure a working one is set before handler->connection_check() is called. + + Reported-by: jnbr on github + Fixes #3541 + Closes #3547 + +- hostip: make create_hostcache_id avoid alloc + free + + Closes #3544 + +- scripts/singleuse: script to use to track single-use functions + + That is functions that are declared global but are not used from outside + of the file in which it is declared. Such functions should be made + static or even at times be removed. + + It also verifies that all used curl_ prefixed functions are "blessed" + + Closes #3538 + +- cleanup: make local functions static + + urlapi: turn three local-only functions into statics + + conncache: make conncache_find_first_connection static + + multi: make detach_connnection static + + connect: make getaddressinfo static + + curl_ntlm_core: make hmac_md5 static + + http2: make two functions static + + http: make http_setup_conn static + + connect: make tcpnodelay static + + tests: make UNITTEST a thing to mark functions with, so they can be static for + normal builds and non-static for unit test builds + + ... and mark Curl_shuffle_addr accordingly. + + url: make up_free static + + setopt: make vsetopt static + + curl_endian: make write32_le static + + rtsp: make rtsp_connisdead static + + warnless: remove unused functions + + memdebug: remove one unused function, made another static + +Dan Fandrich (10 Feb 2019) +- cirrus: Added FreeBSD builds using Cirrus CI. + + The build logs will be at https://cirrus-ci.com/github/curl/curl + + Some tests are currently failing and so disabled for now. The SSH server + isn't starting for the SSH tests due to unsupported options used in its + config file. The DICT server also is failing on startup. + +Daniel Stenberg (9 Feb 2019) +- url/idnconvert: remove scan for <= 32 ascii values + + The check was added back in fa939220df before the URL parser would catch + these problems and therefore these will never trigger now. + + Closes #3539 + +- urlapi: reduce variable scope, remove unreachable 'break' + + Both nits pointed out by codacy.com + + Closes #3540 + +Alessandro Ghedini (7 Feb 2019) +- zsh.pl: escape ':' character + + ':' is interpreted as separator by zsh, so if used as part of the argument + or option's description it needs to be escaped. + + The problem can be reproduced as follows: + + % curl --reso + % curl -E + + Bug: https://bugs.debian.org/921452 + +- zsh.pl: update regex to better match curl -h output + + The current regex fails to match '<...>' arguments properly (e.g. those + with spaces in them), which causes an completion script with wrong + descriptions for some options. + + Here's a diff of the generated completion script, comparing the previous + version to the one with this fix: + + --- /usr/share/zsh/vendor-completions/_curl 2019-01-15 20:47:40.000000000 +0000 + +++ _curl 2019-02-05 20:57:29.453349040 +0000 + @@ -9,48 +9,48 @@ + + _arguments -C -S \ + --happy-eyeballs-timeout-ms'[How long to wait in milliseconds for IPv6 before trying IPv4]':'' \ + + --resolve'[Resolve the host+port to this address]':'' \ + {-c,--cookie-jar}'[Write cookies to after operation]':'':_files \ + {-D,--dump-header}'[Write the received headers to ]':'':_files \ + {-y,--speed-time}'[Trigger '\''speed-limit'\'' abort after this time]':'' \ + --proxy-cacert'[CA certificate to verify peer against for proxy]':'':_files \ + - --tls13-ciphers'[of TLS 1.3 ciphersuites> TLS 1.3 cipher suites to use]':'' \ + {-E,--cert}'[Client certificate file and password]':'' \ + --libcurl'[Dump libcurl equivalent code of this command line]':'':_files \ + --proxy-capath'[CA directory to verify peer against for proxy]':'

    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�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 Lj0XNc(!l=#W0xG# literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/sym/winfsp-x64.dll.pdb b/3rd_party/winfsp-1.10/sym/winfsp-x64.dll.pdb new file mode 100644 index 0000000000000000000000000000000000000000..b2e35eeba3341d1ce58281e7c80e6099b70f7bb0 GIT binary patch literal 266240 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ʬ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 CvL4g` literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/sym/winfsp-x86.dll.pdb b/3rd_party/winfsp-1.10/sym/winfsp-x86.dll.pdb new file mode 100644 index 0000000000000000000000000000000000000000..7c1b0bbcb0f5008c00de67ae8f4650c326159694 GIT binary patch literal 307200 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℞qCiv@@ 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 R!nuqS&q?c$7BK@~{{SzL7GD4W literal 0 HcmV?d00001 diff --git a/3rd_party/winfsp-1.10/bin/winfsp-x86.dll b/3rd_party/winfsp-1.10/bin/winfsp-x86.dll new file mode 100644 index 0000000000000000000000000000000000000000..b96b04607108f3927869e0283e4289ca22268ea2 GIT binary patch literal 141312 zcmeFae|%KcnfQMv8ORU@?jQq>8f4T#(*`w~h{1pc$uEV#gph<*e%WF=&DxgY41`Kx z(whLob*j6opVr;(mTrIV_WSv|TR#F~Apx3zx(aF)tJ|Wr?ck(sR2BkeozMF@_s(Pz zK)c`X_w(O3uh-<>dwx9Uoaa2}InVQ)=bTgb*+;ZoP1BtGQYlT_%~Sp=)c=qFmmqrL z^rt6kPmcTdt9CmU{`*x+LtlKrzjobMzOe4zFZn-z@0Y*)m9YPF_xaaFzU=?vm;IHC z8~k7T%9{Ibm@pwfV1xeom%qI8tgd~K{{73>a^L?izW=z!@&2DwxZ{HrJS)EDdjD