From 3b41f26f2fc3a00096a264701ba6b65022d12aae Mon Sep 17 00:00:00 2001 From: KoDer Date: Tue, 29 Sep 2026 19:55:06 +0700 Subject: [PATCH] First --- .idea/.gitignore | 10 + .idea/Xenith.iml | 2 + .idea/editor.xml | 254 + .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + CMakeLists.txt | 44 + KVCacheArch | 7 + Makefile | 47 + README.md | 136 + bin/xenith | Bin 0 -> 384392 bytes config.yaml | 2 + corpus/demo.txt | 4000 +++ libs/cpp-httplib-0.57.1/.gitattributes | 2 + .../.github/workflows/abidiff.yaml | 70 + .../.github/workflows/benchmark_ab.yaml | 62 + .../.github/workflows/benchmark_run.yaml | 106 + .../.github/workflows/cifuzz.yaml | 42 + .../.github/workflows/docs.yml | 37 + .../.github/workflows/release-docker.yml | 51 + .../.github/workflows/test-32bit.yml | 37 + .../.github/workflows/test.yaml | 629 + .../.github/workflows/test_benchmark.yaml | 79 + .../.github/workflows/test_no_exceptions.yaml | 20 + .../.github/workflows/test_offline.yaml | 62 + .../.github/workflows/test_proxy.yaml | 37 + libs/cpp-httplib-0.57.1/CMakeLists.txt | 470 + libs/cpp-httplib-0.57.1/Dockerfile | 13 + libs/cpp-httplib-0.57.1/LICENSE | 22 + libs/cpp-httplib-0.57.1/README-sse.md | 204 + libs/cpp-httplib-0.57.1/README-stream.md | 317 + libs/cpp-httplib-0.57.1/README-websocket.md | 523 + libs/cpp-httplib-0.57.1/README.md | 1829 ++ libs/cpp-httplib-0.57.1/benchmark/Makefile | 51 + libs/cpp-httplib-0.57.1/benchmark/ab.sh | 286 + .../benchmark/cpp-httplib/main.cpp | 139 + .../benchmark/crow/crow_all.h | 13796 ++++++++ .../benchmark/crow/main.cpp | 17 + .../cpp-httplib-0.57.1/cmake/FindBrotli.cmake | 173 + .../cmake/httplibConfig.cmake.in | 119 + libs/cpp-httplib-0.57.1/cmake/modules.cmake | 19 + libs/cpp-httplib-0.57.1/docker-compose.yml | 7 + .../cpp-httplib-0.57.1/docker/html/index.html | 21 + libs/cpp-httplib-0.57.1/docker/main.cc | 303 + libs/cpp-httplib-0.57.1/docs-src/config.toml | 30 + .../en/cookbook/c01-get-response-body.md | 60 + .../docs-src/pages/en/cookbook/c02-json.md | 36 + .../pages/en/cookbook/c03-default-headers.md | 55 + .../pages/en/cookbook/c04-follow-location.md | 38 + .../pages/en/cookbook/c05-basic-auth.md | 46 + .../pages/en/cookbook/c06-bearer-token.md | 50 + .../pages/en/cookbook/c07-multipart-upload.md | 52 + .../pages/en/cookbook/c08-post-file-body.md | 34 + .../pages/en/cookbook/c09-chunked-upload.md | 47 + .../pages/en/cookbook/c10-stream-response.md | 52 + .../en/cookbook/c11-progress-callback.md | 59 + .../pages/en/cookbook/c12-timeouts.md | 52 + .../pages/en/cookbook/c13-max-timeout.md | 42 + .../pages/en/cookbook/c14-keep-alive.md | 53 + .../pages/en/cookbook/c15-compression.md | 47 + .../docs-src/pages/en/cookbook/c16-proxy.md | 87 + .../pages/en/cookbook/c17-error-codes.md | 63 + .../pages/en/cookbook/c18-ssl-errors.md | 51 + .../pages/en/cookbook/c19-client-logger.md | 57 + .../pages/en/cookbook/e01-sse-server.md | 87 + .../pages/en/cookbook/e02-sse-event-names.md | 84 + .../pages/en/cookbook/e03-sse-reconnect.md | 85 + .../pages/en/cookbook/e04-sse-client.md | 99 + .../docs-src/pages/en/cookbook/index.md | 101 + .../pages/en/cookbook/s01-handlers.md | 68 + .../pages/en/cookbook/s02-json-api.md | 74 + .../pages/en/cookbook/s03-path-params.md | 53 + .../pages/en/cookbook/s04-static-files.md | 55 + .../pages/en/cookbook/s05-stream-response.md | 63 + .../en/cookbook/s06-download-response.md | 50 + .../pages/en/cookbook/s07-multipart-reader.md | 103 + .../en/cookbook/s08-compress-response.md | 78 + .../pages/en/cookbook/s09-pre-routing.md | 54 + .../pages/en/cookbook/s10-post-routing.md | 56 + .../pages/en/cookbook/s11-pre-request.md | 51 + .../pages/en/cookbook/s12-user-data.md | 56 + .../pages/en/cookbook/s13-error-handler.md | 51 + .../en/cookbook/s14-exception-handler.md | 67 + .../pages/en/cookbook/s15-server-logger.md | 64 + .../pages/en/cookbook/s16-disconnect.md | 55 + .../pages/en/cookbook/s17-bind-any-port.md | 52 + .../en/cookbook/s18-listen-after-bind.md | 82 + .../en/cookbook/s19-graceful-shutdown.md | 57 + .../pages/en/cookbook/s20-keep-alive.md | 57 + .../pages/en/cookbook/s21-thread-pool.md | 69 + .../pages/en/cookbook/s22-unix-socket.md | 64 + .../pages/en/cookbook/s23-custom-methods.md | 59 + .../pages/en/cookbook/t01-tls-backends.md | 49 + .../en/cookbook/t02-cert-verification.md | 55 + .../pages/en/cookbook/t03-ssl-server.md | 78 + .../docs-src/pages/en/cookbook/t04-mtls.md | 86 + .../pages/en/cookbook/t05-peer-cert.md | 88 + .../pages/en/cookbook/w01-websocket-echo.md | 89 + .../pages/en/cookbook/w02-websocket-ping.md | 80 + .../pages/en/cookbook/w03-websocket-close.md | 91 + .../pages/en/cookbook/w04-websocket-binary.md | 88 + .../pages/en/cookbook/w05-websocket-tls.md | 49 + .../en/cookbook/w06-websocket-timeouts.md | 86 + .../docs-src/pages/en/index.md | 25 + .../docs-src/pages/en/llm-app/app.png | Bin 0 -> 123216 bytes .../docs-src/pages/en/llm-app/ch01-setup.md | 236 + .../pages/en/llm-app/ch02-rest-api.md | 212 + .../pages/en/llm-app/ch03-sse-streaming.md | 264 + .../pages/en/llm-app/ch04-model-management.md | 788 + .../docs-src/pages/en/llm-app/ch05-web-ui.md | 1223 + .../pages/en/llm-app/ch06-desktop-app.md | 724 + .../pages/en/llm-app/ch07-code-reading.md | 154 + .../pages/en/llm-app/ch08-customization.md | 120 + .../docs-src/pages/en/llm-app/index.md | 26 + .../docs-src/pages/en/llm-app/kv-cache.svg | 36 + .../docs-src/pages/en/llm-app/slots.svg | 24 + .../docs-src/pages/en/llm-app/webui.png | Bin 0 -> 132922 bytes .../pages/en/tour/01-getting-started.md | 88 + .../docs-src/pages/en/tour/02-basic-client.md | 266 + .../docs-src/pages/en/tour/03-basic-server.md | 280 + .../pages/en/tour/04-static-file-server.md | 134 + .../docs-src/pages/en/tour/05-tls-setup.md | 90 + .../docs-src/pages/en/tour/06-https-client.md | 122 + .../docs-src/pages/en/tour/07-https-server.md | 124 + .../docs-src/pages/en/tour/08-websocket.md | 141 + .../docs-src/pages/en/tour/09-whats-next.md | 228 + .../docs-src/pages/en/tour/index.md | 16 + .../ja/cookbook/c01-get-response-body.md | 60 + .../docs-src/pages/ja/cookbook/c02-json.md | 36 + .../pages/ja/cookbook/c03-default-headers.md | 55 + .../pages/ja/cookbook/c04-follow-location.md | 38 + .../pages/ja/cookbook/c05-basic-auth.md | 46 + .../pages/ja/cookbook/c06-bearer-token.md | 50 + .../pages/ja/cookbook/c07-multipart-upload.md | 52 + .../pages/ja/cookbook/c08-post-file-body.md | 34 + .../pages/ja/cookbook/c09-chunked-upload.md | 47 + .../pages/ja/cookbook/c10-stream-response.md | 52 + .../ja/cookbook/c11-progress-callback.md | 59 + .../pages/ja/cookbook/c12-timeouts.md | 52 + .../pages/ja/cookbook/c13-max-timeout.md | 42 + .../pages/ja/cookbook/c14-keep-alive.md | 53 + .../pages/ja/cookbook/c15-compression.md | 47 + .../docs-src/pages/ja/cookbook/c16-proxy.md | 87 + .../pages/ja/cookbook/c17-error-codes.md | 63 + .../pages/ja/cookbook/c18-ssl-errors.md | 51 + .../pages/ja/cookbook/c19-client-logger.md | 57 + .../pages/ja/cookbook/e01-sse-server.md | 87 + .../pages/ja/cookbook/e02-sse-event-names.md | 84 + .../pages/ja/cookbook/e03-sse-reconnect.md | 85 + .../pages/ja/cookbook/e04-sse-client.md | 99 + .../docs-src/pages/ja/cookbook/index.md | 101 + .../pages/ja/cookbook/s01-handlers.md | 68 + .../pages/ja/cookbook/s02-json-api.md | 74 + .../pages/ja/cookbook/s03-path-params.md | 53 + .../pages/ja/cookbook/s04-static-files.md | 55 + .../pages/ja/cookbook/s05-stream-response.md | 63 + .../ja/cookbook/s06-download-response.md | 50 + .../pages/ja/cookbook/s07-multipart-reader.md | 103 + .../ja/cookbook/s08-compress-response.md | 78 + .../pages/ja/cookbook/s09-pre-routing.md | 54 + .../pages/ja/cookbook/s10-post-routing.md | 56 + .../pages/ja/cookbook/s11-pre-request.md | 51 + .../pages/ja/cookbook/s12-user-data.md | 56 + .../pages/ja/cookbook/s13-error-handler.md | 51 + .../ja/cookbook/s14-exception-handler.md | 67 + .../pages/ja/cookbook/s15-server-logger.md | 64 + .../pages/ja/cookbook/s16-disconnect.md | 55 + .../pages/ja/cookbook/s17-bind-any-port.md | 52 + .../ja/cookbook/s18-listen-after-bind.md | 82 + .../ja/cookbook/s19-graceful-shutdown.md | 57 + .../pages/ja/cookbook/s20-keep-alive.md | 57 + .../pages/ja/cookbook/s21-thread-pool.md | 69 + .../pages/ja/cookbook/s22-unix-socket.md | 64 + .../pages/ja/cookbook/s23-custom-methods.md | 59 + .../pages/ja/cookbook/t01-tls-backends.md | 49 + .../ja/cookbook/t02-cert-verification.md | 55 + .../pages/ja/cookbook/t03-ssl-server.md | 78 + .../docs-src/pages/ja/cookbook/t04-mtls.md | 86 + .../pages/ja/cookbook/t05-peer-cert.md | 88 + .../pages/ja/cookbook/w01-websocket-echo.md | 89 + .../pages/ja/cookbook/w02-websocket-ping.md | 80 + .../pages/ja/cookbook/w03-websocket-close.md | 91 + .../pages/ja/cookbook/w04-websocket-binary.md | 88 + .../pages/ja/cookbook/w05-websocket-tls.md | 49 + .../ja/cookbook/w06-websocket-timeouts.md | 86 + .../docs-src/pages/ja/index.md | 25 + .../docs-src/pages/ja/llm-app/ch01-setup.md | 236 + .../pages/ja/llm-app/ch02-rest-api.md | 212 + .../pages/ja/llm-app/ch03-sse-streaming.md | 264 + .../pages/ja/llm-app/ch04-model-management.md | 788 + .../docs-src/pages/ja/llm-app/ch05-web-ui.md | 1223 + .../pages/ja/llm-app/ch06-desktop-app.md | 724 + .../pages/ja/llm-app/ch07-code-reading.md | 154 + .../pages/ja/llm-app/ch08-customization.md | 120 + .../docs-src/pages/ja/llm-app/index.md | 26 + .../docs-src/pages/ja/llm-app/kv-cache.svg | 36 + .../docs-src/pages/ja/llm-app/slots.svg | 24 + .../pages/ja/tour/01-getting-started.md | 88 + .../docs-src/pages/ja/tour/02-basic-client.md | 266 + .../docs-src/pages/ja/tour/03-basic-server.md | 280 + .../pages/ja/tour/04-static-file-server.md | 134 + .../docs-src/pages/ja/tour/05-tls-setup.md | 90 + .../docs-src/pages/ja/tour/06-https-client.md | 122 + .../docs-src/pages/ja/tour/07-https-server.md | 124 + .../docs-src/pages/ja/tour/08-websocket.md | 141 + .../docs-src/pages/ja/tour/09-whats-next.md | 228 + .../docs-src/pages/ja/tour/index.md | 16 + .../docs-util/llm-app/build_desktop_app.sh | 33 + .../docs-util/llm-app/build_web_app.sh | 33 + .../docs-util/llm-app/extract_code.sh | 18 + .../llm-app/generate_desktop_app_project.sh | 38 + .../docs-util/llm-app/justfile | 28 + .../docs-util/llm-app/test_book.sh | 561 + .../docs-util/llm-app/test_webui.cpp | 300 + .../docs-util/llm-app/webdriver.h | 278 + .../example/Dockerfile.hello | 12 + libs/cpp-httplib-0.57.1/example/Makefile | 70 + .../example/accept_header.cc | 144 + libs/cpp-httplib-0.57.1/example/benchmark.cc | 33 + libs/cpp-httplib-0.57.1/example/ca-bundle.crt | 3401 ++ libs/cpp-httplib-0.57.1/example/client.cc | 38 + .../cpp-httplib-0.57.1/example/client.vcxproj | 160 + libs/cpp-httplib-0.57.1/example/example.sln | 46 + libs/cpp-httplib-0.57.1/example/hello.cc | 19 + .../example/one_time_request.cc | 56 + libs/cpp-httplib-0.57.1/example/redirect.cc | 60 + libs/cpp-httplib-0.57.1/example/server.cc | 113 + .../cpp-httplib-0.57.1/example/server.vcxproj | 160 + .../example/server_and_client.cc | 90 + libs/cpp-httplib-0.57.1/example/simplecli.cc | 29 + libs/cpp-httplib-0.57.1/example/simplesvr.cc | 148 + .../example/ssecli-stream.cc | 234 + libs/cpp-httplib-0.57.1/example/ssecli.cc | 57 + libs/cpp-httplib-0.57.1/example/ssesvr.cc | 106 + libs/cpp-httplib-0.57.1/example/upload.cc | 91 + libs/cpp-httplib-0.57.1/example/uploader.sh | 6 + libs/cpp-httplib-0.57.1/example/wsecho.cc | 135 + libs/cpp-httplib-0.57.1/generate_module.py | 77 + libs/cpp-httplib-0.57.1/httplib.h | 22930 ++++++++++++++ libs/cpp-httplib-0.57.1/justfile | 60 + libs/cpp-httplib-0.57.1/meson.build | 171 + libs/cpp-httplib-0.57.1/meson_options.txt | 24 + libs/cpp-httplib-0.57.1/scripts/release.sh | 195 + libs/cpp-httplib-0.57.1/split.py | 77 + libs/cpp-httplib-0.57.1/test/CMakeLists.txt | 151 + libs/cpp-httplib-0.57.1/test/Makefile | 325 + libs/cpp-httplib-0.57.1/test/ca-bundle.crt | 3401 ++ .../test/dns_test_fixture.py | 87 + .../test/fuzzing/CMakeLists.txt | 10 + libs/cpp-httplib-0.57.1/test/fuzzing/Makefile | 42 + .../test/fuzzing/client_fuzzer.cc | 88 + libs/cpp-httplib-0.57.1/test/fuzzing/corpus/1 | 1 + libs/cpp-httplib-0.57.1/test/fuzzing/corpus/2 | 5 + libs/cpp-httplib-0.57.1/test/fuzzing/corpus/3 | Bin 0 -> 54 bytes ...e-minimized-client_fuzzer-5188033728282624 | 3 + ...e-minimized-client_fuzzer-6561074643271680 | 3 + ...ized-header_parser_fuzzer-4645558454386688 | Bin 0 -> 58160 bytes ...e-minimized-server_fuzzer-5042094968537088 | Bin 0 -> 516575 bytes ...e-minimized-server_fuzzer-5372331946541056 | Bin 0 -> 1041826 bytes ...e-minimized-server_fuzzer-5386708825800704 | Bin 0 -> 787294 bytes ...e-minimized-server_fuzzer-5667822731132928 | Bin 0 -> 317 bytes ...e-minimized-server_fuzzer-5886572146327552 | Bin 0 -> 974479 bytes ...e-minimized-server_fuzzer-5942767436562432 | Bin 0 -> 395 bytes ...e-minimized-server_fuzzer-6007379124158464 | Bin 0 -> 452123 bytes ...e-minimized-server_fuzzer-6508706672541696 | 7 + .../test/fuzzing/corpus/issue1264 | 19 + .../test/fuzzing/header_parser_fuzzer.cc | 59 + .../test/fuzzing/multipart_parser_fuzzer.cc | 37 + .../test/fuzzing/server_fuzzer.cc | 100 + .../test/fuzzing/server_fuzzer.dict | 224 + .../fuzzing/standalone_fuzz_target_runner.cpp | 35 + .../test/fuzzing/url_parser_fuzzer.cc | 52 + libs/cpp-httplib-0.57.1/test/gen-certs.sh | 35 + .../include/gtest/gtest-assertion-result.h | 237 + .../gtest/include/gtest/gtest-death-test.h | 345 + .../test/gtest/include/gtest/gtest-matchers.h | 956 + .../test/gtest/include/gtest/gtest-message.h | 218 + .../gtest/include/gtest/gtest-param-test.h | 510 + .../test/gtest/include/gtest/gtest-printers.h | 1048 + .../test/gtest/include/gtest/gtest-spi.h | 248 + .../gtest/include/gtest/gtest-test-part.h | 190 + .../gtest/include/gtest/gtest-typed-test.h | 331 + .../test/gtest/include/gtest/gtest.h | 2297 ++ .../gtest/include/gtest/gtest_pred_impl.h | 279 + .../test/gtest/include/gtest/gtest_prod.h | 60 + .../include/gtest/internal/custom/README.md | 44 + .../gtest/internal/custom/gtest-port.h | 37 + .../gtest/internal/custom/gtest-printers.h | 42 + .../include/gtest/internal/custom/gtest.h | 37 + .../internal/gtest-death-test-internal.h | 306 + .../include/gtest/internal/gtest-filepath.h | 210 + .../include/gtest/internal/gtest-internal.h | 1570 + .../include/gtest/internal/gtest-param-util.h | 956 + .../include/gtest/internal/gtest-port-arch.h | 116 + .../gtest/include/gtest/internal/gtest-port.h | 2413 ++ .../include/gtest/internal/gtest-string.h | 177 + .../include/gtest/internal/gtest-type-util.h | 186 + .../test/gtest/src/gtest-all.cc | 49 + .../test/gtest/src/gtest-assertion-result.cc | 77 + .../test/gtest/src/gtest-death-test.cc | 1620 + .../test/gtest/src/gtest-filepath.cc | 367 + .../test/gtest/src/gtest-internal-inl.h | 1212 + .../test/gtest/src/gtest-matchers.cc | 98 + .../test/gtest/src/gtest-port.cc | 1394 + .../test/gtest/src/gtest-printers.cc | 553 + .../test/gtest/src/gtest-test-part.cc | 105 + .../test/gtest/src/gtest-typed-test.cc | 104 + .../test/gtest/src/gtest.cc | 6795 ++++ .../test/gtest/src/gtest_main.cc | 53 + libs/cpp-httplib-0.57.1/test/image.jpg | Bin 0 -> 33653 bytes .../test/include_httplib.cc | 5 + .../test/include_windows_h.cc | 6 + .../test/lsan_suppressions.txt | 7 + .../test/make-shared-library.sh | 28 + libs/cpp-httplib-0.57.1/test/meson.build | 185 + libs/cpp-httplib-0.57.1/test/proxy/Dockerfile | 13 + .../test/proxy/basic_passwd | 1 + .../test/proxy/basic_squid.conf | 82 + .../test/proxy/digest_passwd | 1 + .../test/proxy/digest_squid.conf | 82 + .../test/proxy/docker-compose.ci.yml | 8 + .../test/proxy/docker-compose.yml | 41 + .../test/proxy/httpbin_nginx.conf | 22 + .../test/run_issue_2431_repro.sh | 102 + libs/cpp-httplib-0.57.1/test/test.cc | 26185 ++++++++++++++++ libs/cpp-httplib-0.57.1/test/test.conf | 21 + libs/cpp-httplib-0.57.1/test/test.rootCA.conf | 18 + libs/cpp-httplib-0.57.1/test/test.sln | 28 + libs/cpp-httplib-0.57.1/test/test.vcxproj | 180 + .../test/test_32bit_build.cpp | 9 + .../cpp-httplib-0.57.1/test/test_benchmark.cc | 78 + libs/cpp-httplib-0.57.1/test/test_proxy.cc | 383 + .../test/test_thread_pool.cc | 285 + .../test/test_websocket_heartbeat.cc | 309 + .../test/test_websocket_thread_safety.cc | 178 + libs/cpp-httplib-0.57.1/test/www/dir/1MB.txt | 8192 +++++ .../test/www/dir/index.html | 8 + .../test/www/dir/meson.build | 8 + .../test/www/dir/test.abcde | 1 + .../cpp-httplib-0.57.1/test/www/dir/test.html | 1 + libs/cpp-httplib-0.57.1/test/www/empty_file | 0 libs/cpp-httplib-0.57.1/test/www/file | 1 + libs/cpp-httplib-0.57.1/test/www/meson.build | 8 + .../test/www/日本語Dir/meson.build | 4 + .../test/www/日本語Dir/日本語File.txt | 1 + .../test/www2/dir/index.html | 8 + .../test/www2/dir/meson.build | 6 + .../test/www2/dir/test.html | 1 + .../test/www3/dir/index.html | 8 + .../test/www3/dir/meson.build | 6 + .../test/www3/dir/test.html | 1 + libs/json-3.12.0/.cirrus.yml | 17 + libs/json-3.12.0/.clang-tidy | 77 + libs/json-3.12.0/.github/CODEOWNERS | 6 + libs/json-3.12.0/.github/CODE_OF_CONDUCT.md | 132 + libs/json-3.12.0/.github/CONTRIBUTING.md | 222 + libs/json-3.12.0/.github/FUNDING.yml | 2 + .../.github/ISSUE_TEMPLATE/bug.yaml | 93 + .../.github/ISSUE_TEMPLATE/config.yml | 5 + .../.github/PULL_REQUEST_TEMPLATE.md | 9 + libs/json-3.12.0/.github/SECURITY.md | 25 + libs/json-3.12.0/.github/config.yml | 22 + libs/json-3.12.0/.github/dependabot.yml | 31 + .../.github/external_ci/appveyor.yml | 91 + libs/json-3.12.0/.github/labeler.yml | 38 + .../.github/workflows/check_amalgamation.yml | 76 + libs/json-3.12.0/.github/workflows/cifuzz.yml | 35 + .../.github/workflows/codeql-analysis.yml | 49 + .../workflows/comment_check_amalgamation.yml | 81 + .../.github/workflows/dependency-review.yml | 27 + .../json-3.12.0/.github/workflows/labeler.yml | 26 + libs/json-3.12.0/.github/workflows/macos.yml | 120 + .../workflows/publish_documentation.yml | 46 + .../.github/workflows/scorecards.yml | 81 + libs/json-3.12.0/.github/workflows/stale.yml | 34 + libs/json-3.12.0/.github/workflows/ubuntu.yml | 251 + .../json-3.12.0/.github/workflows/windows.yml | 134 + libs/json-3.12.0/.gitignore | 47 + libs/json-3.12.0/.reuse/dep5 | 36 + libs/json-3.12.0/.reuse/templates/json.jinja2 | 11 + .../.reuse/templates/json_support.jinja2 | 11 + libs/json-3.12.0/BUILD.bazel | 80 + libs/json-3.12.0/CITATION.cff | 14 + libs/json-3.12.0/CMakeLists.txt | 225 + libs/json-3.12.0/ChangeLog.md | 3272 ++ libs/json-3.12.0/FILES.md | 239 + libs/json-3.12.0/LICENSE.MIT | 21 + libs/json-3.12.0/LICENSES/Apache-2.0.txt | 73 + libs/json-3.12.0/LICENSES/BSD-3-Clause.txt | 11 + libs/json-3.12.0/LICENSES/GPL-3.0-only.txt | 232 + libs/json-3.12.0/LICENSES/MIT.txt | 9 + libs/json-3.12.0/MODULE.bazel | 7 + libs/json-3.12.0/Makefile | 266 + libs/json-3.12.0/Package.swift | 22 + libs/json-3.12.0/README.md | 1866 ++ libs/json-3.12.0/cmake/ci.cmake | 713 + libs/json-3.12.0/cmake/clang_flags.cmake | 20 + libs/json-3.12.0/cmake/config.cmake.in | 15 + .../cmake/download_test_data.cmake | 56 + libs/json-3.12.0/cmake/gcc_flags.cmake | 348 + .../cmake/nlohmann_jsonConfigVersion.cmake.in | 20 + libs/json-3.12.0/cmake/pkg-config.pc.in | 7 + .../requirements/requirements-cppcheck.txt | 1 + .../requirements/requirements-cpplint.txt | 1 + .../cmake/requirements/requirements-reuse.txt | 1 + .../cmake/scripts/gen_bazel_build_file.cmake | 24 + libs/json-3.12.0/cmake/test.cmake | 273 + libs/json-3.12.0/docs/Makefile | 44 + libs/json-3.12.0/docs/README.md | 20 + libs/json-3.12.0/docs/avatars.png | Bin 0 -> 1715973 bytes libs/json-3.12.0/docs/docset/Info.plist | 20 + libs/json-3.12.0/docs/docset/Makefile | 88 + libs/json-3.12.0/docs/docset/README.md | 19 + libs/json-3.12.0/docs/docset/docSet.sql | 244 + libs/json-3.12.0/docs/docset/docset.json | 10 + libs/json-3.12.0/docs/docset/icon.png | Bin 0 -> 700 bytes libs/json-3.12.0/docs/docset/icon@2x.png | Bin 0 -> 1362 bytes libs/json-3.12.0/docs/json.gif | Bin 0 -> 1652828 bytes libs/json-3.12.0/docs/mkdocs/Makefile | 45 + .../docs/api/adl_serializer/from_json.md | 73 + .../mkdocs/docs/api/adl_serializer/index.md | 35 + .../mkdocs/docs/api/adl_serializer/to_json.md | 43 + .../docs/mkdocs/docs/api/basic_json/accept.md | 113 + .../docs/mkdocs/docs/api/basic_json/array.md | 60 + .../mkdocs/docs/api/basic_json/array_t.md | 68 + .../docs/mkdocs/docs/api/basic_json/at.md | 226 + .../docs/mkdocs/docs/api/basic_json/back.md | 65 + .../mkdocs/docs/api/basic_json/basic_json.md | 402 + .../docs/mkdocs/docs/api/basic_json/begin.md | 42 + .../docs/mkdocs/docs/api/basic_json/binary.md | 66 + .../mkdocs/docs/api/basic_json/binary_t.md | 89 + .../mkdocs/docs/api/basic_json/boolean_t.md | 42 + .../docs/mkdocs/docs/api/basic_json/cbegin.md | 41 + .../docs/api/basic_json/cbor_tag_handler_t.md | 42 + .../docs/mkdocs/docs/api/basic_json/cend.md | 41 + .../docs/mkdocs/docs/api/basic_json/clear.md | 58 + .../mkdocs/docs/api/basic_json/contains.md | 118 + .../docs/mkdocs/docs/api/basic_json/count.md | 78 + .../mkdocs/docs/api/basic_json/crbegin.md | 41 + .../docs/mkdocs/docs/api/basic_json/crend.md | 42 + .../basic_json/default_object_comparator_t.md | 35 + .../docs/mkdocs/docs/api/basic_json/diff.md | 62 + .../docs/mkdocs/docs/api/basic_json/dump.md | 79 + .../mkdocs/docs/api/basic_json/emplace.md | 61 + .../docs/api/basic_json/emplace_back.md | 65 + .../docs/mkdocs/docs/api/basic_json/empty.md | 66 + .../docs/mkdocs/docs/api/basic_json/end.md | 42 + .../mkdocs/docs/api/basic_json/end_pos.md | 68 + .../docs/mkdocs/docs/api/basic_json/erase.md | 211 + .../docs/api/basic_json/error_handler_t.md | 42 + .../mkdocs/docs/api/basic_json/exception.md | 87 + .../docs/mkdocs/docs/api/basic_json/find.md | 86 + .../mkdocs/docs/api/basic_json/flatten.md | 50 + .../mkdocs/docs/api/basic_json/from_bjdata.md | 93 + .../mkdocs/docs/api/basic_json/from_bson.md | 110 + .../mkdocs/docs/api/basic_json/from_cbor.md | 117 + .../docs/api/basic_json/from_msgpack.md | 109 + .../mkdocs/docs/api/basic_json/from_ubjson.md | 106 + .../docs/mkdocs/docs/api/basic_json/front.md | 58 + .../docs/mkdocs/docs/api/basic_json/get.md | 136 + .../docs/api/basic_json/get_allocator.md | 31 + .../mkdocs/docs/api/basic_json/get_binary.md | 45 + .../mkdocs/docs/api/basic_json/get_ptr.md | 94 + .../mkdocs/docs/api/basic_json/get_ref.md | 68 + .../docs/mkdocs/docs/api/basic_json/get_to.md | 58 + .../docs/mkdocs/docs/api/basic_json/index.md | 336 + .../docs/api/basic_json/input_format_t.md | 52 + .../docs/mkdocs/docs/api/basic_json/insert.md | 190 + .../docs/api/basic_json/invalid_iterator.md | 77 + .../mkdocs/docs/api/basic_json/is_array.md | 39 + .../mkdocs/docs/api/basic_json/is_binary.md | 39 + .../mkdocs/docs/api/basic_json/is_boolean.md | 39 + .../docs/api/basic_json/is_discarded.md | 72 + .../mkdocs/docs/api/basic_json/is_null.md | 39 + .../mkdocs/docs/api/basic_json/is_number.md | 56 + .../docs/api/basic_json/is_number_float.md | 46 + .../docs/api/basic_json/is_number_integer.md | 47 + .../docs/api/basic_json/is_number_unsigned.md | 46 + .../mkdocs/docs/api/basic_json/is_object.md | 39 + .../docs/api/basic_json/is_primitive.md | 69 + .../mkdocs/docs/api/basic_json/is_string.md | 39 + .../docs/api/basic_json/is_structured.md | 63 + .../docs/mkdocs/docs/api/basic_json/items.md | 100 + .../docs/api/basic_json/json_base_class_t.md | 45 + .../docs/api/basic_json/json_serializer.md | 41 + .../mkdocs/docs/api/basic_json/max_size.md | 60 + .../mkdocs/docs/api/basic_json/merge_patch.md | 63 + .../docs/mkdocs/docs/api/basic_json/meta.md | 56 + .../docs/api/basic_json/number_float_t.md | 70 + .../docs/api/basic_json/number_integer_t.md | 76 + .../docs/api/basic_json/number_unsigned_t.md | 76 + .../docs/mkdocs/docs/api/basic_json/object.md | 63 + .../api/basic_json/object_comparator_t.md | 32 + .../mkdocs/docs/api/basic_json/object_t.md | 114 + .../mkdocs/docs/api/basic_json/operator+=.md | 124 + .../mkdocs/docs/api/basic_json/operator=.md | 43 + .../mkdocs/docs/api/basic_json/operator[].md | 250 + .../docs/api/basic_json/operator_ValueType.md | 82 + .../mkdocs/docs/api/basic_json/operator_eq.md | 168 + .../mkdocs/docs/api/basic_json/operator_ge.md | 86 + .../mkdocs/docs/api/basic_json/operator_gt.md | 86 + .../mkdocs/docs/api/basic_json/operator_le.md | 87 + .../mkdocs/docs/api/basic_json/operator_lt.md | 96 + .../mkdocs/docs/api/basic_json/operator_ne.md | 98 + .../docs/api/basic_json/operator_spaceship.md | 100 + .../docs/api/basic_json/operator_value_t.md | 54 + .../mkdocs/docs/api/basic_json/other_error.md | 77 + .../docs/api/basic_json/out_of_range.md | 78 + .../docs/mkdocs/docs/api/basic_json/parse.md | 211 + .../mkdocs/docs/api/basic_json/parse_error.md | 86 + .../docs/api/basic_json/parse_event_t.md | 29 + .../docs/api/basic_json/parser_callback_t.md | 73 + .../docs/mkdocs/docs/api/basic_json/patch.md | 73 + .../docs/api/basic_json/patch_inplace.md | 70 + .../mkdocs/docs/api/basic_json/push_back.md | 120 + .../docs/mkdocs/docs/api/basic_json/rbegin.md | 42 + .../docs/mkdocs/docs/api/basic_json/rend.md | 43 + .../mkdocs/docs/api/basic_json/sax_parse.md | 115 + .../docs/mkdocs/docs/api/basic_json/size.md | 57 + .../mkdocs/docs/api/basic_json/start_pos.md | 68 + .../mkdocs/docs/api/basic_json/std_hash.md | 34 + .../mkdocs/docs/api/basic_json/std_swap.md | 51 + .../mkdocs/docs/api/basic_json/string_t.md | 66 + .../docs/mkdocs/docs/api/basic_json/swap.md | 157 + .../mkdocs/docs/api/basic_json/to_bjdata.md | 78 + .../mkdocs/docs/api/basic_json/to_bson.md | 59 + .../mkdocs/docs/api/basic_json/to_cbor.md | 61 + .../mkdocs/docs/api/basic_json/to_msgpack.md | 59 + .../mkdocs/docs/api/basic_json/to_string.md | 65 + .../mkdocs/docs/api/basic_json/to_ubjson.md | 70 + .../docs/mkdocs/docs/api/basic_json/type.md | 54 + .../mkdocs/docs/api/basic_json/type_error.md | 78 + .../mkdocs/docs/api/basic_json/type_name.md | 54 + .../mkdocs/docs/api/basic_json/unflatten.md | 61 + .../docs/mkdocs/docs/api/basic_json/update.md | 147 + .../docs/mkdocs/docs/api/basic_json/value.md | 183 + .../mkdocs/docs/api/basic_json/value_t.md | 81 + .../mkdocs/docs/api/basic_json/~basic_json.md | 21 + .../byte_container_with_subtype.md | 46 + .../clear_subtype.md | 36 + .../has_subtype.md | 39 + .../api/byte_container_with_subtype/index.md | 35 + .../set_subtype.md | 41 + .../byte_container_with_subtype/subtype.md | 42 + libs/json-3.12.0/docs/mkdocs/docs/api/json.md | 28 + .../docs/mkdocs/docs/api/json_pointer/back.md | 40 + .../mkdocs/docs/api/json_pointer/empty.md | 39 + .../mkdocs/docs/api/json_pointer/index.md | 52 + .../docs/api/json_pointer/json_pointer.md | 41 + .../docs/api/json_pointer/operator_eq.md | 113 + .../docs/api/json_pointer/operator_ne.md | 109 + .../docs/api/json_pointer/operator_slash.md | 64 + .../docs/api/json_pointer/operator_slasheq.md | 61 + .../api/json_pointer/operator_string_t.md | 52 + .../docs/api/json_pointer/parent_pointer.md | 35 + .../mkdocs/docs/api/json_pointer/pop_back.md | 35 + .../mkdocs/docs/api/json_pointer/push_back.md | 39 + .../mkdocs/docs/api/json_pointer/string_t.md | 28 + .../mkdocs/docs/api/json_pointer/to_string.md | 40 + .../docs/mkdocs/docs/api/json_sax/binary.md | 40 + .../docs/mkdocs/docs/api/json_sax/boolean.md | 36 + .../mkdocs/docs/api/json_sax/end_array.md | 31 + .../mkdocs/docs/api/json_sax/end_object.md | 31 + .../docs/mkdocs/docs/api/json_sax/index.md | 44 + .../docs/mkdocs/docs/api/json_sax/key.md | 40 + .../docs/mkdocs/docs/api/json_sax/null.md | 31 + .../mkdocs/docs/api/json_sax/number_float.md | 39 + .../docs/api/json_sax/number_integer.md | 36 + .../docs/api/json_sax/number_unsigned.md | 36 + .../mkdocs/docs/api/json_sax/parse_error.md | 44 + .../mkdocs/docs/api/json_sax/start_array.md | 40 + .../mkdocs/docs/api/json_sax/start_object.md | 40 + .../docs/mkdocs/docs/api/json_sax/string.md | 40 + .../docs/mkdocs/docs/api/macros/index.md | 83 + .../mkdocs/docs/api/macros/json_assert.md | 88 + .../api/macros/json_diagnostic_positions.md | 119 + .../docs/api/macros/json_diagnostics.md | 94 + .../macros/json_disable_enum_serialization.md | 154 + .../mkdocs/docs/api/macros/json_has_cpp_11.md | 41 + .../docs/api/macros/json_has_filesystem.md | 43 + .../mkdocs/docs/api/macros/json_has_ranges.md | 31 + .../docs/api/macros/json_has_static_rtti.md | 31 + .../macros/json_has_three_way_comparison.md | 32 + .../docs/mkdocs/docs/api/macros/json_no_io.md | 35 + .../docs/api/macros/json_noexception.md | 45 + .../macros/json_skip_library_version_check.md | 37 + .../json_skip_unsupported_compiler_check.md | 33 + .../mkdocs/docs/api/macros/json_throw_user.md | 75 + .../docs/api/macros/json_use_global_udls.md | 99 + .../macros/json_use_implicit_conversions.md | 60 + ...n_use_legacy_discarded_value_comparison.md | 81 + .../macros/nlohmann_define_derived_type.md | 177 + .../macros/nlohmann_define_type_intrusive.md | 170 + .../nlohmann_define_type_non_intrusive.md | 171 + .../api/macros/nlohmann_json_namespace.md | 41 + .../macros/nlohmann_json_namespace_begin.md | 61 + .../nlohmann_json_namespace_no_version.md | 45 + .../macros/nlohmann_json_serialize_enum.md | 85 + .../api/macros/nlohmann_json_version_major.md | 40 + .../docs/mkdocs/docs/api/operator_gtgt.md | 64 + .../mkdocs/docs/api/operator_literal_json.md | 61 + .../docs/api/operator_literal_json_pointer.md | 64 + .../docs/mkdocs/docs/api/operator_ltlt.md | 87 + .../docs/mkdocs/docs/api/ordered_json.md | 39 + .../docs/mkdocs/docs/api/ordered_map.md | 82 + .../mkdocs/docs/community/code_of_conduct.md | 1 + .../docs/community/contribution_guidelines.md | 1 + .../docs/mkdocs/docs/community/governance.md | 122 + .../docs/mkdocs/docs/community/index.md | 7 + .../docs/community/quality_assurance.md | 214 + .../mkdocs/docs/community/security_policy.md | 1 + .../docs/mkdocs/docs/css/custom.css | 4 + .../docs/mkdocs/docs/examples/README.cpp | 39 + .../docs/mkdocs/docs/examples/README.output | 27 + .../mkdocs/docs/examples/accept__string.cpp | 26 + .../docs/examples/accept__string.output | 1 + .../docs/mkdocs/docs/examples/array.cpp | 19 + .../docs/mkdocs/docs/examples/array.output | 4 + .../docs/mkdocs/docs/examples/array_t.cpp | 10 + .../docs/mkdocs/docs/examples/array_t.output | 1 + .../mkdocs/docs/examples/at__json_pointer.cpp | 103 + .../docs/examples/at__json_pointer.output | 12 + .../docs/examples/at__json_pointer_const.cpp | 80 + .../examples/at__json_pointer_const.output | 9 + .../docs/examples/at__keytype.c++17.cpp | 49 + .../docs/examples/at__keytype.c++17.output | 4 + .../docs/examples/at__keytype_const.c++17.cpp | 43 + .../examples/at__keytype_const.c++17.output | 3 + .../docs/examples/at__object_t_key_type.cpp | 47 + .../examples/at__object_t_key_type.output | 4 + .../examples/at__object_t_key_type_const.cpp | 41 + .../at__object_t_key_type_const.output | 3 + .../mkdocs/docs/examples/at__size_type.cpp | 42 + .../mkdocs/docs/examples/at__size_type.output | 4 + .../docs/examples/at__size_type_const.cpp | 36 + .../docs/examples/at__size_type_const.output | 3 + .../docs/mkdocs/docs/examples/back.cpp | 38 + .../docs/mkdocs/docs/examples/back.output | 7 + .../examples/basic_json__CompatibleType.cpp | 214 + .../basic_json__CompatibleType.output | 39 + .../examples/basic_json__InputIt_InputIt.cpp | 32 + .../basic_json__InputIt_InputIt.output | 4 + .../docs/examples/basic_json__basic_json.cpp | 17 + .../examples/basic_json__basic_json.output | 2 + .../examples/basic_json__copyassignment.cpp | 18 + .../basic_json__copyassignment.output | 2 + .../docs/examples/basic_json__list_init_t.cpp | 21 + .../examples/basic_json__list_init_t.output | 5 + .../examples/basic_json__moveconstructor.cpp | 17 + .../basic_json__moveconstructor.output | 2 + .../docs/examples/basic_json__nullptr_t.cpp | 16 + .../examples/basic_json__nullptr_t.output | 2 + .../basic_json__size_type_basic_json.cpp | 18 + .../basic_json__size_type_basic_json.output | 3 + .../docs/examples/basic_json__value_t.cpp | 25 + .../docs/examples/basic_json__value_t.output | 7 + .../docs/mkdocs/docs/examples/begin.cpp | 16 + .../docs/mkdocs/docs/examples/begin.output | 1 + .../docs/mkdocs/docs/examples/binary.cpp | 16 + .../docs/mkdocs/docs/examples/binary.output | 1 + .../docs/mkdocs/docs/examples/binary_t.cpp | 10 + .../docs/mkdocs/docs/examples/binary_t.output | 1 + .../docs/mkdocs/docs/examples/boolean_t.cpp | 10 + .../mkdocs/docs/examples/boolean_t.output | 1 + ...h_subtype__byte_container_with_subtype.cpp | 23 + ...ubtype__byte_container_with_subtype.output | 3 + ..._container_with_subtype__clear_subtype.cpp | 21 + ...ntainer_with_subtype__clear_subtype.output | 2 + ...te_container_with_subtype__has_subtype.cpp | 19 + ...container_with_subtype__has_subtype.output | 2 + ...te_container_with_subtype__set_subtype.cpp | 22 + ...container_with_subtype__set_subtype.output | 2 + .../byte_container_with_subtype__subtype.cpp | 22 + ...yte_container_with_subtype__subtype.output | 2 + .../docs/mkdocs/docs/examples/cbegin.cpp | 16 + .../docs/mkdocs/docs/examples/cbegin.output | 1 + .../docs/examples/cbor_tag_handler_t.cpp | 28 + .../docs/examples/cbor_tag_handler_t.output | 3 + .../docs/mkdocs/docs/examples/cend.cpp | 19 + .../docs/mkdocs/docs/examples/cend.output | 1 + .../docs/mkdocs/docs/examples/clear.cpp | 34 + .../docs/mkdocs/docs/examples/clear.output | 7 + .../docs/examples/contains__json_pointer.cpp | 43 + .../examples/contains__json_pointer.output | 7 + .../docs/examples/contains__keytype.c++17.cpp | 20 + .../examples/contains__keytype.c++17.output | 3 + .../examples/contains__object_t_key_type.cpp | 18 + .../contains__object_t_key_type.output | 3 + .../docs/examples/count__keytype.c++17.cpp | 20 + .../docs/examples/count__keytype.c++17.output | 2 + .../examples/count__object_t_key_type.cpp | 18 + .../examples/count__object_t_key_type.output | 2 + .../docs/mkdocs/docs/examples/crbegin.cpp | 16 + .../docs/mkdocs/docs/examples/crbegin.output | 1 + .../docs/mkdocs/docs/examples/crend.cpp | 19 + .../docs/mkdocs/docs/examples/crend.output | 1 + .../examples/default_object_comparator_t.cpp | 11 + .../default_object_comparator_t.output | 2 + .../docs/examples/diagnostic_positions.cpp | 51 + .../docs/examples/diagnostic_positions.output | 50 + .../diagnostic_positions_exception.cpp | 30 + .../diagnostic_positions_exception.output | 1 + .../docs/examples/diagnostics_extended.cpp | 22 + .../docs/examples/diagnostics_extended.output | 1 + .../diagnostics_extended_positions.cpp | 31 + .../diagnostics_extended_positions.output | 1 + .../docs/examples/diagnostics_standard.cpp | 20 + .../docs/examples/diagnostics_standard.output | 1 + .../docs/mkdocs/docs/examples/diff.cpp | 37 + .../docs/mkdocs/docs/examples/diff.output | 25 + .../docs/mkdocs/docs/examples/dump.cpp | 48 + .../docs/mkdocs/docs/examples/dump.output | 55 + .../docs/mkdocs/docs/examples/emplace.cpp | 31 + .../docs/mkdocs/docs/examples/emplace.output | 6 + .../mkdocs/docs/examples/emplace_back.cpp | 24 + .../mkdocs/docs/examples/emplace_back.output | 4 + .../docs/mkdocs/docs/examples/empty.cpp | 30 + .../docs/mkdocs/docs/examples/empty.output | 9 + .../docs/mkdocs/docs/examples/end.cpp | 19 + .../docs/mkdocs/docs/examples/end.output | 1 + .../docs/examples/erase__IteratorType.cpp | 31 + .../docs/examples/erase__IteratorType.output | 6 + .../erase__IteratorType_IteratorType.cpp | 31 + .../erase__IteratorType_IteratorType.output | 6 + .../docs/examples/erase__keytype.c++17.cpp | 20 + .../docs/examples/erase__keytype.c++17.output | 2 + .../examples/erase__object_t_key_type.cpp | 18 + .../examples/erase__object_t_key_type.output | 2 + .../mkdocs/docs/examples/erase__size_type.cpp | 16 + .../docs/examples/erase__size_type.output | 1 + .../mkdocs/docs/examples/error_handler_t.cpp | 24 + .../docs/examples/error_handler_t.output | 3 + .../docs/mkdocs/docs/examples/exception.cpp | 20 + .../mkdocs/docs/examples/exception.output | 2 + .../docs/examples/find__keytype.c++17.cpp | 22 + .../docs/examples/find__keytype.c++17.output | 3 + .../docs/examples/find__object_t_key_type.cpp | 20 + .../examples/find__object_t_key_type.output | 3 + .../docs/mkdocs/docs/examples/flatten.cpp | 32 + .../docs/mkdocs/docs/examples/flatten.output | 12 + .../docs/mkdocs/docs/examples/from_bjdata.cpp | 20 + .../mkdocs/docs/examples/from_bjdata.output | 4 + .../docs/mkdocs/docs/examples/from_bson.cpp | 21 + .../mkdocs/docs/examples/from_bson.output | 4 + .../docs/mkdocs/docs/examples/from_cbor.cpp | 20 + .../mkdocs/docs/examples/from_cbor.output | 4 + .../from_json__default_constructible.cpp | 37 + .../from_json__default_constructible.output | 1 + .../from_json__non_default_constructible.cpp | 53 + ...rom_json__non_default_constructible.output | 1 + .../mkdocs/docs/examples/from_msgpack.cpp | 20 + .../mkdocs/docs/examples/from_msgpack.output | 4 + .../docs/mkdocs/docs/examples/from_ubjson.cpp | 20 + .../mkdocs/docs/examples/from_ubjson.output | 4 + .../docs/mkdocs/docs/examples/front.cpp | 29 + .../docs/mkdocs/docs/examples/front.output | 6 + .../mkdocs/docs/examples/get__PointerType.cpp | 21 + .../docs/examples/get__PointerType.output | 2 + .../docs/examples/get__ValueType_const.cpp | 50 + .../docs/examples/get__ValueType_const.output | 11 + .../mkdocs/docs/examples/get_allocator.cpp | 18 + .../mkdocs/docs/examples/get_allocator.output | 1 + .../docs/mkdocs/docs/examples/get_binary.cpp | 16 + .../mkdocs/docs/examples/get_binary.output | 1 + .../docs/mkdocs/docs/examples/get_ptr.cpp | 21 + .../docs/mkdocs/docs/examples/get_ptr.output | 2 + .../docs/mkdocs/docs/examples/get_ref.cpp | 27 + .../docs/mkdocs/docs/examples/get_ref.output | 2 + .../docs/mkdocs/docs/examples/get_to.cpp | 59 + .../docs/mkdocs/docs/examples/get_to.output | 11 + .../docs/mkdocs/docs/examples/insert.cpp | 17 + .../docs/mkdocs/docs/examples/insert.output | 2 + .../mkdocs/docs/examples/insert__count.cpp | 17 + .../mkdocs/docs/examples/insert__count.output | 2 + .../mkdocs/docs/examples/insert__ilist.cpp | 17 + .../mkdocs/docs/examples/insert__ilist.output | 2 + .../mkdocs/docs/examples/insert__range.cpp | 20 + .../mkdocs/docs/examples/insert__range.output | 2 + .../docs/examples/insert__range_object.cpp | 21 + .../docs/examples/insert__range_object.output | 3 + .../mkdocs/docs/examples/invalid_iterator.cpp | 21 + .../docs/examples/invalid_iterator.output | 2 + .../docs/mkdocs/docs/examples/is_array.cpp | 30 + .../docs/mkdocs/docs/examples/is_array.output | 9 + .../docs/mkdocs/docs/examples/is_binary.cpp | 30 + .../mkdocs/docs/examples/is_binary.output | 9 + .../docs/mkdocs/docs/examples/is_boolean.cpp | 30 + .../mkdocs/docs/examples/is_boolean.output | 9 + .../mkdocs/docs/examples/is_discarded.cpp | 30 + .../mkdocs/docs/examples/is_discarded.output | 9 + .../docs/mkdocs/docs/examples/is_null.cpp | 30 + .../docs/mkdocs/docs/examples/is_null.output | 9 + .../docs/mkdocs/docs/examples/is_number.cpp | 30 + .../mkdocs/docs/examples/is_number.output | 9 + .../mkdocs/docs/examples/is_number_float.cpp | 30 + .../docs/examples/is_number_float.output | 9 + .../docs/examples/is_number_integer.cpp | 30 + .../docs/examples/is_number_integer.output | 9 + .../docs/examples/is_number_unsigned.cpp | 30 + .../docs/examples/is_number_unsigned.output | 9 + .../docs/mkdocs/docs/examples/is_object.cpp | 30 + .../mkdocs/docs/examples/is_object.output | 9 + .../mkdocs/docs/examples/is_primitive.cpp | 30 + .../mkdocs/docs/examples/is_primitive.output | 9 + .../docs/mkdocs/docs/examples/is_string.cpp | 30 + .../mkdocs/docs/examples/is_string.output | 9 + .../mkdocs/docs/examples/is_structured.cpp | 30 + .../mkdocs/docs/examples/is_structured.output | 9 + .../docs/mkdocs/docs/examples/items.cpp | 23 + .../docs/mkdocs/docs/examples/items.output | 7 + .../docs/examples/json_base_class_t.cpp | 88 + .../docs/examples/json_base_class_t.output | 4 + .../docs/mkdocs/docs/examples/json_lines.cpp | 22 + .../mkdocs/docs/examples/json_lines.output | 4 + .../mkdocs/docs/examples/json_pointer.cpp | 47 + .../mkdocs/docs/examples/json_pointer.output | 3 + .../docs/examples/json_pointer__back.cpp | 15 + .../docs/examples/json_pointer__back.output | 2 + .../docs/examples/json_pointer__empty.cpp | 20 + .../docs/examples/json_pointer__empty.output | 4 + .../json_pointer__operator__equal.cpp | 19 + .../json_pointer__operator__equal.output | 4 + ...on_pointer__operator__equal_stringtype.cpp | 33 + ...pointer__operator__equal_stringtype.output | 4 + .../json_pointer__operator__notequal.cpp | 19 + .../json_pointer__operator__notequal.output | 4 + ...pointer__operator__notequal_stringtype.cpp | 32 + ...nter__operator__notequal_stringtype.output | 4 + .../examples/json_pointer__operator_add.cpp | 23 + .../json_pointer__operator_add.output | 4 + .../json_pointer__operator_add_binary.cpp | 19 + .../json_pointer__operator_add_binary.output | 3 + .../json_pointer__operator_string_t.cpp | 19 + .../json_pointer__operator_string_t.output | 2 + .../examples/json_pointer__parent_pointer.cpp | 18 + .../json_pointer__parent_pointer.output | 3 + .../docs/examples/json_pointer__pop_back.cpp | 21 + .../examples/json_pointer__pop_back.output | 4 + .../docs/examples/json_pointer__push_back.cpp | 21 + .../examples/json_pointer__push_back.output | 4 + .../docs/examples/json_pointer__string_t.cpp | 13 + .../examples/json_pointer__string_t.output | 2 + .../docs/examples/json_pointer__to_string.cpp | 34 + .../examples/json_pointer__to_string.output | 12 + .../docs/mkdocs/docs/examples/max_size.cpp | 25 + .../docs/mkdocs/docs/examples/max_size.output | 7 + .../docs/mkdocs/docs/examples/merge_patch.cpp | 41 + .../mkdocs/docs/examples/merge_patch.output | 11 + .../docs/mkdocs/docs/examples/meta.cpp | 11 + .../docs/mkdocs/docs/examples/meta.output | 17 + ...nn_define_derived_type_intrusive_macro.cpp | 37 + ...define_derived_type_intrusive_macro.output | 6 + ...lohmann_define_type_intrusive_explicit.cpp | 62 + ...mann_define_type_intrusive_explicit.output | 2 + .../nlohmann_define_type_intrusive_macro.cpp | 48 + ...lohmann_define_type_intrusive_macro.output | 2 + ...type_intrusive_only_serialize_explicit.cpp | 39 + ...e_intrusive_only_serialize_explicit.output | 1 + ...ne_type_intrusive_only_serialize_macro.cpp | 33 + ...type_intrusive_only_serialize_macro.output | 1 + ...e_type_intrusive_with_default_explicit.cpp | 57 + ...ype_intrusive_with_default_explicit.output | 2 + ...fine_type_intrusive_with_default_macro.cpp | 42 + ...e_type_intrusive_with_default_macro.output | 2 + ...ann_define_type_non_intrusive_explicit.cpp | 55 + ..._define_type_non_intrusive_explicit.output | 2 + ...ohmann_define_type_non_intrusive_macro.cpp | 41 + ...ann_define_type_non_intrusive_macro.output | 2 + ..._non_intrusive_only_serialize_explicit.cpp | 32 + ...n_intrusive_only_serialize_explicit.output | 1 + ...ype_non_intrusive_only_serialize_macro.cpp | 26 + ..._non_intrusive_only_serialize_macro.output | 1 + ...pe_non_intrusive_with_default_explicit.cpp | 55 + ...non_intrusive_with_default_explicit.output | 2 + ..._type_non_intrusive_with_default_macro.cpp | 40 + ...pe_non_intrusive_with_default_macro.output | 2 + .../docs/examples/nlohmann_json_namespace.cpp | 14 + .../examples/nlohmann_json_namespace.output | 1 + .../nlohmann_json_namespace_begin.c++17.cpp | 33 + ...nlohmann_json_namespace_begin.c++17.output | 1 + .../nlohmann_json_namespace_no_version.cpp | 13 + .../nlohmann_json_namespace_no_version.output | 1 + .../examples/nlohmann_json_serialize_enum.cpp | 59 + .../nlohmann_json_serialize_enum.output | 3 + .../nlohmann_json_serialize_enum_2.cpp | 33 + .../nlohmann_json_serialize_enum_2.output | 3 + .../docs/examples/nlohmann_json_version.cpp | 12 + .../examples/nlohmann_json_version.output | 1 + .../mkdocs/docs/examples/number_float_t.cpp | 10 + .../docs/examples/number_float_t.output | 1 + .../mkdocs/docs/examples/number_integer_t.cpp | 10 + .../docs/examples/number_integer_t.output | 1 + .../docs/examples/number_unsigned_t.cpp | 10 + .../docs/examples/number_unsigned_t.output | 1 + .../docs/mkdocs/docs/examples/object.cpp | 28 + .../docs/mkdocs/docs/examples/object.output | 4 + .../docs/examples/object_comparator_t.cpp | 11 + .../docs/examples/object_comparator_t.output | 2 + .../docs/mkdocs/docs/examples/object_t.cpp | 10 + .../docs/mkdocs/docs/examples/object_t.output | 1 + .../docs/examples/operator__ValueType.cpp | 60 + .../docs/examples/operator__ValueType.output | 12 + .../mkdocs/docs/examples/operator__equal.cpp | 24 + .../docs/examples/operator__equal.output | 4 + .../examples/operator__equal__nullptr_t.cpp | 22 + .../operator__equal__nullptr_t.output | 5 + .../operator__equal__specializations.cpp | 16 + .../operator__equal__specializations.output | 2 + .../docs/examples/operator__greater.cpp | 24 + .../docs/examples/operator__greater.output | 4 + .../docs/examples/operator__greaterequal.cpp | 24 + .../examples/operator__greaterequal.output | 4 + .../mkdocs/docs/examples/operator__less.cpp | 24 + .../docs/examples/operator__less.output | 4 + .../docs/examples/operator__lessequal.cpp | 24 + .../docs/examples/operator__lessequal.output | 4 + .../docs/examples/operator__notequal.cpp | 24 + .../docs/examples/operator__notequal.output | 4 + .../operator__notequal__nullptr_t.cpp | 22 + .../operator__notequal__nullptr_t.output | 5 + .../docs/examples/operator__value_t.cpp | 38 + .../docs/examples/operator__value_t.output | 8 + .../examples/operator_array__json_pointer.cpp | 49 + .../operator_array__json_pointer.output | 8 + .../operator_array__json_pointer_const.cpp | 25 + .../operator_array__json_pointer_const.output | 4 + .../operator_array__keytype.c++17.cpp | 34 + .../operator_array__keytype.c++17.output | 19 + .../operator_array__keytype_const.c++17.cpp | 18 + ...operator_array__keytype_const.c++17.output | 1 + .../operator_array__object_t_key_type.cpp | 32 + .../operator_array__object_t_key_type.output | 19 + ...perator_array__object_t_key_type_const.cpp | 16 + ...ator_array__object_t_key_type_const.output | 1 + .../examples/operator_array__size_type.cpp | 25 + .../examples/operator_array__size_type.output | 3 + .../operator_array__size_type_const.cpp | 13 + .../operator_array__size_type_const.output | 1 + .../docs/examples/operator_deserialize.cpp | 26 + .../docs/examples/operator_deserialize.output | 13 + .../docs/examples/operator_literal_json.cpp | 13 + .../examples/operator_literal_json.output | 4 + .../operator_literal_json_pointer.cpp | 14 + .../operator_literal_json_pointer.output | 1 + .../examples/operator_ltlt__basic_json.cpp | 21 + .../examples/operator_ltlt__basic_json.output | 22 + .../examples/operator_ltlt__json_pointer.cpp | 13 + .../operator_ltlt__json_pointer.output | 1 + ...rator_spaceship__const_reference.c++20.cpp | 40 + ...or_spaceship__const_reference.c++20.output | 4 + .../operator_spaceship__scalartype.c++20.cpp | 40 + ...perator_spaceship__scalartype.c++20.output | 4 + .../mkdocs/docs/examples/ordered_json.cpp | 14 + .../mkdocs/docs/examples/ordered_json.output | 5 + .../docs/mkdocs/docs/examples/ordered_map.cpp | 43 + .../mkdocs/docs/examples/ordered_map.output | 4 + .../docs/mkdocs/docs/examples/other_error.cpp | 30 + .../mkdocs/docs/examples/other_error.output | 2 + .../mkdocs/docs/examples/out_of_range.cpp | 20 + .../mkdocs/docs/examples/out_of_range.output | 2 + .../docs/examples/parse__allow_exceptions.cpp | 36 + .../examples/parse__allow_exceptions.output | 2 + .../parse__array__parser_callback_t.cpp | 30 + .../parse__array__parser_callback_t.output | 20 + ...contiguouscontainer__parser_callback_t.cpp | 15 + ...tiguouscontainer__parser_callback_t.output | 6 + .../parse__istream__parser_callback_t.cpp | 57 + .../parse__istream__parser_callback_t.output | 34 + .../docs/examples/parse__iterator_pair.cpp | 15 + .../docs/examples/parse__iterator_pair.link | 1 + .../docs/examples/parse__iterator_pair.output | 6 + .../mkdocs/docs/examples/parse__pointers.cpp | 15 + .../mkdocs/docs/examples/parse__pointers.link | 1 + .../docs/examples/parse__pointers.output | 6 + .../parse__string__parser_callback_t.cpp | 48 + .../parse__string__parser_callback_t.output | 34 + .../docs/mkdocs/docs/examples/parse_error.cpp | 20 + .../mkdocs/docs/examples/parse_error.output | 3 + .../docs/mkdocs/docs/examples/patch.cpp | 33 + .../docs/mkdocs/docs/examples/patch.output | 11 + .../mkdocs/docs/examples/patch_inplace.cpp | 35 + .../mkdocs/docs/examples/patch_inplace.output | 13 + .../docs/mkdocs/docs/examples/push_back.cpp | 25 + .../mkdocs/docs/examples/push_back.output | 4 + .../examples/push_back__initializer_list.cpp | 27 + .../push_back__initializer_list.output | 4 + .../examples/push_back__object_t__value.cpp | 25 + .../push_back__object_t__value.output | 4 + .../docs/mkdocs/docs/examples/rbegin.cpp | 16 + .../docs/mkdocs/docs/examples/rbegin.output | 1 + .../docs/mkdocs/docs/examples/rend.cpp | 19 + .../docs/mkdocs/docs/examples/rend.output | 1 + .../docs/mkdocs/docs/examples/sax_parse.cpp | 131 + .../mkdocs/docs/examples/sax_parse.output | 37 + .../docs/examples/sax_parse__binary.cpp | 114 + .../docs/examples/sax_parse__binary.output | 3 + .../docs/mkdocs/docs/examples/size.cpp | 29 + .../docs/mkdocs/docs/examples/size.output | 9 + .../docs/mkdocs/docs/examples/std_hash.cpp | 19 + .../docs/mkdocs/docs/examples/std_hash.output | 8 + .../docs/mkdocs/docs/examples/std_swap.cpp | 19 + .../docs/mkdocs/docs/examples/std_swap.output | 2 + .../docs/mkdocs/docs/examples/string_t.cpp | 10 + .../docs/mkdocs/docs/examples/string_t.output | 1 + .../mkdocs/docs/examples/swap__array_t.cpp | 20 + .../mkdocs/docs/examples/swap__array_t.output | 2 + .../mkdocs/docs/examples/swap__binary_t.cpp | 20 + .../docs/examples/swap__binary_t.output | 2 + .../mkdocs/docs/examples/swap__object_t.cpp | 20 + .../docs/examples/swap__object_t.output | 2 + .../mkdocs/docs/examples/swap__reference.cpp | 18 + .../docs/examples/swap__reference.output | 2 + .../mkdocs/docs/examples/swap__string_t.cpp | 20 + .../docs/examples/swap__string_t.output | 2 + .../docs/mkdocs/docs/examples/to_bjdata.cpp | 64 + .../mkdocs/docs/examples/to_bjdata.output | 4 + .../docs/mkdocs/docs/examples/to_bson.cpp | 22 + .../docs/mkdocs/docs/examples/to_bson.output | 1 + .../docs/mkdocs/docs/examples/to_cbor.cpp | 22 + .../docs/mkdocs/docs/examples/to_cbor.output | 1 + .../docs/mkdocs/docs/examples/to_json.cpp | 32 + .../docs/mkdocs/docs/examples/to_json.output | 1 + .../docs/mkdocs/docs/examples/to_msgpack.cpp | 22 + .../mkdocs/docs/examples/to_msgpack.output | 1 + .../docs/mkdocs/docs/examples/to_string.cpp | 20 + .../mkdocs/docs/examples/to_string.output | 3 + .../docs/mkdocs/docs/examples/to_ubjson.cpp | 64 + .../mkdocs/docs/examples/to_ubjson.output | 4 + .../docs/mkdocs/docs/examples/type.cpp | 28 + .../docs/mkdocs/docs/examples/type.output | 8 + .../docs/mkdocs/docs/examples/type_error.cpp | 20 + .../mkdocs/docs/examples/type_error.output | 2 + .../docs/mkdocs/docs/examples/type_name.cpp | 27 + .../mkdocs/docs/examples/type_name.output | 8 + .../docs/mkdocs/docs/examples/unflatten.cpp | 26 + .../mkdocs/docs/examples/unflatten.output | 18 + .../docs/mkdocs/docs/examples/update.cpp | 24 + .../docs/mkdocs/docs/examples/update.output | 17 + .../mkdocs/docs/examples/update__range.cpp | 24 + .../mkdocs/docs/examples/update__range.output | 17 + .../mkdocs/docs/examples/value__json_ptr.cpp | 31 + .../docs/examples/value__json_ptr.output | 1 + .../docs/examples/value__keytype.c++17.cpp | 32 + .../docs/examples/value__keytype.c++17.output | 1 + .../examples/value__object_t_key_type.cpp | 30 + .../examples/value__object_t_key_type.output | 1 + .../docs/examples/value__return_type.cpp | 14 + .../docs/examples/value__return_type.output | 4 + .../mkdocs/docs/features/arbitrary_types.md | 294 + .../docs/mkdocs/docs/features/assertions.md | 144 + .../docs/features/binary_formats/bjdata.md | 206 + .../docs/features/binary_formats/bson.md | 97 + .../docs/features/binary_formats/cbor.md | 181 + .../docs/features/binary_formats/index.md | 52 + .../features/binary_formats/messagepack.md | 143 + .../docs/features/binary_formats/ubjson.md | 126 + .../mkdocs/docs/features/binary_values.md | 374 + .../docs/mkdocs/docs/features/comments.md | 83 + .../features/element_access/checked_access.md | 91 + .../features/element_access/default_value.md | 63 + .../docs/features/element_access/index.md | 9 + .../element_access/unchecked_access.md | 112 + .../mkdocs/docs/features/enum_conversion.md | 61 + .../docs/mkdocs/docs/features/iterators.md | 155 + .../docs/mkdocs/docs/features/json_patch.md | 47 + .../docs/mkdocs/docs/features/json_pointer.md | 126 + .../docs/mkdocs/docs/features/macros.md | 135 + .../docs/mkdocs/docs/features/merge_patch.md | 20 + .../docs/mkdocs/docs/features/namespace.md | 94 + .../docs/mkdocs/docs/features/object_order.md | 109 + .../mkdocs/docs/features/parsing/index.md | 13 + .../docs/features/parsing/json_lines.md | 49 + .../docs/features/parsing/parse_exceptions.md | 121 + .../docs/features/parsing/parser_callbacks.md | 83 + .../docs/features/parsing/sax_interface.md | 76 + .../docs/mkdocs/docs/features/types/index.md | 271 + .../docs/features/types/number_handling.md | 328 + .../docs/mkdocs/docs/home/architecture.md | 124 + .../docs/mkdocs/docs/home/customers.md | 163 + .../docs/mkdocs/docs/home/design_goals.md | 17 + .../docs/mkdocs/docs/home/exceptions.md | 902 + libs/json-3.12.0/docs/mkdocs/docs/home/faq.md | 180 + .../docs/mkdocs/docs/home/license.md | 21 + .../docs/mkdocs/docs/home/releases.md | 1225 + .../docs/mkdocs/docs/home/sponsors.md | 19 + .../mkdocs/docs/images/callback_events.png | Bin 0 -> 46039 bytes .../docs/mkdocs/docs/images/customers.png | Bin 0 -> 1020636 bytes .../docs/mkdocs/docs/images/json.gif | Bin 0 -> 1652796 bytes .../mkdocs/docs/images/json_syntax_number.png | Bin 0 -> 37014 bytes .../docs/images/package_managers/CPM.png | Bin 0 -> 15910 bytes .../docs/images/package_managers/bazel.svg | 11 + .../docs/images/package_managers/conan.svg | 16 + .../docs/images/package_managers/conda.svg | 1 + .../docs/images/package_managers/homebrew.svg | 22 + .../docs/images/package_managers/macports.svg | 81 + .../docs/images/package_managers/meson.svg | 2 + .../docs/images/package_managers/nuget.svg | 21 + .../docs/images/package_managers/spack.svg | 61 + .../docs/images/package_managers/swift.svg | 1 + .../docs/images/package_managers/vcpkg.png | Bin 0 -> 11393 bytes .../docs/images/package_managers/xmake.svg | 60 + .../mkdocs/docs/images/range-begin-end.svg | 435 + .../mkdocs/docs/images/range-rbegin-rend.svg | 1232 + libs/json-3.12.0/docs/mkdocs/docs/index.md | 3 + .../docs/mkdocs/docs/integration/bazel/BUILD | 5 + .../docs/integration/bazel/MODULE.bazel | 1 + .../mkdocs/docs/integration/bazel/example.cpp | 10 + .../docs/integration/cget/CMakeLists.txt | 7 + .../mkdocs/docs/integration/cget/example.cpp | 10 + .../docs/mkdocs/docs/integration/cmake.md | 178 + .../docs/integration/conan/CMakeLists.txt | 7 + .../docs/integration/conan/Conanfile.txt | 6 + .../mkdocs/docs/integration/conan/example.cpp | 10 + .../mkdocs/docs/integration/conda/example.cpp | 10 + .../docs/integration/cpm/CMakeLists.txt | 9 + .../mkdocs/docs/integration/cpm/example.cpp | 10 + .../docs/mkdocs/docs/integration/example.cpp | 10 + .../docs/integration/homebrew/CMakeLists.txt | 7 + .../docs/integration/homebrew/example.cpp | 10 + .../docs/integration/hunter/CMakeLists.txt | 15 + .../docs/integration/hunter/example.cpp | 10 + .../docs/mkdocs/docs/integration/index.md | 18 + .../docs/integration/macports/CMakeLists.txt | 7 + .../docs/integration/macports/example.cpp | 10 + .../mkdocs/docs/integration/meson/example.cpp | 10 + .../mkdocs/docs/integration/meson/meson.build | 12 + .../docs/integration/migration_guide.md | 264 + .../nuget/nuget-package-content.png | Bin 0 -> 19422 bytes .../nuget/nuget-project-changes.png | Bin 0 -> 30826 bytes .../nuget/nuget-project-makefile.png | Bin 0 -> 55236 bytes .../nuget/nuget-search-package.png | Bin 0 -> 96734 bytes .../nuget/nuget-select-package.png | Bin 0 -> 157311 bytes .../docs/integration/package_managers.md | 826 + .../mkdocs/docs/integration/pkg-config.md | 13 + .../docs/integration/spack/CMakeLists.txt | 7 + .../mkdocs/docs/integration/spack/example.cpp | 10 + .../docs/integration/vcpkg/CMakeLists.txt | 7 + .../mkdocs/docs/integration/vcpkg/example.cpp | 10 + .../mkdocs/docs/integration/xmake/example.cpp | 10 + .../mkdocs/docs/integration/xmake/xmake.lua | 8 + .../docs/mkdocs/includes/glossary.md | 36 + libs/json-3.12.0/docs/mkdocs/mkdocs.yml | 380 + libs/json-3.12.0/docs/mkdocs/requirements.txt | 11 + .../docs/mkdocs/scripts/check_structure.py | 222 + .../include/nlohmann/adl_serializer.hpp | 55 + .../nlohmann/byte_container_with_subtype.hpp | 103 + .../include/nlohmann/detail/abi_macros.hpp | 111 + .../nlohmann/detail/conversions/from_json.hpp | 577 + .../nlohmann/detail/conversions/to_chars.hpp | 1118 + .../nlohmann/detail/conversions/to_json.hpp | 479 + .../include/nlohmann/detail/exceptions.hpp | 291 + .../include/nlohmann/detail/hash.hpp | 129 + .../nlohmann/detail/input/binary_reader.hpp | 3068 ++ .../nlohmann/detail/input/input_adapters.hpp | 549 + .../nlohmann/detail/input/json_sax.hpp | 986 + .../include/nlohmann/detail/input/lexer.hpp | 1643 + .../include/nlohmann/detail/input/parser.hpp | 519 + .../nlohmann/detail/input/position_t.hpp | 37 + .../detail/iterators/internal_iterator.hpp | 35 + .../nlohmann/detail/iterators/iter_impl.hpp | 760 + .../detail/iterators/iteration_proxy.hpp | 235 + .../detail/iterators/iterator_traits.hpp | 61 + .../iterators/json_reverse_iterator.hpp | 130 + .../detail/iterators/primitive_iterator.hpp | 132 + .../detail/json_custom_base_class.hpp | 39 + .../include/nlohmann/detail/json_pointer.hpp | 988 + .../include/nlohmann/detail/json_ref.hpp | 78 + .../include/nlohmann/detail/macro_scope.hpp | 595 + .../include/nlohmann/detail/macro_unscope.hpp | 46 + .../nlohmann/detail/meta/call_std/begin.hpp | 17 + .../nlohmann/detail/meta/call_std/end.hpp | 17 + .../nlohmann/detail/meta/cpp_future.hpp | 171 + .../include/nlohmann/detail/meta/detected.hpp | 70 + .../nlohmann/detail/meta/identity_tag.hpp | 21 + .../include/nlohmann/detail/meta/is_sax.hpp | 159 + .../include/nlohmann/detail/meta/std_fs.hpp | 29 + .../nlohmann/detail/meta/type_traits.hpp | 795 + .../include/nlohmann/detail/meta/void_t.hpp | 24 + .../nlohmann/detail/output/binary_writer.hpp | 1850 ++ .../detail/output/output_adapters.hpp | 147 + .../nlohmann/detail/output/serializer.hpp | 988 + .../include/nlohmann/detail/string_concat.hpp | 146 + .../include/nlohmann/detail/string_escape.hpp | 72 + .../include/nlohmann/detail/string_utils.hpp | 37 + .../include/nlohmann/detail/value_t.hpp | 118 + libs/json-3.12.0/include/nlohmann/json.hpp | 5306 ++++ .../json-3.12.0/include/nlohmann/json_fwd.hpp | 75 + .../include/nlohmann/ordered_map.hpp | 359 + .../nlohmann/thirdparty/hedley/hedley.hpp | 2045 ++ .../thirdparty/hedley/hedley_undef.hpp | 158 + libs/json-3.12.0/meson.build | 24 + libs/json-3.12.0/nlohmann_json.natvis | 278 + .../single_include/nlohmann/json.hpp | 25526 +++++++++++++++ .../single_include/nlohmann/json_fwd.hpp | 187 + libs/json-3.12.0/tests/CMakeLists.txt | 197 + libs/json-3.12.0/tests/Makefile | 32 + libs/json-3.12.0/tests/abi/CMakeLists.txt | 30 + .../tests/abi/config/CMakeLists.txt | 22 + libs/json-3.12.0/tests/abi/config/config.hpp | 35 + libs/json-3.12.0/tests/abi/config/custom.cpp | 33 + libs/json-3.12.0/tests/abi/config/default.cpp | 45 + .../tests/abi/config/noversion.cpp | 44 + .../json-3.12.0/tests/abi/diag/CMakeLists.txt | 19 + libs/json-3.12.0/tests/abi/diag/diag.cpp | 29 + libs/json-3.12.0/tests/abi/diag/diag.hpp | 20 + libs/json-3.12.0/tests/abi/diag/diag_off.cpp | 30 + libs/json-3.12.0/tests/abi/diag/diag_on.cpp | 30 + .../abi/include/nlohmann/json_v3_10_5.hpp | 22091 +++++++++++++ .../tests/abi/inline_ns/CMakeLists.txt | 12 + .../tests/abi/inline_ns/use_current.cpp | 36 + .../tests/abi/inline_ns/use_v3_10_5.cpp | 22 + libs/json-3.12.0/tests/abi/main.cpp | 10 + .../tests/benchmarks/CMakeLists.txt | 34 + .../tests/benchmarks/src/benchmarks.cpp | 217 + .../cmake_add_subdirectory/CMakeLists.txt | 18 + .../project/CMakeLists.txt | 20 + .../cmake_add_subdirectory/project/main.cpp | 16 + .../tests/cmake_fetch_content/CMakeLists.txt | 20 + .../project/CMakeLists.txt | 20 + .../cmake_fetch_content/project/main.cpp | 16 + .../tests/cmake_fetch_content2/CMakeLists.txt | 20 + .../project/CMakeLists.txt | 15 + .../cmake_fetch_content2/project/main.cpp | 16 + .../tests/cmake_import/CMakeLists.txt | 19 + .../tests/cmake_import/project/CMakeLists.txt | 12 + .../tests/cmake_import/project/main.cpp | 16 + .../tests/cmake_import_minver/CMakeLists.txt | 19 + .../project/CMakeLists.txt | 8 + .../cmake_import_minver/project/main.cpp | 16 + .../CMakeLists.txt | 18 + .../project/Bar.cpp | 11 + .../project/Bar.hpp | 12 + .../project/CMakeLists.txt | 21 + .../project/Foo.cpp | 11 + .../project/Foo.hpp | 12 + .../project/main.cpp | 16 + .../tests/cuda_example/CMakeLists.txt | 10 + .../tests/cuda_example/json_cuda.cu | 19 + libs/json-3.12.0/tests/fuzzing.md | 81 + .../reports/2016-08-29-fuzz/exec_speed.png | Bin 0 -> 28144 bytes .../tests/reports/2016-08-29-fuzz/fuzz.tiff | Bin 0 -> 235588 bytes .../reports/2016-08-29-fuzz/high_freq.png | Bin 0 -> 26251 bytes .../tests/reports/2016-08-29-fuzz/index.html | 10 + .../reports/2016-08-29-fuzz/low_freq.png | Bin 0 -> 11752 bytes .../2016-09-09-nativejson_benchmark/README.md | 31 + .../conformance_Nlohmann (C++11).md | 670 + .../conformance_overall_Result.png | Bin 0 -> 169617 bytes ..._mac64_clang7.0_1._Parse_Memory_(byte).png | Bin 0 -> 196128 bytes ...0GHz_mac64_clang7.0_1._Parse_Time_(ms).png | Bin 0 -> 149308 bytes ..._mac64_clang7.0_2._Stringify_Time_(ms).png | Bin 0 -> 139615 bytes ...z_mac64_clang7.0_3._Prettify_Time_(ms).png | Bin 0 -> 100027 bytes ..._clang7.0_7._Code_size_FileSize_(byte).png | Bin 0 -> 186055 bytes .../reports/2016-10-02-fuzz/exec_speed.png | Bin 0 -> 31420 bytes .../tests/reports/2016-10-02-fuzz/fuzz.tiff | Bin 0 -> 264782 bytes .../reports/2016-10-02-fuzz/high_freq.png | Bin 0 -> 23019 bytes .../tests/reports/2016-10-02-fuzz/index.html | 10 + .../reports/2016-10-02-fuzz/low_freq.png | Bin 0 -> 14234 bytes .../tests/src/fuzzer-driver_afl.cpp | 39 + .../tests/src/fuzzer-parse_bjdata.cpp | 85 + .../tests/src/fuzzer-parse_bson.cpp | 74 + .../tests/src/fuzzer-parse_cbor.cpp | 69 + .../tests/src/fuzzer-parse_json.cpp | 70 + .../tests/src/fuzzer-parse_msgpack.cpp | 69 + .../tests/src/fuzzer-parse_ubjson.cpp | 85 + .../tests/src/make_test_data_available.hpp | 31 + libs/json-3.12.0/tests/src/test_utils.hpp | 33 + libs/json-3.12.0/tests/src/unit-32bit.cpp | 134 + .../json-3.12.0/tests/src/unit-algorithms.cpp | 365 + libs/json-3.12.0/tests/src/unit-allocator.cpp | 263 + .../json-3.12.0/tests/src/unit-alt-string.cpp | 370 + .../tests/src/unit-assert_macro.cpp | 48 + .../tests/src/unit-binary_formats.cpp | 211 + libs/json-3.12.0/tests/src/unit-bjdata.cpp | 3713 +++ libs/json-3.12.0/tests/src/unit-bson.cpp | 1296 + .../src/unit-byte_container_with_subtype.cpp | 76 + libs/json-3.12.0/tests/src/unit-capacity.cpp | 542 + libs/json-3.12.0/tests/src/unit-cbor.cpp | 2704 ++ .../tests/src/unit-class_const_iterator.cpp | 393 + .../tests/src/unit-class_iterator.cpp | 468 + .../tests/src/unit-class_lexer.cpp | 226 + .../tests/src/unit-class_parser.cpp | 1691 + ...unit-class_parser_diagnostic_positions.cpp | 1957 ++ .../json-3.12.0/tests/src/unit-comparison.cpp | 596 + libs/json-3.12.0/tests/src/unit-concepts.cpp | 149 + .../tests/src/unit-constructor1.cpp | 1581 + .../tests/src/unit-constructor2.cpp | 186 + .../tests/src/unit-convenience.cpp | 205 + .../tests/src/unit-conversions.cpp | 1753 ++ .../tests/src/unit-custom-base-class.cpp | 335 + .../tests/src/unit-deserialization.cpp | 1191 + .../src/unit-diagnostic-positions-only.cpp | 44 + .../tests/src/unit-diagnostic-positions.cpp | 40 + .../tests/src/unit-diagnostics.cpp | 265 + .../tests/src/unit-disabled_exceptions.cpp | 51 + .../tests/src/unit-element_access1.cpp | 880 + .../tests/src/unit-element_access2.cpp | 1792 ++ libs/json-3.12.0/tests/src/unit-hash.cpp | 113 + .../json-3.12.0/tests/src/unit-inspection.cpp | 459 + libs/json-3.12.0/tests/src/unit-items.cpp | 1433 + .../json-3.12.0/tests/src/unit-iterators1.cpp | 1630 + .../json-3.12.0/tests/src/unit-iterators2.cpp | 971 + .../json-3.12.0/tests/src/unit-iterators3.cpp | 35 + .../json-3.12.0/tests/src/unit-json_patch.cpp | 1336 + .../tests/src/unit-json_pointer.cpp | 791 + .../json-3.12.0/tests/src/unit-large_json.cpp | 29 + .../json-3.12.0/tests/src/unit-locale-cpp.cpp | 161 + .../tests/src/unit-merge_patch.cpp | 244 + libs/json-3.12.0/tests/src/unit-meta.cpp | 36 + libs/json-3.12.0/tests/src/unit-modifiers.cpp | 952 + libs/json-3.12.0/tests/src/unit-msgpack.cpp | 1882 ++ .../src/unit-no-mem-leak-on-adl-serialize.cpp | 86 + libs/json-3.12.0/tests/src/unit-noexcept.cpp | 83 + .../tests/src/unit-ordered_json.cpp | 71 + .../tests/src/unit-ordered_map.cpp | 310 + .../tests/src/unit-pointer_access.cpp | 479 + libs/json-3.12.0/tests/src/unit-readme.cpp | 304 + .../tests/src/unit-reference_access.cpp | 247 + .../tests/src/unit-regression1.cpp | 1530 + .../tests/src/unit-regression2.cpp | 1042 + .../tests/src/unit-serialization.cpp | 297 + .../json-3.12.0/tests/src/unit-testsuites.cpp | 1392 + libs/json-3.12.0/tests/src/unit-to_chars.cpp | 516 + .../tests/src/unit-type_traits.cpp | 56 + libs/json-3.12.0/tests/src/unit-ubjson.cpp | 2547 ++ libs/json-3.12.0/tests/src/unit-udl.cpp | 57 + libs/json-3.12.0/tests/src/unit-udt.cpp | 904 + libs/json-3.12.0/tests/src/unit-udt_macro.cpp | 709 + libs/json-3.12.0/tests/src/unit-unicode1.cpp | 620 + libs/json-3.12.0/tests/src/unit-unicode2.cpp | 610 + libs/json-3.12.0/tests/src/unit-unicode3.cpp | 324 + libs/json-3.12.0/tests/src/unit-unicode4.cpp | 324 + libs/json-3.12.0/tests/src/unit-unicode5.cpp | 324 + .../tests/src/unit-user_defined_input.cpp | 130 + libs/json-3.12.0/tests/src/unit-windows_h.cpp | 23 + libs/json-3.12.0/tests/src/unit-wstring.cpp | 99 + libs/json-3.12.0/tests/src/unit.cpp | 10 + .../tests/thirdparty/Fuzzer/CMakeLists.txt | 45 + .../tests/thirdparty/Fuzzer/FuzzerCorpus.h | 217 + .../thirdparty/Fuzzer/FuzzerCrossOver.cpp | 52 + .../tests/thirdparty/Fuzzer/FuzzerDefs.h | 89 + .../thirdparty/Fuzzer/FuzzerDictionary.h | 124 + .../tests/thirdparty/Fuzzer/FuzzerDriver.cpp | 545 + .../thirdparty/Fuzzer/FuzzerExtFunctions.def | 50 + .../thirdparty/Fuzzer/FuzzerExtFunctions.h | 35 + .../Fuzzer/FuzzerExtFunctionsDlsym.cpp | 52 + .../Fuzzer/FuzzerExtFunctionsWeak.cpp | 53 + .../Fuzzer/FuzzerExtFunctionsWeakAlias.cpp | 56 + .../tests/thirdparty/Fuzzer/FuzzerFlags.def | 115 + .../tests/thirdparty/Fuzzer/FuzzerIO.cpp | 117 + .../tests/thirdparty/Fuzzer/FuzzerIO.h | 64 + .../tests/thirdparty/Fuzzer/FuzzerIOPosix.cpp | 88 + .../thirdparty/Fuzzer/FuzzerIOWindows.cpp | 282 + .../tests/thirdparty/Fuzzer/FuzzerInterface.h | 67 + .../tests/thirdparty/Fuzzer/FuzzerInternal.h | 182 + .../tests/thirdparty/Fuzzer/FuzzerLoop.cpp | 792 + .../tests/thirdparty/Fuzzer/FuzzerMain.cpp | 21 + .../tests/thirdparty/Fuzzer/FuzzerMerge.cpp | 261 + .../tests/thirdparty/Fuzzer/FuzzerMerge.h | 70 + .../tests/thirdparty/Fuzzer/FuzzerMutate.cpp | 527 + .../tests/thirdparty/Fuzzer/FuzzerMutate.h | 145 + .../tests/thirdparty/Fuzzer/FuzzerOptions.h | 68 + .../tests/thirdparty/Fuzzer/FuzzerRandom.h | 36 + .../tests/thirdparty/Fuzzer/FuzzerSHA1.cpp | 222 + .../tests/thirdparty/Fuzzer/FuzzerSHA1.h | 33 + .../tests/thirdparty/Fuzzer/FuzzerTracePC.cpp | 339 + .../tests/thirdparty/Fuzzer/FuzzerTracePC.h | 158 + .../thirdparty/Fuzzer/FuzzerTraceState.cpp | 325 + .../tests/thirdparty/Fuzzer/FuzzerUtil.cpp | 218 + .../tests/thirdparty/Fuzzer/FuzzerUtil.h | 72 + .../thirdparty/Fuzzer/FuzzerUtilDarwin.cpp | 152 + .../thirdparty/Fuzzer/FuzzerUtilLinux.cpp | 24 + .../thirdparty/Fuzzer/FuzzerUtilPosix.cpp | 117 + .../thirdparty/Fuzzer/FuzzerUtilWindows.cpp | 182 + .../thirdparty/Fuzzer/FuzzerValueBitMap.h | 87 + .../tests/thirdparty/Fuzzer/README.txt | 2 + .../thirdparty/Fuzzer/afl/afl_driver.cpp | 295 + .../tests/thirdparty/Fuzzer/build.sh | 10 + .../tests/thirdparty/Fuzzer/cxx.dict | 122 + .../standalone/StandaloneFuzzTargetMain.c | 41 + .../thirdparty/Fuzzer/test/AFLDriverTest.cpp | 22 + .../Fuzzer/test/AbsNegAndConstant64Test.cpp | 23 + .../Fuzzer/test/AbsNegAndConstantTest.cpp | 23 + .../Fuzzer/test/AccumulateAllocationsTest.cpp | 17 + .../Fuzzer/test/BufferOverflowOnInput.cpp | 23 + .../thirdparty/Fuzzer/test/CMakeLists.txt | 217 + .../Fuzzer/test/CallerCalleeTest.cpp | 59 + .../thirdparty/Fuzzer/test/CounterTest.cpp | 18 + .../Fuzzer/test/CustomCrossOverTest.cpp | 63 + .../Fuzzer/test/CustomMutatorTest.cpp | 38 + .../tests/thirdparty/Fuzzer/test/DSO1.cpp | 12 + .../tests/thirdparty/Fuzzer/test/DSO2.cpp | 12 + .../thirdparty/Fuzzer/test/DSOTestExtra.cpp | 11 + .../thirdparty/Fuzzer/test/DSOTestMain.cpp | 31 + .../tests/thirdparty/Fuzzer/test/DivTest.cpp | 20 + .../thirdparty/Fuzzer/test/EmptyTest.cpp | 11 + .../test/FourIndependentBranchesTest.cpp | 22 + .../Fuzzer/test/FullCoverageSetTest.cpp | 24 + .../thirdparty/Fuzzer/test/FuzzerUnittest.cpp | 738 + .../thirdparty/Fuzzer/test/InitializeTest.cpp | 28 + .../tests/thirdparty/Fuzzer/test/LeakTest.cpp | 17 + .../Fuzzer/test/LeakTimeoutTest.cpp | 17 + .../tests/thirdparty/Fuzzer/test/LoadTest.cpp | 22 + .../thirdparty/Fuzzer/test/MemcmpTest.cpp | 31 + .../Fuzzer/test/NthRunCrashTest.cpp | 18 + .../Fuzzer/test/NullDerefOnEmptyTest.cpp | 19 + .../thirdparty/Fuzzer/test/NullDerefTest.cpp | 26 + .../Fuzzer/test/OneHugeAllocTest.cpp | 28 + .../test/OutOfMemorySingleLargeMallocTest.cpp | 27 + .../Fuzzer/test/OutOfMemoryTest.cpp | 31 + .../Fuzzer/test/RepeatedBytesTest.cpp | 29 + .../thirdparty/Fuzzer/test/RepeatedMemcmp.cpp | 22 + .../Fuzzer/test/ShrinkControlFlowTest.cpp | 28 + .../Fuzzer/test/ShrinkValueProfileTest.cpp | 22 + .../Fuzzer/test/SignedIntOverflowTest.cpp | 28 + .../thirdparty/Fuzzer/test/SimpleCmpTest.cpp | 46 + .../Fuzzer/test/SimpleDictionaryTest.cpp | 29 + .../thirdparty/Fuzzer/test/SimpleHashTest.cpp | 40 + .../thirdparty/Fuzzer/test/SimpleTest.cpp | 27 + .../Fuzzer/test/SimpleThreadedTest.cpp | 25 + .../Fuzzer/test/SingleMemcmpTest.cpp | 17 + .../Fuzzer/test/SingleStrcmpTest.cpp | 17 + .../Fuzzer/test/SingleStrncmpTest.cpp | 17 + .../thirdparty/Fuzzer/test/SpamyTest.cpp | 21 + .../thirdparty/Fuzzer/test/StrcmpTest.cpp | 32 + .../thirdparty/Fuzzer/test/StrncmpOOBTest.cpp | 21 + .../thirdparty/Fuzzer/test/StrncmpTest.cpp | 28 + .../thirdparty/Fuzzer/test/StrstrTest.cpp | 28 + .../thirdparty/Fuzzer/test/SwapCmpTest.cpp | 34 + .../thirdparty/Fuzzer/test/Switch2Test.cpp | 35 + .../thirdparty/Fuzzer/test/SwitchTest.cpp | 58 + .../Fuzzer/test/ThreadedLeakTest.cpp | 18 + .../thirdparty/Fuzzer/test/ThreadedTest.cpp | 26 + .../Fuzzer/test/TimeoutEmptyTest.cpp | 14 + .../thirdparty/Fuzzer/test/TimeoutTest.cpp | 26 + .../Fuzzer/test/TraceMallocTest.cpp | 27 + .../Fuzzer/test/UninstrumentedTest.cpp | 11 + .../Fuzzer/test/afl-driver-extra-stats.test | 28 + .../Fuzzer/test/afl-driver-stderr.test | 10 + .../thirdparty/Fuzzer/test/caller-callee.test | 2 + .../thirdparty/Fuzzer/test/coverage.test | 19 + .../tests/thirdparty/Fuzzer/test/dict1.txt | 4 + .../thirdparty/Fuzzer/test/dump_coverage.test | 16 + .../Fuzzer/test/fuzzer-customcrossover.test | 10 + .../Fuzzer/test/fuzzer-custommutator.test | 4 + .../thirdparty/Fuzzer/test/fuzzer-dict.test | 6 + .../thirdparty/Fuzzer/test/fuzzer-dirs.test | 15 + .../thirdparty/Fuzzer/test/fuzzer-fdmask.test | 30 + .../Fuzzer/test/fuzzer-finalstats.test | 11 + .../thirdparty/Fuzzer/test/fuzzer-flags.test | 10 + .../thirdparty/Fuzzer/test/fuzzer-jobs.test | 29 + .../thirdparty/Fuzzer/test/fuzzer-leak.test | 35 + .../Fuzzer/test/fuzzer-oom-with-profile.test | 6 + .../thirdparty/Fuzzer/test/fuzzer-oom.test | 11 + .../Fuzzer/test/fuzzer-printcovpcs.test | 8 + .../thirdparty/Fuzzer/test/fuzzer-runs.test | 8 + .../thirdparty/Fuzzer/test/fuzzer-seed.test | 3 + .../thirdparty/Fuzzer/test/fuzzer-segv.test | 5 + .../Fuzzer/test/fuzzer-singleinputs.test | 16 + .../Fuzzer/test/fuzzer-threaded.test | 7 + .../Fuzzer/test/fuzzer-timeout.test | 19 + .../Fuzzer/test/fuzzer-traces-hooks.test | 25 + .../thirdparty/Fuzzer/test/fuzzer-ubsan.test | 4 + .../tests/thirdparty/Fuzzer/test/fuzzer.test | 57 + .../tests/thirdparty/Fuzzer/test/hi.txt | 1 + .../tests/thirdparty/Fuzzer/test/lit.cfg | 29 + .../thirdparty/Fuzzer/test/lit.site.cfg.in | 4 + .../tests/thirdparty/Fuzzer/test/merge.test | 46 + .../Fuzzer/test/minimize_crash.test | 6 + .../Fuzzer/test/no-coverage/CMakeLists.txt | 29 + .../Fuzzer/test/repeated-bytes.test | 2 + .../tests/thirdparty/Fuzzer/test/shrink.test | 7 + .../thirdparty/Fuzzer/test/simple-cmp.test | 2 + .../thirdparty/Fuzzer/test/standalone.test | 4 + .../thirdparty/Fuzzer/test/swap-cmp.test | 2 + .../thirdparty/Fuzzer/test/trace-malloc.test | 10 + .../Fuzzer/test/ubsan/CMakeLists.txt | 15 + .../tests/thirdparty/Fuzzer/test/ulimit.test | 2 + .../Fuzzer/test/uninstrumented/CMakeLists.txt | 16 + .../tests/thirdparty/Fuzzer/test/unit/lit.cfg | 7 + .../Fuzzer/test/unit/lit.site.cfg.in | 2 + .../Fuzzer/test/value-profile-cmp.test | 2 + .../Fuzzer/test/value-profile-cmp2.test | 2 + .../Fuzzer/test/value-profile-cmp3.test | 2 + .../Fuzzer/test/value-profile-cmp4.test | 2 + .../Fuzzer/test/value-profile-div.test | 3 + .../Fuzzer/test/value-profile-load.test | 3 + .../Fuzzer/test/value-profile-mem.test | 2 + .../Fuzzer/test/value-profile-set.test | 3 + .../Fuzzer/test/value-profile-strcmp.test | 2 + .../Fuzzer/test/value-profile-strncmp.test | 2 + .../Fuzzer/test/value-profile-switch.test | 3 + .../tests/thirdparty/doctest/doctest.h | 7106 +++++ .../doctest/doctest_compatibility.h | 37 + .../tests/thirdparty/fifo_map/fifo_map.hpp | 530 + .../tests/thirdparty/imapdl/filterbr.py | 111 + libs/json-3.12.0/tools/amalgamate/CHANGES.md | 10 + libs/json-3.12.0/tools/amalgamate/README.md | 65 + .../tools/amalgamate/amalgamate.py | 299 + .../tools/amalgamate/config_json.json | 8 + .../tools/amalgamate/config_json_fwd.json | 8 + libs/json-3.12.0/tools/astyle/.astylerc | 80 + .../json-3.12.0/tools/astyle/requirements.txt | 1 + .../tools/gdb_pretty_printer/README.md | 79 + .../tools/gdb_pretty_printer/nlohmann-json.py | 35 + .../tools/generate_natvis/README.md | 9 + .../tools/generate_natvis/generate_natvis.py | 41 + .../generate_natvis/nlohmann_json.natvis.j2 | 40 + .../tools/generate_natvis/requirements.txt | 1 + libs/json-3.12.0/tools/macro_builder/main.cpp | 43 + libs/json-3.12.0/tools/serve_header/README.md | 91 + libs/json-3.12.0/tools/serve_header/demo.png | Bin 0 -> 557446 bytes .../tools/serve_header/requirements.txt | 2 + .../tools/serve_header/serve_header.py | 410 + .../serve_header/serve_header.yml.example | 15 + main.cpp | 316 + main.d | 9 + main.o | Bin 0 -> 60968 bytes models/demo.xnh | Bin 0 -> 1069767 bytes models/demo_trained.xnh | Bin 0 -> 3207463 bytes models/demo_trained.xnh.step1500 | Bin 0 -> 3207463 bytes models/test_model.bfr | Bin 0 -> 4054 bytes models/test_model.h | 273 + ollama_api/test.cpp | 192 + settings.h | 15 + xenith/converter.cpp | 172 + xenith/converter.h | 69 + xenith/core/backward.cpp | 242 + xenith/core/backward.d | 6 + xenith/core/backward.o | Bin 0 -> 75256 bytes xenith/core/checkpoint.cpp | 354 + xenith/core/checkpoint.d | 5 + xenith/core/checkpoint.h | 37 + xenith/core/checkpoint.o | Bin 0 -> 123632 bytes xenith/core/generate.cpp | 275 + xenith/core/generate.d | 6 + xenith/core/generate.h | 28 + xenith/core/generate.o | Bin 0 -> 88632 bytes xenith/core/gradcheck.cpp | 173 + xenith/core/gradcheck.d | 9 + xenith/core/gradcheck.h | 8 + xenith/core/gradcheck.o | Bin 0 -> 27728 bytes xenith/core/model.cpp | 366 + xenith/core/model.d | 4 + xenith/core/model.h | 104 + xenith/core/model.o | Bin 0 -> 131960 bytes xenith/core/tensor.h | 229 + xenith/core/train.h | 56 + xenith/core/trainer.cpp | 140 + xenith/core/trainer.d | 6 + xenith/core/trainer.o | Bin 0 -> 69160 bytes xenith/preprocessing/tokenizer.cpp | 136 + xenith/preprocessing/tokenizer.h | 13 + 1552 files changed, 325314 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/Xenith.iml create mode 100644 .idea/editor.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 CMakeLists.txt create mode 100644 KVCacheArch create mode 100644 Makefile create mode 100644 README.md create mode 100755 bin/xenith create mode 100644 config.yaml create mode 100644 corpus/demo.txt create mode 100644 libs/cpp-httplib-0.57.1/.gitattributes create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/abidiff.yaml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/benchmark_ab.yaml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/benchmark_run.yaml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/cifuzz.yaml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/docs.yml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/release-docker.yml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test-32bit.yml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test.yaml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test_benchmark.yaml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test_no_exceptions.yaml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test_offline.yaml create mode 100644 libs/cpp-httplib-0.57.1/.github/workflows/test_proxy.yaml create mode 100644 libs/cpp-httplib-0.57.1/CMakeLists.txt create mode 100644 libs/cpp-httplib-0.57.1/Dockerfile create mode 100644 libs/cpp-httplib-0.57.1/LICENSE create mode 100644 libs/cpp-httplib-0.57.1/README-sse.md create mode 100644 libs/cpp-httplib-0.57.1/README-stream.md create mode 100644 libs/cpp-httplib-0.57.1/README-websocket.md create mode 100644 libs/cpp-httplib-0.57.1/README.md create mode 100644 libs/cpp-httplib-0.57.1/benchmark/Makefile create mode 100755 libs/cpp-httplib-0.57.1/benchmark/ab.sh create mode 100644 libs/cpp-httplib-0.57.1/benchmark/cpp-httplib/main.cpp create mode 100644 libs/cpp-httplib-0.57.1/benchmark/crow/crow_all.h create mode 100644 libs/cpp-httplib-0.57.1/benchmark/crow/main.cpp create mode 100644 libs/cpp-httplib-0.57.1/cmake/FindBrotli.cmake create mode 100644 libs/cpp-httplib-0.57.1/cmake/httplibConfig.cmake.in create mode 100644 libs/cpp-httplib-0.57.1/cmake/modules.cmake create mode 100644 libs/cpp-httplib-0.57.1/docker-compose.yml create mode 100644 libs/cpp-httplib-0.57.1/docker/html/index.html create mode 100644 libs/cpp-httplib-0.57.1/docker/main.cc create mode 100644 libs/cpp-httplib-0.57.1/docs-src/config.toml create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c01-get-response-body.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c02-json.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c03-default-headers.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c04-follow-location.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c05-basic-auth.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c06-bearer-token.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c07-multipart-upload.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c08-post-file-body.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c09-chunked-upload.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c10-stream-response.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c11-progress-callback.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c12-timeouts.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c13-max-timeout.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c14-keep-alive.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c15-compression.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c16-proxy.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c17-error-codes.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c18-ssl-errors.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/c19-client-logger.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/e01-sse-server.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/e02-sse-event-names.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/e03-sse-reconnect.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/e04-sse-client.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/index.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s01-handlers.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s02-json-api.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s03-path-params.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s04-static-files.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s05-stream-response.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s06-download-response.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s07-multipart-reader.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s08-compress-response.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s09-pre-routing.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s10-post-routing.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s11-pre-request.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s12-user-data.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s13-error-handler.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s14-exception-handler.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s15-server-logger.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s16-disconnect.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s17-bind-any-port.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s18-listen-after-bind.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s19-graceful-shutdown.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s20-keep-alive.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s21-thread-pool.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s22-unix-socket.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/s23-custom-methods.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/t01-tls-backends.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/t02-cert-verification.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/t03-ssl-server.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/t04-mtls.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/t05-peer-cert.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w01-websocket-echo.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w02-websocket-ping.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w03-websocket-close.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w04-websocket-binary.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w05-websocket-tls.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/cookbook/w06-websocket-timeouts.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/index.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/app.png create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch01-setup.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch02-rest-api.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch03-sse-streaming.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch04-model-management.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch05-web-ui.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch06-desktop-app.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch07-code-reading.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/ch08-customization.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/index.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/kv-cache.svg create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/slots.svg create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/llm-app/webui.png create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/01-getting-started.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/02-basic-client.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/03-basic-server.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/04-static-file-server.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/05-tls-setup.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/06-https-client.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/07-https-server.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/08-websocket.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/09-whats-next.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/en/tour/index.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c01-get-response-body.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c02-json.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c03-default-headers.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c04-follow-location.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c05-basic-auth.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c06-bearer-token.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c07-multipart-upload.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c08-post-file-body.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c09-chunked-upload.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c10-stream-response.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c11-progress-callback.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c12-timeouts.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c13-max-timeout.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c14-keep-alive.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c15-compression.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c16-proxy.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c17-error-codes.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c18-ssl-errors.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/c19-client-logger.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/e01-sse-server.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/e02-sse-event-names.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/e03-sse-reconnect.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/e04-sse-client.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/index.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s01-handlers.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s02-json-api.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s03-path-params.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s04-static-files.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s05-stream-response.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s06-download-response.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s07-multipart-reader.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s08-compress-response.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s09-pre-routing.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s10-post-routing.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s11-pre-request.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s12-user-data.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s13-error-handler.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s14-exception-handler.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s15-server-logger.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s16-disconnect.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s17-bind-any-port.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s18-listen-after-bind.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s19-graceful-shutdown.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s20-keep-alive.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s21-thread-pool.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s22-unix-socket.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/s23-custom-methods.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/t01-tls-backends.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/t02-cert-verification.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/t03-ssl-server.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/t04-mtls.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/t05-peer-cert.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w01-websocket-echo.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w02-websocket-ping.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w03-websocket-close.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w04-websocket-binary.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w05-websocket-tls.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/cookbook/w06-websocket-timeouts.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/index.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch01-setup.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch02-rest-api.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch03-sse-streaming.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch04-model-management.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch05-web-ui.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch06-desktop-app.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch07-code-reading.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/ch08-customization.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/index.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/kv-cache.svg create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/llm-app/slots.svg create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/01-getting-started.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/02-basic-client.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/03-basic-server.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/04-static-file-server.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/05-tls-setup.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/06-https-client.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/07-https-server.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/08-websocket.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/09-whats-next.md create mode 100644 libs/cpp-httplib-0.57.1/docs-src/pages/ja/tour/index.md create mode 100755 libs/cpp-httplib-0.57.1/docs-util/llm-app/build_desktop_app.sh create mode 100755 libs/cpp-httplib-0.57.1/docs-util/llm-app/build_web_app.sh create mode 100644 libs/cpp-httplib-0.57.1/docs-util/llm-app/extract_code.sh create mode 100755 libs/cpp-httplib-0.57.1/docs-util/llm-app/generate_desktop_app_project.sh create mode 100644 libs/cpp-httplib-0.57.1/docs-util/llm-app/justfile create mode 100755 libs/cpp-httplib-0.57.1/docs-util/llm-app/test_book.sh create mode 100644 libs/cpp-httplib-0.57.1/docs-util/llm-app/test_webui.cpp create mode 100644 libs/cpp-httplib-0.57.1/docs-util/llm-app/webdriver.h create mode 100644 libs/cpp-httplib-0.57.1/example/Dockerfile.hello create mode 100644 libs/cpp-httplib-0.57.1/example/Makefile create mode 100644 libs/cpp-httplib-0.57.1/example/accept_header.cc create mode 100644 libs/cpp-httplib-0.57.1/example/benchmark.cc create mode 100644 libs/cpp-httplib-0.57.1/example/ca-bundle.crt create mode 100644 libs/cpp-httplib-0.57.1/example/client.cc create mode 100644 libs/cpp-httplib-0.57.1/example/client.vcxproj create mode 100644 libs/cpp-httplib-0.57.1/example/example.sln create mode 100644 libs/cpp-httplib-0.57.1/example/hello.cc create mode 100644 libs/cpp-httplib-0.57.1/example/one_time_request.cc create mode 100644 libs/cpp-httplib-0.57.1/example/redirect.cc create mode 100644 libs/cpp-httplib-0.57.1/example/server.cc create mode 100644 libs/cpp-httplib-0.57.1/example/server.vcxproj create mode 100644 libs/cpp-httplib-0.57.1/example/server_and_client.cc create mode 100644 libs/cpp-httplib-0.57.1/example/simplecli.cc create mode 100644 libs/cpp-httplib-0.57.1/example/simplesvr.cc create mode 100644 libs/cpp-httplib-0.57.1/example/ssecli-stream.cc create mode 100644 libs/cpp-httplib-0.57.1/example/ssecli.cc create mode 100644 libs/cpp-httplib-0.57.1/example/ssesvr.cc create mode 100644 libs/cpp-httplib-0.57.1/example/upload.cc create mode 100755 libs/cpp-httplib-0.57.1/example/uploader.sh create mode 100644 libs/cpp-httplib-0.57.1/example/wsecho.cc create mode 100644 libs/cpp-httplib-0.57.1/generate_module.py create mode 100644 libs/cpp-httplib-0.57.1/httplib.h create mode 100644 libs/cpp-httplib-0.57.1/justfile create mode 100644 libs/cpp-httplib-0.57.1/meson.build create mode 100644 libs/cpp-httplib-0.57.1/meson_options.txt create mode 100755 libs/cpp-httplib-0.57.1/scripts/release.sh create mode 100755 libs/cpp-httplib-0.57.1/split.py create mode 100644 libs/cpp-httplib-0.57.1/test/CMakeLists.txt create mode 100644 libs/cpp-httplib-0.57.1/test/Makefile create mode 100644 libs/cpp-httplib-0.57.1/test/ca-bundle.crt create mode 100755 libs/cpp-httplib-0.57.1/test/dns_test_fixture.py create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/CMakeLists.txt create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/Makefile create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/client_fuzzer.cc create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/1 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/2 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/3 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-client_fuzzer-5188033728282624 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-client_fuzzer-6561074643271680 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-header_parser_fuzzer-4645558454386688 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5042094968537088 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5372331946541056 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5386708825800704 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5667822731132928 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5886572146327552 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-5942767436562432 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-6007379124158464 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/clusterfuzz-testcase-minimized-server_fuzzer-6508706672541696 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/corpus/issue1264 create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/header_parser_fuzzer.cc create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/multipart_parser_fuzzer.cc create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/server_fuzzer.cc create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/server_fuzzer.dict create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/standalone_fuzz_target_runner.cpp create mode 100644 libs/cpp-httplib-0.57.1/test/fuzzing/url_parser_fuzzer.cc create mode 100755 libs/cpp-httplib-0.57.1/test/gen-certs.sh create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-assertion-result.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-death-test.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-matchers.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-message.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-param-test.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-printers.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-spi.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-test-part.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest-typed-test.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest_pred_impl.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/gtest_prod.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/custom/README.md create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/custom/gtest-port.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/custom/gtest-printers.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/custom/gtest.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-death-test-internal.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-filepath.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-internal.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-param-util.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-port-arch.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-port.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-string.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/include/gtest/internal/gtest-type-util.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-all.cc create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-assertion-result.cc create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-death-test.cc create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-filepath.cc create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-internal-inl.h create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-matchers.cc create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-port.cc create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-printers.cc create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-test-part.cc create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest-typed-test.cc create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest.cc create mode 100644 libs/cpp-httplib-0.57.1/test/gtest/src/gtest_main.cc create mode 100644 libs/cpp-httplib-0.57.1/test/image.jpg create mode 100644 libs/cpp-httplib-0.57.1/test/include_httplib.cc create mode 100644 libs/cpp-httplib-0.57.1/test/include_windows_h.cc create mode 100644 libs/cpp-httplib-0.57.1/test/lsan_suppressions.txt create mode 100755 libs/cpp-httplib-0.57.1/test/make-shared-library.sh create mode 100644 libs/cpp-httplib-0.57.1/test/meson.build create mode 100644 libs/cpp-httplib-0.57.1/test/proxy/Dockerfile create mode 100644 libs/cpp-httplib-0.57.1/test/proxy/basic_passwd create mode 100644 libs/cpp-httplib-0.57.1/test/proxy/basic_squid.conf create mode 100644 libs/cpp-httplib-0.57.1/test/proxy/digest_passwd create mode 100644 libs/cpp-httplib-0.57.1/test/proxy/digest_squid.conf create mode 100644 libs/cpp-httplib-0.57.1/test/proxy/docker-compose.ci.yml create mode 100644 libs/cpp-httplib-0.57.1/test/proxy/docker-compose.yml create mode 100644 libs/cpp-httplib-0.57.1/test/proxy/httpbin_nginx.conf create mode 100755 libs/cpp-httplib-0.57.1/test/run_issue_2431_repro.sh create mode 100644 libs/cpp-httplib-0.57.1/test/test.cc create mode 100644 libs/cpp-httplib-0.57.1/test/test.conf create mode 100644 libs/cpp-httplib-0.57.1/test/test.rootCA.conf create mode 100644 libs/cpp-httplib-0.57.1/test/test.sln create mode 100644 libs/cpp-httplib-0.57.1/test/test.vcxproj create mode 100644 libs/cpp-httplib-0.57.1/test/test_32bit_build.cpp create mode 100644 libs/cpp-httplib-0.57.1/test/test_benchmark.cc create mode 100644 libs/cpp-httplib-0.57.1/test/test_proxy.cc create mode 100644 libs/cpp-httplib-0.57.1/test/test_thread_pool.cc create mode 100644 libs/cpp-httplib-0.57.1/test/test_websocket_heartbeat.cc create mode 100644 libs/cpp-httplib-0.57.1/test/test_websocket_thread_safety.cc create mode 100644 libs/cpp-httplib-0.57.1/test/www/dir/1MB.txt create mode 100644 libs/cpp-httplib-0.57.1/test/www/dir/index.html create mode 100644 libs/cpp-httplib-0.57.1/test/www/dir/meson.build create mode 100644 libs/cpp-httplib-0.57.1/test/www/dir/test.abcde create mode 100644 libs/cpp-httplib-0.57.1/test/www/dir/test.html create mode 100644 libs/cpp-httplib-0.57.1/test/www/empty_file create mode 100644 libs/cpp-httplib-0.57.1/test/www/file create mode 100644 libs/cpp-httplib-0.57.1/test/www/meson.build create mode 100644 libs/cpp-httplib-0.57.1/test/www/日本語Dir/meson.build create mode 100644 libs/cpp-httplib-0.57.1/test/www/日本語Dir/日本語File.txt create mode 100644 libs/cpp-httplib-0.57.1/test/www2/dir/index.html create mode 100644 libs/cpp-httplib-0.57.1/test/www2/dir/meson.build create mode 100644 libs/cpp-httplib-0.57.1/test/www2/dir/test.html create mode 100644 libs/cpp-httplib-0.57.1/test/www3/dir/index.html create mode 100644 libs/cpp-httplib-0.57.1/test/www3/dir/meson.build create mode 100644 libs/cpp-httplib-0.57.1/test/www3/dir/test.html create mode 100644 libs/json-3.12.0/.cirrus.yml create mode 100644 libs/json-3.12.0/.clang-tidy create mode 100644 libs/json-3.12.0/.github/CODEOWNERS create mode 100644 libs/json-3.12.0/.github/CODE_OF_CONDUCT.md create mode 100644 libs/json-3.12.0/.github/CONTRIBUTING.md create mode 100644 libs/json-3.12.0/.github/FUNDING.yml create mode 100644 libs/json-3.12.0/.github/ISSUE_TEMPLATE/bug.yaml create mode 100644 libs/json-3.12.0/.github/ISSUE_TEMPLATE/config.yml create mode 100644 libs/json-3.12.0/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 libs/json-3.12.0/.github/SECURITY.md create mode 100644 libs/json-3.12.0/.github/config.yml create mode 100644 libs/json-3.12.0/.github/dependabot.yml create mode 100644 libs/json-3.12.0/.github/external_ci/appveyor.yml create mode 100644 libs/json-3.12.0/.github/labeler.yml create mode 100644 libs/json-3.12.0/.github/workflows/check_amalgamation.yml create mode 100644 libs/json-3.12.0/.github/workflows/cifuzz.yml create mode 100644 libs/json-3.12.0/.github/workflows/codeql-analysis.yml create mode 100644 libs/json-3.12.0/.github/workflows/comment_check_amalgamation.yml create mode 100644 libs/json-3.12.0/.github/workflows/dependency-review.yml create mode 100644 libs/json-3.12.0/.github/workflows/labeler.yml create mode 100644 libs/json-3.12.0/.github/workflows/macos.yml create mode 100644 libs/json-3.12.0/.github/workflows/publish_documentation.yml create mode 100644 libs/json-3.12.0/.github/workflows/scorecards.yml create mode 100644 libs/json-3.12.0/.github/workflows/stale.yml create mode 100644 libs/json-3.12.0/.github/workflows/ubuntu.yml create mode 100644 libs/json-3.12.0/.github/workflows/windows.yml create mode 100644 libs/json-3.12.0/.gitignore create mode 100644 libs/json-3.12.0/.reuse/dep5 create mode 100644 libs/json-3.12.0/.reuse/templates/json.jinja2 create mode 100644 libs/json-3.12.0/.reuse/templates/json_support.jinja2 create mode 100644 libs/json-3.12.0/BUILD.bazel create mode 100644 libs/json-3.12.0/CITATION.cff create mode 100644 libs/json-3.12.0/CMakeLists.txt create mode 100644 libs/json-3.12.0/ChangeLog.md create mode 100644 libs/json-3.12.0/FILES.md create mode 100644 libs/json-3.12.0/LICENSE.MIT create mode 100644 libs/json-3.12.0/LICENSES/Apache-2.0.txt create mode 100644 libs/json-3.12.0/LICENSES/BSD-3-Clause.txt create mode 100644 libs/json-3.12.0/LICENSES/GPL-3.0-only.txt create mode 100644 libs/json-3.12.0/LICENSES/MIT.txt create mode 100644 libs/json-3.12.0/MODULE.bazel create mode 100644 libs/json-3.12.0/Makefile create mode 100644 libs/json-3.12.0/Package.swift create mode 100644 libs/json-3.12.0/README.md create mode 100644 libs/json-3.12.0/cmake/ci.cmake create mode 100644 libs/json-3.12.0/cmake/clang_flags.cmake create mode 100644 libs/json-3.12.0/cmake/config.cmake.in create mode 100644 libs/json-3.12.0/cmake/download_test_data.cmake create mode 100644 libs/json-3.12.0/cmake/gcc_flags.cmake create mode 100644 libs/json-3.12.0/cmake/nlohmann_jsonConfigVersion.cmake.in create mode 100644 libs/json-3.12.0/cmake/pkg-config.pc.in create mode 100644 libs/json-3.12.0/cmake/requirements/requirements-cppcheck.txt create mode 100644 libs/json-3.12.0/cmake/requirements/requirements-cpplint.txt create mode 100644 libs/json-3.12.0/cmake/requirements/requirements-reuse.txt create mode 100644 libs/json-3.12.0/cmake/scripts/gen_bazel_build_file.cmake create mode 100644 libs/json-3.12.0/cmake/test.cmake create mode 100644 libs/json-3.12.0/docs/Makefile create mode 100644 libs/json-3.12.0/docs/README.md create mode 100644 libs/json-3.12.0/docs/avatars.png create mode 100644 libs/json-3.12.0/docs/docset/Info.plist create mode 100644 libs/json-3.12.0/docs/docset/Makefile create mode 100644 libs/json-3.12.0/docs/docset/README.md create mode 100644 libs/json-3.12.0/docs/docset/docSet.sql create mode 100644 libs/json-3.12.0/docs/docset/docset.json create mode 100644 libs/json-3.12.0/docs/docset/icon.png create mode 100644 libs/json-3.12.0/docs/docset/icon@2x.png create mode 100644 libs/json-3.12.0/docs/json.gif create mode 100644 libs/json-3.12.0/docs/mkdocs/Makefile create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/adl_serializer/from_json.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/adl_serializer/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/adl_serializer/to_json.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/accept.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/array.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/array_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/at.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/back.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/basic_json.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/begin.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/binary.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/binary_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/boolean_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/cbegin.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/cbor_tag_handler_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/cend.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/clear.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/contains.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/count.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/crbegin.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/crend.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/default_object_comparator_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/diff.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/dump.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/emplace.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/emplace_back.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/empty.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/end.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/end_pos.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/erase.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/error_handler_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/exception.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/find.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/flatten.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/from_bjdata.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/from_bson.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/from_cbor.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/from_msgpack.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/from_ubjson.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/front.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get_allocator.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get_binary.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get_ptr.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get_ref.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/get_to.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/input_format_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/insert.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/invalid_iterator.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_array.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_binary.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_boolean.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_discarded.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_null.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_number.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_number_float.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_number_integer.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_number_unsigned.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_object.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_primitive.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_string.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/is_structured.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/items.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/json_base_class_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/json_serializer.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/max_size.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/merge_patch.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/meta.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/number_float_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/number_integer_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/number_unsigned_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/object.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/object_comparator_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/object_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator+=.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator=.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator[].md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_ValueType.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_eq.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_ge.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_gt.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_le.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_lt.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_ne.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_spaceship.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/operator_value_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/other_error.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/out_of_range.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/parse.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/parse_error.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/parse_event_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/parser_callback_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/patch.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/patch_inplace.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/push_back.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/rbegin.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/rend.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/sax_parse.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/size.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/start_pos.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/std_hash.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/std_swap.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/string_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/swap.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_bjdata.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_bson.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_cbor.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_msgpack.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_string.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/to_ubjson.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/type.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/type_error.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/type_name.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/unflatten.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/update.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/value.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/value_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/basic_json/~basic_json.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/byte_container_with_subtype.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/clear_subtype.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/has_subtype.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/set_subtype.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/byte_container_with_subtype/subtype.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/back.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/empty.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/json_pointer.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/operator_eq.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/operator_ne.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/operator_slash.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/operator_slasheq.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/operator_string_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/parent_pointer.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/pop_back.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/push_back.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/string_t.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_pointer/to_string.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/binary.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/boolean.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/end_array.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/end_object.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/key.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/null.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/number_float.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/number_integer.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/number_unsigned.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/parse_error.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/start_array.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/start_object.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/json_sax/string.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_assert.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_diagnostic_positions.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_diagnostics.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_disable_enum_serialization.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_has_cpp_11.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_has_filesystem.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_has_ranges.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_has_static_rtti.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_has_three_way_comparison.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_no_io.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_noexception.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_skip_library_version_check.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_skip_unsupported_compiler_check.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_throw_user.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_use_global_udls.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_use_implicit_conversions.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/json_use_legacy_discarded_value_comparison.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_define_derived_type.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_define_type_intrusive.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_define_type_non_intrusive.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_json_namespace.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_json_namespace_begin.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_json_namespace_no_version.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_json_serialize_enum.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/macros/nlohmann_json_version_major.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/operator_gtgt.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/operator_literal_json.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/operator_literal_json_pointer.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/operator_ltlt.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/ordered_json.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/api/ordered_map.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/code_of_conduct.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/contribution_guidelines.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/governance.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/quality_assurance.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/community/security_policy.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/css/custom.css create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/README.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/README.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/accept__string.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/accept__string.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/array.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/array.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/array_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/array_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__json_pointer.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__json_pointer.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__json_pointer_const.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__json_pointer_const.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__keytype.c++17.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__keytype.c++17.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__keytype_const.c++17.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__keytype_const.c++17.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__object_t_key_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__object_t_key_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__object_t_key_type_const.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__object_t_key_type_const.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__size_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__size_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__size_type_const.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/at__size_type_const.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/back.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/back.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__CompatibleType.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__CompatibleType.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__InputIt_InputIt.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__InputIt_InputIt.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__basic_json.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__basic_json.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__copyassignment.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__copyassignment.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__list_init_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__list_init_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__moveconstructor.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__moveconstructor.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__nullptr_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__nullptr_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__size_type_basic_json.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__size_type_basic_json.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__value_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/basic_json__value_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/begin.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/begin.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/binary.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/binary.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/binary_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/binary_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/boolean_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/boolean_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__byte_container_with_subtype.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__byte_container_with_subtype.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__clear_subtype.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__clear_subtype.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__has_subtype.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__has_subtype.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__set_subtype.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__set_subtype.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__subtype.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/byte_container_with_subtype__subtype.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cbegin.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cbegin.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cbor_tag_handler_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cbor_tag_handler_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cend.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/cend.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/clear.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/clear.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__json_pointer.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__json_pointer.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__keytype.c++17.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__keytype.c++17.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__object_t_key_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/contains__object_t_key_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/count__keytype.c++17.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/count__keytype.c++17.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/count__object_t_key_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/count__object_t_key_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/crbegin.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/crbegin.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/crend.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/crend.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/default_object_comparator_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/default_object_comparator_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostic_positions.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostic_positions.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostic_positions_exception.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostic_positions_exception.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_extended.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_extended.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_extended_positions.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_extended_positions.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_standard.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diagnostics_standard.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diff.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/diff.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/dump.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/dump.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/emplace.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/emplace.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/emplace_back.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/emplace_back.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/empty.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/empty.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/end.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/end.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__IteratorType.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__IteratorType.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__IteratorType_IteratorType.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__IteratorType_IteratorType.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__keytype.c++17.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__keytype.c++17.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__object_t_key_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__object_t_key_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__size_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/erase__size_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/error_handler_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/error_handler_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/exception.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/exception.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/find__keytype.c++17.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/find__keytype.c++17.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/find__object_t_key_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/find__object_t_key_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/flatten.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/flatten.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_bjdata.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_bjdata.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_bson.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_bson.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_cbor.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_cbor.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_json__default_constructible.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_json__default_constructible.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_json__non_default_constructible.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_json__non_default_constructible.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_msgpack.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_msgpack.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_ubjson.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/from_ubjson.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/front.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/front.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get__PointerType.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get__PointerType.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get__ValueType_const.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get__ValueType_const.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_allocator.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_allocator.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_binary.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_binary.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_ptr.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_ptr.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_ref.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_ref.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_to.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/get_to.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__count.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__count.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__ilist.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__ilist.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__range.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__range.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__range_object.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/insert__range_object.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/invalid_iterator.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/invalid_iterator.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_array.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_array.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_binary.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_binary.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_boolean.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_boolean.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_discarded.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_discarded.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_null.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_null.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_float.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_float.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_integer.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_integer.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_unsigned.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_number_unsigned.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_object.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_object.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_primitive.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_primitive.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_string.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_string.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_structured.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/is_structured.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/items.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/items.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_base_class_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_base_class_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_lines.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_lines.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__back.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__back.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__empty.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__empty.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__equal.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__equal.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__equal_stringtype.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__equal_stringtype.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__notequal.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__notequal.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__notequal_stringtype.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator__notequal_stringtype.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_add.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_add.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_add_binary.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_add_binary.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_string_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__operator_string_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__parent_pointer.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__parent_pointer.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__pop_back.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__pop_back.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__push_back.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__push_back.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__string_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__string_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__to_string.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/json_pointer__to_string.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/max_size.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/max_size.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/merge_patch.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/merge_patch.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/meta.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/meta.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_derived_type_intrusive_macro.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_derived_type_intrusive_macro.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_explicit.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_explicit.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_macro.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_macro.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_only_serialize_explicit.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_only_serialize_explicit.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_only_serialize_macro.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_only_serialize_macro.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_with_default_explicit.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_with_default_explicit.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_with_default_macro.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_intrusive_with_default_macro.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_explicit.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_explicit.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_macro.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_macro.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_only_serialize_explicit.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_only_serialize_explicit.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_only_serialize_macro.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_only_serialize_macro.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_with_default_explicit.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_with_default_explicit.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_with_default_macro.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_define_type_non_intrusive_with_default_macro.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace_begin.c++17.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace_begin.c++17.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace_no_version.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_namespace_no_version.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_serialize_enum.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_serialize_enum.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_serialize_enum_2.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_serialize_enum_2.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_version.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/nlohmann_json_version.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_float_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_float_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_integer_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_integer_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_unsigned_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/number_unsigned_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object_comparator_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object_comparator_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/object_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__ValueType.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__ValueType.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal__nullptr_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal__nullptr_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal__specializations.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__equal__specializations.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__greater.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__greater.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__greaterequal.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__greaterequal.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__less.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__less.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__lessequal.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__lessequal.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__notequal.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__notequal.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__notequal__nullptr_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__notequal__nullptr_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__value_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator__value_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__json_pointer.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__json_pointer.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__json_pointer_const.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__json_pointer_const.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__keytype.c++17.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__keytype.c++17.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__keytype_const.c++17.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__keytype_const.c++17.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__object_t_key_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__object_t_key_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__object_t_key_type_const.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__object_t_key_type_const.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__size_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__size_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__size_type_const.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_array__size_type_const.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_deserialize.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_deserialize.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_literal_json.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_literal_json.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_literal_json_pointer.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_literal_json_pointer.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_ltlt__basic_json.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_ltlt__basic_json.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_ltlt__json_pointer.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_ltlt__json_pointer.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_spaceship__const_reference.c++20.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_spaceship__const_reference.c++20.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_spaceship__scalartype.c++20.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/operator_spaceship__scalartype.c++20.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/ordered_json.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/ordered_json.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/ordered_map.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/ordered_map.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/other_error.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/other_error.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/out_of_range.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/out_of_range.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__allow_exceptions.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__allow_exceptions.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__array__parser_callback_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__array__parser_callback_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__contiguouscontainer__parser_callback_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__contiguouscontainer__parser_callback_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__istream__parser_callback_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__istream__parser_callback_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__iterator_pair.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__iterator_pair.link create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__iterator_pair.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__pointers.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__pointers.link create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__pointers.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__string__parser_callback_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse__string__parser_callback_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse_error.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/parse_error.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/patch.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/patch.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/patch_inplace.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/patch_inplace.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back__initializer_list.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back__initializer_list.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back__object_t__value.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/push_back__object_t__value.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/rbegin.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/rbegin.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/rend.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/rend.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/sax_parse.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/sax_parse.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/sax_parse__binary.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/sax_parse__binary.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/size.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/size.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/std_hash.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/std_hash.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/std_swap.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/std_swap.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/string_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/string_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__array_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__array_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__binary_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__binary_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__object_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__object_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__reference.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__reference.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__string_t.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/swap__string_t.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_bjdata.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_bjdata.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_bson.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_bson.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_cbor.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_cbor.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_json.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_json.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_msgpack.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_msgpack.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_string.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_string.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_ubjson.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/to_ubjson.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type_error.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type_error.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type_name.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/type_name.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/unflatten.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/unflatten.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/update.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/update.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/update__range.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/update__range.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__json_ptr.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__json_ptr.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__keytype.c++17.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__keytype.c++17.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__object_t_key_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__object_t_key_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__return_type.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/examples/value__return_type.output create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/arbitrary_types.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/assertions.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/bjdata.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/bson.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/cbor.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/messagepack.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_formats/ubjson.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/binary_values.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/comments.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/element_access/checked_access.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/element_access/default_value.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/element_access/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/element_access/unchecked_access.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/enum_conversion.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/iterators.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/json_patch.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/json_pointer.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/macros.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/merge_patch.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/namespace.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/object_order.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/parsing/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/parsing/json_lines.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/parsing/parse_exceptions.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/parsing/parser_callbacks.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/parsing/sax_interface.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/types/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/features/types/number_handling.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/architecture.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/customers.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/design_goals.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/exceptions.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/faq.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/license.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/releases.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/home/sponsors.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/callback_events.png create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/customers.png create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/json.gif create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/json_syntax_number.png create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/CPM.png create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/bazel.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/conan.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/conda.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/homebrew.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/macports.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/meson.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/nuget.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/spack.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/swift.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/vcpkg.png create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/package_managers/xmake.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/range-begin-end.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/images/range-rbegin-rend.svg create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/bazel/BUILD create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/bazel/MODULE.bazel create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/bazel/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/cget/CMakeLists.txt create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/cget/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/cmake.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/conan/CMakeLists.txt create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/conan/Conanfile.txt create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/conan/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/conda/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/cpm/CMakeLists.txt create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/cpm/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/homebrew/CMakeLists.txt create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/homebrew/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/hunter/CMakeLists.txt create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/hunter/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/index.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/macports/CMakeLists.txt create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/macports/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/meson/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/meson/meson.build create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/migration_guide.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/nuget/nuget-package-content.png create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/nuget/nuget-project-changes.png create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/nuget/nuget-project-makefile.png create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/nuget/nuget-search-package.png create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/nuget/nuget-select-package.png create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/package_managers.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/pkg-config.md create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/spack/CMakeLists.txt create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/spack/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/vcpkg/CMakeLists.txt create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/vcpkg/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/xmake/example.cpp create mode 100644 libs/json-3.12.0/docs/mkdocs/docs/integration/xmake/xmake.lua create mode 100644 libs/json-3.12.0/docs/mkdocs/includes/glossary.md create mode 100644 libs/json-3.12.0/docs/mkdocs/mkdocs.yml create mode 100644 libs/json-3.12.0/docs/mkdocs/requirements.txt create mode 100755 libs/json-3.12.0/docs/mkdocs/scripts/check_structure.py create mode 100644 libs/json-3.12.0/include/nlohmann/adl_serializer.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/byte_container_with_subtype.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/abi_macros.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/conversions/from_json.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/conversions/to_chars.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/conversions/to_json.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/exceptions.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/hash.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/binary_reader.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/input_adapters.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/json_sax.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/lexer.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/parser.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/input/position_t.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/internal_iterator.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/iter_impl.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/iteration_proxy.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/iterator_traits.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/json_reverse_iterator.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/iterators/primitive_iterator.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/json_custom_base_class.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/json_pointer.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/json_ref.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/macro_scope.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/macro_unscope.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/call_std/begin.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/call_std/end.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/cpp_future.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/detected.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/identity_tag.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/is_sax.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/std_fs.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/type_traits.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/meta/void_t.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/output/binary_writer.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/output/output_adapters.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/output/serializer.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/string_concat.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/string_escape.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/string_utils.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/detail/value_t.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/json.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/json_fwd.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/ordered_map.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/thirdparty/hedley/hedley.hpp create mode 100644 libs/json-3.12.0/include/nlohmann/thirdparty/hedley/hedley_undef.hpp create mode 100644 libs/json-3.12.0/meson.build create mode 100644 libs/json-3.12.0/nlohmann_json.natvis create mode 100644 libs/json-3.12.0/single_include/nlohmann/json.hpp create mode 100644 libs/json-3.12.0/single_include/nlohmann/json_fwd.hpp create mode 100644 libs/json-3.12.0/tests/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/Makefile create mode 100644 libs/json-3.12.0/tests/abi/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/abi/config/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/abi/config/config.hpp create mode 100644 libs/json-3.12.0/tests/abi/config/custom.cpp create mode 100644 libs/json-3.12.0/tests/abi/config/default.cpp create mode 100644 libs/json-3.12.0/tests/abi/config/noversion.cpp create mode 100644 libs/json-3.12.0/tests/abi/diag/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/abi/diag/diag.cpp create mode 100644 libs/json-3.12.0/tests/abi/diag/diag.hpp create mode 100644 libs/json-3.12.0/tests/abi/diag/diag_off.cpp create mode 100644 libs/json-3.12.0/tests/abi/diag/diag_on.cpp create mode 100644 libs/json-3.12.0/tests/abi/include/nlohmann/json_v3_10_5.hpp create mode 100644 libs/json-3.12.0/tests/abi/inline_ns/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/abi/inline_ns/use_current.cpp create mode 100644 libs/json-3.12.0/tests/abi/inline_ns/use_v3_10_5.cpp create mode 100644 libs/json-3.12.0/tests/abi/main.cpp create mode 100644 libs/json-3.12.0/tests/benchmarks/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/benchmarks/src/benchmarks.cpp create mode 100644 libs/json-3.12.0/tests/cmake_add_subdirectory/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_add_subdirectory/project/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_add_subdirectory/project/main.cpp create mode 100644 libs/json-3.12.0/tests/cmake_fetch_content/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_fetch_content/project/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_fetch_content/project/main.cpp create mode 100644 libs/json-3.12.0/tests/cmake_fetch_content2/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_fetch_content2/project/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_fetch_content2/project/main.cpp create mode 100644 libs/json-3.12.0/tests/cmake_import/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_import/project/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_import/project/main.cpp create mode 100644 libs/json-3.12.0/tests/cmake_import_minver/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_import_minver/project/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_import_minver/project/main.cpp create mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/Bar.cpp create mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/Bar.hpp create mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/Foo.cpp create mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/Foo.hpp create mode 100644 libs/json-3.12.0/tests/cmake_target_include_directories/project/main.cpp create mode 100644 libs/json-3.12.0/tests/cuda_example/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/cuda_example/json_cuda.cu create mode 100644 libs/json-3.12.0/tests/fuzzing.md create mode 100644 libs/json-3.12.0/tests/reports/2016-08-29-fuzz/exec_speed.png create mode 100644 libs/json-3.12.0/tests/reports/2016-08-29-fuzz/fuzz.tiff create mode 100644 libs/json-3.12.0/tests/reports/2016-08-29-fuzz/high_freq.png create mode 100644 libs/json-3.12.0/tests/reports/2016-08-29-fuzz/index.html create mode 100644 libs/json-3.12.0/tests/reports/2016-08-29-fuzz/low_freq.png create mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/README.md create mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/conformance_Nlohmann (C++11).md create mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/conformance_overall_Result.png create mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/performance_Corei7-4980HQ@2.80GHz_mac64_clang7.0_1._Parse_Memory_(byte).png create mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/performance_Corei7-4980HQ@2.80GHz_mac64_clang7.0_1._Parse_Time_(ms).png create mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/performance_Corei7-4980HQ@2.80GHz_mac64_clang7.0_2._Stringify_Time_(ms).png create mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/performance_Corei7-4980HQ@2.80GHz_mac64_clang7.0_3._Prettify_Time_(ms).png create mode 100644 libs/json-3.12.0/tests/reports/2016-09-09-nativejson_benchmark/performance_Corei7-4980HQ@2.80GHz_mac64_clang7.0_7._Code_size_FileSize_(byte).png create mode 100644 libs/json-3.12.0/tests/reports/2016-10-02-fuzz/exec_speed.png create mode 100644 libs/json-3.12.0/tests/reports/2016-10-02-fuzz/fuzz.tiff create mode 100644 libs/json-3.12.0/tests/reports/2016-10-02-fuzz/high_freq.png create mode 100644 libs/json-3.12.0/tests/reports/2016-10-02-fuzz/index.html create mode 100644 libs/json-3.12.0/tests/reports/2016-10-02-fuzz/low_freq.png create mode 100644 libs/json-3.12.0/tests/src/fuzzer-driver_afl.cpp create mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_bjdata.cpp create mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_bson.cpp create mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_cbor.cpp create mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_json.cpp create mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_msgpack.cpp create mode 100644 libs/json-3.12.0/tests/src/fuzzer-parse_ubjson.cpp create mode 100644 libs/json-3.12.0/tests/src/make_test_data_available.hpp create mode 100644 libs/json-3.12.0/tests/src/test_utils.hpp create mode 100644 libs/json-3.12.0/tests/src/unit-32bit.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-algorithms.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-allocator.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-alt-string.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-assert_macro.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-binary_formats.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-bjdata.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-bson.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-byte_container_with_subtype.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-capacity.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-cbor.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-class_const_iterator.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-class_iterator.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-class_lexer.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-class_parser.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-class_parser_diagnostic_positions.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-comparison.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-concepts.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-constructor1.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-constructor2.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-convenience.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-conversions.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-custom-base-class.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-deserialization.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-diagnostic-positions-only.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-diagnostic-positions.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-diagnostics.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-disabled_exceptions.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-element_access1.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-element_access2.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-hash.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-inspection.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-items.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-iterators1.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-iterators2.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-iterators3.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-json_patch.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-json_pointer.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-large_json.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-locale-cpp.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-merge_patch.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-meta.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-modifiers.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-msgpack.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-no-mem-leak-on-adl-serialize.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-noexcept.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-ordered_json.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-ordered_map.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-pointer_access.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-readme.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-reference_access.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-regression1.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-regression2.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-serialization.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-testsuites.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-to_chars.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-type_traits.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-ubjson.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-udl.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-udt.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-udt_macro.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-unicode1.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-unicode2.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-unicode3.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-unicode4.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-unicode5.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-user_defined_input.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-windows_h.cpp create mode 100644 libs/json-3.12.0/tests/src/unit-wstring.cpp create mode 100644 libs/json-3.12.0/tests/src/unit.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerCorpus.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerCrossOver.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerDefs.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerDictionary.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerDriver.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerExtFunctions.def create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerExtFunctions.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerExtFunctionsDlsym.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerExtFunctionsWeak.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerExtFunctionsWeakAlias.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerFlags.def create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerIO.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerIO.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerIOPosix.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerIOWindows.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerInterface.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerInternal.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerLoop.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerMain.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerMerge.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerMerge.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerMutate.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerMutate.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerOptions.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerRandom.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerSHA1.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerSHA1.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerTracePC.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerTracePC.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerTraceState.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtil.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtil.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtilDarwin.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtilLinux.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtilPosix.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerUtilWindows.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/FuzzerValueBitMap.h create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/README.txt create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/afl/afl_driver.cpp create mode 100755 libs/json-3.12.0/tests/thirdparty/Fuzzer/build.sh create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/cxx.dict create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/standalone/StandaloneFuzzTargetMain.c create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/AFLDriverTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/AbsNegAndConstant64Test.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/AbsNegAndConstantTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/AccumulateAllocationsTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/BufferOverflowOnInput.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/CallerCalleeTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/CounterTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/CustomCrossOverTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/CustomMutatorTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/DSO1.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/DSO2.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/DSOTestExtra.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/DSOTestMain.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/DivTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/EmptyTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/FourIndependentBranchesTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/FullCoverageSetTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/FuzzerUnittest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/InitializeTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/LeakTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/LeakTimeoutTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/LoadTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/MemcmpTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/NthRunCrashTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/NullDerefOnEmptyTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/NullDerefTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/OneHugeAllocTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/OutOfMemorySingleLargeMallocTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/OutOfMemoryTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/RepeatedBytesTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/RepeatedMemcmp.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ShrinkControlFlowTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ShrinkValueProfileTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SignedIntOverflowTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SimpleCmpTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SimpleDictionaryTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SimpleHashTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SimpleTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SimpleThreadedTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SingleMemcmpTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SingleStrcmpTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SingleStrncmpTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SpamyTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/StrcmpTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/StrncmpOOBTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/StrncmpTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/StrstrTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SwapCmpTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/Switch2Test.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/SwitchTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ThreadedLeakTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ThreadedTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/TimeoutEmptyTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/TimeoutTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/TraceMallocTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/UninstrumentedTest.cpp create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/afl-driver-extra-stats.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/afl-driver-stderr.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/caller-callee.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/coverage.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/dict1.txt create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/dump_coverage.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-customcrossover.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-custommutator.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-dict.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-dirs.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-fdmask.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-finalstats.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-flags.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-jobs.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-leak.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-oom-with-profile.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-oom.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-printcovpcs.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-runs.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-seed.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-segv.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-singleinputs.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-threaded.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-timeout.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-traces-hooks.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer-ubsan.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/fuzzer.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/hi.txt create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/lit.cfg create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/lit.site.cfg.in create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/merge.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/minimize_crash.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/no-coverage/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/repeated-bytes.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/shrink.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/simple-cmp.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/standalone.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/swap-cmp.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/trace-malloc.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ubsan/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/ulimit.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/uninstrumented/CMakeLists.txt create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/unit/lit.cfg create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/unit/lit.site.cfg.in create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-cmp.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-cmp2.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-cmp3.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-cmp4.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-div.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-load.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-mem.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-set.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-strcmp.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-strncmp.test create mode 100644 libs/json-3.12.0/tests/thirdparty/Fuzzer/test/value-profile-switch.test create mode 100644 libs/json-3.12.0/tests/thirdparty/doctest/doctest.h create mode 100644 libs/json-3.12.0/tests/thirdparty/doctest/doctest_compatibility.h create mode 100644 libs/json-3.12.0/tests/thirdparty/fifo_map/fifo_map.hpp create mode 100755 libs/json-3.12.0/tests/thirdparty/imapdl/filterbr.py create mode 100644 libs/json-3.12.0/tools/amalgamate/CHANGES.md create mode 100644 libs/json-3.12.0/tools/amalgamate/README.md create mode 100755 libs/json-3.12.0/tools/amalgamate/amalgamate.py create mode 100644 libs/json-3.12.0/tools/amalgamate/config_json.json create mode 100644 libs/json-3.12.0/tools/amalgamate/config_json_fwd.json create mode 100644 libs/json-3.12.0/tools/astyle/.astylerc create mode 100644 libs/json-3.12.0/tools/astyle/requirements.txt create mode 100644 libs/json-3.12.0/tools/gdb_pretty_printer/README.md create mode 100644 libs/json-3.12.0/tools/gdb_pretty_printer/nlohmann-json.py create mode 100644 libs/json-3.12.0/tools/generate_natvis/README.md create mode 100755 libs/json-3.12.0/tools/generate_natvis/generate_natvis.py create mode 100644 libs/json-3.12.0/tools/generate_natvis/nlohmann_json.natvis.j2 create mode 100644 libs/json-3.12.0/tools/generate_natvis/requirements.txt create mode 100644 libs/json-3.12.0/tools/macro_builder/main.cpp create mode 100644 libs/json-3.12.0/tools/serve_header/README.md create mode 100644 libs/json-3.12.0/tools/serve_header/demo.png create mode 100644 libs/json-3.12.0/tools/serve_header/requirements.txt create mode 100755 libs/json-3.12.0/tools/serve_header/serve_header.py create mode 100644 libs/json-3.12.0/tools/serve_header/serve_header.yml.example create mode 100644 main.cpp create mode 100644 main.d create mode 100644 main.o create mode 100644 models/demo.xnh create mode 100644 models/demo_trained.xnh create mode 100644 models/demo_trained.xnh.step1500 create mode 100644 models/test_model.bfr create mode 100644 models/test_model.h create mode 100644 ollama_api/test.cpp create mode 100644 settings.h create mode 100644 xenith/converter.cpp create mode 100644 xenith/converter.h create mode 100644 xenith/core/backward.cpp create mode 100644 xenith/core/backward.d create mode 100644 xenith/core/backward.o create mode 100644 xenith/core/checkpoint.cpp create mode 100644 xenith/core/checkpoint.d create mode 100644 xenith/core/checkpoint.h create mode 100644 xenith/core/checkpoint.o create mode 100644 xenith/core/generate.cpp create mode 100644 xenith/core/generate.d create mode 100644 xenith/core/generate.h create mode 100644 xenith/core/generate.o create mode 100644 xenith/core/gradcheck.cpp create mode 100644 xenith/core/gradcheck.d create mode 100644 xenith/core/gradcheck.h create mode 100644 xenith/core/gradcheck.o create mode 100644 xenith/core/model.cpp create mode 100644 xenith/core/model.d create mode 100644 xenith/core/model.h create mode 100644 xenith/core/model.o create mode 100644 xenith/core/tensor.h create mode 100644 xenith/core/train.h create mode 100644 xenith/core/trainer.cpp create mode 100644 xenith/core/trainer.d create mode 100644 xenith/core/trainer.o create mode 100644 xenith/preprocessing/tokenizer.cpp create mode 100644 xenith/preprocessing/tokenizer.h diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/Xenith.iml b/.idea/Xenith.iml new file mode 100644 index 0000000..4c94235 --- /dev/null +++ b/.idea/Xenith.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/editor.xml b/.idea/editor.xml new file mode 100644 index 0000000..4d62399 --- /dev/null +++ b/.idea/editor.xml @@ -0,0 +1,254 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0b76fe5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..ff105f5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..2de374e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 3.20) +project(Xenith) + +set(CMAKE_CXX_STANDARD 17) # В Makefile указан c++17 +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Опции компиляции из твоего Makefile +# Для Debug сборки CLion обычно сам добавляет -O0 -g, но можно форсировать +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_CXX_FLAGS_DEBUG "-O1 -g -fsanitize=address,undefined") + set(CMAKE_EXE_LINKER_FLAGS_DEBUG "-fsanitize=address,undefined") +else() + set(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native -ffast-math -funroll-loops") +endif() + +# Добавляем предупреждения +add_compile_options(-Wall -Wextra -Wno-unused-parameter) + +# Список исходных файлов из твоего Makefile +set(SOURCES + main.cpp + xenith/core/model.cpp + xenith/core/backward.cpp + xenith/core/trainer.cpp + xenith/core/checkpoint.cpp + xenith/core/generate.cpp + xenith/core/gradcheck.cpp + # Файлы, которые уже были в твоем старом CMakeLists.txt + xenith/preprocessing/tokenizer.cpp + ollama_api/test.cpp + xenith/converter.cpp +) + +# Заголовочные файлы (для удобства в IDE) +file(GLOB_RECURSE HEADER_FILES "*.h" "*.hpp") + +add_executable(Xenith ${SOURCES} ${HEADER_FILES}) + +# Настройка include директорий +target_include_directories(Xenith PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +# Потоки (pthread) +find_package(Threads REQUIRED) +target_link_libraries(Xenith PRIVATE Threads::Threads) \ No newline at end of file diff --git a/KVCacheArch b/KVCacheArch new file mode 100644 index 0000000..9ec93aa --- /dev/null +++ b/KVCacheArch @@ -0,0 +1,7 @@ +// [token][layer][kv][head][dim] +struct TokenKV { + float k[num_heads][head_dim]; // Ключи всех голов этого слоя + float v[num_heads][head_dim]; // Значения всех голов этого слоя +}; + +TokenKV kv_cache[MAX_CTX][NUM_LAYERS]; \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bfb3cbe --- /dev/null +++ b/Makefile @@ -0,0 +1,47 @@ +CXX ?= g++ +CXXFLAGS ?= -O3 -march=native -ffast-math -funroll-loops -std=c++17 -Wall -Wextra -Wno-unused-parameter +LDFLAGS ?= -pthread + +SRC := main.cpp \ + xenith/core/model.cpp \ + xenith/core/backward.cpp \ + xenith/core/trainer.cpp \ + xenith/core/checkpoint.cpp \ + xenith/core/generate.cpp \ + xenith/core/gradcheck.cpp + +OBJ := $(SRC:.cpp=.o) +DEP := $(OBJ:.o=.d) +BIN := bin/xenith + +# Без -include .d make считает ПЕРВУЮ цель в make-файле целью по умолчанию. +# Если первой стоит "-include $(DEP)", сборка молча превращается в no-op: +# ни один .o не пересобирается, и правки исходников не доходят до бинарника. +# Именно так мы потеряли час: gradcheck показывал одни и те же числа +# после нескольких исправлений. Поэтому первая цель здесь — всегда all. +ALL_OBJ := $(OBJ) + +all: $(BIN) +.PHONY: all + +bin: + mkdir -p bin + +$(BIN): $(ALL_OBJ) + @mkdir -p bin + $(CXX) $(ALL_OBJ) -o $@ $(LDFLAGS) + +%.o: %.cpp + $(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@ + +debug: + $(MAKE) clean + $(MAKE) CXXFLAGS="-O1 -g -std=c++17 -Wall -Wextra -Wno-unused-parameter -fsanitize=address,undefined" \ + LDFLAGS="-pthread -fsanitize=address,undefined" + +clean: + rm -f $(OBJ) $(DEP) $(BIN) + +.PHONY: debug clean + +-include $(DEP) diff --git a/README.md b/README.md new file mode 100644 index 0000000..1cdf6e0 --- /dev/null +++ b/README.md @@ -0,0 +1,136 @@ +# Xenith + +Трансформер на чистом C++: обучение и генерация текста на CPU, без внешних +зависимостей. Всё в одном бинарнике. + +``` +make # собрать -> bin/xenith +./bin/xenith --help +``` + +## Что внутри + +Архитектура — как у LLaMA: pre-norm, RMSNorm, RoPE, SwiGLU, связанные +эмбеддинги (tied weights), каузальное внимание. Обучение — вручную +написанный обратный проход + AdamW. Никаких фреймворков. + +| файл | что делает | +|---|---| +| `xenith/core/tensor.h` | матрицы, три формы GEMM, RMSNorm, RNG, пул потоков | +| `xenith/core/model.cpp` | конфигурация, инициализация, прямой проход, RoPE, Adam | +| `xenith/core/backward.cpp` | обратный проход (ручной, без автомиффов) | +| `xenith/core/trainer.cpp` | цикл обучения, расписание lr, чекпоинты, валидация | +| `xenith/core/generate.cpp` | генерация с KV-кэшем, temperature / top-k / top-p | +| `xenith/core/checkpoint.cpp` | формат `.xnh`, токенизатор, сохранение/загрузка | +| `xenith/core/gradcheck.cpp` | численная проверка градиентов + бенчмарк | + +## Быстрый старт + +```bash +# 1) собрать модель из своего текста +./bin/xenith new models/my.xnh --corpus data.txt \ + --vocab 512 --embd 128 --layers 6 --heads 8 --ctx 256 + +# 2) обучить +./bin/xenith train models/my.xnh --corpus data.txt \ + --out models/my_trained.xnh --steps 5000 --batch 16 --lr 3e-4 + +# 3) сгенерировать +./bin/xenith gen models/my_trained.xnh --prompt "Привет" --n 200 --temp 0.8 +``` + +## Команды + +### new — создать модель + +Читает корпус, строит по нему словарь, инициализирует веса случайно. + +``` +--corpus PATH текст (обязательно) +--out PATH файл модели (по умолчанию model.xnh) +--vocab N размер словаря (512) +--embd N ширина эмбеддинга (128) +--layers N число слоёв (4) +--heads N число голов (4). embd должен делиться на heads +--ctx N максимальный контекст (128) +--ffn N ширина FFN (0 = 4*embd) +--rope N база RoPE (10000) +--seed N зерно инициализации (1337) +--untied отдельная матрица выхода вместо связанной с эмбеддингом +``` + +Словарь двухуровневый: частые слова берутся целиком, остальное режется на +символы. Так словарь остаётся маленьким, а любой текст кодируется без потерь — +модель может учить и слова, и буквы. + +### train — обучить + +``` +--corpus PATH текст (обязательно) +--out PATH куда сохранить (по умолчанию перезаписывает входной файл) +--steps N шагов (1000) +--batch N батч (8) +--block N длина окна (64) +--lr F скорость (3e-4) +--wd F weight decay (0.01) +--clip F клип нормы градиента (1.0) +--warmup N прогрев (100) +--seed N зерно (1337) +--log-every N как часто печатать (50) +--ckpt-every N промежуточный чекпоинт каждые N шагов (0 = нет) +--val-every N валидация каждые N шагов (0 = нет) +--val-tokens N размер валидации (20000) +--threads N потоков (0 = все ядра) +--resume продолжить с сохранённого step +``` + +Прогрев + косинусное затухание до `lr * 0.1`. Промежуточные чекпоинты +пишутся как `models/my.xnh.step1500` — можно откатиться, если loss +развалился. + +### gen — сгенерировать + +``` +--prompt STR стартовый текст +--n N сколько токенов (200) +--temp F температура; 0 = жадный выбор (0.8) +--top-k N top-k (40), 0 = выкл +--top-p F top-p (0.95), 1.0 = выкл +--seed N зерно +--no-stream не печатать в процессе +--batch "a;b;c" несколько промптов через ; +--show-tokens показать id токенов +``` + +### info / gradcheck / bench + +```bash +./bin/xenith info models/my.xnh # конфигурация и словарь +./bin/xenith gradcheck # градиенты против численных +./bin/xenith bench models/my.xnh # скорость +``` + +`gradcheck` стоит запускать после любой правки в `model.cpp` / `backward.cpp` — +он ловит ошибку в обратном проходе за секунды. + +## Формат модели + +Один файл `.xnh` содержит и словарь, и веса, и состояние оптимизатора. +При загрузке проверяется каждая размерность тензора, так что модель, +собранная с другими настройками, отвергается с понятной ошибкой, а не +молча портит вывод. + +Совместимость с `models/test_model.bfr` (старый формат) **не** поддерживается: +там была другая раскладка весов. + +## Что учесть + +- **Скорость.** ~7600 ток/с на 4 ядрах для 4 слоёв × 64 измерения. С ростом + модели скорость падает квадратично по `embd` и линейно по слоям. + Замеряйте своим `bench`. +- **Форма входа.** `text`, `code`, `html` — чем однороднее корпус, тем + меньше словарь и тем быстрее обучение. +- **Количество данных.** Модель на 0.25 млн параметров хочет хотя бы + несколько мегабайт текста, иначе будет только запоминать. +- **Токенизатор** — слова + символы, не BPE. Для морфологически богатых + языков это проще, но экономнее BPE приходится платить длиной последовательности. diff --git a/bin/xenith b/bin/xenith new file mode 100755 index 0000000000000000000000000000000000000000..a6a39ac5ad6feb6126cb83d9d25700ce10ae4dbc GIT binary patch literal 384392 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 z≪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 PURz}P5n&0!qU`?x-y-fT literal 0 HcmV?d00001 diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..6c2217f --- /dev/null +++ b/config.yaml @@ -0,0 +1,2 @@ +models: + BiPy: models/bipy.bif diff --git a/corpus/demo.txt b/corpus/demo.txt new file mode 100644 index 0000000..5455f11 --- /dev/null +++ b/corpus/demo.txt @@ -0,0 +1,4000 @@ +старый данные возвращает в системы +быстрый код записывает в алгоритма +медленный программа создаёт в кода +новый компьютер записывает в алгоритма +старый код записывает в компьютера +простой данные читает в кода +новый компьютер работает в системы +новый переменная читает в программы +новый переменная считает в данных +хороший память создаёт в памяти +медленный функция создаёт в памяти +хороший переменная создаёт в программы +новый программа меняет в программы +сложный компьютер работает в программы +медленный данные хранит в алгоритма +сложный функция записывает в компьютера +сложный код считает в памяти +медленный программа возвращает в программы +простой программа считает в компьютера +хороший данные меняет в данных +новый переменная хранит в функции +сложный память хранит в кода +новый код хранит в кода +медленный компьютер работает в алгоритма +старый память возвращает в программы +новый алгоритм создаёт в программы +старый система возвращает в функции +сложный алгоритм работает в алгоритма +сложный переменная работает в компьютера +быстрый компьютер меняет в данных +старый код возвращает в программы +новый память читает в компьютера +хороший компьютер хранит в компьютера +быстрый память работает в алгоритма +новый функция считает в алгоритма +медленный алгоритм записывает в алгоритма +быстрый данные создаёт в алгоритма +хороший алгоритм меняет в памяти +хороший алгоритм работает в памяти +медленный данные возвращает в системы +новый данные хранит в системы +хороший компьютер возвращает в памяти +хороший переменная считает в данных +простой компьютер записывает в алгоритма +новый код считает в кода +сложный память возвращает в функции +новый программа возвращает в функции +новый память создаёт в памяти +сложный код читает в кода +новый программа работает в функции +новый код работает в программы +быстрый функция хранит в алгоритма +быстрый указатель создаёт в функции +старый указатель меняет в программы +сложный функция меняет в памяти +сложный функция работает в функции +новый память хранит в алгоритма +сложный функция считает в памяти +старый код создаёт в функции +хороший указатель записывает в алгоритма +быстрый указатель записывает в памяти +старый алгоритм меняет в компьютера +быстрый код работает в алгоритма +старый система хранит в функции +новый компьютер возвращает в кода +сложный система читает в памяти +новый функция меняет в данных +новый компьютер возвращает в функции +новый компьютер хранит в функции +медленный программа возвращает в программы +медленный компьютер читает в функции +старый код считает в памяти +быстрый данные работает в памяти +хороший программа возвращает в алгоритма +новый система создаёт в программы +быстрый код возвращает в кода +медленный компьютер записывает в функции +сложный память меняет в программы +хороший переменная возвращает в функции +простой компьютер возвращает в алгоритма +новый данные меняет в программы +медленный программа хранит в системы +хороший данные возвращает в алгоритма +простой компьютер считает в программы +сложный компьютер меняет в памяти +простой система хранит в компьютера +медленный указатель записывает в системы +быстрый указатель меняет в компьютера +простой память читает в компьютера +хороший программа меняет в алгоритма +сложный программа меняет в системы +простой система считает в компьютера +сложный программа записывает в функции +быстрый код записывает в алгоритма +хороший функция создаёт в функции +сложный система считает в компьютера +медленный данные возвращает в системы +новый функция считает в алгоритма +медленный система считает в алгоритма +быстрый функция хранит в алгоритма +медленный память создаёт в памяти +сложный функция меняет в памяти +быстрый данные меняет в памяти +новый память считает в данных +старый алгоритм возвращает в данных +сложный память создаёт в системы +медленный указатель меняет в функции +медленный система возвращает в кода +старый данные работает в данных +старый код возвращает в программы +новый данные возвращает в данных +новый программа возвращает в памяти +новый указатель меняет в компьютера +простой алгоритм создаёт в системы +быстрый код читает в компьютера +новый переменная работает в алгоритма +медленный функция создаёт в памяти +сложный функция считает в памяти +старый алгоритм меняет в компьютера +сложный память меняет в программы +простой алгоритм работает в алгоритма +новый система создаёт в программы +новый функция хранит в алгоритма +хороший переменная записывает в алгоритма +быстрый компьютер работает в компьютера +новый данные создаёт в компьютера +новый алгоритм возвращает в данных +старый указатель меняет в программы +новый указатель считает в функции +старый переменная считает в программы +быстрый компьютер записывает в функции +сложный данные работает в программы +новый алгоритм считает в кода +новый система считает в системы +новый система записывает в кода +новый алгоритм записывает в данных +быстрый память читает в кода +новый указатель читает в программы +новый код меняет в алгоритма +медленный указатель создаёт в функции +старый переменная записывает в кода +быстрый функция хранит в алгоритма +новый данные считает в памяти +новый программа читает в системы +новый программа хранит в данных +новый переменная читает в программы +медленный данные хранит в алгоритма +сложный функция считает в памяти +простой память меняет в кода +сложный память считает в данных +хороший код возвращает в данных +хороший данные возвращает в алгоритма +новый функция меняет в данных +быстрый система работает в компьютера +сложный указатель работает в данных +сложный функция хранит в алгоритма +сложный переменная считает в компьютера +сложный код меняет в алгоритма +новый указатель записывает в системы +медленный система хранит в данных +медленный система работает в программы +сложный код хранит в кода +старый переменная работает в кода +новый компьютер работает в программы +быстрый алгоритм меняет в системы +простой переменная записывает в системы +простой переменная записывает в системы +простой указатель возвращает в алгоритма +простой память возвращает в компьютера +быстрый функция меняет в памяти +старый память читает в алгоритма +медленный указатель записывает в системы +медленный алгоритм создаёт в кода +быстрый программа работает в компьютера +медленный система возвращает в кода +новый программа работает в кода +простой память создаёт в данных +медленный переменная хранит в компьютера +сложный функция считает в памяти +хороший программа считает в функции +новый алгоритм работает в компьютера +быстрый память хранит в памяти +простой память работает в программы +новый код записывает в функции +старый переменная записывает в кода +сложный алгоритм работает в алгоритма +быстрый память работает в алгоритма +хороший данные работает в функции +медленный программа хранит в системы +хороший компьютер записывает в кода +новый переменная хранит в функции +старый переменная возвращает в функции +быстрый память читает в кода +хороший функция создаёт в функции +сложный функция меняет в памяти +быстрый программа хранит в алгоритма +новый данные возвращает в данных +старый код возвращает в программы +хороший данные меняет в данных +хороший память считает в системы +медленный данные хранит в алгоритма +простой память возвращает в компьютера +хороший программа работает в памяти +хороший система работает в программы +хороший компьютер возвращает в памяти +сложный программа возвращает в системы +старый программа хранит в системы +хороший память работает в компьютера +быстрый функция читает в компьютера +новый программа читает в функции +сложный компьютер работает в программы +хороший компьютер работает в функции +хороший код считает в компьютера +простой программа записывает в программы +простой переменная хранит в компьютера +новый функция работает в данных +старый переменная возвращает в функции +быстрый функция возвращает в системы +новый данные считает в памяти +быстрый код читает в компьютера +старый компьютер возвращает в системы +медленный программа хранит в системы +медленный компьютер хранит в памяти +новый код меняет в алгоритма +быстрый функция работает в программы +простой переменная записывает в системы +новый система хранит в кода +хороший переменная работает в функции +новый функция возвращает в системы +быстрый программа хранит в алгоритма +медленный компьютер считает в системы +новый алгоритм возвращает в данных +быстрый данные записывает в компьютера +медленный программа работает в функции +новый система меняет в системы +новый функция возвращает в системы +быстрый данные работает в памяти +простой компьютер записывает в алгоритма +медленный компьютер читает в функции +медленный функция создаёт в памяти +старый указатель считает в алгоритма +старый код создаёт в функции +старый переменная создаёт в системы +хороший данные читает в кода +простой программа записывает в программы +хороший алгоритм считает в данных +новый алгоритм работает в кода +быстрый память записывает в системы +новый компьютер возвращает в функции +быстрый данные записывает в компьютера +сложный данные создаёт в кода +медленный код меняет в программы +быстрый функция меняет в памяти +медленный данные читает в алгоритма +сложный код возвращает в системы +медленный компьютер считает в системы +новый программа считает в кода +старый алгоритм считает в функции +старый алгоритм возвращает в данных +хороший память считает в системы +хороший программа меняет в алгоритма +простой код меняет в компьютера +новый указатель меняет в компьютера +новый программа меняет в программы +старый указатель работает в функции +простой код создаёт в программы +хороший компьютер работает в функции +новый переменная создаёт в функции +быстрый алгоритм создаёт в данных +новый функция считает в компьютера +новый функция меняет в данных +сложный переменная записывает в компьютера +быстрый компьютер читает в памяти +новый программа читает в системы +новый система хранит в кода +хороший алгоритм меняет в памяти +сложный переменная читает в памяти +новый функция меняет в данных +быстрый алгоритм работает в алгоритма +хороший алгоритм считает в данных +хороший данные меняет в данных +хороший система считает в кода +старый память создаёт в памяти +хороший система работает в программы +медленный память создаёт в памяти +старый система читает в памяти +быстрый переменная считает в кода +простой программа меняет в кода +новый функция создаёт в кода +хороший алгоритм работает в памяти +медленный компьютер хранит в памяти +простой алгоритм работает в алгоритма +старый указатель создаёт в кода +новый переменная работает в системы +быстрый система считает в системы +медленный система работает в программы +хороший код возвращает в данных +новый алгоритм меняет в данных +простой алгоритм меняет в компьютера +старый переменная читает в программы +простой код записывает в компьютера +сложный данные возвращает в данных +хороший алгоритм меняет в памяти +старый компьютер меняет в системы +быстрый переменная возвращает в кода +новый переменная считает в системы +новый память работает в кода +хороший память считает в системы +быстрый указатель работает в памяти +сложный переменная работает в компьютера +старый система читает в памяти +старый алгоритм меняет в компьютера +новый код меняет в программы +новый данные хранит в системы +старый функция читает в функции +сложный система меняет в программы +медленный система меняет в данных +быстрый указатель хранит в данных +старый данные хранит в компьютера +простой данные создаёт в функции +хороший система работает в программы +старый память возвращает в программы +простой указатель возвращает в алгоритма +новый указатель считает в программы +сложный компьютер хранит в кода +новый система работает в системы +простой программа возвращает в компьютера +простой система работает в данных +хороший функция хранит в программы +быстрый память считает в программы +новый система меняет в программы +хороший система меняет в кода +простой функция хранит в системы +новый указатель читает в данных +новый алгоритм считает в кода +простой код считает в компьютера +сложный память работает в данных +медленный алгоритм считает в данных +хороший программа работает в памяти +новый указатель возвращает в функции +старый компьютер считает в компьютера +быстрый данные записывает в компьютера +быстрый память считает в программы +новый система меняет в системы +новый компьютер читает в компьютера +сложный данные создаёт в кода +быстрый указатель создаёт в функции +простой функция создаёт в системы +простой программа работает в компьютера +сложный функция считает в памяти +простой код создаёт в программы +сложный компьютер хранит в кода +хороший указатель возвращает в компьютера +медленный данные считает в памяти +сложный алгоритм работает в алгоритма +медленный данные возвращает в системы +новый данные читает в программы +новый алгоритм читает в кода +быстрый данные создаёт в алгоритма +быстрый компьютер считает в кода +хороший система читает в памяти +быстрый переменная возвращает в кода +новый система считает в алгоритма +быстрый программа записывает в функции +быстрый компьютер создаёт в алгоритма +новый данные возвращает в кода +новый переменная работает в алгоритма +медленный указатель работает в данных +быстрый алгоритм меняет в системы +хороший функция считает в данных +медленный переменная хранит в компьютера +хороший переменная хранит в памяти +простой указатель меняет в системы +новый функция считает в компьютера +новый данные хранит в системы +новый система читает в функции +старый алгоритм создаёт в кода +быстрый переменная возвращает в кода +простой система возвращает в памяти +новый код меняет в программы +сложный указатель работает в данных +новый система меняет в системы +хороший система считает в кода +новый система возвращает в кода +сложный память создаёт в системы +сложный алгоритм работает в алгоритма +старый переменная записывает в кода +новый переменная возвращает в компьютера +сложный алгоритм возвращает в системы +старый компьютер считает в компьютера +быстрый функция записывает в программы +сложный программа считает в данных +новый компьютер записывает в компьютера +хороший память читает в системы +новый переменная работает в системы +быстрый программа хранит в алгоритма +новый функция работает в данных +новый функция создаёт в кода +простой компьютер читает в кода +быстрый алгоритм работает в алгоритма +сложный код возвращает в системы +старый переменная хранит в алгоритма +хороший переменная хранит в памяти +старый переменная записывает в кода +старый алгоритм работает в системы +новый данные записывает в данных +хороший указатель работает в функции +медленный программа хранит в системы +старый функция возвращает в кода +быстрый алгоритм создаёт в данных +новый программа считает в кода +новый компьютер считает в системы +хороший алгоритм записывает в данных +новый алгоритм возвращает в данных +старый алгоритм работает в системы +новый функция записывает в системы +быстрый система хранит в данных +медленный указатель создаёт в функции +сложный компьютер хранит в кода +простой код создаёт в программы +старый код хранит в компьютера +сложный алгоритм хранит в компьютера +новый алгоритм создаёт в программы +старый алгоритм работает в системы +сложный программа считает в данных +новый переменная работает в системы +сложный функция работает в функции +новый код возвращает в функции +хороший память возвращает в алгоритма +простой функция работает в системы +новый компьютер хранит в памяти +хороший данные возвращает в алгоритма +медленный данные возвращает в системы +быстрый компьютер хранит в кода +старый программа возвращает в алгоритма +хороший программа создаёт в кода +новый алгоритм хранит в программы +простой система считает в компьютера +старый программа создаёт в кода +сложный алгоритм работает в алгоритма +медленный указатель создаёт в функции +новый указатель читает в программы +старый данные меняет в функции +новый переменная работает в системы +сложный компьютер создаёт в кода +медленный код считает в программы +новый алгоритм записывает в данных +быстрый память хранит в памяти +сложный код хранит в кода +новый указатель считает в программы +медленный система создаёт в программы +новый память считает в данных +хороший функция возвращает в алгоритма +простой указатель меняет в системы +медленный код возвращает в алгоритма +простой алгоритм работает в алгоритма +хороший указатель создаёт в данных +старый компьютер записывает в данных +сложный система меняет в программы +новый данные работает в программы +медленный функция создаёт в памяти +старый система работает в памяти +простой система работает в данных +хороший программа считает в функции +старый память считает в памяти +быстрый код возвращает в кода +новый переменная создаёт в функции +сложный память считает в данных +медленный компьютер считает в системы +сложный функция создаёт в алгоритма +новый функция создаёт в системы +быстрый функция создаёт в памяти +медленный память считает в компьютера +старый переменная работает в кода +быстрый указатель меняет в компьютера +новый функция хранит в программы +сложный компьютер меняет в памяти +быстрый память работает в алгоритма +хороший программа считает в функции +медленный данные создаёт в программы +старый функция записывает в компьютера +быстрый данные меняет в памяти +хороший память считает в системы +быстрый переменная хранит в компьютера +новый программа создаёт в памяти +старый компьютер хранит в данных +новый данные работает в памяти +хороший указатель хранит в данных +простой программа работает в компьютера +хороший компьютер читает в алгоритма +медленный система хранит в данных +простой алгоритм хранит в алгоритма +старый код считает в памяти +новый данные читает в алгоритма +старый указатель работает в функции +новый данные читает в программы +медленный программа читает в данных +хороший данные записывает в алгоритма +сложный программа считает в данных +медленный функция записывает в функции +новый программа записывает в алгоритма +медленный система создаёт в программы +хороший память хранит в кода +новый компьютер считает в системы +старый программа меняет в алгоритма +новый алгоритм возвращает в данных +новый система меняет в системы +быстрый система считает в системы +старый данные создаёт в программы +хороший память хранит в кода +медленный программа считает в компьютера +медленный код записывает в программы +новый переменная считает в системы +новый данные хранит в системы +простой данные записывает в данных +сложный функция возвращает в памяти +новый программа читает в системы +медленный система меняет в данных +быстрый код работает в алгоритма +новый данные записывает в данных +хороший система читает в памяти +медленный программа считает в компьютера +быстрый данные считает в компьютера +быстрый код создаёт в алгоритма +хороший код возвращает в данных +быстрый программа хранит в алгоритма +старый код меняет в функции +новый система считает в алгоритма +медленный компьютер записывает в функции +сложный код записывает в системы +быстрый алгоритм записывает в компьютера +хороший данные работает в функции +старый указатель читает в алгоритма +старый код читает в системы +медленный функция хранит в программы +простой переменная записывает в системы +медленный переменная считает в памяти +новый алгоритм читает в кода +хороший переменная возвращает в функции +быстрый код возвращает в кода +быстрый алгоритм возвращает в функции +сложный программа хранит в кода +простой данные хранит в системы +старый компьютер читает в данных +хороший компьютер записывает в кода +сложный код возвращает в системы +медленный функция считает в системы +сложный указатель создаёт в алгоритма +старый алгоритм возвращает в данных +новый функция работает в данных +простой память создаёт в данных +новый функция создаёт в системы +медленный память возвращает в функции +медленный код считает в программы +простой код меняет в компьютера +старый компьютер меняет в системы +быстрый программа хранит в алгоритма +старый система записывает в функции +хороший алгоритм создаёт в компьютера +медленный указатель меняет в функции +сложный переменная считает в компьютера +медленный данные меняет в кода +быстрый переменная работает в памяти +новый память меняет в компьютера +новый программа меняет в программы +быстрый переменная хранит в компьютера +старый переменная записывает в кода +новый система хранит в программы +хороший указатель хранит в данных +быстрый система меняет в компьютера +медленный данные записывает в программы +простой код читает в программы +медленный память читает в данных +хороший система меняет в кода +новый код создаёт в функции +быстрый данные читает в памяти +новый алгоритм считает в кода +сложный компьютер работает в программы +сложный компьютер работает в программы +быстрый код работает в алгоритма +новый память записывает в памяти +хороший данные хранит в функции +медленный программа создаёт в кода +хороший функция возвращает в алгоритма +новый алгоритм записывает в данных +сложный код создаёт в кода +новый алгоритм читает в кода +простой указатель работает в системы +хороший программа хранит в компьютера +сложный память работает в данных +хороший код хранит в памяти +новый данные меняет в функции +хороший код читает в программы +старый код считает в памяти +сложный данные возвращает в данных +старый память меняет в системы +сложный компьютер меняет в памяти +медленный код работает в компьютера +простой функция меняет в системы +сложный компьютер создаёт в кода +медленный алгоритм создаёт в кода +сложный алгоритм работает в алгоритма +простой программа читает в памяти +новый данные возвращает в кода +быстрый компьютер возвращает в данных +новый переменная меняет в памяти +сложный алгоритм считает в данных +быстрый указатель записывает в памяти +новый компьютер считает в кода +простой программа записывает в программы +сложный алгоритм меняет в программы +медленный программа считает в компьютера +медленный переменная хранит в компьютера +новый система считает в алгоритма +хороший код считает в компьютера +старый данные записывает в функции +сложный код меняет в алгоритма +сложный алгоритм хранит в компьютера +простой данные возвращает в данных +простой компьютер хранит в кода +простой функция работает в системы +сложный программа хранит в кода +новый переменная хранит в функции +хороший компьютер хранит в компьютера +простой компьютер работает в функции +новый алгоритм читает в системы +сложный программа считает в данных +новый указатель хранит в компьютера +хороший код возвращает в данных +простой функция создаёт в системы +быстрый указатель создаёт в функции +новый переменная возвращает в компьютера +простой компьютер создаёт в памяти +быстрый указатель работает в памяти +сложный указатель меняет в компьютера +сложный функция меняет в памяти +новый указатель работает в кода +сложный система создаёт в данных +хороший указатель меняет в программы +сложный код меняет в алгоритма +медленный переменная хранит в компьютера +старый переменная считает в программы +быстрый компьютер меняет в данных +хороший переменная работает в функции +медленный система записывает в компьютера +хороший система считает в кода +старый данные меняет в функции +простой функция меняет в системы +старый память меняет в системы +простой алгоритм считает в компьютера +старый система считает в данных +сложный переменная записывает в компьютера +хороший алгоритм читает в данных +хороший переменная считает в данных +медленный система считает в алгоритма +быстрый код создаёт в алгоритма +простой компьютер считает в программы +простой алгоритм хранит в алгоритма +новый указатель считает в функции +медленный программа считает в компьютера +новый система хранит в программы +старый указатель считает в алгоритма +простой алгоритм создаёт в системы +сложный данные создаёт в кода +новый компьютер хранит в функции +хороший память читает в системы +старый указатель читает в алгоритма +хороший данные создаёт в памяти +простой память создаёт в данных +новый память создаёт в памяти +новый компьютер меняет в программы +сложный переменная записывает в компьютера +хороший указатель читает в компьютера +новый программа работает в кода +новый алгоритм возвращает в данных +новый данные считает в памяти +новый память меняет в программы +старый код возвращает в программы +простой функция возвращает в функции +сложный алгоритм записывает в алгоритма +старый алгоритм работает в системы +старый память записывает в кода +быстрый переменная создаёт в алгоритма +новый компьютер возвращает в функции +сложный указатель возвращает в компьютера +сложный указатель считает в компьютера +сложный функция записывает в компьютера +новый указатель хранит в памяти +простой функция работает в системы +старый функция создаёт в алгоритма +простой указатель создаёт в алгоритма +новый указатель работает в кода +хороший указатель работает в функции +старый программа меняет в алгоритма +старый компьютер создаёт в компьютера +сложный память возвращает в функции +сложный память меняет в программы +хороший компьютер считает в компьютера +быстрый память читает в кода +новый указатель возвращает в функции +новый алгоритм хранит в компьютера +новый переменная хранит в функции +медленный алгоритм считает в данных +новый указатель работает в компьютера +сложный код записывает в системы +новый программа создаёт в памяти +новый функция записывает в компьютера +быстрый программа меняет в функции +быстрый система хранит в данных +быстрый компьютер работает в компьютера +новый функция создаёт в кода +медленный компьютер записывает в функции +старый функция меняет в кода +старый переменная создаёт в системы +новый компьютер читает в компьютера +старый данные работает в данных +старый функция хранит в системы +медленный данные хранит в алгоритма +старый указатель читает в алгоритма +хороший переменная возвращает в функции +старый программа хранит в системы +хороший данные создаёт в памяти +быстрый указатель считает в функции +простой переменная создаёт в кода +новый система меняет в системы +простой память записывает в функции +простой код хранит в системы +новый система меняет в программы +сложный данные возвращает в данных +старый код возвращает в программы +старый алгоритм читает в памяти +хороший алгоритм хранит в компьютера +сложный переменная возвращает в программы +медленный код читает в функции +хороший данные создаёт в памяти +новый функция читает в компьютера +старый память работает в системы +старый указатель считает в алгоритма +новый код меняет в алгоритма +хороший код работает в компьютера +простой функция считает в алгоритма +старый переменная работает в кода +новый программа работает в функции +простой программа читает в памяти +быстрый система считает в системы +простой данные считает в компьютера +хороший система считает в кода +новый переменная записывает в алгоритма +быстрый переменная считает в кода +простой алгоритм считает в компьютера +простой память записывает в функции +быстрый функция работает в программы +медленный память хранит в системы +новый указатель возвращает в функции +простой переменная меняет в памяти +новый указатель работает в кода +новый память создаёт в памяти +сложный программа записывает в функции +сложный алгоритм работает в алгоритма +быстрый данные создаёт в алгоритма +быстрый память хранит в памяти +хороший функция возвращает в алгоритма +сложный переменная возвращает в программы +старый алгоритм хранит в алгоритма +новый система считает в алгоритма +новый память хранит в компьютера +хороший данные меняет в данных +медленный система создаёт в программы +сложный память хранит в кода +новый алгоритм возвращает в данных +быстрый компьютер меняет в данных +простой переменная хранит в компьютера +старый переменная меняет в программы +медленный программа работает в функции +простой данные работает в компьютера +новый компьютер записывает в компьютера +новый память читает в компьютера +простой данные записывает в данных +простой код записывает в компьютера +медленный код читает в функции +простой компьютер записывает в алгоритма +старый система работает в памяти +новый алгоритм меняет в кода +сложный данные возвращает в данных +медленный память считает в компьютера +быстрый алгоритм хранит в функции +простой система работает в данных +новый функция читает в компьютера +медленный указатель создаёт в функции +простой переменная создаёт в кода +новый система записывает в системы +старый программа меняет в алгоритма +сложный код работает в программы +быстрый переменная хранит в компьютера +старый указатель считает в алгоритма +новый указатель хранит в памяти +новый система считает в системы +старый система создаёт в памяти +новый переменная меняет в памяти +сложный память работает в данных +медленный данные считает в памяти +простой данные возвращает в данных +простой программа возвращает в компьютера +старый память меняет в системы +хороший система создаёт в компьютера +сложный система записывает в данных +сложный указатель меняет в компьютера +новый система записывает в системы +простой алгоритм создаёт в системы +хороший память читает в системы +новый компьютер возвращает в функции +быстрый указатель хранит в данных +новый память возвращает в компьютера +простой программа работает в компьютера +простой переменная работает в кода +новый память меняет в компьютера +простой система работает в данных +быстрый указатель считает в функции +простой программа создаёт в данных +медленный система меняет в данных +старый компьютер считает в компьютера +сложный память читает в алгоритма +новый переменная меняет в памяти +старый память считает в памяти +медленный указатель меняет в функции +новый функция возвращает в системы +хороший программа считает в функции +простой программа создаёт в данных +быстрый данные хранит в данных +медленный компьютер меняет в системы +простой компьютер возвращает в алгоритма +новый компьютер работает в программы +новый память хранит в компьютера +медленный переменная хранит в компьютера +сложный переменная читает в памяти +новый указатель создаёт в функции +медленный функция записывает в функции +старый алгоритм возвращает в данных +старый указатель работает в функции +новый переменная записывает в кода +простой система записывает в компьютера +старый функция хранит в системы +простой компьютер работает в функции +старый указатель работает в функции +быстрый программа читает в системы +медленный память работает в данных +простой переменная работает в кода +быстрый система хранит в данных +старый функция хранит в системы +простой система работает в данных +быстрый код читает в компьютера +новый система считает в алгоритма +сложный код считает в памяти +медленный переменная хранит в компьютера +медленный переменная работает в системы +медленный программа создаёт в кода +медленный переменная хранит в компьютера +быстрый программа считает в программы +старый алгоритм возвращает в данных +новый память возвращает в компьютера +быстрый код считает в памяти +новый данные считает в данных +быстрый код читает в компьютера +простой алгоритм считает в компьютера +старый память возвращает в программы +сложный переменная хранит в кода +сложный алгоритм возвращает в системы +новый система хранит в кода +хороший функция возвращает в алгоритма +новый алгоритм создаёт в программы +быстрый переменная создаёт в алгоритма +новый алгоритм работает в компьютера +новый система считает в алгоритма +новый переменная хранит в функции +новый алгоритм хранит в программы +медленный переменная записывает в кода +быстрый программа меняет в функции +простой указатель хранит в данных +новый компьютер читает в кода +хороший система меняет в кода +хороший алгоритм возвращает в кода +сложный данные возвращает в данных +простой переменная работает в кода +новый код меняет в программы +хороший компьютер считает в компьютера +старый память записывает в кода +старый алгоритм считает в функции +простой память работает в программы +новый алгоритм меняет в кода +новый память возвращает в компьютера +сложный данные возвращает в данных +старый указатель создаёт в кода +простой программа читает в памяти +хороший функция работает в алгоритма +новый программа хранит в кода +простой компьютер возвращает в алгоритма +сложный компьютер возвращает в кода +хороший программа читает в программы +новый компьютер считает в системы +новый переменная работает в системы +быстрый память считает в программы +простой данные возвращает в данных +простой память возвращает в компьютера +медленный компьютер меняет в системы +быстрый программа читает в системы +быстрый данные считает в компьютера +медленный память создаёт в памяти +сложный переменная меняет в кода +новый переменная возвращает в компьютера +новый указатель работает в кода +быстрый алгоритм меняет в системы +быстрый система меняет в компьютера +сложный переменная записывает в компьютера +новый указатель считает в программы +хороший память возвращает в алгоритма +быстрый переменная считает в кода +быстрый данные записывает в компьютера +медленный алгоритм меняет в данных +простой данные работает в компьютера +старый компьютер хранит в данных +хороший данные работает в функции +сложный указатель работает в данных +сложный компьютер записывает в кода +простой алгоритм меняет в компьютера +новый данные записывает в данных +сложный данные возвращает в данных +новый память меняет в программы +старый алгоритм хранит в алгоритма +хороший данные записывает в алгоритма +старый компьютер читает в данных +хороший код считает в компьютера +новый память читает в данных +быстрый система читает в компьютера +новый функция читает в компьютера +простой переменная читает в функции +новый указатель считает в программы +сложный программа меняет в системы +новый алгоритм считает в кода +медленный код хранит в алгоритма +медленный память читает в данных +новый система записывает в системы +сложный указатель записывает в памяти +хороший данные меняет в данных +простой функция читает в алгоритма +новый память работает в кода +хороший алгоритм возвращает в кода +хороший программа считает в функции +сложный память читает в алгоритма +новый система записывает в кода +старый указатель записывает в алгоритма +хороший программа хранит в компьютера +хороший алгоритм записывает в данных +хороший компьютер создаёт в данных +сложный алгоритм возвращает в системы +быстрый компьютер читает в памяти +новый переменная возвращает в алгоритма +новый компьютер записывает в алгоритма +хороший компьютер работает в функции +сложный программа создаёт в алгоритма +простой код меняет в компьютера +медленный алгоритм возвращает в данных +сложный переменная создаёт в функции +старый программа возвращает в алгоритма +простой компьютер читает в кода +старый указатель возвращает в алгоритма +старый код читает в системы +старый код создаёт в функции +старый компьютер меняет в системы +хороший программа возвращает в алгоритма +сложный код работает в программы +медленный программа читает в данных +старый память считает в памяти +сложный система записывает в данных +новый память создаёт в памяти +хороший алгоритм меняет в памяти +сложный память меняет в программы +сложный функция возвращает в памяти +хороший алгоритм хранит в компьютера +быстрый переменная меняет в кода +быстрый система создаёт в функции +новый память возвращает в памяти +сложный компьютер возвращает в кода +быстрый функция работает в программы +медленный память создаёт в памяти +новый код записывает в данных +новый функция читает в компьютера +старый память меняет в системы +медленный память возвращает в функции +новый переменная создаёт в функции +хороший компьютер записывает в кода +новый программа создаёт в памяти +медленный память работает в данных +хороший алгоритм записывает в данных +хороший код создаёт в данных +простой код читает в программы +хороший переменная работает в функции +новый алгоритм создаёт в компьютера +старый переменная читает в программы +медленный память возвращает в функции +сложный память создаёт в системы +простой программа работает в компьютера +медленный система хранит в данных +хороший функция читает в данных +новый компьютер считает в кода +новый код считает в компьютера +старый система создаёт в памяти +медленный компьютер считает в системы +быстрый программа считает в программы +быстрый данные записывает в компьютера +новый компьютер считает в системы +новый функция считает в алгоритма +новый алгоритм читает в кода +медленный программа считает в компьютера +быстрый система создаёт в функции +хороший данные записывает в алгоритма +простой данные создаёт в функции +простой система хранит в компьютера +новый данные работает в памяти +простой данные меняет в программы +старый указатель читает в алгоритма +сложный функция записывает в компьютера +новый компьютер работает в системы +быстрый переменная возвращает в кода +медленный память меняет в программы +сложный данные создаёт в кода +быстрый данные работает в памяти +сложный алгоритм считает в данных +новый данные меняет в функции +медленный компьютер хранит в памяти +новый указатель читает в данных +хороший данные хранит в функции +новый данные возвращает в кода +новый система работает в системы +хороший программа создаёт в кода +сложный указатель считает в компьютера +старый данные записывает в функции +простой система читает в программы +быстрый программа создаёт в программы +новый компьютер записывает в алгоритма +быстрый данные работает в памяти +быстрый переменная создаёт в алгоритма +простой указатель считает в памяти +новый компьютер создаёт в данных +старый указатель возвращает в алгоритма +новый код записывает в функции +новый переменная считает в данных +старый система хранит в функции +старый код работает в памяти +хороший система меняет в кода +новый память хранит в алгоритма +старый функция записывает в компьютера +хороший указатель считает в алгоритма +сложный память создаёт в системы +медленный код записывает в программы +хороший память хранит в кода +хороший система записывает в компьютера +быстрый программа читает в системы +новый функция считает в алгоритма +хороший данные возвращает в алгоритма +новый программа считает в кода +медленный функция записывает в функции +сложный переменная создаёт в функции +старый код работает в памяти +быстрый система создаёт в функции +медленный функция читает в алгоритма +медленный данные создаёт в программы +быстрый алгоритм создаёт в данных +новый алгоритм создаёт в компьютера +медленный функция работает в компьютера +новый переменная создаёт в алгоритма +быстрый функция меняет в памяти +простой алгоритм хранит в алгоритма +старый код считает в памяти +новый система считает в системы +старый переменная возвращает в функции +медленный указатель создаёт в функции +новый алгоритм читает в кода +медленный память хранит в системы +медленный компьютер работает в алгоритма +медленный компьютер считает в системы +хороший система считает в кода +сложный система создаёт в данных +сложный функция возвращает в памяти +медленный компьютер читает в функции +старый функция считает в функции +сложный функция записывает в компьютера +простой код создаёт в программы +старый функция возвращает в кода +хороший указатель меняет в программы +хороший система считает в кода +старый система меняет в данных +хороший компьютер читает в алгоритма +медленный переменная читает в функции +быстрый указатель считает в функции +простой алгоритм меняет в компьютера +простой программа создаёт в данных +медленный память хранит в системы +сложный алгоритм считает в данных +новый система возвращает в памяти +новый система считает в системы +медленный компьютер меняет в системы +хороший алгоритм хранит в компьютера +быстрый алгоритм работает в алгоритма +сложный программа создаёт в алгоритма +простой данные считает в компьютера +медленный указатель работает в данных +простой функция возвращает в функции +новый переменная меняет в кода +быстрый память меняет в программы +сложный данные считает в системы +старый компьютер считает в компьютера +новый код считает в кода +старый функция создаёт в алгоритма +простой алгоритм работает в алгоритма +новый код возвращает в функции +сложный данные создаёт в кода +медленный данные записывает в программы +новый компьютер работает в программы +старый указатель читает в алгоритма +новый переменная создаёт в алгоритма +новый переменная возвращает в компьютера +быстрый программа считает в программы +новый алгоритм создаёт в компьютера +быстрый указатель хранит в данных +хороший код считает в компьютера +старый программа меняет в алгоритма +сложный указатель создаёт в алгоритма +сложный память записывает в программы +сложный функция хранит в алгоритма +медленный функция возвращает в памяти +сложный код меняет в алгоритма +сложный программа создаёт в алгоритма +новый компьютер возвращает в кода +новый система хранит в кода +старый переменная работает в кода +медленный переменная работает в системы +старый алгоритм работает в системы +медленный переменная считает в памяти +новый указатель возвращает в данных +медленный переменная хранит в компьютера +хороший переменная записывает в алгоритма +простой код записывает в компьютера +новый код читает в программы +медленный код хранит в алгоритма +старый указатель возвращает в алгоритма +хороший программа возвращает в алгоритма +простой данные меняет в программы +хороший данные меняет в данных +сложный компьютер возвращает в кода +сложный память записывает в программы +новый код читает в программы +хороший функция записывает в кода +новый код читает в программы +хороший данные создаёт в памяти +старый переменная создаёт в системы +быстрый система меняет в компьютера +сложный функция создаёт в алгоритма +новый данные хранит в системы +хороший программа меняет в алгоритма +новый программа считает в кода +новый программа читает в функции +простой код записывает в компьютера +старый программа меняет в алгоритма +быстрый память создаёт в функции +медленный данные записывает в программы +хороший система читает в памяти +сложный код меняет в алгоритма +хороший алгоритм записывает в данных +быстрый алгоритм считает в данных +быстрый алгоритм читает в памяти +хороший указатель меняет в программы +сложный указатель возвращает в компьютера +старый данные записывает в функции +старый программа читает в компьютера +новый переменная возвращает в алгоритма +новый указатель считает в функции +быстрый программа считает в программы +старый алгоритм меняет в компьютера +медленный алгоритм создаёт в кода +простой переменная записывает в системы +быстрый данные возвращает в кода +хороший система меняет в кода +простой код возвращает в функции +сложный память читает в алгоритма +новый система записывает в системы +простой алгоритм считает в компьютера +быстрый данные создаёт в алгоритма +новый переменная записывает в алгоритма +хороший программа работает в памяти +медленный код хранит в алгоритма +новый алгоритм работает в кода +быстрый код работает в алгоритма +новый функция работает в программы +новый код считает в кода +старый указатель читает в алгоритма +простой код создаёт в программы +новый система читает в функции +сложный код работает в программы +новый переменная работает в системы +простой система работает в данных +быстрый алгоритм записывает в компьютера +новый данные записывает в данных +медленный программа записывает в данных +медленный программа работает в функции +новый данные меняет в программы +сложный компьютер считает в кода +новый код читает в программы +быстрый компьютер меняет в данных +простой компьютер считает в программы +сложный код возвращает в системы +новый код хранит в кода +новый функция записывает в компьютера +новый память считает в памяти +новый данные читает в алгоритма +простой алгоритм меняет в компьютера +хороший данные меняет в данных +медленный компьютер хранит в памяти +старый переменная создаёт в системы +сложный функция читает в памяти +простой память меняет в кода +быстрый программа меняет в функции +простой переменная работает в кода +хороший программа читает в программы +сложный память записывает в программы +сложный переменная работает в компьютера +быстрый компьютер меняет в данных +быстрый алгоритм хранит в функции +новый программа работает в кода +новый код работает в программы +медленный программа считает в компьютера +быстрый данные возвращает в кода +новый указатель создаёт в функции +новый указатель создаёт в функции +хороший данные возвращает в алгоритма +простой алгоритм создаёт в системы +новый переменная хранит в функции +новый программа читает в системы +сложный функция считает в памяти +новый указатель записывает в алгоритма +новый программа записывает в алгоритма +хороший программа записывает в памяти +простой данные меняет в программы +новый указатель записывает в системы +простой переменная меняет в памяти +старый функция меняет в кода +хороший программа считает в функции +медленный компьютер возвращает в системы +старый система хранит в функции +простой переменная работает в кода +старый код считает в памяти +новый код возвращает в функции +старый компьютер возвращает в системы +новый указатель записывает в алгоритма +новый программа читает в функции +хороший данные возвращает в алгоритма +медленный данные работает в памяти +простой код создаёт в программы +старый указатель читает в алгоритма +старый указатель работает в функции +медленный функция возвращает в памяти +медленный функция хранит в программы +старый функция меняет в кода +простой данные считает в компьютера +быстрый переменная читает в алгоритма +медленный данные хранит в алгоритма +быстрый алгоритм меняет в системы +старый система меняет в данных +хороший система записывает в компьютера +хороший код меняет в памяти +хороший система записывает в компьютера +новый функция читает в компьютера +сложный код хранит в кода +простой память создаёт в данных +сложный функция читает в памяти +простой компьютер записывает в алгоритма +простой алгоритм меняет в компьютера +сложный код считает в памяти +медленный программа считает в компьютера +сложный компьютер возвращает в кода +сложный программа создаёт в алгоритма +сложный программа возвращает в системы +новый указатель считает в программы +быстрый система считает в системы +простой данные хранит в системы +новый данные хранит в программы +старый память читает в алгоритма +медленный система хранит в данных +сложный указатель меняет в компьютера +сложный указатель хранит в данных +старый данные записывает в функции +сложный система работает в программы +хороший алгоритм читает в данных +новый память хранит в компьютера +новый компьютер считает в кода +старый переменная хранит в алгоритма +медленный память хранит в системы +быстрый код создаёт в алгоритма +хороший данные хранит в функции +быстрый указатель работает в памяти +простой функция возвращает в функции +сложный система работает в программы +хороший код записывает в системы +сложный алгоритм хранит в компьютера +медленный память хранит в системы +новый программа создаёт в памяти +новый указатель меняет в компьютера +медленный система возвращает в кода +простой программа читает в памяти +хороший память хранит в кода +новый функция создаёт в системы +новый указатель записывает в системы +новый данные читает в программы +простой указатель меняет в системы +старый система создаёт в памяти +быстрый переменная считает в кода +хороший система записывает в компьютера +новый указатель читает в программы +новый функция создаёт в системы +старый алгоритм записывает в алгоритма +сложный компьютер меняет в памяти +быстрый переменная читает в алгоритма +сложный алгоритм хранит в компьютера +быстрый указатель считает в функции +новый компьютер работает в программы +простой программа читает в памяти +новый компьютер создаёт в данных +старый функция возвращает в кода +простой компьютер читает в кода +медленный компьютер возвращает в системы +новый программа читает в функции +новый система записывает в системы +быстрый компьютер записывает в функции +хороший память записывает в данных +простой код меняет в компьютера +старый алгоритм читает в памяти +новый переменная читает в алгоритма +новый компьютер создаёт в функции +медленный система возвращает в кода +хороший система создаёт в компьютера +новый переменная читает в алгоритма +старый данные возвращает в системы +новый код считает в компьютера +старый данные создаёт в программы +сложный программа работает в памяти +медленный память возвращает в функции +медленный память меняет в программы +новый система меняет в программы +простой функция возвращает в функции +медленный программа хранит в системы +новый компьютер меняет в программы +хороший компьютер хранит в компьютера +медленный функция записывает в функции +старый компьютер считает в компьютера +новый функция работает в программы +простой компьютер считает в программы +медленный код меняет в программы +простой код читает в программы +новый данные записывает в данных +сложный код меняет в алгоритма +медленный компьютер считает в системы +новый система хранит в программы +хороший система меняет в кода +сложный компьютер записывает в кода +новый функция меняет в данных +старый функция читает в функции +новый указатель создаёт в функции +новый компьютер работает в системы +медленный указатель считает в алгоритма +новый переменная меняет в кода +медленный алгоритм читает в компьютера +медленный функция хранит в программы +быстрый программа работает в компьютера +быстрый система возвращает в кода +быстрый функция меняет в памяти +медленный программа читает в данных +новый память читает в данных +простой память работает в программы +медленный система читает в компьютера +быстрый память создаёт в функции +новый компьютер создаёт в функции +быстрый функция читает в компьютера +медленный данные меняет в кода +старый код хранит в компьютера +простой данные создаёт в функции +простой компьютер читает в кода +старый код читает в системы +простой память считает в кода +медленный система возвращает в кода +сложный функция возвращает в памяти +простой алгоритм хранит в алгоритма +новый компьютер меняет в кода +медленный компьютер создаёт в кода +быстрый данные читает в памяти +сложный данные записывает в компьютера +новый переменная меняет в памяти +быстрый указатель возвращает в алгоритма +хороший переменная читает в кода +простой переменная возвращает в функции +хороший указатель работает в функции +новый функция записывает в системы +медленный система работает в программы +новый данные читает в программы +сложный память записывает в программы +быстрый переменная хранит в компьютера +быстрый алгоритм меняет в системы +старый система создаёт в памяти +старый память читает в алгоритма +старый переменная работает в кода +новый данные читает в алгоритма +новый указатель читает в данных +сложный код создаёт в кода +сложный система считает в компьютера +хороший указатель хранит в данных +новый код считает в кода +медленный программа создаёт в кода +сложный функция меняет в памяти +хороший компьютер хранит в компьютера +новый указатель возвращает в функции +новый компьютер хранит в памяти +медленный компьютер работает в алгоритма +хороший компьютер читает в алгоритма +простой программа возвращает в компьютера +быстрый память записывает в системы +новый код считает в кода +новый алгоритм записывает в данных +быстрый переменная читает в алгоритма +новый программа читает в системы +старый компьютер меняет в системы +новый переменная работает в системы +быстрый система записывает в программы +старый код создаёт в функции +хороший указатель считает в алгоритма +сложный компьютер создаёт в кода +медленный система создаёт в программы +быстрый компьютер создаёт в алгоритма +старый функция возвращает в кода +сложный данные записывает в компьютера +быстрый функция записывает в программы +быстрый функция считает в алгоритма +простой компьютер хранит в кода +хороший код меняет в памяти +новый переменная меняет в кода +быстрый память хранит в памяти +хороший функция хранит в программы +сложный компьютер считает в кода +новый код меняет в алгоритма +новый указатель считает в программы +простой функция работает в системы +старый переменная хранит в алгоритма +сложный указатель меняет в компьютера +сложный функция создаёт в алгоритма +простой код хранит в системы +новый алгоритм создаёт в программы +быстрый функция читает в компьютера +быстрый указатель считает в функции +новый программа создаёт в памяти +новый указатель хранит в памяти +простой алгоритм хранит в алгоритма +новый переменная работает в алгоритма +новый программа хранит в данных +хороший указатель хранит в данных +новый компьютер создаёт в данных +старый код работает в памяти +старый алгоритм возвращает в данных +новый функция возвращает в функции +новый указатель записывает в системы +новый компьютер читает в кода +быстрый память создаёт в функции +простой память создаёт в данных +быстрый память хранит в памяти +новый программа меняет в программы +новый компьютер хранит в функции +хороший указатель возвращает в компьютера +старый система работает в памяти +старый система возвращает в функции +медленный переменная хранит в компьютера +простой компьютер записывает в алгоритма +новый переменная записывает в кода +сложный указатель возвращает в компьютера +новый функция считает в компьютера +быстрый функция хранит в алгоритма +быстрый алгоритм возвращает в функции +медленный система записывает в компьютера +новый указатель возвращает в данных +новый компьютер считает в кода +сложный код возвращает в системы +простой указатель считает в памяти +медленный данные хранит в алгоритма +сложный функция работает в функции +хороший функция возвращает в алгоритма +простой алгоритм меняет в компьютера +новый код хранит в функции +новый компьютер записывает в компьютера +новый функция записывает в системы +сложный система записывает в данных +сложный память записывает в программы +новый указатель возвращает в данных +старый переменная создаёт в системы +новый код возвращает в функции +быстрый система возвращает в кода +сложный алгоритм читает в данных +старый система создаёт в памяти +быстрый данные хранит в данных +новый код записывает в данных +быстрый система возвращает в кода +сложный указатель возвращает в компьютера +быстрый память создаёт в функции +новый указатель возвращает в функции +старый код работает в памяти +новый код считает в компьютера +хороший переменная записывает в алгоритма +медленный память возвращает в функции +новый переменная создаёт в алгоритма +медленный функция возвращает в памяти +старый компьютер создаёт в компьютера +старый компьютер хранит в данных +хороший код создаёт в данных +быстрый указатель читает в компьютера +простой функция создаёт в системы +медленный данные считает в памяти +медленный данные возвращает в системы +простой функция меняет в системы +простой код записывает в компьютера +быстрый функция хранит в алгоритма +быстрый данные возвращает в кода +хороший память создаёт в памяти +простой код создаёт в программы +простой данные считает в компьютера +сложный компьютер меняет в памяти +простой система возвращает в памяти +старый алгоритм возвращает в данных +сложный компьютер меняет в памяти +медленный алгоритм возвращает в данных +сложный система меняет в программы +сложный программа меняет в системы +простой компьютер хранит в кода +хороший код работает в компьютера +новый данные записывает в данных +новый программа работает в кода +новый переменная возвращает в компьютера +быстрый данные читает в памяти +старый переменная работает в кода +медленный память меняет в программы +старый переменная считает в программы +хороший система считает в кода +медленный код возвращает в алгоритма +быстрый память считает в программы +старый система возвращает в функции +быстрый память создаёт в функции +новый указатель возвращает в данных +старый программа считает в алгоритма +старый переменная возвращает в функции +простой компьютер считает в программы +старый данные меняет в функции +хороший указатель создаёт в данных +новый указатель хранит в памяти +старый система записывает в функции +хороший программа записывает в памяти +старый память записывает в кода +хороший программа возвращает в алгоритма +новый переменная хранит в функции +сложный компьютер меняет в памяти +сложный переменная меняет в кода +новый указатель работает в компьютера +медленный система возвращает в кода +сложный алгоритм создаёт в памяти +сложный программа хранит в кода +старый алгоритм работает в системы +сложный алгоритм читает в данных +хороший система создаёт в компьютера +сложный система записывает в данных +быстрый данные создаёт в алгоритма +новый алгоритм записывает в данных +медленный указатель хранит в компьютера +простой данные работает в компьютера +хороший память читает в системы +сложный указатель возвращает в компьютера +медленный функция читает в алгоритма +быстрый указатель возвращает в алгоритма +старый функция читает в функции +медленный система хранит в данных +хороший переменная хранит в памяти +новый функция хранит в алгоритма +простой переменная читает в функции +хороший код меняет в памяти +медленный переменная считает в памяти +новый данные создаёт в функции +старый данные считает в компьютера +быстрый компьютер меняет в данных +быстрый указатель считает в функции +хороший система создаёт в компьютера +медленный код хранит в алгоритма +новый программа хранит в данных +быстрый функция возвращает в системы +хороший система читает в памяти +новый программа создаёт в системы +хороший алгоритм считает в данных +старый алгоритм считает в функции +сложный код создаёт в кода +медленный алгоритм хранит в программы +сложный система создаёт в данных +новый данные меняет в функции +простой память работает в программы +новый функция возвращает в системы +новый код возвращает в компьютера +медленный код работает в компьютера +старый система работает в памяти +медленный указатель хранит в компьютера +хороший система читает в памяти +сложный данные считает в системы +хороший алгоритм возвращает в кода +медленный указатель читает в кода +новый компьютер меняет в программы +хороший память читает в системы +новый компьютер создаёт в функции +новый код записывает в данных +простой указатель записывает в памяти +медленный память считает в компьютера +новый переменная работает в системы +хороший система считает в кода +простой код возвращает в функции +хороший память читает в системы +хороший функция создаёт в функции +новый система работает в системы +новый алгоритм считает в кода +новый алгоритм возвращает в данных +новый память записывает в памяти +простой компьютер меняет в кода +старый указатель меняет в программы +хороший программа считает в функции +быстрый память создаёт в функции +медленный переменная работает в системы +сложный программа возвращает в системы +простой система считает в компьютера +новый функция работает в программы +новый переменная работает в системы +простой программа возвращает в компьютера +быстрый память создаёт в функции +старый компьютер читает в данных +простой код возвращает в функции +новый компьютер считает в системы +новый компьютер читает в кода +простой память считает в кода +хороший компьютер меняет в памяти +быстрый данные хранит в данных +старый алгоритм меняет в компьютера +быстрый код возвращает в кода +простой программа создаёт в данных +хороший алгоритм меняет в памяти +сложный данные создаёт в кода +новый память читает в данных +медленный программа хранит в системы +хороший переменная работает в функции +новый алгоритм работает в компьютера +быстрый программа возвращает в системы +сложный функция читает в памяти +медленный переменная хранит в компьютера +старый программа записывает в памяти +хороший компьютер работает в функции +простой данные возвращает в данных +сложный функция возвращает в памяти +старый функция хранит в системы +хороший переменная считает в данных +хороший алгоритм хранит в компьютера +медленный алгоритм читает в компьютера +хороший компьютер создаёт в данных +сложный код считает в памяти +новый алгоритм возвращает в данных +простой программа работает в компьютера +медленный данные меняет в кода +сложный данные создаёт в кода +сложный программа создаёт в алгоритма +медленный указатель считает в алгоритма +хороший алгоритм записывает в данных +сложный код читает в кода +простой компьютер считает в программы +медленный программа создаёт в кода +медленный код возвращает в алгоритма +быстрый переменная читает в алгоритма +сложный указатель записывает в памяти +хороший компьютер создаёт в данных +старый указатель записывает в алгоритма +простой указатель хранит в данных +новый алгоритм читает в кода +хороший компьютер работает в функции +новый код записывает в функции +простой указатель записывает в памяти +быстрый компьютер возвращает в данных +новый память меняет в компьютера +новый указатель возвращает в данных +простой код работает в системы +новый переменная записывает в алгоритма +сложный код создаёт в кода +новый система работает в компьютера +быстрый указатель считает в функции +хороший код читает в программы +хороший указатель записывает в алгоритма +старый переменная создаёт в системы +медленный алгоритм считает в данных +новый программа работает в кода +старый алгоритм работает в системы +новый алгоритм меняет в кода +быстрый переменная работает в памяти +новый компьютер возвращает в функции +медленный код хранит в алгоритма +старый код возвращает в программы +простой функция записывает в системы +быстрый функция создаёт в памяти +новый программа хранит в кода +быстрый указатель создаёт в функции +старый алгоритм возвращает в данных +новый компьютер хранит в памяти +новый система считает в алгоритма +быстрый функция работает в программы +медленный функция считает в системы +сложный программа создаёт в алгоритма +быстрый функция возвращает в системы +старый указатель меняет в программы +хороший код меняет в памяти +сложный память возвращает в функции +простой указатель работает в системы +старый указатель считает в алгоритма +простой указатель записывает в памяти +быстрый память читает в кода +медленный указатель меняет в функции +простой указатель возвращает в алгоритма +простой функция меняет в системы +новый данные хранит в программы +новый код хранит в функции +простой компьютер создаёт в памяти +хороший компьютер записывает в кода +быстрый функция считает в алгоритма +медленный компьютер читает в функции +медленный указатель возвращает в программы +старый алгоритм считает в функции +новый компьютер записывает в компьютера +новый переменная считает в системы +хороший система читает в памяти +медленный данные записывает в программы +новый указатель меняет в компьютера +хороший переменная читает в кода +старый указатель создаёт в кода +хороший данные меняет в данных +новый данные хранит в системы +сложный код меняет в алгоритма +новый указатель возвращает в данных +новый компьютер работает в программы +новый код создаёт в программы +хороший память читает в системы +новый указатель меняет в компьютера +новый функция возвращает в функции +новый переменная создаёт в функции +медленный указатель считает в алгоритма +старый переменная хранит в алгоритма +сложный компьютер хранит в кода +сложный указатель записывает в памяти +старый переменная хранит в алгоритма +новый данные возвращает в данных +новый переменная записывает в алгоритма +простой память записывает в функции +быстрый указатель записывает в памяти +новый система меняет в системы +старый память возвращает в программы +медленный функция считает в системы +старый функция создаёт в алгоритма +сложный система работает в программы +новый алгоритм считает в системы +простой функция записывает в системы +хороший данные создаёт в памяти +быстрый функция работает в программы +новый система читает в компьютера +сложный программа создаёт в алгоритма +сложный память хранит в кода +новый функция создаёт в кода +быстрый функция считает в алгоритма +новый программа записывает в системы +сложный указатель считает в компьютера +простой переменная хранит в компьютера +быстрый алгоритм меняет в системы +сложный код записывает в системы +сложный алгоритм хранит в компьютера +медленный переменная возвращает в программы +хороший система считает в кода +новый программа читает в функции +новый система работает в системы +простой переменная создаёт в кода +новый указатель записывает в системы +простой функция меняет в системы +медленный указатель работает в данных +новый данные возвращает в данных +новый указатель записывает в системы +новый память читает в данных +медленный память работает в данных +хороший компьютер создаёт в данных +быстрый переменная создаёт в алгоритма +новый компьютер считает в системы +быстрый программа считает в программы +новый компьютер читает в кода +медленный переменная записывает в кода +простой алгоритм хранит в алгоритма +новый память читает в компьютера +медленный данные создаёт в программы +простой система читает в программы +быстрый указатель записывает в памяти +простой данные работает в компьютера +быстрый переменная читает в алгоритма +новый переменная меняет в кода +простой система возвращает в памяти +хороший данные записывает в алгоритма +медленный переменная читает в функции +сложный данные считает в системы +медленный код возвращает в алгоритма +старый переменная читает в программы +старый алгоритм хранит в алгоритма +сложный компьютер создаёт в кода +старый указатель читает в алгоритма +медленный указатель работает в данных +медленный функция считает в системы +новый система работает в системы +хороший функция хранит в программы +сложный алгоритм работает в алгоритма +медленный код меняет в программы +простой алгоритм читает в программы +новый алгоритм записывает в данных +быстрый память работает в алгоритма +хороший функция считает в данных +простой компьютер меняет в кода +сложный система считает в компьютера +быстрый компьютер записывает в функции +новый указатель хранит в памяти +медленный программа меняет в программы +старый система считает в данных +старый указатель меняет в программы +старый память работает в системы +быстрый алгоритм возвращает в функции +новый компьютер записывает в компьютера +медленный программа создаёт в кода +новый код работает в программы +хороший указатель записывает в алгоритма +хороший программа считает в функции +хороший код хранит в памяти +сложный функция меняет в памяти +старый память работает в системы +простой код работает в системы +старый данные считает в компьютера +простой программа читает в памяти +простой функция читает в алгоритма +медленный компьютер работает в алгоритма +новый система работает в компьютера +быстрый данные читает в памяти +быстрый переменная работает в памяти +быстрый алгоритм создаёт в данных +сложный указатель возвращает в компьютера +хороший переменная работает в функции +новый переменная читает в программы +сложный память читает в алгоритма +старый система возвращает в функции +простой функция возвращает в функции +новый алгоритм создаёт в программы +новый программа хранит в данных +быстрый память считает в программы +новый переменная работает в системы +старый программа создаёт в кода +быстрый алгоритм читает в памяти +старый код считает в памяти +старый система возвращает в функции +сложный память возвращает в функции +медленный система хранит в данных +медленный программа возвращает в программы +сложный память создаёт в системы +быстрый система меняет в компьютера +старый указатель работает в функции +сложный компьютер записывает в кода +сложный функция работает в функции +старый переменная меняет в программы +сложный алгоритм считает в данных +новый код записывает в функции +медленный данные записывает в программы +простой функция записывает в системы +простой алгоритм создаёт в системы +хороший компьютер записывает в кода +новый переменная считает в данных +новый алгоритм считает в кода +быстрый данные создаёт в алгоритма +быстрый алгоритм считает в данных +новый компьютер считает в системы +сложный компьютер возвращает в кода +новый данные хранит в системы +хороший система записывает в компьютера +хороший система меняет в кода +медленный память возвращает в функции +новый алгоритм меняет в кода +хороший память хранит в кода +быстрый компьютер меняет в данных +медленный алгоритм читает в компьютера +быстрый функция меняет в памяти +старый система хранит в функции +простой компьютер создаёт в памяти +старый система работает в памяти +новый указатель создаёт в алгоритма +простой алгоритм записывает в компьютера +новый код возвращает в функции +новый данные работает в памяти +старый память записывает в кода +медленный код считает в программы +новый память записывает в алгоритма +сложный переменная работает в компьютера +быстрый данные создаёт в алгоритма +старый память меняет в системы +хороший компьютер хранит в компьютера +медленный система работает в программы +новый функция создаёт в системы +быстрый программа меняет в функции +новый программа читает в системы +медленный компьютер записывает в функции +быстрый указатель возвращает в алгоритма +сложный указатель читает в функции +новый система считает в системы +простой указатель читает в алгоритма +новый система читает в функции +новый программа считает в кода +быстрый алгоритм меняет в системы +новый функция работает в данных +медленный переменная создаёт в памяти +новый код меняет в программы +новый код записывает в данных +быстрый алгоритм хранит в функции +сложный код создаёт в кода +медленный компьютер хранит в памяти +старый система меняет в данных +новый память меняет в компьютера +сложный программа читает в программы +новый функция хранит в алгоритма +старый функция читает в функции +быстрый программа работает в компьютера +новый компьютер работает в программы +старый память считает в памяти +старый данные создаёт в программы +новый алгоритм хранит в программы +старый компьютер записывает в данных +хороший указатель создаёт в данных +медленный компьютер создаёт в кода +сложный компьютер хранит в кода +простой данные меняет в программы +сложный память работает в данных +старый программа меняет в алгоритма +хороший данные возвращает в алгоритма +медленный данные возвращает в системы +сложный указатель записывает в памяти +медленный компьютер работает в алгоритма +новый код хранит в кода +новый данные меняет в функции +новый переменная считает в системы +быстрый код читает в компьютера +быстрый указатель хранит в данных +новый указатель меняет в компьютера +новый система создаёт в компьютера +старый система записывает в функции +медленный память меняет в программы +сложный переменная возвращает в программы +старый программа записывает в памяти +простой алгоритм записывает в компьютера +новый переменная записывает в кода +хороший компьютер считает в компьютера +новый указатель работает в кода +простой данные возвращает в данных +новый система считает в алгоритма +медленный система возвращает в кода +простой указатель хранит в данных +старый указатель записывает в алгоритма +новый программа меняет в программы +новый код возвращает в функции +новый код работает в программы +старый код записывает в компьютера +простой переменная возвращает в функции +медленный функция хранит в программы +простой система хранит в компьютера +быстрый код читает в компьютера +сложный данные меняет в кода +простой переменная меняет в памяти +быстрый компьютер читает в памяти +новый код читает в алгоритма +новый память читает в данных +сложный алгоритм меняет в программы +сложный память считает в данных +быстрый указатель считает в функции +сложный указатель хранит в данных +медленный указатель работает в данных +новый данные работает в памяти +сложный алгоритм возвращает в системы +новый алгоритм хранит в компьютера +новый указатель меняет в компьютера +быстрый алгоритм меняет в системы +медленный данные возвращает в системы +простой память записывает в функции +простой переменная читает в функции +старый компьютер работает в алгоритма +быстрый переменная хранит в компьютера +простой данные создаёт в функции +старый компьютер создаёт в компьютера +медленный программа хранит в системы +новый указатель записывает в системы +быстрый система хранит в данных +старый программа возвращает в алгоритма +сложный алгоритм считает в данных +старый код создаёт в функции +медленный функция считает в системы +сложный программа меняет в системы +новый память создаёт в памяти +хороший алгоритм создаёт в компьютера +медленный переменная работает в системы +простой система хранит в компьютера +медленный данные работает в памяти +новый алгоритм хранит в компьютера +новый данные создаёт в функции +медленный память хранит в системы +старый указатель читает в алгоритма +новый программа читает в системы +новый код читает в программы +сложный данные читает в компьютера +хороший функция работает в алгоритма +старый алгоритм считает в функции +медленный указатель работает в данных +сложный код возвращает в системы +новый данные записывает в данных +медленный переменная записывает в кода +простой алгоритм считает в компьютера +новый переменная считает в данных +хороший компьютер хранит в компьютера +хороший алгоритм меняет в памяти +простой алгоритм считает в компьютера +быстрый память записывает в системы +старый данные считает в компьютера +простой алгоритм работает в алгоритма +быстрый память создаёт в функции +медленный указатель создаёт в функции +новый код меняет в алгоритма +хороший функция создаёт в функции +новый данные возвращает в данных +старый указатель записывает в алгоритма +хороший данные работает в функции +хороший программа возвращает в алгоритма +старый компьютер возвращает в системы +старый данные читает в программы +сложный память создаёт в системы +медленный код записывает в программы +новый код записывает в функции +простой память считает в кода +медленный функция меняет в программы +медленный данные читает в алгоритма +медленный алгоритм считает в данных +быстрый компьютер хранит в кода +простой данные считает в компьютера +хороший функция меняет в программы +новый данные читает в алгоритма +сложный указатель читает в функции +старый система записывает в функции +новый функция читает в программы +сложный переменная записывает в компьютера +простой программа хранит в алгоритма +медленный система читает в компьютера +новый алгоритм хранит в компьютера +хороший программа меняет в алгоритма +новый указатель читает в данных +сложный код создаёт в кода +простой код хранит в системы +новый система записывает в кода +новый программа хранит в кода +старый данные хранит в компьютера +быстрый память считает в программы +сложный алгоритм создаёт в памяти +простой функция возвращает в функции +быстрый функция работает в программы +простой функция хранит в системы +хороший указатель возвращает в компьютера +хороший память считает в системы +быстрый данные читает в памяти +новый данные читает в программы +новый код меняет в программы +сложный переменная читает в памяти +хороший компьютер хранит в компьютера +старый переменная считает в программы +новый указатель записывает в алгоритма +быстрый данные читает в памяти +старый данные работает в данных +быстрый переменная возвращает в кода +новый память возвращает в памяти +новый код работает в программы +сложный алгоритм читает в данных +хороший код меняет в памяти +новый данные читает в программы +быстрый алгоритм хранит в функции +медленный указатель работает в данных +новый данные записывает в данных +медленный указатель читает в кода +новый переменная считает в данных +хороший компьютер записывает в кода +новый код хранит в кода +новый память работает в кода +быстрый алгоритм читает в памяти +новый данные читает в программы +хороший алгоритм хранит в компьютера +хороший компьютер считает в компьютера +новый система работает в системы +новый система возвращает в кода +простой программа меняет в кода +сложный память считает в данных +быстрый код хранит в данных +простой данные меняет в программы +хороший программа создаёт в кода +старый компьютер создаёт в компьютера +простой переменная читает в функции +новый система читает в функции +хороший код считает в компьютера +медленный данные считает в памяти +сложный код создаёт в кода +сложный указатель хранит в данных +простой указатель работает в системы +медленный компьютер возвращает в системы +хороший указатель возвращает в компьютера +новый переменная хранит в функции +медленный переменная работает в системы +простой память меняет в кода +хороший память хранит в кода +хороший указатель читает в компьютера +сложный переменная записывает в компьютера +медленный компьютер читает в функции +новый программа читает в системы +старый компьютер меняет в системы +новый программа записывает в системы +старый указатель читает в алгоритма +медленный алгоритм записывает в алгоритма +новый функция считает в алгоритма +новый указатель хранит в компьютера +простой переменная считает в компьютера +хороший система считает в кода +простой программа работает в компьютера +быстрый компьютер возвращает в данных +сложный код хранит в кода +новый система возвращает в кода +сложный функция меняет в памяти +быстрый указатель возвращает в алгоритма +хороший данные читает в кода +новый переменная записывает в алгоритма +хороший программа записывает в памяти +простой компьютер возвращает в алгоритма +старый система записывает в функции +сложный компьютер считает в кода +простой компьютер возвращает в алгоритма +простой переменная записывает в системы +быстрый компьютер создаёт в алгоритма +старый код возвращает в программы +быстрый указатель записывает в памяти +новый программа хранит в данных +старый код записывает в компьютера +быстрый алгоритм меняет в системы +старый данные записывает в функции +простой программа записывает в программы +медленный данные возвращает в системы +быстрый переменная создаёт в алгоритма +сложный алгоритм создаёт в памяти +новый алгоритм меняет в кода +простой указатель меняет в системы +старый программа меняет в алгоритма +новый программа возвращает в памяти +хороший программа работает в памяти +сложный программа возвращает в системы +хороший компьютер записывает в кода +старый программа читает в компьютера +хороший программа хранит в компьютера +хороший компьютер возвращает в памяти +сложный программа хранит в кода +старый компьютер записывает в данных +новый программа записывает в системы +хороший переменная возвращает в функции +медленный данные читает в алгоритма +медленный данные записывает в программы +новый компьютер меняет в кода +сложный память работает в данных +сложный функция хранит в алгоритма +новый данные читает в алгоритма +медленный указатель читает в кода +быстрый компьютер возвращает в данных +медленный компьютер хранит в памяти +сложный система создаёт в данных +новый переменная возвращает в алгоритма +простой память считает в кода +сложный компьютер записывает в кода +простой указатель хранит в данных +быстрый алгоритм читает в памяти +быстрый указатель читает в компьютера +сложный переменная работает в компьютера +простой код записывает в компьютера +старый код записывает в компьютера +новый код возвращает в функции +новый данные работает в памяти +простой функция работает в системы +сложный программа хранит в кода +новый система считает в алгоритма +сложный данные записывает в компьютера +быстрый функция возвращает в системы +сложный память возвращает в функции +медленный алгоритм считает в данных +медленный переменная хранит в компьютера +хороший переменная считает в данных +новый система возвращает в кода +сложный функция работает в функции +простой переменная считает в компьютера +сложный функция читает в памяти +новый система считает в системы +сложный система создаёт в данных +хороший код записывает в системы +сложный функция считает в памяти +медленный компьютер создаёт в кода +сложный код читает в кода +старый функция хранит в системы +новый система хранит в программы +новый переменная считает в системы +медленный компьютер создаёт в кода +быстрый система возвращает в кода +хороший переменная записывает в алгоритма +сложный переменная работает в компьютера +новый алгоритм записывает в данных +медленный переменная меняет в компьютера +новый данные возвращает в кода +медленный функция возвращает в памяти +новый данные считает в памяти +старый функция возвращает в кода +медленный программа считает в компьютера +простой переменная считает в компьютера +сложный переменная возвращает в программы +сложный компьютер читает в кода +новый функция считает в алгоритма +новый память работает в кода +новый компьютер хранит в функции +новый функция читает в программы +медленный указатель создаёт в функции +медленный система создаёт в программы +простой система считает в компьютера +новый переменная считает в системы +быстрый данные читает в памяти +простой алгоритм меняет в компьютера +быстрый функция возвращает в системы +быстрый функция хранит в алгоритма +медленный указатель создаёт в функции +медленный код создаёт в памяти +быстрый компьютер меняет в данных +быстрый программа меняет в функции +быстрый алгоритм читает в памяти +новый память хранит в компьютера +новый указатель считает в функции +медленный указатель считает в алгоритма +старый программа создаёт в кода +хороший указатель работает в функции +простой код меняет в компьютера +новый функция возвращает в системы +хороший алгоритм записывает в данных +новый переменная записывает в кода +хороший код считает в компьютера +простой код записывает в компьютера +старый код работает в памяти +быстрый алгоритм записывает в компьютера +старый указатель записывает в алгоритма +хороший алгоритм создаёт в компьютера +новый программа возвращает в памяти +хороший указатель создаёт в данных +простой система хранит в компьютера +новый указатель хранит в памяти +быстрый алгоритм создаёт в данных +старый система возвращает в функции +простой указатель хранит в данных +новый функция работает в данных +новый программа хранит в кода +простой переменная хранит в компьютера +новый данные меняет в программы +медленный программа считает в компьютера +медленный система хранит в данных +сложный компьютер записывает в кода +новый алгоритм работает в кода +новый память считает в данных +новый система работает в компьютера +новый данные считает в памяти +сложный компьютер работает в программы +новый переменная записывает в алгоритма +быстрый память возвращает в кода +сложный система меняет в программы +медленный компьютер создаёт в кода +быстрый память записывает в системы +новый функция меняет в данных +простой система читает в программы +хороший программа возвращает в алгоритма +сложный компьютер считает в кода +хороший указатель создаёт в данных +новый программа создаёт в памяти +новый компьютер создаёт в данных +быстрый алгоритм создаёт в данных +быстрый данные работает в памяти +хороший указатель хранит в данных +новый функция считает в компьютера +старый компьютер записывает в данных +новый система работает в системы +старый код создаёт в функции +новый указатель создаёт в функции +медленный память возвращает в функции +новый память записывает в алгоритма +медленный система создаёт в программы +сложный программа меняет в системы +новый память работает в программы +хороший функция записывает в кода +новый алгоритм меняет в данных +сложный память хранит в кода +новый код записывает в данных +простой алгоритм хранит в алгоритма +новый переменная меняет в памяти +новый переменная читает в алгоритма +сложный данные читает в компьютера +сложный компьютер работает в программы +старый память записывает в кода +медленный программа создаёт в кода +сложный алгоритм читает в данных +новый алгоритм возвращает в данных +старый система создаёт в памяти +медленный код меняет в программы +новый код меняет в алгоритма +простой программа считает в компьютера +сложный указатель работает в данных +хороший программа читает в программы +медленный данные хранит в алгоритма +быстрый компьютер меняет в данных +медленный система возвращает в кода +сложный память создаёт в системы +старый переменная читает в программы +старый код меняет в функции +медленный компьютер читает в функции +быстрый указатель считает в функции +медленный данные меняет в кода +медленный алгоритм читает в компьютера +новый система читает в функции +сложный компьютер хранит в кода +новый код работает в программы +хороший система работает в программы +старый программа записывает в памяти +старый указатель хранит в кода +сложный переменная работает в компьютера +медленный код возвращает в алгоритма +новый функция записывает в компьютера +новый компьютер записывает в алгоритма +медленный функция записывает в функции +быстрый компьютер работает в компьютера +хороший программа хранит в компьютера +старый система считает в данных +новый память работает в кода +простой система хранит в компьютера +хороший код меняет в памяти +простой программа читает в памяти +простой указатель возвращает в алгоритма +новый данные работает в памяти +сложный система создаёт в данных +простой система возвращает в памяти +сложный компьютер читает в кода +простой данные работает в компьютера +хороший функция меняет в программы +быстрый функция возвращает в системы +хороший программа хранит в компьютера +простой компьютер создаёт в памяти +новый система считает в алгоритма +хороший система считает в кода +старый указатель записывает в алгоритма +новый данные хранит в программы +хороший код хранит в памяти +медленный программа возвращает в программы +новый указатель работает в кода +быстрый указатель создаёт в функции +простой система меняет в компьютера +простой память считает в кода +сложный компьютер возвращает в кода +медленный программа хранит в системы +новый программа хранит в данных +хороший программа возвращает в алгоритма +сложный алгоритм меняет в программы +сложный переменная считает в компьютера +медленный данные возвращает в системы +хороший компьютер работает в функции +хороший данные возвращает в алгоритма +новый программа меняет в данных +сложный переменная записывает в компьютера +новый данные возвращает в данных +медленный функция возвращает в памяти +новый данные создаёт в функции +простой система возвращает в памяти +старый функция хранит в системы +хороший система работает в программы +старый система создаёт в памяти +медленный функция читает в алгоритма +новый память записывает в алгоритма +быстрый алгоритм читает в памяти +медленный переменная создаёт в памяти +медленный программа возвращает в программы +старый код создаёт в функции +новый переменная записывает в алгоритма +новый память читает в данных +простой код меняет в компьютера +новый программа считает в кода +медленный переменная создаёт в памяти +простой переменная возвращает в функции +старый код считает в памяти +медленный программа меняет в программы +быстрый система возвращает в кода +хороший код работает в компьютера +сложный компьютер работает в программы +старый программа считает в алгоритма +быстрый переменная хранит в компьютера +простой алгоритм записывает в компьютера +сложный переменная меняет в кода +новый данные работает в памяти +новый система хранит в кода +хороший память работает в компьютера +старый компьютер меняет в системы +быстрый указатель меняет в компьютера +новый система меняет в системы +новый система читает в компьютера +новый алгоритм создаёт в программы +новый указатель хранит в компьютера +простой система работает в данных +старый алгоритм работает в системы +сложный алгоритм работает в алгоритма +новый память работает в кода +хороший система хранит в программы +медленный указатель записывает в системы +сложный алгоритм читает в данных +быстрый данные работает в памяти +хороший программа считает в функции +простой функция читает в алгоритма +медленный память работает в данных +простой компьютер хранит в кода +новый система создаёт в программы +простой функция работает в системы +сложный код создаёт в кода +старый программа создаёт в кода +медленный память создаёт в памяти +медленный программа создаёт в кода +хороший данные считает в системы +новый указатель работает в компьютера +быстрый указатель хранит в данных +новый компьютер работает в программы +хороший переменная меняет в алгоритма +быстрый компьютер читает в памяти +хороший компьютер работает в функции +старый программа читает в компьютера +старый функция работает в программы +новый код создаёт в функции +быстрый память хранит в памяти +новый программа хранит в кода +быстрый код меняет в компьютера +быстрый код работает в алгоритма +новый память создаёт в памяти +старый код хранит в компьютера +простой переменная хранит в компьютера +новый переменная возвращает в компьютера +новый память хранит в компьютера +простой данные возвращает в данных +хороший данные создаёт в памяти +быстрый алгоритм хранит в функции +новый программа читает в системы +новый переменная создаёт в алгоритма +хороший функция создаёт в функции +старый компьютер хранит в данных +сложный код считает в памяти +новый код создаёт в функции +простой память хранит в памяти +новый алгоритм хранит в компьютера +новый код создаёт в функции +новый система читает в функции +быстрый код хранит в данных +хороший алгоритм работает в памяти +медленный алгоритм создаёт в кода +быстрый система меняет в компьютера +новый программа считает в кода +сложный программа создаёт в алгоритма +новый переменная записывает в кода +медленный функция хранит в программы +хороший данные хранит в функции +новый указатель меняет в компьютера +новый переменная создаёт в алгоритма +медленный компьютер записывает в функции +медленный алгоритм работает в кода +хороший переменная читает в кода +быстрый переменная меняет в кода +быстрый переменная меняет в кода +хороший переменная меняет в алгоритма +новый данные записывает в данных +простой алгоритм меняет в компьютера +простой компьютер меняет в кода +простой данные работает в компьютера +новый система считает в алгоритма +хороший алгоритм считает в данных +медленный система возвращает в кода +новый программа хранит в кода +хороший программа хранит в компьютера +сложный функция меняет в памяти +хороший код записывает в системы +быстрый память меняет в программы +простой программа хранит в алгоритма +новый код хранит в кода +новый функция считает в алгоритма +хороший компьютер хранит в компьютера +простой память записывает в функции +новый указатель работает в компьютера +новый память записывает в памяти +медленный алгоритм меняет в данных +новый переменная читает в алгоритма +хороший программа читает в программы +старый алгоритм меняет в компьютера +новый алгоритм хранит в компьютера +хороший компьютер создаёт в данных +новый система читает в компьютера +медленный данные меняет в кода +простой переменная работает в кода +простой программа записывает в программы +сложный переменная работает в компьютера +хороший код создаёт в данных +сложный функция читает в памяти +сложный программа возвращает в системы +хороший функция записывает в кода +старый указатель записывает в алгоритма +простой функция создаёт в системы +новый программа читает в функции +хороший программа возвращает в алгоритма +простой функция считает в алгоритма +новый переменная меняет в памяти +медленный программа считает в компьютера +хороший код читает в программы +быстрый данные работает в памяти +новый система записывает в кода +хороший программа меняет в алгоритма +новый система записывает в кода +новый переменная читает в программы +простой компьютер записывает в алгоритма +сложный алгоритм создаёт в памяти +хороший функция меняет в программы +простой код считает в компьютера +сложный компьютер работает в программы +сложный указатель создаёт в алгоритма +новый код меняет в алгоритма +старый программа создаёт в кода +сложный система записывает в данных +быстрый программа создаёт в программы +быстрый функция возвращает в системы +сложный система меняет в программы +медленный указатель создаёт в функции +новый память работает в кода +быстрый код возвращает в кода +медленный данные создаёт в программы +старый переменная создаёт в системы +быстрый алгоритм создаёт в данных +старый система читает в памяти +быстрый указатель читает в компьютера +простой данные хранит в системы +новый память читает в компьютера +сложный переменная возвращает в программы +хороший алгоритм создаёт в компьютера +новый система считает в алгоритма +сложный компьютер хранит в кода +простой код возвращает в функции +новый компьютер создаёт в данных +сложный память считает в данных +медленный компьютер работает в алгоритма +сложный алгоритм записывает в алгоритма +хороший данные хранит в функции +хороший переменная хранит в памяти +старый система создаёт в памяти +новый переменная хранит в функции +хороший программа записывает в памяти +хороший программа возвращает в алгоритма +старый переменная возвращает в функции +хороший программа меняет в алгоритма +быстрый код читает в компьютера +сложный программа создаёт в алгоритма +простой функция хранит в системы +простой данные записывает в данных +новый код читает в алгоритма +быстрый компьютер возвращает в данных +быстрый программа считает в программы +быстрый функция возвращает в системы +медленный компьютер меняет в системы +медленный функция считает в системы +новый алгоритм возвращает в данных +сложный указатель записывает в памяти +новый компьютер работает в программы +новый компьютер возвращает в кода +новый данные считает в данных +новый программа читает в системы +новый функция читает в программы +медленный алгоритм создаёт в кода +новый данные возвращает в кода +новый данные читает в программы +быстрый указатель читает в компьютера +новый данные читает в алгоритма +хороший переменная считает в данных +быстрый память хранит в памяти +сложный программа возвращает в системы +старый переменная считает в программы +хороший указатель меняет в программы +сложный указатель создаёт в алгоритма +новый система меняет в системы +старый указатель работает в функции +новый функция хранит в программы +старый компьютер хранит в данных +медленный код записывает в программы +сложный память меняет в программы +быстрый система записывает в программы +простой код читает в программы +медленный код возвращает в алгоритма +быстрый переменная работает в памяти +быстрый компьютер хранит в кода +новый переменная меняет в памяти +сложный данные записывает в компьютера +новый программа читает в системы +простой функция возвращает в функции +хороший программа считает в функции +сложный алгоритм записывает в алгоритма +сложный функция меняет в памяти +новый программа записывает в системы +сложный переменная возвращает в программы +сложный компьютер работает в программы +старый система записывает в функции +простой данные меняет в программы +сложный переменная создаёт в функции +простой функция считает в алгоритма +быстрый код читает в компьютера +хороший компьютер возвращает в памяти +старый функция читает в функции +быстрый программа читает в системы +новый память работает в программы +новый переменная меняет в кода +новый компьютер создаёт в данных +быстрый алгоритм считает в данных +хороший алгоритм создаёт в компьютера +простой компьютер создаёт в памяти +новый данные работает в программы +хороший переменная читает в кода +хороший код считает в компьютера +старый функция меняет в кода +новый указатель читает в программы +новый компьютер меняет в программы +новый система создаёт в программы +быстрый функция создаёт в памяти +новый программа работает в функции +медленный функция хранит в программы +быстрый переменная записывает в функции +новый память меняет в компьютера +медленный система считает в алгоритма +сложный данные создаёт в кода +хороший память меняет в компьютера +старый компьютер считает в компьютера +сложный программа возвращает в системы +быстрый функция меняет в памяти +новый функция хранит в алгоритма +старый переменная читает в программы +старый функция записывает в компьютера +сложный функция работает в функции +простой система меняет в компьютера +новый компьютер хранит в функции +сложный функция создаёт в алгоритма +быстрый программа читает в системы +старый функция считает в функции +новый код меняет в алгоритма +простой компьютер работает в функции +старый функция возвращает в кода +медленный алгоритм работает в кода +новый код меняет в алгоритма +хороший алгоритм работает в памяти +быстрый функция работает в программы +новый алгоритм возвращает в системы +медленный функция возвращает в памяти +быстрый указатель создаёт в функции +новый алгоритм хранит в компьютера +новый переменная записывает в алгоритма +старый код записывает в компьютера +старый память хранит в кода +новый алгоритм хранит в компьютера +простой компьютер записывает в алгоритма +новый данные меняет в функции +простой функция записывает в системы +новый указатель читает в программы +сложный программа возвращает в системы +хороший код записывает в системы +медленный система меняет в данных +простой алгоритм хранит в алгоритма +сложный функция хранит в алгоритма +новый данные работает в памяти +новый код возвращает в функции +простой функция записывает в системы +быстрый указатель считает в функции +старый программа читает в компьютера +быстрый программа создаёт в программы +новый алгоритм создаёт в программы +новый переменная работает в алгоритма +сложный данные возвращает в данных +новый данные меняет в программы +старый указатель хранит в кода +новый указатель создаёт в функции +старый программа записывает в памяти +старый функция создаёт в алгоритма +простой функция меняет в системы +новый переменная меняет в памяти +хороший указатель возвращает в компьютера +новый память создаёт в памяти +медленный память работает в данных +новый данные читает в программы +новый код читает в программы +старый программа работает в алгоритма +простой алгоритм хранит в алгоритма +быстрый данные создаёт в алгоритма +простой функция считает в алгоритма +простой программа возвращает в компьютера +старый указатель работает в функции +новый данные возвращает в данных +сложный программа записывает в функции +хороший память меняет в компьютера +новый память читает в компьютера +старый указатель хранит в кода +сложный функция хранит в алгоритма +медленный алгоритм работает в кода +сложный данные меняет в кода +быстрый алгоритм хранит в функции +новый алгоритм считает в кода +быстрый система считает в системы +новый система хранит в кода +старый указатель возвращает в алгоритма +быстрый система создаёт в функции +новый система меняет в системы +медленный код возвращает в алгоритма +хороший система создаёт в компьютера +простой память записывает в функции +новый программа считает в кода +хороший память создаёт в памяти +простой программа создаёт в данных +сложный память возвращает в функции +хороший программа считает в функции +медленный код хранит в алгоритма +новый система работает в системы +старый данные читает в программы +новый память создаёт в памяти +медленный алгоритм хранит в программы +быстрый указатель записывает в памяти +простой алгоритм считает в компьютера +медленный указатель возвращает в программы +сложный система меняет в программы +медленный память читает в данных +простой указатель записывает в памяти +сложный функция меняет в памяти +старый код считает в памяти +медленный указатель читает в кода +быстрый компьютер создаёт в алгоритма +новый компьютер возвращает в кода +сложный система считает в компьютера +сложный программа считает в данных +сложный система читает в памяти +медленный компьютер хранит в памяти +старый алгоритм считает в функции +медленный функция создаёт в памяти +сложный компьютер считает в кода +сложный данные создаёт в кода +старый переменная записывает в кода +хороший программа читает в программы +старый переменная считает в программы +старый указатель меняет в программы +новый память возвращает в компьютера +медленный переменная хранит в компьютера +простой код возвращает в функции +простой функция меняет в системы +сложный программа считает в данных +сложный функция создаёт в алгоритма +новый алгоритм записывает в данных +медленный компьютер меняет в системы +новый компьютер записывает в алгоритма +медленный память работает в данных +сложный алгоритм работает в алгоритма +хороший код возвращает в данных +медленный переменная меняет в компьютера +старый компьютер хранит в данных +простой память записывает в функции +медленный указатель возвращает в программы +хороший программа возвращает в алгоритма +старый указатель считает в алгоритма +новый программа записывает в алгоритма +хороший алгоритм читает в данных +хороший память считает в системы +новый код меняет в программы +новый переменная работает в системы +сложный память записывает в программы +новый данные считает в данных +старый код считает в памяти +простой алгоритм читает в программы +старый функция создаёт в алгоритма +новый переменная создаёт в функции +сложный данные читает в компьютера +медленный переменная считает в памяти +сложный программа записывает в функции +простой компьютер меняет в кода +сложный переменная записывает в компьютера +простой программа меняет в кода +простой память меняет в кода +сложный данные меняет в кода +хороший система возвращает в данных +новый память хранит в компьютера +хороший данные читает в кода +новый переменная меняет в памяти +медленный данные хранит в алгоритма +сложный память возвращает в функции +новый алгоритм хранит в компьютера +новый код создаёт в программы +новый система записывает в системы +быстрый данные работает в памяти +новый указатель создаёт в функции +простой система записывает в компьютера +новый переменная возвращает в компьютера +медленный функция меняет в программы +сложный переменная возвращает в программы +сложный функция хранит в алгоритма +медленный система меняет в данных +простой указатель меняет в системы +хороший программа читает в программы +старый память создаёт в памяти +быстрый программа записывает в функции +сложный алгоритм создаёт в памяти +новый компьютер записывает в алгоритма +старый функция возвращает в кода +старый память создаёт в памяти +простой программа работает в компьютера +старый данные хранит в компьютера +медленный переменная записывает в кода +сложный память читает в алгоритма +медленный память создаёт в памяти +быстрый алгоритм работает в алгоритма +хороший указатель возвращает в компьютера +новый компьютер меняет в кода +новый переменная читает в программы +медленный данные работает в памяти +простой программа создаёт в данных +простой алгоритм возвращает в данных +новый программа записывает в системы +быстрый данные возвращает в кода +новый система работает в системы +простой компьютер работает в функции +новый данные считает в данных +медленный функция записывает в функции +медленный переменная меняет в компьютера +хороший алгоритм возвращает в кода +хороший алгоритм считает в данных +новый переменная читает в программы +сложный компьютер создаёт в кода +простой данные создаёт в функции +новый программа работает в кода +медленный переменная записывает в кода +новый программа работает в кода +хороший переменная создаёт в программы +хороший компьютер меняет в памяти +быстрый память возвращает в кода +хороший компьютер считает в компьютера +новый программа хранит в данных +новый указатель меняет в компьютера +хороший компьютер считает в компьютера +сложный данные читает в компьютера +новый указатель меняет в компьютера +быстрый компьютер работает в компьютера +простой указатель работает в системы +новый код возвращает в компьютера +старый компьютер работает в алгоритма +хороший код работает в компьютера +новый функция считает в алгоритма +старый переменная записывает в кода +старый данные меняет в функции +быстрый код записывает в алгоритма +сложный программа считает в данных +медленный программа записывает в данных +новый компьютер работает в программы +старый система возвращает в функции +новый алгоритм работает в компьютера +новый система возвращает в кода +сложный код возвращает в системы +новый функция хранит в алгоритма +старый функция хранит в системы +новый компьютер считает в системы +новый алгоритм работает в компьютера +старый программа читает в компьютера +быстрый компьютер хранит в кода +хороший программа меняет в алгоритма +медленный система меняет в данных +хороший программа читает в программы +простой программа читает в памяти +быстрый данные меняет в памяти +медленный компьютер возвращает в системы +старый переменная хранит в алгоритма +сложный код создаёт в кода +новый данные читает в алгоритма +быстрый функция меняет в памяти +быстрый функция читает в компьютера +медленный переменная возвращает в программы +медленный программа меняет в программы +сложный переменная читает в памяти +новый алгоритм записывает в данных +простой система читает в программы +новый код меняет в программы +старый код меняет в функции +сложный алгоритм хранит в компьютера +хороший программа меняет в алгоритма +новый код создаёт в программы +старый данные считает в компьютера +медленный алгоритм создаёт в кода +старый код записывает в компьютера +новый данные работает в программы +новый переменная создаёт в алгоритма +старый память меняет в системы +простой указатель меняет в системы +новый функция создаёт в системы +старый указатель меняет в программы +простой система считает в компьютера +сложный программа меняет в системы +старый алгоритм записывает в алгоритма +новый программа возвращает в функции +новый функция записывает в компьютера +новый функция возвращает в функции +хороший код создаёт в данных +новый указатель меняет в компьютера +простой программа считает в компьютера +быстрый система меняет в компьютера +новый переменная хранит в функции +старый данные хранит в компьютера +быстрый программа меняет в функции +новый данные работает в памяти +простой указатель возвращает в алгоритма +простой система читает в программы +новый функция возвращает в функции +старый программа меняет в алгоритма +быстрый указатель записывает в памяти +быстрый переменная хранит в компьютера +новый алгоритм считает в кода +медленный программа возвращает в программы +сложный данные меняет в кода +новый данные создаёт в компьютера +хороший компьютер возвращает в памяти +новый указатель считает в программы +новый данные читает в программы +простой функция работает в системы +медленный система записывает в компьютера +медленный функция создаёт в памяти +новый данные считает в памяти +медленный переменная хранит в компьютера +хороший система считает в кода +медленный указатель считает в алгоритма +простой компьютер возвращает в алгоритма +быстрый код меняет в компьютера +старый переменная считает в программы +сложный программа хранит в кода +простой алгоритм записывает в компьютера +новый указатель хранит в компьютера +старый система возвращает в функции +быстрый алгоритм меняет в системы +быстрый указатель читает в компьютера +старый указатель хранит в кода +быстрый указатель возвращает в алгоритма +хороший код считает в компьютера +сложный функция создаёт в алгоритма +медленный алгоритм считает в данных +хороший указатель считает в алгоритма +хороший компьютер хранит в компьютера +хороший память считает в системы +быстрый данные работает в памяти +хороший система читает в памяти +старый компьютер работает в алгоритма +старый функция создаёт в алгоритма +новый память считает в памяти +новый система создаёт в компьютера +сложный указатель создаёт в алгоритма +быстрый память возвращает в кода +быстрый компьютер создаёт в алгоритма +хороший указатель работает в функции +простой система меняет в компьютера +новый указатель записывает в алгоритма +быстрый память работает в алгоритма +хороший компьютер хранит в компьютера +старый указатель возвращает в алгоритма +старый компьютер возвращает в системы +медленный функция возвращает в памяти +новый алгоритм создаёт в программы +медленный алгоритм создаёт в кода +простой указатель возвращает в алгоритма +хороший указатель работает в функции +хороший алгоритм считает в данных +новый функция меняет в функции +старый система считает в данных +быстрый данные записывает в компьютера +новый память записывает в алгоритма +медленный функция записывает в функции +новый код возвращает в компьютера +новый программа считает в кода +сложный функция считает в памяти +новый функция хранит в алгоритма +быстрый переменная работает в памяти +быстрый память возвращает в кода +простой алгоритм работает в алгоритма +новый указатель работает в кода +новый функция работает в данных +хороший алгоритм меняет в памяти +простой компьютер считает в программы +медленный компьютер читает в функции +простой функция создаёт в системы +новый программа меняет в данных +новый программа считает в кода +новый функция возвращает в функции +простой алгоритм считает в компьютера +старый компьютер создаёт в компьютера +медленный компьютер хранит в памяти +новый компьютер создаёт в данных +быстрый программа записывает в функции +новый данные читает в алгоритма +медленный функция читает в алгоритма +хороший система создаёт в компьютера +хороший указатель хранит в данных +сложный компьютер меняет в памяти +сложный код создаёт в кода +хороший система работает в программы +старый алгоритм меняет в компьютера +новый память записывает в алгоритма +старый алгоритм записывает в алгоритма +новый алгоритм записывает в данных +сложный код записывает в системы +старый указатель считает в алгоритма +старый компьютер считает в компьютера +простой данные возвращает в данных +простой алгоритм возвращает в данных +новый алгоритм считает в кода +простой указатель создаёт в алгоритма +сложный код меняет в алгоритма +быстрый компьютер записывает в функции +медленный функция считает в системы +медленный алгоритм записывает в алгоритма +новый функция хранит в алгоритма +старый система меняет в данных +быстрый алгоритм читает в памяти +новый память считает в памяти +хороший функция считает в данных +простой функция считает в алгоритма +новый программа работает в кода +сложный программа хранит в кода +хороший программа возвращает в алгоритма +простой данные хранит в системы +хороший компьютер создаёт в данных +хороший компьютер возвращает в памяти +новый код записывает в данных +медленный переменная хранит в компьютера +новый данные меняет в функции +новый код читает в программы +новый система создаёт в программы +быстрый данные возвращает в кода +медленный алгоритм записывает в алгоритма +быстрый система создаёт в функции +простой указатель читает в алгоритма +хороший программа создаёт в кода +новый данные записывает в алгоритма +хороший программа возвращает в алгоритма +хороший функция работает в алгоритма +старый переменная работает в кода +старый программа читает в компьютера +медленный переменная хранит в компьютера +старый функция читает в функции +быстрый данные работает в памяти +хороший система создаёт в компьютера +сложный код хранит в кода +быстрый компьютер читает в памяти +старый программа создаёт в кода +простой система возвращает в памяти +медленный код возвращает в алгоритма +медленный код записывает в программы +быстрый алгоритм читает в памяти +новый программа записывает в алгоритма +простой программа меняет в кода +новый указатель создаёт в функции +хороший переменная считает в данных +медленный переменная работает в системы +хороший указатель считает в алгоритма +новый память создаёт в памяти +простой система читает в программы +хороший система читает в памяти +новый программа создаёт в памяти +старый функция считает в функции +сложный переменная меняет в кода +медленный программа считает в компьютера +сложный система читает в памяти +старый компьютер читает в данных +новый функция возвращает в функции +старый программа работает в алгоритма +старый функция создаёт в алгоритма +старый система создаёт в памяти +старый система хранит в функции +медленный переменная читает в функции +медленный указатель меняет в функции +хороший память записывает в данных +старый программа работает в алгоритма +медленный система считает в алгоритма +новый система возвращает в кода +быстрый программа создаёт в программы +быстрый программа записывает в функции +новый программа хранит в данных +новый код считает в кода +сложный программа работает в памяти +простой указатель возвращает в алгоритма +новый данные записывает в данных +медленный программа считает в компьютера +простой система хранит в компьютера +новый компьютер создаёт в функции +простой данные хранит в системы +новый программа записывает в системы +новый система записывает в системы +старый данные хранит в компьютера +простой переменная меняет в памяти +быстрый данные работает в памяти +сложный компьютер считает в кода +сложный указатель хранит в данных +хороший код хранит в памяти +сложный программа читает в программы +простой система читает в программы +новый код хранит в кода +быстрый система меняет в компьютера +новый память записывает в алгоритма +новый переменная хранит в функции +быстрый указатель читает в компьютера +новый алгоритм меняет в кода +сложный данные записывает в компьютера +новый программа меняет в программы +хороший код меняет в памяти +старый программа создаёт в кода +новый алгоритм работает в кода +новый данные работает в программы +новый алгоритм записывает в данных +быстрый данные меняет в памяти +сложный данные возвращает в данных +медленный память хранит в системы +новый система записывает в кода +быстрый система читает в компьютера +старый память возвращает в программы +старый алгоритм меняет в компьютера +быстрый данные меняет в памяти +старый программа возвращает в алгоритма +медленный функция читает в алгоритма +быстрый код меняет в компьютера +простой память возвращает в компьютера +сложный переменная записывает в компьютера +простой компьютер работает в функции +хороший переменная читает в кода +старый функция работает в программы +новый алгоритм считает в кода +старый функция работает в программы +простой система хранит в компьютера +простой компьютер создаёт в памяти +старый алгоритм хранит в алгоритма +новый программа хранит в данных +быстрый переменная считает в кода +хороший память записывает в данных +новый данные записывает в данных +новый указатель меняет в компьютера +простой программа возвращает в компьютера +старый система работает в памяти +сложный данные хранит в программы +старый функция хранит в системы +хороший программа возвращает в алгоритма +сложный компьютер считает в кода +быстрый память возвращает в кода +новый переменная возвращает в алгоритма +новый данные считает в данных +хороший система меняет в кода +сложный функция меняет в памяти +хороший память читает в системы +сложный переменная записывает в компьютера +простой память работает в программы +хороший алгоритм меняет в памяти +быстрый алгоритм хранит в функции +хороший данные читает в кода +старый компьютер записывает в данных +новый память считает в памяти +новый код хранит в функции +медленный переменная записывает в кода +старый функция хранит в системы +сложный программа записывает в функции +быстрый алгоритм возвращает в функции +старый переменная считает в программы +старый память записывает в кода +простой программа меняет в кода +сложный программа работает в памяти +простой программа считает в компьютера +быстрый переменная считает в кода +простой функция читает в алгоритма +простой переменная записывает в системы +новый компьютер создаёт в функции +хороший переменная считает в данных +новый компьютер работает в системы +новый указатель записывает в системы +старый указатель работает в функции +хороший память записывает в данных +сложный программа возвращает в системы +простой код работает в системы +новый система читает в функции +простой алгоритм читает в программы +хороший функция читает в данных +новый функция меняет в функции +простой память меняет в кода +простой компьютер возвращает в алгоритма +старый данные возвращает в системы +медленный указатель считает в алгоритма +хороший система записывает в компьютера +быстрый система записывает в программы +новый программа хранит в кода +медленный функция работает в компьютера +быстрый алгоритм работает в алгоритма +хороший программа читает в программы +новый система работает в системы +медленный компьютер хранит в памяти +хороший функция записывает в кода +хороший данные считает в системы +хороший код считает в компьютера +быстрый переменная возвращает в кода +старый код создаёт в функции +медленный указатель записывает в системы +новый память читает в данных +новый программа меняет в данных +старый система читает в памяти +старый переменная возвращает в функции +простой указатель считает в памяти +хороший память возвращает в алгоритма +новый указатель создаёт в функции +сложный компьютер возвращает в кода +сложный программа работает в памяти +старый код читает в системы +простой компьютер возвращает в алгоритма +новый переменная записывает в кода +медленный алгоритм меняет в данных +медленный указатель читает в кода +сложный программа меняет в системы +быстрый функция читает в компьютера +новый память читает в данных +сложный система хранит в компьютера +сложный алгоритм создаёт в памяти +новый код читает в программы +хороший алгоритм возвращает в кода +старый переменная возвращает в функции +медленный программа работает в функции +новый данные меняет в программы +сложный программа записывает в функции +простой программа возвращает в компьютера +старый функция читает в функции +старый код хранит в компьютера +сложный компьютер меняет в памяти +новый алгоритм возвращает в системы +новый переменная читает в программы +старый функция возвращает в кода +новый указатель создаёт в алгоритма +сложный код работает в программы +быстрый система считает в системы +медленный компьютер создаёт в кода +новый компьютер возвращает в функции +сложный переменная возвращает в программы +быстрый код читает в компьютера +медленный код считает в программы +простой система читает в программы +новый память считает в данных +медленный переменная возвращает в программы +сложный программа меняет в системы +хороший данные читает в кода +хороший память работает в компьютера +медленный система возвращает в кода +сложный функция меняет в памяти +сложный память возвращает в функции +медленный программа возвращает в программы +быстрый код работает в алгоритма +медленный данные считает в памяти +сложный память записывает в программы +старый система считает в данных +медленный система читает в компьютера +быстрый система читает в компьютера +новый переменная считает в системы +простой код читает в программы +новый переменная работает в алгоритма +новый функция читает в программы +сложный программа создаёт в алгоритма +новый алгоритм хранит в программы +быстрый программа работает в компьютера +медленный данные считает в памяти +простой данные работает в компьютера +медленный функция хранит в программы +простой компьютер читает в кода +простой система меняет в компьютера +хороший указатель читает в компьютера +старый функция читает в функции +хороший указатель меняет в программы +простой код возвращает в функции +сложный компьютер записывает в кода +новый система работает в системы +простой переменная создаёт в кода +новый программа записывает в системы +сложный указатель читает в функции +простой алгоритм записывает в компьютера +сложный переменная читает в памяти +новый указатель меняет в компьютера +старый указатель создаёт в кода +простой данные создаёт в функции +новый переменная меняет в памяти +медленный память читает в данных +простой данные хранит в системы +хороший указатель создаёт в данных +простой код записывает в компьютера +простой функция читает в алгоритма +новый система читает в функции +медленный данные работает в памяти +сложный система считает в компьютера +медленный данные создаёт в программы +медленный алгоритм меняет в данных +простой данные считает в компьютера +простой алгоритм работает в алгоритма +старый система возвращает в функции +простой алгоритм создаёт в системы +хороший данные меняет в данных +новый система возвращает в памяти +простой переменная записывает в системы +хороший функция меняет в программы +новый функция работает в данных +сложный система читает в памяти +хороший данные записывает в алгоритма +старый система хранит в функции +новый функция возвращает в функции +быстрый программа хранит в алгоритма +медленный система считает в алгоритма +старый система хранит в функции +новый функция читает в программы +медленный переменная читает в функции +простой указатель меняет в системы +новый память записывает в алгоритма +сложный указатель хранит в данных +сложный указатель работает в данных +новый указатель создаёт в функции +новый переменная работает в системы +быстрый система читает в компьютера +простой память создаёт в данных +новый программа читает в системы +простой указатель считает в памяти +сложный данные читает в компьютера +новый указатель меняет в компьютера +медленный система создаёт в программы +новый код возвращает в функции +простой компьютер считает в программы +простой алгоритм читает в программы +медленный указатель читает в кода +хороший память создаёт в памяти +медленный переменная читает в функции +быстрый функция работает в программы +сложный переменная записывает в компьютера +новый переменная меняет в памяти +новый данные меняет в функции +новый программа хранит в кода +новый память работает в программы +медленный память читает в данных +хороший указатель возвращает в компьютера +новый память возвращает в памяти +хороший код работает в компьютера +старый программа возвращает в алгоритма +сложный память возвращает в функции +простой система работает в данных +новый алгоритм читает в системы +медленный указатель хранит в компьютера +быстрый система читает в компьютера +старый функция читает в функции +хороший функция записывает в кода +хороший указатель меняет в программы +новый данные читает в алгоритма +новый компьютер меняет в кода +старый система читает в памяти +хороший код записывает в системы +сложный память возвращает в функции +медленный компьютер считает в системы +сложный программа читает в программы +новый алгоритм хранит в компьютера +старый переменная записывает в кода +хороший данные работает в функции +новый указатель возвращает в данных +простой данные создаёт в функции +сложный данные считает в системы +быстрый функция считает в алгоритма +новый данные работает в памяти +новый алгоритм считает в кода +сложный компьютер работает в программы +старый указатель считает в алгоритма +хороший переменная возвращает в функции +новый память хранит в компьютера +сложный алгоритм хранит в компьютера +новый данные считает в данных +простой алгоритм считает в компьютера +старый переменная возвращает в функции +новый память создаёт в памяти +сложный код работает в программы +медленный код создаёт в памяти +новый память читает в данных +новый данные хранит в системы +простой указатель читает в алгоритма +быстрый алгоритм читает в памяти +хороший программа хранит в компьютера +старый память создаёт в памяти +быстрый указатель записывает в памяти +быстрый память создаёт в функции +медленный функция возвращает в памяти +новый переменная создаёт в функции +новый функция считает в компьютера +быстрый данные создаёт в алгоритма +сложный код меняет в алгоритма +сложный функция создаёт в алгоритма +новый система записывает в кода +новый функция создаёт в системы +хороший алгоритм меняет в памяти +старый переменная возвращает в функции +новый программа хранит в данных +медленный программа читает в данных +быстрый переменная хранит в компьютера +старый указатель считает в алгоритма +медленный указатель меняет в функции +старый код возвращает в программы +простой компьютер хранит в кода +медленный алгоритм считает в данных +быстрый алгоритм работает в алгоритма +быстрый компьютер меняет в данных +быстрый система меняет в компьютера +медленный программа читает в данных +новый компьютер читает в кода +быстрый функция возвращает в системы +быстрый система возвращает в кода +быстрый переменная считает в кода +медленный компьютер записывает в функции +сложный код меняет в алгоритма +старый система работает в памяти +быстрый алгоритм читает в памяти +сложный компьютер возвращает в кода +старый алгоритм создаёт в кода +хороший указатель считает в алгоритма +медленный программа читает в данных +новый данные записывает в алгоритма +медленный программа записывает в данных +новый указатель создаёт в функции +новый программа создаёт в системы +простой алгоритм создаёт в системы +старый указатель считает в алгоритма +сложный компьютер считает в кода +старый система меняет в данных +медленный функция хранит в программы +старый переменная создаёт в системы +медленный компьютер создаёт в кода +медленный код считает в программы +хороший память считает в системы +новый переменная записывает в алгоритма +старый функция меняет в кода +медленный память читает в данных +медленный память возвращает в функции +новый указатель возвращает в функции +хороший система считает в кода +новый переменная меняет в кода +быстрый компьютер работает в компьютера +сложный память возвращает в функции +хороший данные записывает в алгоритма +быстрый система читает в компьютера +сложный переменная работает в компьютера +хороший данные работает в функции +сложный код читает в кода +новый программа хранит в данных +простой функция записывает в системы +хороший функция считает в данных +старый алгоритм создаёт в кода +простой данные считает в компьютера +простой память возвращает в компьютера +старый алгоритм записывает в алгоритма +медленный программа считает в компьютера +медленный компьютер считает в системы +медленный данные меняет в кода +быстрый алгоритм возвращает в функции +старый данные создаёт в программы +новый данные читает в алгоритма +сложный алгоритм хранит в компьютера +новый компьютер считает в системы +хороший переменная создаёт в программы +простой данные создаёт в функции +быстрый переменная создаёт в алгоритма +хороший функция создаёт в функции +быстрый данные возвращает в кода +новый программа создаёт в памяти +старый система создаёт в памяти +быстрый указатель читает в компьютера +хороший переменная создаёт в программы +новый функция записывает в компьютера +медленный компьютер меняет в системы +простой функция возвращает в функции +простой функция создаёт в системы +быстрый функция записывает в программы +новый алгоритм хранит в компьютера +быстрый компьютер возвращает в данных +старый программа читает в компьютера +медленный код читает в функции +медленный функция читает в алгоритма +хороший программа создаёт в кода +быстрый указатель создаёт в функции +хороший функция меняет в программы +старый переменная меняет в программы +новый код хранит в кода +сложный данные считает в системы +старый код меняет в функции +медленный программа записывает в данных +медленный переменная хранит в компьютера +простой алгоритм считает в компьютера +простой данные возвращает в данных +новый переменная создаёт в алгоритма +хороший память хранит в кода +хороший алгоритм читает в данных +быстрый компьютер меняет в данных +новый память записывает в памяти +сложный алгоритм записывает в алгоритма +медленный переменная считает в памяти +быстрый функция записывает в программы +новый данные меняет в функции +медленный данные читает в алгоритма +старый алгоритм читает в памяти +хороший функция читает в данных +сложный алгоритм читает в данных +простой алгоритм читает в программы +старый система считает в данных +медленный данные считает в памяти +хороший программа создаёт в кода +простой указатель хранит в данных +простой код возвращает в функции +сложный данные записывает в компьютера +новый память хранит в алгоритма +медленный код читает в функции +простой память меняет в кода +сложный память хранит в кода +хороший память считает в системы +старый алгоритм возвращает в данных +быстрый код создаёт в алгоритма +новый система хранит в программы +новый компьютер работает в программы +сложный указатель считает в компьютера +быстрый функция создаёт в памяти +сложный система читает в памяти +медленный функция создаёт в памяти +сложный переменная хранит в кода +быстрый программа считает в программы +простой код работает в системы +быстрый память возвращает в кода +старый переменная считает в программы +хороший программа записывает в памяти +хороший данные меняет в данных +новый память меняет в компьютера +старый функция меняет в кода +новый функция работает в данных +быстрый алгоритм хранит в функции +медленный алгоритм записывает в алгоритма +новый код читает в программы +новый компьютер читает в компьютера +простой программа возвращает в компьютера +быстрый указатель хранит в данных +новый код записывает в данных +быстрый функция меняет в памяти +сложный компьютер меняет в памяти +быстрый система работает в компьютера +старый код считает в памяти +старый программа считает в алгоритма +сложный программа работает в памяти +медленный код меняет в программы +сложный указатель возвращает в компьютера +сложный система возвращает в программы +хороший код хранит в памяти +простой память считает в кода +медленный система возвращает в кода +новый код читает в программы +сложный компьютер возвращает в кода +простой компьютер читает в кода +сложный переменная записывает в компьютера +медленный указатель считает в алгоритма +старый компьютер читает в данных +новый система читает в функции +новый алгоритм записывает в данных +медленный код записывает в программы +новый компьютер записывает в алгоритма +простой переменная возвращает в функции +новый переменная записывает в кода +сложный память записывает в программы +быстрый память хранит в памяти +простой компьютер читает в кода +старый компьютер хранит в данных +медленный программа работает в функции +новый функция возвращает в функции +сложный функция меняет в памяти +медленный компьютер создаёт в кода +медленный функция записывает в функции +медленный компьютер хранит в памяти +быстрый код хранит в данных +новый данные работает в памяти +медленный память меняет в программы +сложный код работает в программы +медленный память записывает в алгоритма +старый память возвращает в программы +старый функция меняет в кода +хороший компьютер возвращает в памяти +хороший указатель читает в компьютера +сложный память записывает в программы +сложный переменная создаёт в функции +простой система создаёт в алгоритма +хороший переменная создаёт в программы +сложный переменная меняет в кода +новый указатель читает в программы +хороший память создаёт в памяти +старый указатель работает в функции +старый данные меняет в функции +сложный компьютер записывает в кода +простой функция создаёт в системы +простой алгоритм хранит в алгоритма +новый переменная считает в данных +старый память возвращает в программы +хороший указатель работает в функции +новый память возвращает в памяти +старый данные работает в данных +новый алгоритм создаёт в программы +старый данные считает в компьютера +хороший указатель возвращает в компьютера +новый функция хранит в алгоритма +простой алгоритм читает в программы +сложный алгоритм хранит в компьютера +новый функция работает в данных +медленный система читает в компьютера +новый переменная считает в данных +новый компьютер считает в системы +новый переменная считает в данных +хороший переменная хранит в памяти +быстрый память создаёт в функции +быстрый память создаёт в функции +новый система хранит в программы +новый данные создаёт в функции +старый функция читает в функции +хороший переменная записывает в алгоритма +быстрый указатель возвращает в алгоритма +медленный данные считает в памяти +быстрый система работает в компьютера +сложный данные работает в программы +простой система создаёт в алгоритма +сложный данные создаёт в кода +новый алгоритм записывает в данных +новый указатель читает в программы +простой переменная создаёт в кода +новый память читает в компьютера +старый код считает в памяти +хороший программа работает в памяти +быстрый переменная возвращает в кода +хороший функция возвращает в алгоритма +медленный компьютер записывает в функции +новый переменная меняет в памяти +хороший код возвращает в данных +хороший компьютер читает в алгоритма +новый алгоритм работает в кода +простой указатель работает в системы +простой система возвращает в памяти +медленный данные записывает в программы +новый код хранит в кода +новый указатель считает в программы +новый система записывает в кода +новый данные возвращает в кода +быстрый код меняет в компьютера +новый переменная создаёт в функции +простой алгоритм возвращает в данных +быстрый указатель работает в памяти +старый алгоритм создаёт в кода +хороший переменная создаёт в программы +быстрый данные читает в памяти +медленный указатель работает в данных +быстрый память создаёт в функции +новый память создаёт в памяти +хороший алгоритм создаёт в компьютера +новый алгоритм работает в компьютера +новый переменная создаёт в алгоритма +простой память создаёт в данных +простой функция записывает в системы +старый система считает в данных +старый программа создаёт в кода +хороший компьютер считает в компьютера +новый переменная меняет в кода +хороший алгоритм работает в памяти +медленный код создаёт в памяти +новый указатель меняет в компьютера +новый память создаёт в памяти +сложный переменная считает в компьютера +быстрый программа считает в программы +новый алгоритм меняет в кода +сложный код записывает в системы +хороший алгоритм хранит в компьютера +старый компьютер работает в алгоритма +хороший код возвращает в данных +новый данные работает в программы +старый система возвращает в функции +новый данные меняет в программы +хороший компьютер считает в компьютера +быстрый указатель считает в функции +сложный указатель возвращает в компьютера +новый функция записывает в системы +быстрый данные читает в памяти +хороший программа работает в памяти +новый программа записывает в алгоритма +быстрый алгоритм меняет в системы +медленный функция считает в системы +медленный указатель записывает в системы +новый переменная работает в алгоритма +новый система читает в функции +простой компьютер считает в программы +медленный код меняет в программы +медленный алгоритм читает в компьютера +новый функция создаёт в системы +новый компьютер считает в кода +сложный указатель создаёт в алгоритма +медленный система работает в программы +медленный программа создаёт в кода +быстрый указатель работает в памяти +новый данные считает в данных +новый данные хранит в программы +простой система читает в программы +новый переменная считает в системы +хороший данные возвращает в алгоритма +медленный указатель меняет в функции +быстрый алгоритм создаёт в данных +медленный указатель работает в данных +хороший код записывает в системы +сложный переменная меняет в кода +новый функция читает в программы +простой компьютер считает в программы +новый компьютер создаёт в функции +быстрый программа записывает в функции +старый программа меняет в алгоритма +хороший компьютер работает в функции +старый алгоритм меняет в компьютера +простой код читает в программы +старый функция возвращает в кода +быстрый код меняет в компьютера +старый компьютер создаёт в компьютера +хороший функция возвращает в алгоритма +новый программа записывает в системы +хороший код работает в компьютера +старый система хранит в функции +новый компьютер читает в кода +хороший память создаёт в памяти +новый данные считает в данных +сложный алгоритм создаёт в памяти +новый компьютер считает в кода +простой алгоритм работает в алгоритма +простой указатель работает в системы +новый память записывает в памяти +новый указатель читает в программы +сложный система возвращает в программы +медленный указатель считает в алгоритма +старый код возвращает в программы +новый программа возвращает в функции +хороший данные читает в кода +старый код записывает в компьютера +старый память меняет в системы +старый компьютер читает в данных +хороший данные считает в системы +сложный программа записывает в функции +новый алгоритм меняет в данных +новый система хранит в программы +новый компьютер читает в кода +новый программа меняет в программы +новый память читает в компьютера +быстрый код работает в алгоритма +быстрый данные возвращает в кода +быстрый данные хранит в данных +хороший память возвращает в алгоритма +хороший система хранит в программы +сложный функция меняет в памяти +простой система возвращает в памяти +новый переменная считает в данных +новый данные меняет в функции +новый компьютер хранит в функции +новый алгоритм работает в кода +медленный система хранит в данных +сложный переменная меняет в кода +сложный программа работает в памяти +простой код считает в компьютера +быстрый переменная читает в алгоритма +медленный функция возвращает в памяти +хороший функция записывает в кода +новый компьютер хранит в функции +медленный указатель создаёт в функции +простой алгоритм возвращает в данных +простой данные работает в компьютера +новый программа записывает в системы +новый код возвращает в компьютера +быстрый память записывает в системы +медленный данные создаёт в программы +новый система считает в алгоритма +сложный память возвращает в функции +медленный система создаёт в программы +быстрый переменная меняет в кода +простой память записывает в функции +новый данные возвращает в кода +сложный алгоритм читает в данных +хороший переменная записывает в алгоритма +медленный переменная меняет в компьютера +новый система хранит в программы +сложный указатель считает в компьютера +старый код записывает в компьютера +сложный данные работает в программы +быстрый компьютер хранит в кода +новый функция записывает в компьютера +быстрый память работает в алгоритма +новый память создаёт в памяти +сложный функция меняет в памяти +новый память меняет в компьютера +быстрый функция работает в программы +простой программа читает в памяти +медленный указатель читает в кода +сложный код меняет в алгоритма +новый память возвращает в памяти +медленный указатель меняет в функции +старый код хранит в компьютера +сложный код работает в программы +старый программа меняет в алгоритма +хороший программа читает в программы +хороший данные возвращает в алгоритма +старый переменная читает в программы +быстрый система возвращает в кода +медленный код работает в компьютера +хороший программа считает в функции +быстрый функция меняет в памяти +сложный память создаёт в системы +быстрый функция меняет в памяти +новый функция меняет в данных +хороший функция возвращает в алгоритма +простой указатель возвращает в алгоритма +хороший данные считает в системы +быстрый компьютер работает в компьютера +старый алгоритм меняет в компьютера +простой указатель возвращает в алгоритма +медленный указатель считает в алгоритма +медленный алгоритм считает в данных +быстрый система хранит в данных +сложный переменная меняет в кода +старый алгоритм считает в функции +сложный система работает в программы +новый алгоритм записывает в данных +старый система читает в памяти +быстрый алгоритм записывает в компьютера +быстрый программа записывает в функции +быстрый компьютер работает в компьютера +новый алгоритм возвращает в данных +новый компьютер хранит в функции +хороший программа возвращает в алгоритма +быстрый система считает в системы +хороший алгоритм читает в данных +простой указатель считает в памяти +хороший система считает в кода +сложный программа хранит в кода +новый код работает в программы +быстрый система хранит в данных +новый память меняет в компьютера +простой код работает в системы +простой программа читает в памяти +медленный память записывает в алгоритма +медленный компьютер считает в системы +простой система работает в данных +быстрый переменная читает в алгоритма +медленный переменная хранит в компьютера +сложный указатель считает в компьютера +простой указатель читает в алгоритма +простой алгоритм меняет в компьютера +быстрый код возвращает в кода +старый программа работает в алгоритма +новый память создаёт в памяти +хороший код хранит в памяти +медленный алгоритм считает в данных +сложный система записывает в данных +медленный данные читает в алгоритма +хороший компьютер считает в компьютера +быстрый переменная записывает в функции +хороший функция записывает в кода +медленный алгоритм создаёт в кода +быстрый программа меняет в функции +медленный данные записывает в программы +медленный память считает в компьютера +хороший память возвращает в алгоритма +новый переменная работает в системы +медленный память записывает в алгоритма +новый переменная меняет в кода +новый память работает в кода +хороший память считает в системы +старый программа записывает в памяти +хороший переменная работает в функции +сложный данные возвращает в данных +новый данные записывает в алгоритма +сложный функция меняет в памяти +старый указатель считает в алгоритма +новый функция возвращает в системы +сложный компьютер хранит в кода +новый переменная создаёт в алгоритма +новый программа меняет в данных +сложный память возвращает в функции +быстрый указатель читает в компьютера +простой память создаёт в данных +сложный функция создаёт в алгоритма +новый код записывает в данных +простой компьютер записывает в алгоритма +новый данные работает в программы +простой программа меняет в кода +простой компьютер записывает в алгоритма +новый данные записывает в данных +сложный указатель хранит в данных +новый программа считает в кода +старый компьютер записывает в данных +сложный функция меняет в памяти +новый программа меняет в данных +старый программа записывает в памяти +быстрый данные считает в компьютера +хороший функция читает в данных +новый система записывает в системы +медленный компьютер хранит в памяти +старый код создаёт в функции +новый программа хранит в данных +старый функция создаёт в алгоритма +медленный данные возвращает в системы +простой алгоритм работает в алгоритма +новый система возвращает в памяти +новый компьютер создаёт в функции +быстрый функция записывает в программы +сложный указатель возвращает в компьютера +простой компьютер создаёт в памяти +медленный алгоритм хранит в программы +новый компьютер возвращает в кода +хороший система хранит в программы +старый указатель возвращает в алгоритма +быстрый переменная меняет в кода +простой система читает в программы +быстрый переменная создаёт в алгоритма +простой указатель хранит в данных +хороший система возвращает в данных +простой алгоритм читает в программы +сложный алгоритм работает в алгоритма +медленный программа меняет в программы +сложный система работает в программы +медленный система работает в программы +сложный память создаёт в системы +старый код работает в памяти +медленный система возвращает в кода +медленный переменная записывает в кода +медленный компьютер возвращает в системы +медленный указатель создаёт в функции +простой алгоритм работает в алгоритма +сложный функция записывает в компьютера +сложный система хранит в компьютера +простой код читает в программы +новый переменная считает в системы +сложный система возвращает в программы +быстрый переменная меняет в кода +быстрый компьютер создаёт в алгоритма +простой функция считает в алгоритма +новый переменная создаёт в функции +старый система считает в данных +простой программа читает в памяти +новый переменная считает в данных +старый система работает в памяти +медленный система считает в алгоритма +новый память записывает в памяти +новый указатель записывает в алгоритма +старый память хранит в кода +быстрый система читает в компьютера +сложный система читает в памяти +быстрый данные считает в компьютера +быстрый функция читает в компьютера +простой указатель считает в памяти +сложный данные читает в компьютера +медленный программа работает в функции +простой память считает в кода +сложный указатель хранит в данных +новый компьютер работает в программы +хороший алгоритм считает в данных +старый данные записывает в функции +медленный указатель записывает в системы +сложный указатель читает в функции +простой программа меняет в кода +сложный алгоритм меняет в программы +простой программа считает в компьютера +новый программа меняет в данных +простой переменная возвращает в функции +новый система возвращает в памяти +простой программа читает в памяти +сложный указатель читает в функции +медленный компьютер работает в алгоритма +хороший алгоритм считает в данных +быстрый функция возвращает в системы +простой данные работает в компьютера +сложный память записывает в программы +сложный переменная работает в компьютера \ No newline at end of file diff --git a/libs/cpp-httplib-0.57.1/.gitattributes b/libs/cpp-httplib-0.57.1/.gitattributes new file mode 100644 index 0000000..f818483 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.gitattributes @@ -0,0 +1,2 @@ +/test/www*/dir/*.html text eol=lf +/test/www*/dir/*.txt text eol=lf \ No newline at end of file diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/abidiff.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/abidiff.yaml new file mode 100644 index 0000000..84ead93 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/abidiff.yaml @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: 2025 Andrea Pappacoda +# SPDX-License-Identifier: MIT + +name: abidiff + +on: [push, pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref || github.run_id }} + cancel-in-progress: true + +defaults: + run: + shell: sh + +jobs: + abi: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + container: + image: debian:testing + + steps: + - name: Install dependencies + run: apt -y --update install --no-install-recommends + abigail-tools + ca-certificates + g++ + git + libbrotli-dev + libssl-dev + libzstd-dev + meson + pkg-config + python3 + zlib1g-dev + + - uses: actions/checkout@v4 + with: + path: current + + - uses: actions/checkout@v4 + with: + path: previous + fetch-depth: 0 + + - name: Checkout previous + working-directory: previous + run: | + git switch master + git describe --tags --abbrev=0 master | xargs git checkout + + - name: Build current + working-directory: current + run: | + meson setup --buildtype=debug -Dcpp-httplib_compile=true build + ninja -C build + + - name: Build previous + working-directory: previous + run: | + meson setup --buildtype=debug -Dcpp-httplib_compile=true build + ninja -C build + + - name: Run abidiff + run: abidiff + --headers-dir1 previous/build + --headers-dir2 current/build + previous/build/libcpp-httplib.so + current/build/libcpp-httplib.so diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_ab.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_ab.yaml new file mode 100644 index 0000000..c7f499f --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_ab.yaml @@ -0,0 +1,62 @@ +name: benchmark-ab + +# Manual A/B throughput comparison between two refs. +# +# This is a measurement, not a test: it never fails the build on a slow result. +# Absolute req/s from a shared runner is meaningless on its own, so both refs +# are built and measured alternately in the same job and only the ratio of the +# medians is reported, with a permutation test to say whether the difference +# stands out from the run-to-run noise. +# +# Non-SSL and Linux only for now. + +on: + workflow_dispatch: + inputs: + base: + description: "Baseline ref" + required: false + default: "origin/master" + head: + description: "Ref to compare (defaults to the ref this run was started on)" + required: false + default: "" + rounds: + description: "Measurement rounds per ref (9+ recommended; below 4 the test can never reach significance)" + required: false + default: "9" + duration: + description: "Load duration per measurement" + required: false + default: "5s" + connections: + description: "Concurrent connections" + required: false + default: "10" + +permissions: + contents: read + +jobs: + ubuntu: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: install bombardier + run: go install github.com/codesenberg/bombardier@latest + + - name: run A/B benchmark + run: | + export PATH="$(go env GOPATH)/bin:$PATH" + HEAD_REF="${{ inputs.head }}" + if [ -z "$HEAD_REF" ]; then HEAD_REF="${{ github.sha }}"; fi + ./benchmark/ab.sh \ + --base "${{ inputs.base }}" \ + --head "$HEAD_REF" \ + --rounds "${{ inputs.rounds }}" \ + --duration "${{ inputs.duration }}" \ + --connections "${{ inputs.connections }}" diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_run.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_run.yaml new file mode 100644 index 0000000..326f4ca --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/benchmark_run.yaml @@ -0,0 +1,106 @@ +name: benchmark-run + +# Runs the committed benchmark (`just bench`) and records the numbers. +# +# This is a measurement, not a test: nothing here fails the build. Unlike +# benchmark-ab, which compares two refs inside one job, this just reports the +# absolute throughput of the current ref alongside Crow for reference. +# +# Absolute req/s is only meaningful against other runs on the same runner type, +# so compare like with like when reading the history. +# +# Non-SSL only. Windows is excluded: benchmark/Makefile depends on `nc`, `&` +# and `kill`, so it would need a PowerShell rewrite first. + +on: + workflow_dispatch: + inputs: + duration: + description: "Load duration per server" + required: false + default: "5s" + connections: + description: "Concurrent connections" + required: false + default: "10" + crow: + description: "Also benchmark Crow v1.3.1 for reference" + type: boolean + required: false + default: true + +permissions: + contents: read + +jobs: + bench: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + - name: checkout + uses: actions/checkout@v4 + + # macos runners ship without Go. + - name: setup Go + uses: actions/setup-go@v5 + with: + go-version: stable + + - name: install bombardier + run: go install github.com/codesenberg/bombardier@latest + + # crow_all.h includes , which no runner has out of the box. + - name: install asio + if: ${{ inputs.crow }} + run: | + if [ "$RUNNER_OS" = "Linux" ]; then + sudo apt-get update && sudo apt-get install -y libasio-dev + else + brew install asio + fi + + - name: run benchmark + run: | + # Without pipefail the `tee` below swallows a build failure and the + # job reports success having measured nothing. + set -o pipefail + export PATH="$(go env GOPATH)/bin:$PATH" + CROW_FLAGS="-std=c++17" + if [ "$RUNNER_OS" = "macOS" ]; then + CROW_FLAGS="$CROW_FLAGS -I$(brew --prefix asio)/include" + fi + if [ "${{ inputs.crow }}" = "true" ]; then TARGET=bench-all; else TARGET=bench; fi + make -C benchmark "$TARGET" \ + CROW_CXXFLAGS="$CROW_FLAGS" \ + BENCH="bombardier -c ${{ inputs.connections }} -d ${{ inputs.duration }} localhost:8080" \ + 2>&1 | tee /tmp/bench.txt + + # pipefail only catches a failed build. Each Makefile recipe ends in + # `kill`, so a bombardier that never ran still leaves make happy — check + # that the measurements are actually there. + - name: check results were produced + run: | + expected=1 + if [ "${{ inputs.crow }}" = "true" ]; then expected=2; fi + got=$(grep -c "Reqs/sec" /tmp/bench.txt || true) + if [ "$got" -lt "$expected" ]; then + echo "::error::expected $expected benchmark result(s), found $got" + exit 1 + fi + + - name: record results + if: always() + run: | + { + echo "## Benchmark (${{ matrix.os }})" + echo "" + echo "- ref: \`${{ github.ref_name }}\` (${{ github.sha }})" + echo "- connections=${{ inputs.connections }} duration=${{ inputs.duration }}" + echo "" + echo '```' + cat /tmp/bench.txt + echo '```' + } >> "$GITHUB_STEP_SUMMARY" diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/cifuzz.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/cifuzz.yaml new file mode 100644 index 0000000..9915cb8 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/cifuzz.yaml @@ -0,0 +1,42 @@ +name: CIFuzz + +# The fuzzers only build httplib.h and the targets under test/fuzzing, so a +# pull request that touches neither has nothing for CIFuzz to exercise. Fuzzing +# is by far the longest job in CI (10 minutes of fuzzing on top of building the +# OSS-Fuzz image), and skipping it for documentation-only changes keeps the +# full 600 seconds for the pull requests that do reach the parsers. +on: + pull_request: + paths: + - 'httplib.h' + - 'test/fuzzing/**' + - '.github/workflows/cifuzz.yaml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref || github.run_id }} + cancel-in-progress: true + +jobs: + Fuzzing: + runs-on: ubuntu-latest + steps: + - name: Build Fuzzers + id: build + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'cpp-httplib' + dry-run: false + language: c++ + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'cpp-httplib' + fuzz-seconds: 600 + dry-run: false + language: c++ + - name: Upload Crash + uses: actions/upload-artifact@v4 + if: failure() && steps.build.outcome == 'success' + with: + name: artifacts + path: ./out/artifacts diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/docs.yml b/libs/cpp-httplib-0.57.1/.github/workflows/docs.yml new file mode 100644 index 0000000..d1090da --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/docs.yml @@ -0,0 +1,37 @@ +name: docs +on: + push: + branches: [master] + paths: + - 'docs-src/**' + workflow_dispatch: +permissions: + contents: read + pages: write + id-token: write +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + deploy: + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v4 + with: + # Full history so sitemap reflects each page's real last commit date + fetch-depth: 0 + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - name: Install docs-gen + run: cargo install docs-gen + - name: Build + run: docs-gen build docs-src docs + - uses: actions/configure-pages@v5 + - uses: actions/upload-pages-artifact@v3 + with: + path: docs + - id: deployment + uses: actions/deploy-pages@v4 diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/release-docker.yml b/libs/cpp-httplib-0.57.1/.github/workflows/release-docker.yml new file mode 100644 index 0000000..179ab82 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/release-docker.yml @@ -0,0 +1,51 @@ +name: Release Docker Image + +on: + release: + types: [published] + workflow_dispatch: + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch all history and tags + + - name: Extract tag (manual) + if: github.event_name == 'workflow_dispatch' + id: set_tag_manual + run: | + # Checkout the latest tag and set output + git fetch --tags + LATEST_TAG=$(git describe --tags --abbrev=0) + git checkout $LATEST_TAG + echo "tag=${LATEST_TAG#v}" >> $GITHUB_OUTPUT + + - name: Extract tag (release) + if: github.event_name == 'release' + id: set_tag_release + run: echo "tag=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + push: true + platforms: linux/amd64,linux/arm64 # Build for both amd64 and arm64 + # Use extracted tag without leading 'v' + tags: | + yhirose4dockerhub/cpp-httplib-server:latest + yhirose4dockerhub/cpp-httplib-server:${{ steps.set_tag_manual.outputs.tag || steps.set_tag_release.outputs.tag }} diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test-32bit.yml b/libs/cpp-httplib-0.57.1/.github/workflows/test-32bit.yml new file mode 100644 index 0000000..45d3393 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/test-32bit.yml @@ -0,0 +1,37 @@ +name: 32-bit Build Test + +on: + push: + branches: [master] + pull_request: + branches: [master] + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref || github.run_id }} + cancel-in-progress: true + +jobs: + test-win32: + name: Windows 32-bit (MSVC x86) + runs-on: windows-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - name: Build (Win32) + shell: cmd + run: | + for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath`) do set VSDIR=%%i + call "%VSDIR%\VC\Auxiliary\Build\vcvarsall.bat" x86 || exit /b 1 + cl /std:c++14 /EHsc /W4 /WX /c /Fo:NUL test\test_32bit_build.cpp + + test-arm32: + name: ARM 32-bit (cross-compile) + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - name: Install cross compiler + run: sudo apt-get update && sudo apt-get install -y g++-arm-linux-gnueabihf + - name: Build (ARM 32-bit) + run: arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wextra -Wno-psabi -Werror -c -o /dev/null test/test_32bit_build.cpp diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/test.yaml new file mode 100644 index 0000000..ba7cc50 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/test.yaml @@ -0,0 +1,629 @@ +name: test + +on: + push: + pull_request: + workflow_dispatch: + inputs: + gtest_filter: + description: 'Google Test filter' + test_linux: + description: 'Test on Linux' + type: boolean + default: true + test_macos: + description: 'Test on MacOS' + type: boolean + default: true + test_windows: + description: 'Test on Windows' + type: boolean + default: true + +concurrency: + group: ${{ github.workflow }}-${{ github.ref || github.run_id }} + cancel-in-progress: true + +env: + # Exclude *_Online tests by default — they hit external services and flake on + # CI runners. Run with workflow_dispatch + a custom filter to include them. + GTEST_FILTER: ${{ github.event.inputs.gtest_filter || '-*_Online' }} + +jobs: + style-check: + # Uses the macOS runner's pre-installed Homebrew so clang-format tracks + # whatever version `brew install clang-format` currently resolves to on + # the maintainer's own Mac, instead of a version pinned in this file. + runs-on: macos-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + continue-on-error: true + steps: + - name: checkout + uses: actions/checkout@v4 + - name: install clang-format + run: | + brew update + brew install clang-format coreutils + - name: run style check + run: | + clang-format --version + cd test && make style_check + + build-and-test-on-32bit: + runs-on: ubuntu-latest + if: > + (github.event_name == 'push') || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') + strategy: + matrix: + config: + - arch_flags: -m32 + arch_suffix: :i386 + name: (32-bit) + steps: + - name: checkout + uses: actions/checkout@v4 + - name: install libraries + run: | + sudo dpkg --add-architecture i386 + sudo apt-get update + sudo apt-get install -y libc6-dev${{ matrix.config.arch_suffix }} libstdc++-13-dev${{ matrix.config.arch_suffix }} \ + libssl-dev${{ matrix.config.arch_suffix }} libcurl4-openssl-dev${{ matrix.config.arch_suffix }} \ + zlib1g-dev${{ matrix.config.arch_suffix }} libbrotli-dev${{ matrix.config.arch_suffix }} \ + libzstd-dev${{ matrix.config.arch_suffix }} + - name: build and run tests + run: cd test && make test EXTRA_CXXFLAGS="${{ matrix.config.arch_flags }}" + + ubuntu: + runs-on: ubuntu-latest + if: > + (github.event_name == 'push') || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') + strategy: + fail-fast: false + matrix: + tls_backend: [openssl, mbedtls, wolfssl] + name: ubuntu (${{ matrix.tls_backend }}) + steps: + - name: checkout + uses: actions/checkout@v4 + - name: install common libraries + run: | + sudo apt-get update + sudo apt-get install -y libcurl4-openssl-dev zlib1g-dev libbrotli-dev libzstd-dev + - name: install OpenSSL + if: matrix.tls_backend == 'openssl' + run: sudo apt-get install -y libssl-dev + - name: install Mbed TLS + if: matrix.tls_backend == 'mbedtls' + run: sudo apt-get install -y libmbedtls-dev + - name: install wolfSSL + if: matrix.tls_backend == 'wolfssl' + run: sudo apt-get install -y libwolfssl-dev + - name: build and run tests (OpenSSL) + if: matrix.tls_backend == 'openssl' + run: cd test && make test_split && make test_openssl_parallel + env: + LSAN_OPTIONS: suppressions=lsan_suppressions.txt + - name: build and run tests (Mbed TLS) + if: matrix.tls_backend == 'mbedtls' + run: cd test && make test_split_mbedtls && make test_mbedtls_parallel + - name: build and run tests (wolfSSL) + if: matrix.tls_backend == 'wolfssl' + run: cd test && make test_split_wolfssl && make test_wolfssl_parallel + - name: run fuzz test target + if: matrix.tls_backend == 'openssl' + run: cd test && make fuzz_test + - name: build and run WebSocket heartbeat test + if: matrix.tls_backend == 'openssl' + run: cd test && make test_websocket_heartbeat && ./test_websocket_heartbeat + - name: build and run WebSocket TLS thread safety test + if: matrix.tls_backend == 'openssl' + run: cd test && make test_websocket_thread_safety && ./test_websocket_thread_safety + - name: build and run ThreadPool test + run: cd test && make test_thread_pool && ./test_thread_pool + + # Ubuntu 26.04's apt ships Mbed TLS 3.6, giving 3.x coverage that + # ubuntu-latest (24.04 = 2.28) and macOS (Homebrew = 4.x) no longer provide. + # Uses the 26.04 public-preview image; fold into the main ubuntu matrix once + # ubuntu-latest moves to 26.04. + ubuntu-2604-mbedtls: + runs-on: ubuntu-26.04 + if: > + (github.event_name == 'push') || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') + name: ubuntu-26.04 (mbedtls 3.x) + steps: + - name: checkout + uses: actions/checkout@v4 + - name: install common libraries + run: | + sudo apt-get update + sudo apt-get install -y libcurl4-openssl-dev zlib1g-dev libbrotli-dev libzstd-dev + - name: install Mbed TLS + run: sudo apt-get install -y libmbedtls-dev + - name: build and run tests (Mbed TLS) + run: cd test && make test_split_mbedtls && make test_mbedtls_parallel + + # BoringSSL is Google's fork of OpenSSL. It has no API stability guarantee + # and is not packaged by distros, so we build it from source. cpp-httplib + # treats it as an OpenSSL backend variant via the OPENSSL_IS_BORINGSSL + # macro (see httplib.h). This job is best-effort: continue-on-error keeps + # upstream API drift from blocking PRs while still surfacing breakage. + ubuntu-boringssl: + runs-on: ubuntu-latest + if: > + (github.event_name == 'push') || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') + continue-on-error: true + name: ubuntu (boringssl, best-effort) + env: + # Tracking HEAD keeps us honest about upstream churn. If breakage + # becomes routine, replace HEAD with a 40-char commit SHA; the + # resolve step uses the SHA directly when it matches that shape. + BORINGSSL_REF: HEAD + BORINGSSL_PREFIX: ${{ github.workspace }}/boringssl-install + steps: + - name: checkout + uses: actions/checkout@v4 + - name: install common libraries + run: | + sudo apt-get update + sudo apt-get install -y libcurl4-openssl-dev zlib1g-dev libbrotli-dev libzstd-dev + - name: resolve BoringSSL commit + id: boringssl-rev + # Accept either a ref name (resolved via git ls-remote) or a full + # 40-char SHA used directly. ls-remote does not list arbitrary + # commit SHAs, so pinning requires the second path. + run: | + if [[ "${BORINGSSL_REF}" =~ ^[0-9a-f]{40}$ ]]; then + sha="${BORINGSSL_REF}" + echo "Using pinned BoringSSL SHA: ${sha}" + else + sha=$(git ls-remote https://boringssl.googlesource.com/boringssl "${BORINGSSL_REF}" | awk '{print $1}') + if [ -z "$sha" ]; then + echo "Failed to resolve BoringSSL ref ${BORINGSSL_REF}" >&2 + exit 1 + fi + echo "Resolved ${BORINGSSL_REF} -> ${sha}" + fi + echo "sha=${sha}" >> "$GITHUB_OUTPUT" + - name: cache BoringSSL build + id: boringssl-cache + uses: actions/cache@v4 + with: + path: ${{ env.BORINGSSL_PREFIX }} + key: boringssl-${{ runner.os }}-${{ steps.boringssl-rev.outputs.sha }} + - name: build BoringSSL + if: steps.boringssl-cache.outputs.cache-hit != 'true' + run: | + set -e + git clone https://boringssl.googlesource.com/boringssl boringssl + cd boringssl + git checkout "${{ steps.boringssl-rev.outputs.sha }}" + cmake -S . -B build \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_INSTALL_PREFIX="${BORINGSSL_PREFIX}" + cmake --build build -j"$(nproc)" --target install + - name: build and run tests (BoringSSL) + # Override OPENSSL_SUPPORT to point the existing OpenSSL Makefile path + # at BoringSSL's prefix. BoringSSL defines OPENSSL_IS_BORINGSSL in + # , which httplib.h and test.cc use to switch on API + # differences (e.g. SAN-only hostname verification, no CN fallback). + # + # BoringSSL's public headers () use std::enable_if_t, + # so consumers must compile with C++14 or later. cpp-httplib itself + # supports C++11, but anyone pairing it with BoringSSL inherits this + # constraint. EXTRA_CXXFLAGS appends after the Makefile's -std=c++11 + # and the later flag wins. + run: | + cd test + BORINGSSL_FLAGS="-DCPPHTTPLIB_OPENSSL_SUPPORT -I${BORINGSSL_PREFIX}/include -L${BORINGSSL_PREFIX}/lib -lssl -lcrypto -lpthread" + make test_split OPENSSL_SUPPORT="${BORINGSSL_FLAGS}" EXTRA_CXXFLAGS="-std=c++17" + make test_openssl_parallel OPENSSL_SUPPORT="${BORINGSSL_FLAGS}" EXTRA_CXXFLAGS="-std=c++17" + env: + LSAN_OPTIONS: suppressions=lsan_suppressions.txt + + # macOS counterpart of the BoringSSL job. Same best-effort posture; the + # extra framework links cover the macOS Keychain integration that + # httplib.h auto-enables for any TLS backend on macOS. + macos-boringssl: + runs-on: macos-latest + if: > + (github.event_name == 'push') || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.test_macos == 'true') + continue-on-error: true + name: macos (boringssl, best-effort) + env: + BORINGSSL_REF: HEAD + BORINGSSL_PREFIX: ${{ github.workspace }}/boringssl-install + steps: + - name: checkout + uses: actions/checkout@v4 + - name: resolve BoringSSL commit + id: boringssl-rev + # Accept either a ref name (resolved via git ls-remote) or a full + # 40-char SHA used directly. ls-remote does not list arbitrary + # commit SHAs, so pinning requires the second path. + run: | + if [[ "${BORINGSSL_REF}" =~ ^[0-9a-f]{40}$ ]]; then + sha="${BORINGSSL_REF}" + echo "Using pinned BoringSSL SHA: ${sha}" + else + sha=$(git ls-remote https://boringssl.googlesource.com/boringssl "${BORINGSSL_REF}" | awk '{print $1}') + if [ -z "$sha" ]; then + echo "Failed to resolve BoringSSL ref ${BORINGSSL_REF}" >&2 + exit 1 + fi + echo "Resolved ${BORINGSSL_REF} -> ${sha}" + fi + echo "sha=${sha}" >> "$GITHUB_OUTPUT" + - name: cache BoringSSL build + id: boringssl-cache + uses: actions/cache@v4 + with: + path: ${{ env.BORINGSSL_PREFIX }} + key: boringssl-${{ runner.os }}-${{ steps.boringssl-rev.outputs.sha }} + - name: build BoringSSL + if: steps.boringssl-cache.outputs.cache-hit != 'true' + run: | + set -e + git clone https://boringssl.googlesource.com/boringssl boringssl + cd boringssl + git checkout "${{ steps.boringssl-rev.outputs.sha }}" + cmake -S . -B build \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_INSTALL_PREFIX="${BORINGSSL_PREFIX}" + cmake --build build -j"$(sysctl -n hw.ncpu)" --target install + - name: build and run tests (BoringSSL) + run: | + cd test + # CoreFoundation/Security frameworks satisfy the Keychain integration + # auto-enabled in httplib.h for macOS TLS builds. + BORINGSSL_FLAGS="-DCPPHTTPLIB_OPENSSL_SUPPORT -I${BORINGSSL_PREFIX}/include -L${BORINGSSL_PREFIX}/lib -lssl -lcrypto -framework CoreFoundation -framework Security" + make test_split OPENSSL_SUPPORT="${BORINGSSL_FLAGS}" EXTRA_CXXFLAGS="-std=c++17" + make test_openssl_parallel OPENSSL_SUPPORT="${BORINGSSL_FLAGS}" EXTRA_CXXFLAGS="-std=c++17" + env: + LSAN_OPTIONS: suppressions=lsan_suppressions.txt + + # Reproducer for https://github.com/yhirose/cpp-httplib/issues/2431. + # On Linux/glibc, getaddrinfo_with_timeout() schedules an asynchronous + # DNS lookup with getaddrinfo_a(GAI_NOWAIT) using a stack-local gaicb. + # When gai_suspend() hits the connection timeout, gai_cancel() is called + # but does not block; the resolver worker can later write back into the + # destroyed stack frame. To make the worker actually reach that write, + # the test job runs a loopback UDP responder (test/dns_test_fixture.py) + # that delays its reply past the test's 1s timeout, and uses an iptables + # NAT rule so glibc's lookups land on that fixture instead of a real + # nameserver. With ASAN's detect_stack_use_after_return enabled, the + # late write-back is reported as a stack-use-after-return. + issue-2431-repro: + runs-on: ubuntu-latest + if: > + (github.event_name == 'push') || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') + name: issue-2431 repro (Linux + ASAN) + # Bound the whole job in case anything in the test harness hangs + # unexpectedly. With the fixture in place a normal run is well under + # a minute either way (ASAN abort on broken HEAD, clean pass on fix). + timeout-minutes: 5 + env: + DNS_FIXTURE_PORT: "15353" + DNS_FIXTURE_DELAY: "3" + steps: + - name: checkout + uses: actions/checkout@v4 + - name: install libraries + run: | + sudo apt-get update + sudo apt-get install -y libssl-dev zlib1g-dev libbrotli-dev \ + libzstd-dev libcurl4-openssl-dev iptables util-linux iproute2 + - name: start loopback DNS test fixture + run: | + # Force glibc through its DNS code path: Ubuntu's default + # nsswitch short-circuits to NOTFOUND through mdns4_minimal, + # which would skip the buggy code entirely. + sudo sed -i 's/^hosts:.*/hosts: dns/' /etc/nsswitch.conf + # Run the loopback fixture (delayed UDP responder). + python3 test/dns_test_fixture.py "$DNS_FIXTURE_PORT" "$DNS_FIXTURE_DELAY" \ + >/tmp/dns_fixture.log 2>&1 & + echo $! | sudo tee /tmp/dns_fixture.pid >/dev/null + # Wait for the fixture to start listening. + for _ in $(seq 1 50); do + if ss -lun "( sport = :$DNS_FIXTURE_PORT )" | grep -q ":$DNS_FIXTURE_PORT"; then + break + fi + sleep 0.1 + done + ss -lun "( sport = :$DNS_FIXTURE_PORT )" | grep -q ":$DNS_FIXTURE_PORT" \ + || { echo "fixture failed to start"; cat /tmp/dns_fixture.log; exit 1; } + # Send the test process's DNS lookups to the loopback fixture. + # NAT only the local OUTPUT chain; conntrack handles the reply path. + sudo iptables -t nat -I OUTPUT -p udp --dport 53 \ + -j REDIRECT --to-port "$DNS_FIXTURE_PORT" + # Sanity check: a query must take at least the fixture delay + # and resolve to NXDOMAIN (proving traffic reaches the fixture). + start=$(date +%s) + getent hosts unresolvable-host.invalid >/dev/null 2>&1 || true + elapsed=$(( $(date +%s) - start )) + if [ "$elapsed" -lt 2 ]; then + echo "ERROR: lookup returned in ${elapsed}s; fixture not in path" >&2 + exit 1 + fi + echo "[ok] DNS lookups are routed to the test fixture (took ${elapsed}s)" + - name: build test binary + run: cd test && make test + - name: run GetAddrInfoAsyncCancelTest + run: | + cd test + ARCH=$(uname -m) + CPPHTTPLIB_TEST_ISSUE_2431=1 \ + ASAN_OPTIONS=detect_stack_use_after_return=1 \ + LSAN_OPTIONS=suppressions=lsan_suppressions.txt \ + setarch "$ARCH" -R \ + ./test --gtest_filter='GetAddrInfoAsyncCancelTest.*' + - name: tear down test fixture + if: always() + run: | + sudo iptables -t nat -F OUTPUT || true + if [ -f /tmp/dns_fixture.pid ]; then + sudo kill "$(cat /tmp/dns_fixture.pid)" 2>/dev/null || true + fi + + macos: + runs-on: macos-latest + if: > + (github.event_name == 'push') || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.test_macos == 'true') + strategy: + fail-fast: false + matrix: + tls_backend: [openssl, mbedtls, wolfssl] + name: macos (${{ matrix.tls_backend }}) + steps: + - name: checkout + uses: actions/checkout@v4 + - name: install Mbed TLS + if: matrix.tls_backend == 'mbedtls' + run: brew install mbedtls + - name: install wolfSSL + if: matrix.tls_backend == 'wolfssl' + run: brew install wolfssl + - name: build and run tests (OpenSSL) + if: matrix.tls_backend == 'openssl' + run: cd test && make test_split && make test_openssl_parallel + env: + LSAN_OPTIONS: suppressions=lsan_suppressions.txt + - name: build and run tests (Mbed TLS) + if: matrix.tls_backend == 'mbedtls' + run: cd test && make test_split_mbedtls && make test_mbedtls_parallel + - name: build and run tests (wolfSSL) + if: matrix.tls_backend == 'wolfssl' + run: cd test && make test_split_wolfssl && make test_wolfssl_parallel + - name: run fuzz test target + if: matrix.tls_backend == 'openssl' + run: cd test && make fuzz_test + - name: build and run WebSocket heartbeat test + if: matrix.tls_backend == 'openssl' + run: cd test && make test_websocket_heartbeat && ./test_websocket_heartbeat + - name: build and run WebSocket TLS thread safety test + if: matrix.tls_backend == 'openssl' + run: cd test && make test_websocket_thread_safety && ./test_websocket_thread_safety + - name: build and run ThreadPool test + run: cd test && make test_thread_pool && ./test_thread_pool + + ios-parse-check: + runs-on: macos-latest + if: > + (github.event_name == 'push') || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.test_macos == 'true') + name: ios header parse check (not officially supported) + steps: + - name: checkout + uses: actions/checkout@v4 + - name: install OpenSSL headers + run: brew install openssl@3 + - name: verify header parses on iOS target + run: | + IOS_SDK=$(xcrun --sdk iphoneos --show-sdk-path) + OPENSSL_INC=$(brew --prefix openssl@3)/include + echo "Using iOS SDK: $IOS_SDK" + echo '#include "httplib.h"' | clang++ \ + -isysroot "$IOS_SDK" \ + -target arm64-apple-ios16.0 \ + -std=c++11 \ + -DCPPHTTPLIB_OPENSSL_SUPPORT \ + -I"$OPENSSL_INC" \ + -I. -Wall -Wextra \ + -fsyntax-only -x c++ - + - name: verify CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN is rejected on iOS + run: | + IOS_SDK=$(xcrun --sdk iphoneos --show-sdk-path) + OPENSSL_INC=$(brew --prefix openssl@3)/include + out=$(echo '#include "httplib.h"' | clang++ \ + -isysroot "$IOS_SDK" \ + -target arm64-apple-ios16.0 \ + -std=c++11 \ + -DCPPHTTPLIB_OPENSSL_SUPPORT \ + -DCPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN \ + -I"$OPENSSL_INC" \ + -I. \ + -fsyntax-only -x c++ - 2>&1 || true) + if echo "$out" | grep -q "only supported on macOS"; then + echo "OK: #error fired as expected" + else + echo "FAIL: expected #error did not fire" + echo "--- compiler output ---" + echo "$out" + exit 1 + fi + + windows: + runs-on: windows-latest + permissions: + contents: read + if: > + (github.event_name == 'push') || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.test_windows == 'true') + strategy: + fail-fast: false + matrix: + config: + - with_ssl: false + compiled: false + run_tests: true + name: without SSL + - with_ssl: true + compiled: false + run_tests: true + name: with SSL + - with_ssl: false + compiled: true + run_tests: false + name: compiled + name: windows ${{ matrix.config.name }} + steps: + - name: Prepare Git for Checkout on Windows + run: | + git config --global core.autocrlf false + git config --global core.eol lf + - name: Checkout + uses: actions/checkout@v4 + - name: Export GitHub Actions cache environment variables + uses: actions/github-script@v7 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + - name: Setup msbuild on windows + uses: microsoft/setup-msbuild@v2 + - name: Cache vcpkg packages + id: vcpkg-cache + uses: actions/cache@v4 + with: + path: C:/vcpkg/installed + key: vcpkg-installed-windows-gtest-curl-zlib-brotli-zstd + - name: Install vcpkg dependencies + if: steps.vcpkg-cache.outputs.cache-hit != 'true' + run: vcpkg install gtest curl zlib brotli zstd + - name: Install OpenSSL + if: ${{ matrix.config.with_ssl }} + shell: pwsh + run: | + # Chocolatey's openssl package hardcodes a versioned slproweb URL, and + # slproweb keeps only the newest build of each branch. The package + # therefore 404s on every OpenSSL release until someone respins it. + # Read slproweb's own manifest instead: it is updated at the same time + # as the downloads it points at, so the URL is always live. + $ErrorActionPreference = 'Stop' + $ProgressPreference = 'SilentlyContinue' # Invoke-WebRequest is slow with it + + $manifest = 'https://raw.githubusercontent.com/slproweb/opensslhashes/master/win32_openssl_hashes.json' + $entry = (Invoke-RestMethod $manifest).files.PSObject.Properties.Value | + Where-Object { + $_.bits -eq 64 -and $_.arch -eq 'INTEL' -and + -not $_.light -and $_.installer -eq 'exe' -and $_.basever -like '4.*' + } | + Sort-Object { [version]$_.basever } | Select-Object -Last 1 + if (-not $entry) { throw 'No 64-bit OpenSSL 4.x installer found in the manifest' } + Write-Host "Installing OpenSSL $($entry.basever) from $($entry.url)" + + $installer = Join-Path $env:RUNNER_TEMP 'Win64OpenSSL.exe' + Invoke-WebRequest $entry.url -OutFile $installer + $actual = (Get-FileHash $installer -Algorithm SHA512).Hash.ToLower() + if ($actual -ne $entry.sha512.ToLower()) { + throw "SHA512 mismatch: expected $($entry.sha512), got $actual" + } + + # Same silent flags the Chocolatey package used. The installer is Inno + # Setup, so /DIR pins the location CMake already looks in. The inner + # quotes matter: ArgumentList joins on spaces, so an unquoted /DIR + # would install to C:\Program and only fail later, at load time. + $dir = 'C:\Program Files\OpenSSL' + $proc = Start-Process $installer -Wait -PassThru -ArgumentList ` + '/VERYSILENT', '/SUPPRESSMSGBOXES', '/NORESTART', '/SP-', "/DIR=`"$dir`"" + if ($proc.ExitCode -ne 0) { throw "Installer exited with $($proc.ExitCode)" } + + # Catch a misplaced install here rather than at link or load time. + if (-not (Test-Path "$dir\lib\VC\x64\MD\libcrypto.lib")) { + throw "OpenSSL import libraries missing under $dir" + } + if (-not (Get-ChildItem "$dir\bin\libcrypto-*.dll" -ErrorAction SilentlyContinue)) { + throw "OpenSSL runtime DLLs missing under $dir\bin" + } + + "$dir\bin" | Out-File $env:GITHUB_PATH -Append -Encoding utf8 + "OPENSSL_CONF=$dir\bin\openssl.cfg" | Out-File $env:GITHUB_ENV -Append -Encoding utf8 + - name: Configure CMake ${{ matrix.config.name }} + run: > + cmake -B build -S . + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake + -DHTTPLIB_TEST=ON + -DHTTPLIB_COMPILE=${{ matrix.config.compiled && 'ON' || 'OFF' }} + -DHTTPLIB_USE_OPENSSL_IF_AVAILABLE=${{ matrix.config.with_ssl && 'ON' || 'OFF' }} + -DHTTPLIB_REQUIRE_ZLIB=ON + -DHTTPLIB_REQUIRE_BROTLI=ON + -DHTTPLIB_REQUIRE_ZSTD=ON + -DHTTPLIB_REQUIRE_OPENSSL=${{ matrix.config.with_ssl && 'ON' || 'OFF' }} + - name: Build ${{ matrix.config.name }} + run: cmake --build build --config Release -- /v:m /clp:ShowCommandLine + - name: Run tests ${{ matrix.config.name }} + if: ${{ matrix.config.run_tests }} + shell: pwsh + working-directory: build/test + run: | + $shards = 4 + $procs = @() + for ($i = 0; $i -lt $shards; $i++) { + $log = "shard_${i}.log" + $procs += Start-Process -FilePath ./Release/httplib-test.exe ` + -ArgumentList "--gtest_color=yes","--gtest_filter=${{ github.event.inputs.gtest_filter || '-*_Online' }}" ` + -NoNewWindow -PassThru -RedirectStandardOutput $log -RedirectStandardError "${log}.err" ` + -Environment @{ GTEST_TOTAL_SHARDS="$shards"; GTEST_SHARD_INDEX="$i" } + } + $procs | Wait-Process + $failed = $false + for ($i = 0; $i -lt $shards; $i++) { + $log = "shard_${i}.log" + $proc = $procs[$i] + $hasPassed = Select-String -Path $log -Pattern "\[ PASSED \]" -Quiet + $hasFailed = Select-String -Path $log -Pattern "\[ FAILED \]" -Quiet + if ($hasPassed -and -not $hasFailed -and $proc.ExitCode -eq 0) { + $passed = (Select-String -Path $log -Pattern "\[ PASSED \]").Line + Write-Host "Shard ${i}: $passed" + } else { + Write-Host "=== Shard $i FAILED (exit=$($proc.ExitCode)) ===" + Get-Content $log + if (Test-Path "${log}.err") { Get-Content "${log}.err" } + $failed = $true + } + } + if ($failed) { exit 1 } + Write-Host "All shards passed." + + env: + VCPKG_ROOT: "C:/vcpkg" + VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test_benchmark.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/test_benchmark.yaml new file mode 100644 index 0000000..e2c0b01 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/test_benchmark.yaml @@ -0,0 +1,79 @@ +name: benchmark + +on: + push: + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref || github.run_id }} + cancel-in-progress: true + +jobs: + ubuntu: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + steps: + - name: checkout + uses: actions/checkout@v4 + - name: build and run + run: cd test && make test_benchmark && ./test_benchmark + + macos: + runs-on: macos-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + steps: + - name: checkout + uses: actions/checkout@v4 + - name: build and run + run: cd test && make test_benchmark && ./test_benchmark + + windows: + runs-on: windows-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + steps: + - name: Prepare Git for Checkout on Windows + run: | + git config --global core.autocrlf false + git config --global core.eol lf + - name: checkout + uses: actions/checkout@v4 + - name: Export GitHub Actions cache environment variables + uses: actions/github-script@v7 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + - name: Cache vcpkg packages + id: vcpkg-cache + uses: actions/cache@v4 + with: + path: C:/vcpkg/installed + key: vcpkg-installed-windows-gtest + - name: Install vcpkg dependencies + if: steps.vcpkg-cache.outputs.cache-hit != 'true' + run: vcpkg install gtest + - name: Configure and build + shell: pwsh + run: | + $cmake_content = @" + cmake_minimum_required(VERSION 3.14) + project(httplib-benchmark CXX) + find_package(GTest REQUIRED) + add_executable(httplib-benchmark test/test_benchmark.cc) + target_include_directories(httplib-benchmark PRIVATE .) + target_link_libraries(httplib-benchmark PRIVATE GTest::gtest_main) + target_compile_options(httplib-benchmark PRIVATE "$<$:/utf-8>") + "@ + New-Item -ItemType Directory -Force -Path build_bench/test | Out-Null + Set-Content -Path build_bench/CMakeLists.txt -Value $cmake_content + Copy-Item -Path httplib.h -Destination build_bench/ + Copy-Item -Path test/test_benchmark.cc -Destination build_bench/test/ + cmake -B build_bench/build -S build_bench ` + -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake" + cmake --build build_bench/build --config Release + - name: Run with retry + run: ctest --output-on-failure --test-dir build_bench/build -C Release --repeat until-pass:5 + env: + VCPKG_ROOT: "C:/vcpkg" + VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test_no_exceptions.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/test_no_exceptions.yaml new file mode 100644 index 0000000..f525297 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/test_no_exceptions.yaml @@ -0,0 +1,20 @@ +name: No Exceptions Test + +on: [push, pull_request] + +jobs: + test-no-exceptions: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + + steps: + - uses: actions/checkout@v3 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y build-essential libssl-dev zlib1g-dev libcurl4-openssl-dev libbrotli-dev libzstd-dev + + - name: Run tests with CPPHTTPLIB_NO_EXCEPTIONS + run: | + cd test && make test_split EXTRA_CXXFLAGS="-fno-exceptions -DCPPHTTPLIB_NO_EXCEPTIONS" && make test_openssl_parallel EXTRA_CXXFLAGS="-fno-exceptions -DCPPHTTPLIB_NO_EXCEPTIONS" diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test_offline.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/test_offline.yaml new file mode 100644 index 0000000..42c4495 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/test_offline.yaml @@ -0,0 +1,62 @@ +name: test_offline + +on: + push: + pull_request: + workflow_dispatch: + inputs: + test_linux: + description: 'Test on Linux' + type: boolean + default: true + +concurrency: + group: ${{ github.workflow }}-${{ github.ref || github.run_id }} + cancel-in-progress: true + +env: + GTEST_FILTER: "-*.*_Online" + +jobs: + ubuntu: + runs-on: ubuntu-latest + if: > + (github.event_name == 'push') || + (github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.test_linux == 'true') + strategy: + matrix: + tls_backend: [openssl, no-tls] + name: ubuntu (${{ matrix.tls_backend }}) + steps: + - name: checkout + uses: actions/checkout@v4 + - name: install common libraries + run: | + sudo apt-get update + sudo apt-get install -y libcurl4-openssl-dev zlib1g-dev libbrotli-dev libzstd-dev + - name: install OpenSSL + if: matrix.tls_backend == 'openssl' + run: sudo apt-get install -y libssl-dev + - name: disable network + run: | + sudo iptables -A OUTPUT -o lo -j ACCEPT + sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT + sudo iptables -A OUTPUT -j REJECT + sudo ip6tables -A OUTPUT -o lo -j ACCEPT + sudo ip6tables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT + sudo ip6tables -A OUTPUT -j REJECT + - name: build and run tests (OpenSSL) + if: matrix.tls_backend == 'openssl' + run: cd test && make test_split && make test_openssl_parallel + env: + LSAN_OPTIONS: suppressions=lsan_suppressions.txt + - name: build and run tests (No TLS) + if: matrix.tls_backend == 'no-tls' + run: cd test && make test_no_tls_parallel + - name: restore network + if: always() + run: | + sudo iptables -F OUTPUT + sudo ip6tables -F OUTPUT diff --git a/libs/cpp-httplib-0.57.1/.github/workflows/test_proxy.yaml b/libs/cpp-httplib-0.57.1/.github/workflows/test_proxy.yaml new file mode 100644 index 0000000..cf09432 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/.github/workflows/test_proxy.yaml @@ -0,0 +1,37 @@ +name: Proxy Test + +on: [push, pull_request] + +jobs: + test-proxy: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + strategy: + matrix: + tls_backend: [openssl, mbedtls] + name: proxy (${{ matrix.tls_backend }}) + + steps: + - uses: actions/checkout@v4 + + - name: Install common dependencies + run: | + sudo apt-get update + sudo apt-get install -y build-essential zlib1g-dev libcurl4-openssl-dev libbrotli-dev libzstd-dev netcat-openbsd + - name: Install OpenSSL + if: matrix.tls_backend == 'openssl' + run: sudo apt-get install -y libssl-dev + - name: Install Mbed TLS + if: matrix.tls_backend == 'mbedtls' + run: sudo apt-get install -y libmbedtls-dev + + - name: Run proxy tests (OpenSSL) + if: matrix.tls_backend == 'openssl' + run: cd test && make proxy + env: + COMPOSE_FILE: docker-compose.yml:docker-compose.ci.yml + - name: Run proxy tests (Mbed TLS) + if: matrix.tls_backend == 'mbedtls' + run: cd test && make proxy_mbedtls + env: + COMPOSE_FILE: docker-compose.yml:docker-compose.ci.yml \ No newline at end of file diff --git a/libs/cpp-httplib-0.57.1/CMakeLists.txt b/libs/cpp-httplib-0.57.1/CMakeLists.txt new file mode 100644 index 0000000..d3d8c29 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/CMakeLists.txt @@ -0,0 +1,470 @@ +#[[ + Build options: + * Standard BUILD_SHARED_LIBS is supported and sets HTTPLIB_SHARED default value. + * HTTPLIB_USE_OPENSSL_IF_AVAILABLE (default on) + * HTTPLIB_USE_WOLFSSL_IF_AVAILABLE (default off) + * HTTPLIB_USE_MBEDTLS_IF_AVAILABLE (default off) + * HTTPLIB_USE_ZLIB_IF_AVAILABLE (default on) + * HTTPLIB_USE_BROTLI_IF_AVAILABLE (default on) + * HTTPLIB_USE_ZSTD_IF_AVAILABLE (default on) + * HTTPLIB_BUILD_MODULES (default off) + * HTTPLIB_REQUIRE_OPENSSL (default off) + * HTTPLIB_REQUIRE_WOLFSSL (default off) + * HTTPLIB_REQUIRE_MBEDTLS (default off) + * HTTPLIB_REQUIRE_ZLIB (default off) + * HTTPLIB_REQUIRE_BROTLI (default off) + * HTTPLIB_REQUIRE_ZSTD (default off) + * HTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES (default off) + * HTTPLIB_USE_NON_BLOCKING_GETADDRINFO (default on) + * HTTPLIB_COMPILE (default off) + * HTTPLIB_INSTALL (default on) + * HTTPLIB_SHARED (default off) builds as a shared library (if HTTPLIB_COMPILE is ON) + * HTTPLIB_TEST (default off) + * BROTLI_USE_STATIC_LIBS - tells Cmake to use the static Brotli libs (only works if you have them installed). + * OPENSSL_USE_STATIC_LIBS - tells Cmake to use the static OpenSSL libs (only works if you have them installed). + + ------------------------------------------------------------------------------- + + After installation with Cmake, a find_package(httplib COMPONENTS OpenSSL wolfssl MbedTLS ZLIB Brotli zstd) is available. + This creates a httplib::httplib target (if found and if listed components are supported). + It can be linked like so: + + target_link_libraries(your_exe httplib::httplib) + + The following will build & install for later use. + + Linux/macOS: + + mkdir -p build + cd build + cmake -DCMAKE_BUILD_TYPE=Release .. + sudo cmake --build . --target install + + Windows: + + mkdir build + cd build + cmake .. + runas /user:Administrator "cmake --build . --config Release --target install" + + ------------------------------------------------------------------------------- + + These variables are available after you run find_package(httplib) + * HTTPLIB_HEADER_PATH - this is the full path to the installed header (e.g. /usr/include/httplib.h). + * HTTPLIB_IS_USING_OPENSSL - a bool for if OpenSSL support is enabled. + * HTTPLIB_IS_USING_WOLFSSL - a bool for if wolfSSL support is enabled. + * HTTPLIB_IS_USING_MBEDTLS - a bool for if MbedTLS support is enabled. + * HTTPLIB_IS_USING_ZLIB - a bool for if ZLIB support is enabled. + * HTTPLIB_IS_USING_BROTLI - a bool for if Brotli support is enabled. + * HTTPLIB_IS_USING_ZSTD - a bool for if ZSTD support is enabled. + * HTTPLIB_IS_USING_MACOSX_AUTOMATIC_ROOT_CERTIFICATES - a bool for if support of loading system certs from the Apple Keychain is enabled. + * HTTPLIB_IS_USING_NON_BLOCKING_GETADDRINFO - a bool for if nonblocking getaddrinfo is enabled. + * HTTPLIB_IS_COMPILED - a bool for if the library is compiled, or otherwise header-only. + * HTTPLIB_INCLUDE_DIR - the root path to httplib's header (e.g. /usr/include). + * HTTPLIB_LIBRARY - the full path to the library if compiled (e.g. /usr/lib/libhttplib.so). + * httplib_VERSION or HTTPLIB_VERSION - the project's version string. + * HTTPLIB_FOUND - a bool for if the target was found. + + Want to use precompiled headers (Cmake feature since v3.16)? + It's as simple as doing the following (before linking): + + target_precompile_headers(httplib::httplib INTERFACE "${HTTPLIB_HEADER_PATH}") + + ------------------------------------------------------------------------------- + + ARCH_INDEPENDENT option of write_basic_package_version_file() requires Cmake v3.14 +]] +cmake_minimum_required(VERSION 3.14.0 FATAL_ERROR) + +# Get the CPPHTTPLIB_VERSION value and use it as a version +# This gets the string with the CPPHTTPLIB_VERSION value from the header. +# This is so the maintainer doesn't actually need to update this manually. +file(STRINGS httplib.h _raw_version_string REGEX "CPPHTTPLIB_VERSION \"([0-9]+\\.[0-9]+\\.[0-9]+)\"") + +# Extracts just the version string itself from the whole string contained in _raw_version_string +# since _raw_version_string would contain the entire line of code where it found the version string +string(REGEX MATCH "([0-9]+\\.?)+" _httplib_version "${_raw_version_string}") + +project(httplib + VERSION ${_httplib_version} + LANGUAGES CXX + DESCRIPTION "A C++ header-only HTTP/HTTPS server and client library." + HOMEPAGE_URL "https://github.com/yhirose/cpp-httplib" +) + +# Change as needed to set an OpenSSL minimum version. +# This is used in the installed Cmake config file. +set(_HTTPLIB_OPENSSL_MIN_VER "3.0.0") + +# Lets you disable C++ exception during CMake configure time. +# The value is used in the install CMake config file. +option(HTTPLIB_NO_EXCEPTIONS "Disable the use of C++ exceptions" OFF) +# Allow for a build to require OpenSSL to pass, instead of just being optional +option(HTTPLIB_REQUIRE_OPENSSL "Requires OpenSSL to be found & linked, or fails build." OFF) +option(HTTPLIB_REQUIRE_WOLFSSL "Requires wolfSSL to be found & linked, or fails build." OFF) +option(HTTPLIB_REQUIRE_MBEDTLS "Requires MbedTLS to be found & linked, or fails build." OFF) +option(HTTPLIB_REQUIRE_ZLIB "Requires ZLIB to be found & linked, or fails build." OFF) +# Allow for a build to casually enable OpenSSL/ZLIB support, but silently continue if not found. +# Make these options so their automatic use can be specifically disabled (as needed) +option(HTTPLIB_USE_OPENSSL_IF_AVAILABLE "Uses OpenSSL (if available) to enable HTTPS support." ON) +option(HTTPLIB_USE_WOLFSSL_IF_AVAILABLE "Uses wolfSSL (if available) to enable HTTPS support." OFF) +option(HTTPLIB_USE_MBEDTLS_IF_AVAILABLE "Uses MbedTLS (if available) to enable HTTPS support." OFF) +option(HTTPLIB_USE_ZLIB_IF_AVAILABLE "Uses ZLIB (if available) to enable Zlib compression support." ON) +# Lets you compile the program as a regular library instead of header-only +option(HTTPLIB_COMPILE "If ON, uses a Python script to split the header into a compilable header & source file (requires Python v3)." OFF) +# Lets you disable the installation (useful when fetched from another CMake project) +option(HTTPLIB_INSTALL "Enables the installation target" ON) +option(HTTPLIB_TEST "Enables testing and builds tests" OFF) +option(HTTPLIB_REQUIRE_BROTLI "Requires Brotli to be found & linked, or fails build." OFF) +option(HTTPLIB_USE_BROTLI_IF_AVAILABLE "Uses Brotli (if available) to enable Brotli decompression support." ON) +option(HTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES "Disable loading system certs from the Apple Keychain on macOS." OFF) +option(HTTPLIB_USE_NON_BLOCKING_GETADDRINFO "Enables the non-blocking alternatives for getaddrinfo." ON) +option(HTTPLIB_REQUIRE_ZSTD "Requires ZSTD to be found & linked, or fails build." OFF) +option(HTTPLIB_USE_ZSTD_IF_AVAILABLE "Uses ZSTD (if available) to enable zstd support." ON) +# C++20 modules support requires CMake 3.28 or later +if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.28") + option(HTTPLIB_BUILD_MODULES "Build httplib modules (requires HTTPLIB_COMPILE to be ON)." OFF) +else() + set(HTTPLIB_BUILD_MODULES OFF CACHE INTERNAL "Build httplib modules disabled (requires CMake 3.28+)" FORCE) + if(DEFINED CACHE{HTTPLIB_BUILD_MODULES} AND HTTPLIB_BUILD_MODULES) + message(WARNING "HTTPLIB_BUILD_MODULES requires CMake 3.28 or later. Current version is ${CMAKE_VERSION}. Modules support has been disabled.") + endif() +endif() + +# Incompatibility between TLS libraries +set(TLS_LIBRARIES_USED_TMP 0) + +foreach(tls_library OPENSSL WOLFSSL MBEDTLS) + set(TLS_REQUIRED ${HTTPLIB_REQUIRE_${tls_library}}) + set(TLS_IF_AVAILABLE ${HTTPLIB_USE_${tls_library}_IF_AVAILABLE}) + + if(TLS_REQUIRED OR TLS_IF_AVAILABLE) + math(EXPR TLS_LIBRARIES_USED_TMP "${TLS_LIBRARIES_USED_TMP} + 1") + endif() +endforeach() + +if(TLS_LIBRARIES_USED_TMP GREATER 1) + message(FATAL_ERROR "TLS libraries are mutually exclusive.") +endif() + +# Defaults to static library but respects standard BUILD_SHARED_LIBS if set +include(CMakeDependentOption) +cmake_dependent_option(HTTPLIB_SHARED "Build the library as a shared library instead of static. Has no effect if using header-only." + "${BUILD_SHARED_LIBS}" HTTPLIB_COMPILE OFF +) +if(HTTPLIB_SHARED) + set(HTTPLIB_LIB_TYPE SHARED) + if(WIN32) + # Necessary for Windows if building shared libs + # See https://stackoverflow.com/a/40743080 + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) + endif() +else() + set(HTTPLIB_LIB_TYPE STATIC) +endif() + +if(CMAKE_SYSTEM_NAME MATCHES "Windows") + if(CMAKE_SYSTEM_VERSION) + if(${CMAKE_SYSTEM_VERSION} VERSION_LESS "10.0.0") + message(WARNING "Windows ${CMAKE_SYSTEM_VERSION} or lower is not supported. Please use Windows 10 or later.") + endif() + else() + set(CMAKE_SYSTEM_VERSION "10.0.19041.0") + message(WARNING "The target is Windows but CMAKE_SYSTEM_VERSION is not set, the default system version is set to Windows 10.") + endif() +endif() + +# Set some variables that are used in-tree and while building based on our options +set(HTTPLIB_IS_COMPILED ${HTTPLIB_COMPILE}) +set(HTTPLIB_IS_USING_MACOSX_AUTOMATIC_ROOT_CERTIFICATES TRUE) +if(HTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES) + set(HTTPLIB_IS_USING_MACOSX_AUTOMATIC_ROOT_CERTIFICATES FALSE) +endif() +set(HTTPLIB_IS_USING_NON_BLOCKING_GETADDRINFO ${HTTPLIB_USE_NON_BLOCKING_GETADDRINFO}) + +# Threads needed for on some systems, and for on Linux +set(THREADS_PREFER_PTHREAD_FLAG TRUE) +find_package(Threads REQUIRED) +# Since Cmake v3.11, Crypto & SSL became optional when not specified as COMPONENTS. +if(HTTPLIB_REQUIRE_OPENSSL) + find_package(OpenSSL ${_HTTPLIB_OPENSSL_MIN_VER} COMPONENTS Crypto SSL REQUIRED) + set(HTTPLIB_IS_USING_OPENSSL TRUE) +elseif(HTTPLIB_USE_OPENSSL_IF_AVAILABLE) + find_package(OpenSSL ${_HTTPLIB_OPENSSL_MIN_VER} COMPONENTS Crypto SSL QUIET) + # Avoid a rare circumstance of not finding all components but the end-user did their + # own call for OpenSSL, which might trick us into thinking we'd otherwise have what we wanted + if (TARGET OpenSSL::SSL AND TARGET OpenSSL::Crypto) + set(HTTPLIB_IS_USING_OPENSSL ${OPENSSL_FOUND}) + else() + set(HTTPLIB_IS_USING_OPENSSL FALSE) + endif() +endif() + +if(HTTPLIB_REQUIRE_WOLFSSL) + find_package(wolfssl REQUIRED) + set(HTTPLIB_IS_USING_WOLFSSL TRUE) +elseif(HTTPLIB_USE_WOLFSSL_IF_AVAILABLE) + find_package(wolfssl QUIET) + set(HTTPLIB_IS_USING_WOLFSSL ${wolfssl_FOUND}) +endif() + +if(HTTPLIB_REQUIRE_MBEDTLS) + find_package(MbedTLS REQUIRED) + set(HTTPLIB_IS_USING_MBEDTLS TRUE) +elseif(HTTPLIB_USE_MBEDTLS_IF_AVAILABLE) + find_package(MbedTLS QUIET) + set(HTTPLIB_IS_USING_MBEDTLS ${MbedTLS_FOUND}) +endif() + +if(HTTPLIB_REQUIRE_ZLIB) + find_package(ZLIB REQUIRED) + set(HTTPLIB_IS_USING_ZLIB TRUE) +elseif(HTTPLIB_USE_ZLIB_IF_AVAILABLE) + find_package(ZLIB QUIET) + # FindZLIB doesn't have a ZLIB_FOUND variable, so check the target. + if(TARGET ZLIB::ZLIB) + set(HTTPLIB_IS_USING_ZLIB TRUE) + endif() +endif() + +# Adds our cmake folder to the search path for find_package +# This is so we can use our custom FindBrotli.cmake +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +if(HTTPLIB_REQUIRE_BROTLI) + find_package(Brotli COMPONENTS encoder decoder common REQUIRED) + set(HTTPLIB_IS_USING_BROTLI TRUE) +elseif(HTTPLIB_USE_BROTLI_IF_AVAILABLE) + find_package(Brotli COMPONENTS encoder decoder common QUIET) + set(HTTPLIB_IS_USING_BROTLI ${Brotli_FOUND}) +endif() + +# NOTE: +# zstd < 1.5.6 does not provide the CMake imported target `zstd::libzstd`. +# Older versions must be consumed via their pkg-config file. +if(HTTPLIB_REQUIRE_ZSTD) + if (NOT TARGET zstd::libzstd) + find_package(zstd 1.5.6 CONFIG) + if(NOT zstd_FOUND) + find_package(PkgConfig REQUIRED) + pkg_check_modules(zstd REQUIRED IMPORTED_TARGET libzstd) + add_library(zstd::libzstd ALIAS PkgConfig::zstd) + endif() + endif() + set(HTTPLIB_IS_USING_ZSTD TRUE) +elseif(HTTPLIB_USE_ZSTD_IF_AVAILABLE) + if (TARGET zstd::libzstd) + set(HTTPLIB_IS_USING_ZSTD TRUE) + else() + find_package(zstd 1.5.6 CONFIG QUIET) + if(NOT zstd_FOUND) + find_package(PkgConfig QUIET) + if(PKG_CONFIG_FOUND) + pkg_check_modules(zstd QUIET IMPORTED_TARGET libzstd) + + if(TARGET PkgConfig::zstd) + add_library(zstd::libzstd ALIAS PkgConfig::zstd) + endif() + endif() + endif() + # Both find_package and PkgConf set a XXX_FOUND var + set(HTTPLIB_IS_USING_ZSTD ${zstd_FOUND}) + endif() +endif() + +# Used for default, common dirs that the end-user can change (if needed) +# like CMAKE_INSTALL_INCLUDEDIR or CMAKE_INSTALL_DATADIR +include(GNUInstallDirs) + +if(HTTPLIB_COMPILE) + # Put the split script into the build dir + configure_file(split.py "${CMAKE_CURRENT_BINARY_DIR}/split.py" + COPYONLY + ) + # Needs to be in the same dir as the python script + configure_file(httplib.h "${CMAKE_CURRENT_BINARY_DIR}/httplib.h" + COPYONLY + ) + + # Used outside of this if-else + set(_INTERFACE_OR_PUBLIC PUBLIC) + # Brings in the Python3_EXECUTABLE path we can use. + find_package(Python3 REQUIRED) + # Actually split the file + # Keeps the output in the build dir to not pollute the main dir + execute_process(COMMAND ${Python3_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/split.py" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ERROR_VARIABLE _httplib_split_error + ) + if(_httplib_split_error) + message(FATAL_ERROR "Failed when trying to split cpp-httplib with the Python script.\n${_httplib_split_error}") + endif() + + # If building modules, also generate the module file + if(HTTPLIB_BUILD_MODULES) + # Put the generate_module script into the build dir + configure_file(generate_module.py "${CMAKE_CURRENT_BINARY_DIR}/generate_module.py" + COPYONLY + ) + # Generate the module file + execute_process(COMMAND ${Python3_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/generate_module.py" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ERROR_VARIABLE _httplib_module_error + ) + if(_httplib_module_error) + message(FATAL_ERROR "Failed when trying to generate cpp-httplib module with the Python script.\n${_httplib_module_error}") + endif() + endif() + + # split.py puts output in "out" + set(_httplib_build_includedir "${CMAKE_CURRENT_BINARY_DIR}/out") + add_library(${PROJECT_NAME} ${HTTPLIB_LIB_TYPE} "${_httplib_build_includedir}/httplib.cc") + target_sources(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + # Add C++20 module support if requested + # Include from separate file to prevent parse errors on older CMake versions + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.28") + include(cmake/modules.cmake) + endif() + + set_target_properties(${PROJECT_NAME} + PROPERTIES + VERSION ${${PROJECT_NAME}_VERSION} + SOVERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}" + OUTPUT_NAME cpp-httplib + ) +else() + # This is for header-only. + set(_INTERFACE_OR_PUBLIC INTERFACE) + add_library(${PROJECT_NAME} INTERFACE) + set(_httplib_build_includedir "${CMAKE_CURRENT_SOURCE_DIR}") +endif() +# Lets you address the target with httplib::httplib +# Only useful if building in-tree, versus using it from an installation. +add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) + +# Require C++11, or C++20 if modules are enabled +if(HTTPLIB_BUILD_MODULES) + target_compile_features(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} cxx_std_20) +else() + target_compile_features(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} cxx_std_11) +endif() + +target_include_directories(${PROJECT_NAME} SYSTEM ${_INTERFACE_OR_PUBLIC} + $ + $ +) + +target_link_libraries(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} + # Always require threads + Threads::Threads + # Needed for Windows libs on Mingw, as the pragma comment(lib, "xyz") aren't triggered. + $<$:ws2_32> + $<$:crypt32> + # Needed for API from MacOS Security framework + "$<$,$,$>:-framework CFNetwork -framework CoreFoundation -framework Security>" + # Needed for non-blocking getaddrinfo on MacOS + "$<$,$>:-framework CFNetwork -framework CoreFoundation>" + # Can't put multiple targets in a single generator expression or it bugs out. + $<$:Brotli::common> + $<$:Brotli::encoder> + $<$:Brotli::decoder> + $<$:ZLIB::ZLIB> + $<$:zstd::libzstd> + $<$:OpenSSL::SSL> + $<$:OpenSSL::Crypto> + $<$:wolfssl::wolfssl> + $<$:MbedTLS::mbedtls> +) + +# Set the definitions to enable optional features +target_compile_definitions(${PROJECT_NAME} ${_INTERFACE_OR_PUBLIC} + $<$:CPPHTTPLIB_NO_EXCEPTIONS> + $<$:CPPHTTPLIB_BROTLI_SUPPORT> + $<$:CPPHTTPLIB_ZLIB_SUPPORT> + $<$:CPPHTTPLIB_ZSTD_SUPPORT> + $<$:CPPHTTPLIB_OPENSSL_SUPPORT> + $<$:CPPHTTPLIB_WOLFSSL_SUPPORT> + $<$:CPPHTTPLIB_MBEDTLS_SUPPORT> + $<$,$>:CPPHTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES> + $<$:CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO> +) + +# CMake configuration files installation directory +set(_TARGET_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") + +include(CMakePackageConfigHelpers) + +# Configures the meta-file httplibConfig.cmake.in to replace variables with paths/values/etc. +configure_package_config_file("cmake/${PROJECT_NAME}Config.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + INSTALL_DESTINATION "${_TARGET_INSTALL_CMAKEDIR}" + # Passes the includedir install path + PATH_VARS CMAKE_INSTALL_FULL_INCLUDEDIR +) + +if(HTTPLIB_COMPILE) + write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake" + # Example: if you find_package(httplib 0.5.4) + # then anything >= 0.5.4 and < 0.6 is accepted + COMPATIBILITY SameMinorVersion + ) +else() + write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake" + # Example: if you find_package(httplib 0.5.4) + # then anything >= 0.5.4 and < 0.6 is accepted + COMPATIBILITY SameMinorVersion + # Tells Cmake that it's a header-only lib + # Mildly useful for end-users :) + ARCH_INDEPENDENT + ) +endif() + +if(HTTPLIB_INSTALL) + # Creates the export httplibTargets.cmake + # This is strictly what holds compilation requirements + # and linkage information (doesn't find deps though). + if(HTTPLIB_BUILD_MODULES) + install(TARGETS ${PROJECT_NAME} EXPORT httplibTargets FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/httplib/modules CXX_MODULES_BMI DESTINATION ${CMAKE_INSTALL_LIBDIR}/httplib/modules) + else() + install(TARGETS ${PROJECT_NAME} EXPORT httplibTargets) + endif() + + install(FILES "${_httplib_build_includedir}/httplib.h" TYPE INCLUDE) + + install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + # Install it so it can be used later by the httplibConfig.cmake file. + # Put it in the same dir as our config file instead of a global path so we don't potentially stomp on other packages. + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindBrotli.cmake" + DESTINATION ${_TARGET_INSTALL_CMAKEDIR} + ) + + # NOTE: This path changes depending on if it's on Windows or Linux + install(EXPORT httplibTargets + # Puts the targets into the httplib namespace + # So this makes httplib::httplib linkable after doing find_package(httplib) + NAMESPACE ${PROJECT_NAME}:: + DESTINATION ${_TARGET_INSTALL_CMAKEDIR} + ) + + # Install documentation & license + # ex: /usr/share/doc/httplib/README.md and /usr/share/licenses/httplib/LICENSE + install(FILES "README.md" DESTINATION "${CMAKE_INSTALL_DOCDIR}") + install(FILES "LICENSE" DESTINATION "${CMAKE_INSTALL_DATADIR}/licenses/${PROJECT_NAME}") + + include(CPack) +endif() + +if(HTTPLIB_BUILD_MODULES AND NOT HTTPLIB_COMPILE) + message(FATAL_ERROR "HTTPLIB_BUILD_MODULES requires HTTPLIB_COMPILE to be ON.") +endif() + +if(HTTPLIB_TEST) + include(CTest) + add_subdirectory(test) +endif() diff --git a/libs/cpp-httplib-0.57.1/Dockerfile b/libs/cpp-httplib-0.57.1/Dockerfile new file mode 100644 index 0000000..3495b42 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/Dockerfile @@ -0,0 +1,13 @@ +FROM yhirose4dockerhub/ubuntu-builder AS builder +WORKDIR /build +COPY httplib.h . +COPY docker/main.cc . +RUN g++ -std=c++23 -static -o server -O2 -I. main.cc && strip server + +FROM scratch +COPY --from=builder /build/server /server +COPY docker/html/index.html /html/index.html +EXPOSE 80 + +ENTRYPOINT ["/server"] +CMD ["--host", "0.0.0.0", "--port", "80", "--mount", "/:./html"] diff --git a/libs/cpp-httplib-0.57.1/LICENSE b/libs/cpp-httplib-0.57.1/LICENSE new file mode 100644 index 0000000..3e5ed35 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2017 yhirose + +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/libs/cpp-httplib-0.57.1/README-sse.md b/libs/cpp-httplib-0.57.1/README-sse.md new file mode 100644 index 0000000..223dcc3 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/README-sse.md @@ -0,0 +1,204 @@ +# SSEClient - Server-Sent Events Client + +A simple, EventSource-like SSE client for C++11. + +## Features + +- **Auto-reconnect**: Automatically reconnects on connection loss +- **Last-Event-ID**: Sends last received ID on reconnect for resumption +- **retry field**: Respects server's reconnect interval +- **Event types**: Supports custom event types via `on_event()` +- **Async support**: Run in background thread with `start_async()` +- **C++11 compatible**: No C++14/17/20 features required + +## Quick Start + +```cpp +httplib::Client cli("http://localhost:8080"); +httplib::sse::SSEClient sse(cli, "/events"); + +sse.on_message([](const httplib::sse::SSEMessage &msg) { + std::cout << "Event: " << msg.event << std::endl; + std::cout << "Data: " << msg.data << std::endl; +}); + +sse.start(); // Blocking, with auto-reconnect +``` + +## API Reference + +### SSEMessage + +```cpp +struct SSEMessage { + std::string event; // Event type (default: "message") + std::string data; // Event payload + std::string id; // Event ID +}; +``` + +### SSEClient + +#### Constructor + +```cpp +// Basic +SSEClient(Client &client, const std::string &path); + +// With custom headers +SSEClient(Client &client, const std::string &path, const Headers &headers); +``` + +#### Event Handlers + +```cpp +// Called for all events (or events without a specific handler) +sse.on_message([](const SSEMessage &msg) { }); + +// Called for specific event types +sse.on_event("update", [](const SSEMessage &msg) { }); +sse.on_event("delete", [](const SSEMessage &msg) { }); + +// Called when connection is established +sse.on_open([]() { }); + +// Called on connection errors +sse.on_error([](httplib::Error err) { }); +``` + +#### Configuration + +```cpp +// Set reconnect interval (default: 3000ms) +sse.set_reconnect_interval(5000); + +// Set max reconnect attempts (default: 0 = unlimited) +sse.set_max_reconnect_attempts(10); + +// Update headers at any time (thread-safe) +sse.set_headers({{"Authorization", "Bearer new_token"}}); +``` + +#### Control + +```cpp +// Blocking start with auto-reconnect +sse.start(); + +// Non-blocking start (runs in background thread) +sse.start_async(); + +// Stop the client (thread-safe) +sse.stop(); +``` + +#### State + +```cpp +bool connected = sse.is_connected(); +const std::string &id = sse.last_event_id(); +``` + +## Examples + +### Basic Usage + +```cpp +httplib::Client cli("http://localhost:8080"); +httplib::sse::SSEClient sse(cli, "/events"); + +sse.on_message([](const httplib::sse::SSEMessage &msg) { + std::cout << msg.data << std::endl; +}); + +sse.start(); +``` + +### With Custom Event Types + +```cpp +httplib::sse::SSEClient sse(cli, "/events"); + +sse.on_event("notification", [](const httplib::sse::SSEMessage &msg) { + std::cout << "Notification: " << msg.data << std::endl; +}); + +sse.on_event("update", [](const httplib::sse::SSEMessage &msg) { + std::cout << "Update: " << msg.data << std::endl; +}); + +sse.start(); +``` + +### Async with Stop + +```cpp +httplib::sse::SSEClient sse(cli, "/events"); + +sse.on_message([](const httplib::sse::SSEMessage &msg) { + std::cout << msg.data << std::endl; +}); + +sse.start_async(); // Returns immediately + +// ... do other work ... + +sse.stop(); // Stop when done +``` + +### With Custom Headers (e.g., Authentication) + +```cpp +httplib::Headers headers = { + {"Authorization", "Bearer token123"} +}; + +httplib::sse::SSEClient sse(cli, "/events", headers); +sse.start(); +``` + +### Refreshing Auth Token on Reconnect + +```cpp +httplib::sse::SSEClient sse(cli, "/events", + {{"Authorization", "Bearer " + get_token()}}); + +// Preemptively refresh token on each successful connection +sse.on_open([&sse]() { + sse.set_headers({{"Authorization", "Bearer " + get_token()}}); +}); + +// Or reactively refresh on auth failure (401 triggers reconnect) +sse.on_error([&sse](httplib::Error) { + sse.set_headers({{"Authorization", "Bearer " + refresh_token()}}); +}); + +sse.start(); +``` + +### Error Handling + +```cpp +sse.on_error([](httplib::Error err) { + std::cerr << "Error: " << httplib::to_string(err) << std::endl; +}); + +sse.set_reconnect_interval(1000); +sse.set_max_reconnect_attempts(5); + +sse.start(); +``` + +## SSE Protocol + +The client parses SSE format according to the [W3C specification](https://html.spec.whatwg.org/multipage/server-sent-events.html): + +``` +event: custom-type +id: 123 +data: {"message": "hello"} + +data: simple message + +: this is a comment (ignored) +``` diff --git a/libs/cpp-httplib-0.57.1/README-stream.md b/libs/cpp-httplib-0.57.1/README-stream.md new file mode 100644 index 0000000..b7f4162 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/README-stream.md @@ -0,0 +1,317 @@ +# cpp-httplib Streaming API + +This document describes the streaming extensions for cpp-httplib, providing an iterator-style API for handling HTTP responses incrementally with **true socket-level streaming**. + +> **Important Notes**: +> +> - **No Keep-Alive**: Each `stream::Get()` call uses a dedicated connection that is closed after the response is fully read. For connection reuse, use `Client::Get()`. +> - **Single iteration only**: The `next()` method can only iterate through the body once. +> - **Result is not thread-safe**: While `stream::Get()` can be called from multiple threads simultaneously, the returned `stream::Result` must be used from a single thread only. + +## Overview + +The streaming API allows you to process HTTP response bodies chunk by chunk using an iterator-style pattern. Data is read directly from the network socket, enabling low-memory processing of large responses. This is particularly useful for: + +- **LLM/AI streaming responses** (e.g., ChatGPT, Claude, Ollama) +- **Server-Sent Events (SSE)** +- **Large file downloads** with progress tracking +- **Reverse proxy implementations** + +## Quick Start + +```cpp +#include "httplib.h" + +int main() { + httplib::Client cli("http://localhost:8080"); + + // Get streaming response + auto result = httplib::stream::Get(cli, "/stream"); + + if (result) { + // Process response body in chunks + while (result.next()) { + std::cout.write(result.data(), result.size()); + } + } + + return 0; +} +``` + +## API Layers + +cpp-httplib provides multiple API layers for different use cases: + +```text +┌─────────────────────────────────────────────┐ +│ SSEClient │ ← SSE-specific, parsed events +│ - on_message(), on_event() │ +│ - Auto-reconnect, Last-Event-ID │ +├─────────────────────────────────────────────┤ +│ stream::Get() / stream::Result │ ← Iterator-based streaming +│ - while (result.next()) { ... } │ +├─────────────────────────────────────────────┤ +│ open_stream() / StreamHandle │ ← General-purpose streaming +│ - handle.read(buf, len) │ +├─────────────────────────────────────────────┤ +│ Client::Get() │ ← Traditional, full buffering +└─────────────────────────────────────────────┘ +``` + +| Use Case | Recommended API | +|----------|----------------| +| SSE with auto-reconnect | `SSEClient` (see [README-sse.md](README-sse.md)) | +| LLM streaming (JSON Lines) | `stream::Get()` | +| Large file download | `stream::Get()` or `open_stream()` | +| Reverse proxy | `open_stream()` | +| Small responses with Keep-Alive | `Client::Get()` | + +## API Reference + +### Low-Level API: `StreamHandle` + +The `StreamHandle` struct provides direct control over streaming responses. It takes ownership of the socket connection and reads data directly from the network. + +> **Note:** When using `open_stream()`, the connection is dedicated to streaming and **Keep-Alive is not supported**. For Keep-Alive connections, use `client.Get()` instead. + +```cpp +// Open a stream (takes ownership of socket) +httplib::Client cli("http://localhost:8080"); +auto handle = cli.open_stream("GET", "/path"); + +// Check validity +if (handle.is_valid()) { + // Access response headers immediately + int status = handle.response->status; + auto content_type = handle.response->get_header_value("Content-Type"); + + // Read body incrementally + char buf[4096]; + ssize_t n; + while ((n = handle.read(buf, sizeof(buf))) > 0) { + process(buf, n); + } +} +``` + +#### StreamHandle Members + +| Member | Type | Description | +|--------|------|-------------| +| `response` | `std::unique_ptr` | HTTP response with headers | +| `error` | `Error` | Error code if request failed | +| `is_valid()` | `bool` | Returns true if response is valid | +| `read(buf, len)` | `ssize_t` | Read up to `len` bytes directly from socket | +| `get_read_error()` | `Error` | Get the last read error | +| `has_read_error()` | `bool` | Check if a read error occurred | + +### High-Level API: `stream::Get()` and `stream::Result` + +The `httplib.h` header provides a more ergonomic iterator-style API. + +```cpp +#include "httplib.h" + +httplib::Client cli("http://localhost:8080"); +cli.set_follow_location(true); +... + +// Simple GET +auto result = httplib::stream::Get(cli, "/path"); + +// GET with custom headers +httplib::Headers headers = {{"Authorization", "Bearer token"}}; +auto result = httplib::stream::Get(cli, "/path", headers); + +// Process the response +if (result) { + while (result.next()) { + process(result.data(), result.size()); + } +} + +// Or read entire body at once +auto result2 = httplib::stream::Get(cli, "/path"); +if (result2) { + std::string body = result2.read_all(); +} +``` + +#### stream::Result Members + +| Member | Type | Description | +|--------|------|-------------| +| `operator bool()` | `bool` | Returns true if response is valid | +| `is_valid()` | `bool` | Same as `operator bool()` | +| `status()` | `int` | HTTP status code | +| `headers()` | `const Headers&` | Response headers | +| `get_header_value(key, def)` | `std::string` | Get header value (with optional default) | +| `has_header(key)` | `bool` | Check if header exists | +| `next()` | `bool` | Read next chunk, returns false when done | +| `data()` | `const char*` | Pointer to current chunk data | +| `size()` | `size_t` | Size of current chunk | +| `read_all()` | `std::string` | Read entire remaining body into string | +| `error()` | `Error` | Get the connection/request error | +| `read_error()` | `Error` | Get the last read error | +| `has_read_error()` | `bool` | Check if a read error occurred | + +## Usage Examples + +### Example 1: SSE (Server-Sent Events) Client + +```cpp +#include "httplib.h" +#include + +int main() { + httplib::Client cli("http://localhost:1234"); + + auto result = httplib::stream::Get(cli, "/events"); + if (!result) { return 1; } + + while (result.next()) { + std::cout.write(result.data(), result.size()); + std::cout.flush(); + } + + return 0; +} +``` + +For a complete SSE client with auto-reconnection and event parsing, see `example/ssecli-stream.cc`. + +### Example 2: LLM Streaming Response + +```cpp +#include "httplib.h" +#include + +int main() { + httplib::Client cli("http://localhost:11434"); // Ollama + + auto result = httplib::stream::Get(cli, "/api/generate"); + + if (result && result.status() == 200) { + while (result.next()) { + std::cout.write(result.data(), result.size()); + std::cout.flush(); + } + } + + // Check for connection errors + if (result.read_error() != httplib::Error::Success) { + std::cerr << "Connection lost\n"; + } + + return 0; +} +``` + +### Example 3: Large File Download with Progress + +```cpp +#include "httplib.h" +#include +#include + +int main() { + httplib::Client cli("http://example.com"); + auto result = httplib::stream::Get(cli, "/large-file.zip"); + + if (!result || result.status() != 200) { + std::cerr << "Download failed\n"; + return 1; + } + + std::ofstream file("download.zip", std::ios::binary); + size_t total = 0; + + while (result.next()) { + file.write(result.data(), result.size()); + total += result.size(); + std::cout << "\rDownloaded: " << (total / 1024) << " KB" << std::flush; + } + + std::cout << "\nComplete!\n"; + return 0; +} +``` + +### Example 4: Reverse Proxy Streaming + +```cpp +#include "httplib.h" + +httplib::Server svr; + +svr.Get("/proxy/(.*)", [](const httplib::Request& req, httplib::Response& res) { + httplib::Client upstream("http://backend:8080"); + auto handle = upstream.open_stream("/" + req.matches[1].str()); + + if (!handle.is_valid()) { + res.status = 502; + return; + } + + res.status = handle.response->status; + res.set_chunked_content_provider( + handle.response->get_header_value("Content-Type"), + [handle = std::move(handle)](size_t, httplib::DataSink& sink) mutable { + char buf[8192]; + auto n = handle.read(buf, sizeof(buf)); + if (n > 0) { + sink.write(buf, static_cast(n)); + return true; + } + sink.done(); + return true; + } + ); +}); + +svr.listen("0.0.0.0", 3000); +``` + +## Comparison with Existing APIs + +| Feature | `Client::Get()` | `open_stream()` | `stream::Get()` | +|---------|----------------|-----------------|----------------| +| Headers available | After complete | Immediately | Immediately | +| Body reading | All at once | Direct from socket | Iterator-based | +| Memory usage | Full body in RAM | Minimal (controlled) | Minimal (controlled) | +| Keep-Alive support | ✅ Yes | ❌ No | ❌ No | +| Compression | Auto-handled | Auto-handled | Auto-handled | +| Best for | Small responses, Keep-Alive | Low-level streaming | Easy streaming | + +## Features + +- **True socket-level streaming**: Data is read directly from the network socket +- **Low memory footprint**: Only the current chunk is held in memory +- **Compression support**: Automatic decompression for gzip, brotli, and zstd +- **Chunked transfer**: Full support for chunked transfer encoding +- **SSL/TLS support**: Works with HTTPS connections + +## Important Notes + +### Keep-Alive Behavior + +The streaming API (`stream::Get()` / `open_stream()`) takes ownership of the socket connection for the duration of the stream. This means: + +- **Keep-Alive is not supported** for streaming connections +- The socket is closed when `StreamHandle` is destroyed +- For Keep-Alive scenarios, use the standard `client.Get()` API instead + +```cpp +// Use for streaming (no Keep-Alive) +auto result = httplib::stream::Get(cli, "/large-stream"); +while (result.next()) { /* ... */ } + +// Use for Keep-Alive connections +auto res = cli.Get("/api/data"); // Connection can be reused +``` + +## Related + +- [Issue #2269](https://github.com/yhirose/cpp-httplib/issues/2269) - Original feature request +- [example/ssecli-stream.cc](./example/ssecli-stream.cc) - SSE client with auto-reconnection diff --git a/libs/cpp-httplib-0.57.1/README-websocket.md b/libs/cpp-httplib-0.57.1/README-websocket.md new file mode 100644 index 0000000..3629a59 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/README-websocket.md @@ -0,0 +1,523 @@ +# WebSocket - RFC 6455 WebSocket Support + +A simple, blocking WebSocket implementation for C++11. + +> [!IMPORTANT] +> This is a blocking I/O WebSocket implementation using a thread-per-connection model (plus one heartbeat thread per connection). It is intended for small- to mid-scale workloads; handling large numbers of simultaneous WebSocket connections is outside the design target of this library. If you need high-concurrency WebSocket support with non-blocking/async I/O (e.g., thousands of simultaneous connections), this is not the one that you want. + +> [!NOTE] +> WebSocket extensions (`permessage-deflate` and others defined by RFC 6455) are **not supported**. If a client proposes an extension via `Sec-WebSocket-Extensions`, the server silently declines it — the negotiated connection always runs without extensions. + +## Features + +- **RFC 6455 compliant**: Full WebSocket protocol support (extensions are not implemented) +- **Server and Client**: Both sides included +- **SSL/TLS support**: `wss://` scheme for secure connections +- **Text and Binary**: Both message types supported +- **Automatic heartbeat**: Periodic Ping/Pong keeps connections alive +- **Unresponsive-peer detection**: Opt-in liveness check via `set_websocket_max_missed_pongs()` +- **Subprotocol negotiation**: `Sec-WebSocket-Protocol` support for GraphQL, MQTT, etc. + +## Quick Start + +### Server + +```cpp +httplib::Server svr; + +svr.WebSocket("/ws", [](const httplib::Request &req, httplib::ws::WebSocket &ws) { + std::string msg; + while (ws.read(msg)) { + ws.send("echo: " + msg); + } +}); + +svr.listen("localhost", 8080); +``` + +### Client + +```cpp +httplib::ws::WebSocketClient ws("ws://localhost:8080/ws"); + +if (ws.connect()) { + ws.send("hello"); + + std::string msg; + if (ws.read(msg)) { + std::cout << msg << std::endl; // "echo: hello" + } + ws.close(); +} +``` + +## API Reference + +### ReadResult + +```cpp +enum ReadResult : int { + Fail = 0, // Connection closed or error + Text = 1, // UTF-8 text message + Binary = 2, // Binary message + Timeout = 3, // Read timeout elapsed; connection still open +}; +``` + +Returned by `read()`. Since `Fail` is `0`, the result works naturally in boolean contexts — `while (ws.read(msg))` continues until the connection closes. When you need to distinguish text from binary, check the return value directly. + +`Timeout` is only returned for a read timeout you set yourself with `set_read_timeout()`. It means the timeout elapsed on a message boundary: nothing was consumed and the connection is still open, so you can send on it and read again. The compile-time defaults (`CPPHTTPLIB_WEBSOCKET_SERVER_READ_TIMEOUT_SECOND`, 300 seconds on the server; a client waits forever) are a backstop against a peer that has gone quiet, not a request for control: when one of them elapses, `read()` returns `Fail` and closes the connection, so code that never calls `set_read_timeout()` can keep using `while (ws.read(msg))`. + +**`msg` is left untouched on `Timeout`.** Because `Timeout` is non-zero, `while (ws.read(msg))` keeps looping — with the *previous* message still in `msg`. Once you set a read timeout, test the result instead: + +```cpp +ws.set_read_timeout(std::chrono::milliseconds(100)); +std::string msg; +while (ws.is_open()) { + auto r = ws.read(msg); + if (r == httplib::ws::Timeout) { continue; } // nothing yet; send if you like + if (r == httplib::ws::Fail) { break; } + handle(msg); +} +``` + +### CloseStatus + +```cpp +enum class CloseStatus : uint16_t { + Normal = 1000, + GoingAway = 1001, + ProtocolError = 1002, + UnsupportedData = 1003, + NoStatus = 1005, + Abnormal = 1006, + InvalidPayload = 1007, + PolicyViolation = 1008, + MessageTooBig = 1009, + MandatoryExtension = 1010, + InternalError = 1011, +}; +``` + +### Server Registration + +```cpp +// Basic handler +Server &WebSocket(const std::string &pattern, WebSocketHandler handler); + +// With subprotocol negotiation +Server &WebSocket(const std::string &pattern, WebSocketHandler handler, + SubProtocolSelector sub_protocol_selector); +``` + +**Type aliases:** + +```cpp +using WebSocketHandler = + std::function; +using SubProtocolSelector = + std::function &protocols)>; +``` + +The `SubProtocolSelector` receives the list of subprotocols proposed by the client (from the `Sec-WebSocket-Protocol` header) and returns the selected one. Return an empty string to decline all proposed subprotocols. + +### WebSocket (Server-side) + +Passed to the handler registered with `Server::WebSocket()`. The handler runs in a dedicated thread per connection. + +```cpp +// Read next message (blocks until received, returns Fail/Text/Binary) +ReadResult read(std::string &msg); + +// Send messages +bool send(const std::string &data); // Text +bool send(const char *data, size_t len); // Binary + +// Close the connection +void close(CloseStatus status = CloseStatus::Normal, + const std::string &reason = ""); + +// Access the original HTTP upgrade request +const Request &request() const; + +// Check if the connection is still open +bool is_open() const; +``` + +### WebSocketClient + +```cpp +// Constructor - accepts ws:// or wss:// URL +explicit WebSocketClient(const std::string &scheme_host_port_path, + const Headers &headers = {}); + +// Constructor with a client certificate for mutual TLS (wss:// only, +// requires CPPHTTPLIB_OPENSSL_SUPPORT). The certificate is ignored for +// ws:// URLs. +struct PemMemory { + const char *cert_pem; + size_t cert_pem_len; + const char *key_pem; + size_t key_pem_len; + const char *private_key_password; +}; +explicit WebSocketClient(const std::string &scheme_host_port_path, + const PemMemory &pem, const Headers &headers = {}); + +// Check if the URL was parsed successfully +bool is_valid() const; + +// Connect (performs HTTP upgrade handshake). The returned Result is truthy +// only when the handshake fully succeeded; on failure it describes what went +// wrong: +// res.error() httplib::Error identifying the failing layer +// res.status() HTTP status of the upgrade response (-1 if none) +// res.headers() headers of the upgrade response +// res.ssl_error() TLS error detail (wss://, SSL builds only) +// res.ssl_backend_error() backend-specific TLS error code (SSL builds only) +Result connect(); + +// Get the subprotocol selected by the server (empty if none) +const std::string &subprotocol() const; + +// Read/Send/Close (same as server-side WebSocket) +ReadResult read(std::string &msg); +bool send(const std::string &data); +bool send(const char *data, size_t len); +void close(CloseStatus status = CloseStatus::Normal, + const std::string &reason = ""); +bool is_open() const; + +// Timeouts +void set_read_timeout(time_t sec, time_t usec = 0); +void set_write_timeout(time_t sec, time_t usec = 0); +void set_connection_timeout(time_t sec, time_t usec = 0); +template +void set_read_timeout(const std::chrono::duration &duration); +template +void set_write_timeout(const std::chrono::duration &duration); +template +void set_connection_timeout(const std::chrono::duration &duration); + +// SSL configuration (wss:// only, requires CPPHTTPLIB_OPENSSL_SUPPORT) +void set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path = std::string()); +void set_ca_cert_store(tls::ca_store_t store); +void enable_server_certificate_verification(bool enabled); +void enable_server_hostname_verification(bool enabled); +``` + +## Examples + +### Echo Server with Connection Logging + +```cpp +httplib::Server svr; + +svr.WebSocket("/ws", [](const httplib::Request &req, httplib::ws::WebSocket &ws) { + std::cout << "Connected from " << req.remote_addr << std::endl; + + std::string msg; + while (ws.read(msg)) { + ws.send("echo: " + msg); + } + + std::cout << "Disconnected" << std::endl; +}); + +svr.listen("localhost", 8080); +``` + +### Client: Continuous Read Loop + +```cpp +httplib::ws::WebSocketClient ws("ws://localhost:8080/ws"); + +if (ws.connect()) { + ws.send("hello"); + ws.send("world"); + + std::string msg; + while (ws.read(msg)) { // blocks until a message arrives + std::cout << msg << std::endl; // "echo: hello", "echo: world" + } + // read() returns false when the server closes the connection +} +``` + +### Inspecting Connection Failures + +`connect()` returns a `Result` that tells you why a connection attempt failed. +`error()` distinguishes network problems (`Connection`, `ConnectionTimeout`), +TLS problems (`SSLConnection`, `SSLServerVerification`, +`SSLServerHostnameVerification`), and upgrade rejections +(`WebSocketHandshake`). When the server answered with something other than +`101 Switching Protocols`, `status()` and `headers()` carry that response: + +```cpp +auto res = ws.connect(); +if (!res) { + std::cerr << "connect failed: " << httplib::to_string(res.error()) << std::endl; + if (res.status() != -1) { + // The server responded but refused the upgrade (e.g. 401, 404) + std::cerr << "HTTP status: " << res.status() << std::endl; + } +} +``` + +### Text and Binary Messages + +Check the `ReadResult` return value to distinguish between text and binary: + +```cpp +// Server +svr.WebSocket("/ws", [](const httplib::Request &req, httplib::ws::WebSocket &ws) { + std::string msg; + httplib::ws::ReadResult ret; + while ((ret = ws.read(msg))) { + if (ret == httplib::ws::Text) { + ws.send("echo: " + msg); + } else { + ws.send(msg.data(), msg.size()); // Binary echo + } + } +}); + +// Client +httplib::ws::WebSocketClient ws("ws://localhost:8080/ws"); +if (ws.connect()) { + // Send binary data + const char binary[] = {0x00, 0x01, 0x02, 0x03}; + ws.send(binary, sizeof(binary)); + + // Receive and check the type + std::string msg; + if (ws.read(msg) == httplib::ws::Binary) { + // Process binary data in msg + } + ws.close(); +} +``` + +### SSL Client + +```cpp +httplib::ws::WebSocketClient ws("wss://echo.example.com/ws"); + +if (ws.connect()) { + ws.send("hello over TLS"); + + std::string msg; + if (ws.read(msg)) { + std::cout << msg << std::endl; + } + ws.close(); +} +``` + +### Close with Status + +```cpp +// Client-side: close with a specific status code and reason +ws.close(httplib::ws::CloseStatus::GoingAway, "shutting down"); + +// Server-side: close with a policy violation status +ws.close(httplib::ws::CloseStatus::PolicyViolation, "forbidden"); +``` + +### Accessing the Upgrade Request + +```cpp +svr.WebSocket("/ws", [](const httplib::Request &req, httplib::ws::WebSocket &ws) { + // Access headers from the original HTTP upgrade request + auto auth = req.get_header_value("Authorization"); + if (auth.empty()) { + ws.close(httplib::ws::CloseStatus::PolicyViolation, "unauthorized"); + return; + } + + std::string msg; + while (ws.read(msg)) { + ws.send("echo: " + msg); + } +}); +``` + +The check above runs after the handshake, so the client sees a successful upgrade followed by a close frame. To refuse the upgrade itself with an HTTP status, use a pre-routing or pre-request handler. Both run before the `101 Switching Protocols` response, and `req.matched_route` is available in the pre-request handler: + +```cpp +svr.set_pre_request_handler([](const httplib::Request &req, httplib::Response &res) { + if (req.matched_route == "/ws" && req.get_header_value("Authorization").empty()) { + res.status = httplib::StatusCode::Unauthorized_401; + return httplib::Server::HandlerResponse::Handled; // not upgraded + } + return httplib::Server::HandlerResponse::Unhandled; +}); +``` + +### Custom Headers and Timeouts + +```cpp +httplib::Headers headers = { + {"Authorization", "Bearer token123"} +}; + +httplib::ws::WebSocketClient ws("ws://localhost:8080/ws", headers); +ws.set_connection_timeout(5, 0); // 5 seconds +ws.set_read_timeout(30, 0); // 30 seconds +ws.set_write_timeout(10, 0); // 10 seconds + +// std::chrono is also supported +ws.set_connection_timeout(std::chrono::seconds(5)); +ws.set_read_timeout(std::chrono::seconds(30)); +ws.set_write_timeout(std::chrono::seconds(10)); + +if (ws.connect()) { + std::string msg; + while (ws.read(msg)) { + std::cout << msg << std::endl; + } +} +``` + +### Subprotocol Negotiation + +The server can negotiate a subprotocol with the client using `Sec-WebSocket-Protocol`. This is required for protocols like GraphQL over WebSocket (`graphql-ws`) and MQTT. + +```cpp +// Server: register a handler with a subprotocol selector +svr.WebSocket( + "/ws", + [](const httplib::Request &req, httplib::ws::WebSocket &ws) { + std::string msg; + while (ws.read(msg)) { + ws.send("echo: " + msg); + } + }, + [](const std::vector &protocols) -> std::string { + // The client proposed a list of subprotocols; pick one + for (const auto &p : protocols) { + if (p == "graphql-ws" || p == "graphql-transport-ws") { + return p; + } + } + return ""; // Decline all + }); + +// Client: propose subprotocols via Sec-WebSocket-Protocol header +httplib::Headers headers = { + {"Sec-WebSocket-Protocol", "graphql-ws, graphql-transport-ws"} +}; +httplib::ws::WebSocketClient ws("ws://localhost:8080/ws", headers); + +if (ws.connect()) { + // Check which subprotocol the server selected + std::cout << "Subprotocol: " << ws.subprotocol() << std::endl; + // => "graphql-ws" + ws.close(); +} +``` + +### SSL Client with Certificate Configuration + +```cpp +httplib::ws::WebSocketClient ws("wss://example.com/ws"); +ws.set_ca_cert_path("/path/to/ca-bundle.crt"); +ws.enable_server_certificate_verification(true); +ws.enable_server_hostname_verification(true); // default; false skips the identity check + +if (ws.connect()) { + ws.send("secure message"); + ws.close(); +} +``` + +## Configuration + +| Macro | Default | Description | +|---------------------------------------------|-------------------|----------------------------------------------------------| +| `CPPHTTPLIB_WEBSOCKET_MAX_PAYLOAD_LENGTH` | `16777216` (16MB) | Maximum payload size per message | +| `CPPHTTPLIB_WEBSOCKET_CLIENT_READ_TIMEOUT_SECOND` | `0` | Client read timeout (seconds); `0` waits forever | +| `CPPHTTPLIB_WEBSOCKET_SERVER_READ_TIMEOUT_SECOND` | `300` | Server read timeout (seconds) | +| `CPPHTTPLIB_WEBSOCKET_CLOSE_TIMEOUT_SECOND` | `5` | Timeout for waiting peer's Close response (seconds) | +| `CPPHTTPLIB_WEBSOCKET_PING_INTERVAL_SECOND` | `30` | Automatic Ping interval for heartbeat (seconds) | +| `CPPHTTPLIB_WEBSOCKET_MAX_MISSED_PONGS` | `0` (disabled) | Close the connection after N consecutive unacked pings | + +### Runtime Ping Interval + +You can override the ping interval at runtime instead of changing the compile-time macro. Set it to `0` to disable automatic pings entirely. + +```cpp +// Server side +httplib::Server svr; +svr.set_websocket_ping_interval(10); // 10 seconds + +// Or using std::chrono +svr.set_websocket_ping_interval(std::chrono::seconds(10)); + +// Client side +httplib::ws::WebSocketClient ws("ws://localhost:8080/ws"); +ws.set_websocket_ping_interval(10); // 10 seconds + +// Disable automatic pings +ws.set_websocket_ping_interval(0); +``` + +### Unresponsive-Peer Detection (Pong Timeout) + +By default the heartbeat only sends pings — it does not enforce that pongs come back. To detect a silently dropped connection faster, enable the max-missed-pongs check. Once `max_missed_pongs` consecutive pings go unanswered, the heartbeat thread closes the connection with `CloseStatus::GoingAway` and the reason `"pong timeout"`. + +```cpp +ws.set_websocket_max_missed_pongs(2); // close after 2 consecutive unacked pings +``` + +The server side has the same `set_websocket_max_missed_pongs()`. + +With the default ping interval of 30 seconds, `max_missed_pongs = 2` detects a dead peer within ~60 seconds. The counter is reset every time a Pong frame is received, so the mechanism only works when your code is actively calling `read()` — exactly the pattern a normal WebSocket client already uses. + +**The default is `0`**, which means "never close the connection because of missing pongs." Pings are still sent on the heartbeat interval, but their responses are not checked. On the server side a dead connection still does not linger: while a handler is inside `read()`, `CPPHTTPLIB_WEBSOCKET_SERVER_READ_TIMEOUT_SECOND` (default **300 seconds = 5 minutes**) acts as a backstop. A client has no such backstop — it waits forever unless you set a read timeout — so there `max_missed_pongs` is what notices an unresponsive peer at all. On either side it is also the knob for noticing one *faster* than the 5-minute fallback. + +## Threading Model + +WebSocket connections share the same thread pool as HTTP requests. Each WebSocket connection occupies one thread for its entire lifetime. + +The default thread pool uses dynamic scaling: it maintains a base thread count of `CPPHTTPLIB_THREAD_POOL_COUNT` (8 or `std::thread::hardware_concurrency() - 1`, whichever is greater) and can scale up to 4x that count under load (`CPPHTTPLIB_THREAD_POOL_MAX_COUNT`). When all base threads are busy, temporary threads are spawned automatically up to the maximum. These dynamic threads exit after an idle timeout (`CPPHTTPLIB_THREAD_POOL_IDLE_TIMEOUT`, default 3 seconds). + +This dynamic scaling helps accommodate WebSocket connections alongside HTTP requests. However, if you expect many simultaneous WebSocket connections, you should configure the thread pool accordingly: + +```cpp +httplib::Server svr; + +svr.new_task_queue = [] { + return new httplib::ThreadPool(/*base_threads=*/8, /*max_threads=*/128); +}; +``` + +Choose sizes that account for both your expected HTTP load and the maximum number of simultaneous WebSocket connections. + +### Calling from Multiple Threads + +A single `WebSocket` (server-side) or `WebSocketClient` handle is shared by three potential callers: the thread running your handler (or holding the client), the heartbeat thread, and, if your code does its own thing, a separate thread calling `send()`/`close()` while another thread is blocked in `read()`. + +**Supported**: calling `read()` from one thread while calling `send()`/`close()` from another. This is the common pattern for a client that reads incoming messages in a loop on one thread and sends from elsewhere (e.g. a UI thread). A message that is in flight when `close()` is called still arrives intact; `close()` sends the Close frame and returns, leaving the connection's read side to the thread that owns it, so it does not block waiting for the peer's Close reply in that case. The heartbeat thread's automatic pings use the same `send()` path internally, so they are safe to run concurrently with your `read()` loop too — for `wss://` this requires every TLS call on a connection to be serialized internally, which cpp-httplib does for you. + +**Not supported**: calling `read()` from two threads at the same time on the same handle. The calls are serialized rather than left to corrupt each other, but which thread receives which message is unspecified, so there is nothing useful to build on it. + +## Protocol + +The implementation follows [RFC 6455](https://tools.ietf.org/html/rfc6455): + +- Handshake via HTTP Upgrade with `Sec-WebSocket-Key` / `Sec-WebSocket-Accept` +- Subprotocol negotiation via `Sec-WebSocket-Protocol` +- Frame masking (client-to-server) +- Control frames: Close, Ping, Pong +- Message fragmentation and reassembly +- Close handshake with status codes + +## Browser Test + +Run the echo server example and open `http://localhost:8080` in a browser: + +```bash +cd example && make wsecho && ./wsecho +``` diff --git a/libs/cpp-httplib-0.57.1/README.md b/libs/cpp-httplib-0.57.1/README.md new file mode 100644 index 0000000..10f85c2 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/README.md @@ -0,0 +1,1829 @@ +# cpp-httplib + +[![](https://github.com/yhirose/cpp-httplib/workflows/test/badge.svg)](https://github.com/yhirose/cpp-httplib/actions) + +A C++11 single-file header-only cross platform HTTP/HTTPS library.
+It's extremely easy to set up. Just include the **[httplib.h](https://raw.githubusercontent.com/yhirose/cpp-httplib/refs/heads/master/httplib.h)** file in your code! + +Learn more in the [official documentation](https://yhirose.github.io/cpp-httplib/) (built with [docs-gen](https://github.com/yhirose/docs-gen)). + +> [!IMPORTANT] +> This library uses 'blocking' socket I/O. If you are looking for a library with 'non-blocking' socket I/O, this is not the one that you want. Only **HTTP/1.1** is supported — HTTP/2 and HTTP/3 are not implemented. + +> [!WARNING] +> 32-bit platforms are **NOT supported**. Use at your own risk. The library may compile on 32-bit targets, but no security review has been conducted for 32-bit environments. Integer truncation and other 32-bit-specific issues may exist. **Security reports that only affect 32-bit platforms will be closed without action.** The maintainer does not have access to 32-bit environments for testing or fixing issues. CI includes basic compile checks only, not functional or security testing. + +## Main Features + +- HTTP Server/Client +- SSL/TLS support (OpenSSL, MbedTLS, wolfSSL) +- [Stream API](README-stream.md) +- [Server-Sent Events](README-sse.md) +- [WebSocket](README-websocket.md) + +## Simple examples + +### Server + +```c++ +#define CPPHTTPLIB_OPENSSL_SUPPORT +#include "path/to/httplib.h" + +// HTTP +httplib::Server svr; + +// HTTPS +httplib::SSLServer svr; + +svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) { + res.set_content("Hello World!", "text/plain"); +}); + +svr.listen("0.0.0.0", 8080); +``` + +### Client + +```c++ +#define CPPHTTPLIB_OPENSSL_SUPPORT +#include "path/to/httplib.h" + +// HTTP +httplib::Client cli("http://yhirose.github.io"); + +// HTTPS +httplib::Client cli("https://yhirose.github.io"); + +if (auto res = cli.Get("/hi")) { + res->status; + res->body; +} +``` + +## SSL/TLS Support + +cpp-httplib supports multiple TLS backends through an abstraction layer: + +| Backend | Define | Libraries | Notes | +| :------ | :----- | :-------- | :---- | +| OpenSSL | `CPPHTTPLIB_OPENSSL_SUPPORT` | `libssl`, `libcrypto` | [3.0 or later](https://www.openssl.org/policies/releasestrat.html) required | +| Mbed TLS | `CPPHTTPLIB_MBEDTLS_SUPPORT` | `libmbedtls`, `libmbedx509`, `libmbedcrypto` | 2.x, 3.x, and 4.x supported (auto-detected); 4.x renames `libmbedcrypto` to `libtfpsacrypto` | +| wolfSSL | `CPPHTTPLIB_WOLFSSL_SUPPORT` | `libwolfssl` | 5.x supported; must build with `--enable-opensslall` | + +> [!NOTE] +> **Mbed TLS / wolfSSL limitation:** `get_ca_certs()` and `get_ca_names()` only reflect CA certificates loaded via `load_ca_cert_store()`. Certificates loaded through `set_ca_cert_path()` or system certificates (`load_system_certs`) are not enumerable. + +> [!NOTE] +> **BoringSSL (best-effort):** BoringSSL builds under `CPPHTTPLIB_OPENSSL_SUPPORT` and is exercised by CI against current upstream. Because BoringSSL does not guarantee API stability, support is best-effort — breakage may occasionally land. Two known behavioral differences vs OpenSSL: (1) BoringSSL's public headers require C++14 or later, so consumers must compile accordingly; (2) hostname verification is SAN-only per RFC 6125 §6.4.4 (no CN fallback). + +```c++ +// Use either OpenSSL, Mbed TLS, or wolfSSL +#define CPPHTTPLIB_OPENSSL_SUPPORT // or CPPHTTPLIB_MBEDTLS_SUPPORT or CPPHTTPLIB_WOLFSSL_SUPPORT +#include "path/to/httplib.h" + +// Server +httplib::SSLServer svr("./cert.pem", "./key.pem"); + +// Client +httplib::Client cli("https://localhost:1234"); // scheme + host +httplib::SSLClient cli("localhost:1234"); // host +httplib::SSLClient cli("localhost", 1234); // host, port + +// Use your CA bundle +cli.set_ca_cert_path("./ca-bundle.crt"); + +// Disable cert verification +cli.enable_server_certificate_verification(false); + +// Disable host verification +cli.enable_server_hostname_verification(false); +``` + +### SSL Error Handling + +When SSL operations fail, cpp-httplib provides detailed error information through `ssl_error()` and `ssl_backend_error()`: + +- `ssl_error()` - Returns the TLS-level error code (e.g., `SSL_ERROR_SSL` for OpenSSL) +- `ssl_backend_error()` - Returns the backend-specific error code (e.g., `ERR_get_error()` for OpenSSL/wolfSSL, return value for Mbed TLS) + +```c++ +#define CPPHTTPLIB_OPENSSL_SUPPORT // or CPPHTTPLIB_MBEDTLS_SUPPORT or CPPHTTPLIB_WOLFSSL_SUPPORT +#include "path/to/httplib.h" + +httplib::Client cli("https://example.com"); + +auto res = cli.Get("/"); +if (!res) { + // Check the error type + const auto err = res.error(); + + switch (err) { + case httplib::Error::SSLConnection: + std::cout << "SSL connection failed, SSL error: " + << res.ssl_error() << std::endl; + break; + + case httplib::Error::SSLLoadingCerts: + std::cout << "SSL cert loading failed, backend error: " + << std::hex << res.ssl_backend_error() << std::endl; + break; + + case httplib::Error::SSLServerVerification: + std::cout << "SSL verification failed, verify error: " + << res.ssl_backend_error() << std::endl; + break; + + case httplib::Error::SSLServerHostnameVerification: + std::cout << "SSL hostname verification failed, verify error: " + << res.ssl_backend_error() << std::endl; + break; + + default: + std::cout << "HTTP error: " << httplib::to_string(err) << std::endl; + } +} +``` + +### Custom Certificate Verification + +You can set a custom verification callback using `tls::VerifyCallback`: + +```c++ +httplib::Client cli("https://example.com"); + +cli.set_server_certificate_verifier( + [](const httplib::tls::VerifyContext &ctx) -> bool { + std::cout << "Subject CN: " << ctx.subject_cn() << std::endl; + std::cout << "Issuer: " << ctx.issuer_name() << std::endl; + std::cout << "Depth: " << ctx.depth << std::endl; + std::cout << "Pre-verified: " << ctx.preverify_ok << std::endl; + + // Inspect SANs (Subject Alternative Names) + for (const auto &san : ctx.sans()) { + std::cout << "SAN: " << san.value << std::endl; + } + + // Return true to accept, false to reject + return ctx.preverify_ok; + }); +``` + +### Mutual TLS (mTLS) + +Regular TLS only verifies the server certificate. With mTLS, the client also presents a certificate that the server verifies. + +```c++ +// Server: pass a CA to verify client certificates against +httplib::SSLServer svr("./cert.pem", "./key.pem", "./client-ca-cert.pem"); + +// Client: present a certificate +httplib::SSLClient cli("api.example.com", 443, + "./client-cert.pem", "./client-key.pem"); +``` + +Both `SSLServer` and `SSLClient` also accept an in-memory `PemMemory` struct instead of file paths — handy when certs come from an environment variable or a secrets manager: + +```c++ +httplib::SSLServer::PemMemory server_pem{}; +server_pem.cert_pem = server_cert.data(); +server_pem.cert_pem_len = server_cert.size(); +server_pem.key_pem = server_key.data(); +server_pem.key_pem_len = server_key.size(); +server_pem.client_ca_pem = client_ca.data(); +server_pem.client_ca_pem_len = client_ca.size(); +httplib::SSLServer svr(server_pem); + +httplib::SSLClient::PemMemory client_pem{}; +client_pem.cert_pem = client_cert.data(); +client_pem.cert_pem_len = client_cert.size(); +client_pem.key_pem = client_key.data(); +client_pem.key_pem_len = client_key.size(); +httplib::SSLClient cli("api.example.com", 443, client_pem); +``` + +`httplib::ws::WebSocketClient` has the same `PemMemory` constructor for `wss://` connections. See [README-websocket.md](README-websocket.md) for details. + +### Peer Certificate Inspection + +On the server side, you can inspect the client's peer certificate from a request handler: + +```c++ +httplib::SSLServer svr("./cert.pem", "./key.pem", + "./client-ca-cert.pem"); + +svr.Get("/", [](const httplib::Request &req, httplib::Response &res) { + auto cert = req.peer_cert(); + if (cert) { + std::cout << "Client CN: " << cert.subject_cn() << std::endl; + std::cout << "Serial: " << cert.serial() << std::endl; + } + + auto sni = req.sni(); + std::cout << "SNI: " << sni << std::endl; +}); +``` + +### Platform-specific Certificate Handling + +cpp-httplib automatically integrates with the OS certificate store on macOS and Windows. This works with all TLS backends. + +| Platform | Behavior | Disable (compile time) | +| :------- | :------- | :--------------------- | +| macOS | Loads system certs from Keychain (link `CoreFoundation` and `Security` with `-framework`). Requires Apple Clang; GCC is not supported for this feature. | `CPPHTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES` | +| Windows | Verifies certs via CryptoAPI (`CertGetCertificateChain` / `CertVerifyCertificateChainPolicy`) with revocation checking | `CPPHTTPLIB_DISABLE_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE` | + +On Windows, verification can also be disabled at runtime: + +```c++ +cli.enable_windows_certificate_verification(false); +``` + +> [!NOTE] +> When using SSL, it seems impossible to avoid SIGPIPE in all cases, since on some operating systems, SIGPIPE can only be suppressed on a per-message basis, but there is no way to make the OpenSSL library do so for its internal communications. If your program needs to avoid being terminated on SIGPIPE, the only fully general way might be to set up a signal handler for SIGPIPE to handle or ignore it yourself. + +## Server + +```c++ +#include + +int main(void) +{ + using namespace httplib; + + Server svr; + + svr.Get("/hi", [](const Request& req, Response& res) { + res.set_content("Hello World!", "text/plain"); + }); + + // Match the request path against a regular expression + // and extract its captures + svr.Get(R"(/numbers/(\d+))", [&](const Request& req, Response& res) { + auto numbers = req.matches[1]; + res.set_content(numbers, "text/plain"); + }); + + // Capture the second segment of the request path as "id" path param + svr.Get("/users/:id", [&](const Request& req, Response& res) { + auto user_id = req.path_params.at("id"); + res.set_content(user_id, "text/plain"); + }); + + // Extract values from HTTP headers and URL query params + svr.Get("/body-header-param", [](const Request& req, Response& res) { + if (req.has_header("Content-Length")) { + auto val = req.get_header_value("Content-Length"); + } + if (req.has_param("key")) { + auto val = req.get_param_value("key"); + } + // Get all values for a given key (e.g., ?tag=a&tag=b) + auto values = req.get_param_values("tag"); + res.set_content(req.body, "text/plain"); + }); + + // If the handler takes time to finish, you can also poll the connection state + svr.Get("/task", [&](const Request& req, Response& res) { + const char * result = nullptr; + process.run(); // for example, starting an external process + while (result == nullptr) { + sleep(1); + if (req.is_connection_closed()) { + process.kill(); // kill the process + return; + } + result = process.stdout(); // != nullptr if the process finishes + } + res.set_content(result, "text/plain"); + }); + + svr.Get("/stop", [&](const Request& req, Response& res) { + svr.stop(); + }); + + svr.listen("localhost", 1234); +} +``` + +`Post`, `Put`, `Patch`, `Delete` and `Options` methods are also supported. + +### Custom HTTP methods + +Methods outside the built-in set are rejected with `400 Bad Request` unless a handler is registered for them with `CustomRoute`. This covers the WebDAV methods of RFC 4918, `SUBSCRIBE` and friends from UPnP, and any other extension method. + +```c++ +svr.CustomRoute("PROPFIND", "/dav/:id", [](const Request& req, Response& res) { + // The request body is available as usual + auto id = req.path_params.at("id"); + res.status = StatusCode::MultiStatus_207; + res.set_content(build_multistatus(req.body), "application/xml"); +}); + +// A content reader overload is available too +svr.CustomRoute("REPORT", "/dav/.*", + [](const Request& req, Response& res, + const ContentReader& content_reader) { + content_reader([&](const char* data, size_t data_length) { + // ... + return true; + }); + }); +``` + +Patterns work exactly as they do for `Get` and the other methods, so regular expressions and path parameters are both available. + +Note the following: + +* The method name must be a valid HTTP method token (RFC 9110) and must be registered before `listen()` is called. +* `GET`, `HEAD`, `POST`, `PUT`, `DELETE`, `CONNECT`, `OPTIONS`, `TRACE`, `PATCH` and `PRI` cannot be registered this way. Use the dedicated methods above instead. +* A rejected registration makes `is_valid()` return `false`, and `listen()` then fails rather than starting a server with a route that would never fire. +* Static file serving and WebSocket upgrades remain `GET`/`HEAD` only. +* `Allow` and the WebDAV `DAV:` header are not generated automatically. Register an `Options` handler if clients need them. + +### Bind a socket to multiple interfaces and any available port + +```cpp +int port = svr.bind_to_any_port("0.0.0.0"); +svr.listen_after_bind(); +``` + +### Port sharing and exclusive binding + +By default, the server socket enables address/port reuse: `SO_REUSEPORT` where it is available (Linux, macOS), and `SO_REUSEADDR` otherwise (Windows). A restarted server can bind again immediately, but binding to a port that another server is already listening on also succeeds, and connections are distributed between them. + +If you want `listen()` to fail when the port is already in use, replace the default socket options with `set_socket_options`: + +```cpp +svr.set_socket_options([](socket_t sock) { +#ifdef _WIN32 + httplib::set_socket_opt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, 1); +#else + httplib::set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1); +#endif +}); +``` + +> [!NOTE] +> Setting only `SO_REUSEADDR` is not enough on Windows. There, `SO_REUSEADDR` allows two sockets that both set it to bind to the same port, so use `SO_EXCLUSIVEADDRUSE` instead. + +### Static File Server + +```cpp +// Mount / to ./www directory +auto ret = svr.set_mount_point("/", "./www"); +if (!ret) { + // The specified base directory doesn't exist... +} + +// Mount /public to ./www directory +ret = svr.set_mount_point("/public", "./www"); + +// Mount /public to ./www1 and ./www2 directories +ret = svr.set_mount_point("/public", "./www1"); // 1st order to search +ret = svr.set_mount_point("/public", "./www2"); // 2nd order to search + +// Remove mount / +ret = svr.remove_mount_point("/"); + +// Remove mount /public +ret = svr.remove_mount_point("/public"); +``` + +```cpp +// User defined file extension and MIME type mappings +svr.set_file_extension_and_mimetype_mapping("cc", "text/x-c"); +svr.set_file_extension_and_mimetype_mapping("cpp", "text/x-c"); +svr.set_file_extension_and_mimetype_mapping("hh", "text/x-h"); +``` + +The following are built-in mappings: + +| Extension | MIME Type | Extension | MIME Type | +| :--------- | :-------------------------- | :--------- | :-------------------------- | +| css | text/css | mpga | audio/mpeg | +| csv | text/csv | weba | audio/webm | +| txt | text/plain | wav | audio/wave | +| vtt | text/vtt | otf | font/otf | +| html, htm | text/html | ttf | font/ttf | +| apng | image/apng | woff | font/woff | +| avif | image/avif | woff2 | font/woff2 | +| bmp | image/bmp | 7z | application/x-7z-compressed | +| gif | image/gif | atom | application/atom+xml | +| png | image/png | pdf | application/pdf | +| svg | image/svg+xml | mjs, js | text/javascript | +| webp | image/webp | json | application/json | +| ico | image/x-icon | rss | application/rss+xml | +| tif | image/tiff | tar | application/x-tar | +| tiff | image/tiff | xhtml, xht | application/xhtml+xml | +| jpeg, jpg | image/jpeg | xslt | application/xslt+xml | +| mp4 | video/mp4 | xml | application/xml | +| mpeg | video/mpeg | gz | application/gzip | +| webm | video/webm | zip | application/zip | +| mp3 | audio/mp3 | wasm | application/wasm | + +> [!WARNING] +> These static file server methods are not thread-safe. + + + +> [!NOTE] +> On POSIX systems, the static file server rejects requests that resolve (via symlinks) to a path outside the mounted base directory. Ensure that the served directory has appropriate permissions, as managing access to the served directory is the application developer's responsibility. + +### File request handler + +```cpp +// The handler is called right before the response is sent to a client +svr.set_file_request_handler([](const Request &req, Response &res) { + ... +}); +``` + +### Logging + +cpp-httplib provides separate logging capabilities for access logs and error logs, similar to web servers like Nginx and Apache. + +#### Access Logging + +Access loggers capture successful HTTP requests and responses: + +```cpp +svr.set_logger([](const httplib::Request& req, const httplib::Response& res) { + std::cout << req.method << " " << req.path << " -> " << res.status << std::endl; +}); +``` + +#### Pre-compression Logging + +You can also set a pre-compression logger to capture request/response data before compression is applied: + +```cpp +svr.set_pre_compression_logger([](const httplib::Request& req, const httplib::Response& res) { + // Log before compression - res.body contains uncompressed content + // Content-Encoding header is not yet set + your_pre_compression_logger(req, res); +}); +``` + +The pre-compression logger is only called when compression would be applied. For responses without compression, only the access logger is called. + +For a static file response (see [Static file compression](#static-file-compression)), `res.body` is empty when the logger runs. The bytes are still on disk at that point, not in memory. + +#### Error Logging + +Error loggers capture failed requests and connection issues. Unlike access loggers, error loggers only receive the Error and Request information, as errors typically occur before a meaningful Response can be generated. + +```cpp +svr.set_error_logger([](const httplib::Error& err, const httplib::Request* req) { + std::cerr << httplib::to_string(err) << " while processing request"; + if (req) { + std::cerr << ", client: " << req->get_header_value("X-Forwarded-For") + << ", request: '" << req->method << " " << req->path << " " << req->version << "'" + << ", host: " << req->get_header_value("Host"); + } + std::cerr << std::endl; +}); +``` + +### Error handler + +```cpp +svr.set_error_handler([](const auto& req, auto& res) { + auto fmt = "

Error Status: %d

"; + char buf[BUFSIZ]; + snprintf(buf, sizeof(buf), fmt, res.status); + res.set_content(buf, "text/html"); +}); +``` + +### Exception handler +The exception handler gets called if a user routing handler throws an error. + +```cpp +svr.set_exception_handler([](const auto& req, auto& res, std::exception_ptr ep) { + auto fmt = "

Error 500

%s

"; + char buf[BUFSIZ]; + try { + std::rethrow_exception(ep); + } catch (std::exception &e) { + snprintf(buf, sizeof(buf), fmt, e.what()); + } catch (...) { // See the following NOTE + snprintf(buf, sizeof(buf), fmt, "Unknown Exception"); + } + res.set_content(buf, "text/html"); + res.status = StatusCode::InternalServerError_500; +}); +``` + +> [!CAUTION] +> if you don't provide the `catch (...)` block for a rethrown exception pointer, an uncaught exception will end up causing the server crash. Be careful! + +### Pre routing handler + +```cpp +svr.set_pre_routing_handler([](const auto& req, auto& res) { + if (req.path == "/hello") { + res.set_content("world", "text/html"); + return Server::HandlerResponse::Handled; + } + return Server::HandlerResponse::Unhandled; +}); +``` + +### Post routing handler + +```cpp +svr.set_post_routing_handler([](const auto& req, auto& res) { + res.set_header("ADDITIONAL_HEADER", "value"); +}); +``` + +### Pre request handler + +The pre-request handler runs after the route has been matched (so `req.matched_route` and `req.path_params` are available) but **before the request body is read**. This means you can reject a request — for example on a failed authentication or authorization check — without forcing the server to buffer a potentially large body. + +```cpp +svr.set_pre_request_handler([](const auto& req, auto& res) { + if (req.matched_route == "/user/:user") { + auto user = req.path_params.at("user"); + if (user != "john") { + res.status = StatusCode::Forbidden_403; + res.set_content("error", "text/html"); + return Server::HandlerResponse::Handled; + } + } + return Server::HandlerResponse::Unhandled; +}); +``` + +> [!NOTE] +> Because the body has not been read yet, `req.body` and form fields parsed from the body are not available in the pre-request handler. Inspect headers, the path, query parameters, or `req.matched_route` instead. + +### Handler execution order + +`set_start_handler` runs once when the server starts. For each request, handlers run in the following order: + +``` +Request received + │ + ├─ expect_100_continue_handler (when the request has "Expect: 100-continue") + │ └─ returns a status other than 100 → stop here + │ + ├─ pre_routing_handler route not matched yet, body not read + │ └─ returns Handled → stop here + │ + ├─ file_request_handler (GET/HEAD, static file serving) + │ + ├─ route matching → req.matched_route is set + │ + ├─ pre_request_handler route matched, body NOT read yet + │ └─ returns Handled → stop here (route handler is skipped) + │ + ├─ route handler Get/Post/...; the request body is read first + │ + └─ post_routing_handler after routing completes + + On a thrown exception → exception_handler + On an error status (4xx/5xx) → error_handler +``` + +Use `pre_routing_handler` to reject a request as early as possible, before the route is known. Use `pre_request_handler` for route-specific checks, since `req.matched_route` is available and the body has not been read yet. + +For a request with `Expect: 100-continue`, the `100 Continue` response is not sent until the body is about to be read. A request rejected before that point (by `pre_routing_handler`, `pre_request_handler`, or because no route matched) gets its final response without `100 Continue`, so the client never sends the body. + +A WebSocket upgrade request that matches a route registered with `svr.WebSocket()` takes a shorter path: `pre_routing_handler`, then route matching (`req.matched_route` is set), then `pre_request_handler`, then the WebSocket handler. If either hook returns `Handled`, its response is sent as a regular HTTP response and the connection is not upgraded. Once the connection is upgraded, `post_routing_handler` does not run. + +### Response user data + +`res.user_data` is a type-safe key-value store that lets pre-routing or pre-request handlers pass arbitrary data to route handlers. + +```cpp +struct AuthContext { + std::string user_id; + std::string role; +}; + +svr.set_pre_routing_handler([](const auto& req, auto& res) { + auto token = req.get_header_value("Authorization"); + res.user_data.set("auth", AuthContext{decode_token(token)}); + return Server::HandlerResponse::Unhandled; +}); + +svr.Get("/me", [](const auto& /*req*/, auto& res) { + auto* ctx = res.user_data.get("auth"); + if (!ctx) { + res.status = StatusCode::Unauthorized_401; + return; + } + res.set_content("Hello " + ctx->user_id, "text/plain"); +}); +``` + +### Form data handling + +#### URL-encoded form data ('application/x-www-form-urlencoded') + +```cpp +svr.Post("/form", [&](const auto& req, auto& res) { + // URL query parameters and form-encoded data are accessible via req.params + std::string username = req.get_param_value("username"); + std::string password = req.get_param_value("password"); + + // Handle multiple values with same name + auto interests = req.get_param_values("interests"); + + // Check existence + if (req.has_param("newsletter")) { + // Handle newsletter subscription + } +}); +``` + +#### 'multipart/form-data' POST data + +```cpp +svr.Post("/multipart", [&](const Request& req, Response& res) { + // Access text fields (from form inputs without files) + std::string username = req.form.get_field("username"); + std::string bio = req.form.get_field("bio"); + + // Access uploaded files + if (req.form.has_file("avatar")) { + const auto& file = req.form.get_file("avatar"); + std::cout << "Uploaded file: " << file.filename + << " (" << file.content_type << ") - " + << file.content.size() << " bytes" << std::endl; + + // Access additional headers if needed + for (const auto& header : file.headers) { + std::cout << "Header: " << header.first << " = " << header.second << std::endl; + } + + // IMPORTANT: file.filename is an untrusted value from the client. + // Always sanitize to prevent path traversal attacks. + auto safe_name = httplib::sanitize_filename(file.filename); + if (safe_name.empty()) { + res.status = StatusCode::BadRequest_400; + res.set_content("Invalid filename", "text/plain"); + return; + } + + // Save to disk + std::ofstream ofs(upload_dir + "/" + safe_name, std::ios::binary); + ofs << file.content; + } + + // Handle multiple values with same name + auto tags = req.form.get_fields("tags"); // e.g., multiple checkboxes + for (const auto& tag : tags) { + std::cout << "Tag: " << tag << std::endl; + } + + auto documents = req.form.get_files("documents"); // multiple file upload + for (const auto& doc : documents) { + std::cout << "Document: " << doc.filename + << " (" << doc.content.size() << " bytes)" << std::endl; + } + + // Check existence before accessing + if (req.form.has_field("newsletter")) { + std::cout << "Newsletter subscription: " << req.form.get_field("newsletter") << std::endl; + } + + // Get counts for validation + if (req.form.get_field_count("tags") > 5) { + res.status = StatusCode::BadRequest_400; + res.set_content("Too many tags", "text/plain"); + return; + } + + // Summary + std::cout << "Received " << req.form.fields.size() << " text fields and " + << req.form.files.size() << " files" << std::endl; + + res.set_content("Upload successful", "text/plain"); +}); +``` + +#### Filename Sanitization + +`file.filename` in multipart uploads is an untrusted value from the client. Always sanitize before using it in file paths: + +```cpp +auto safe = httplib::sanitize_filename(file.filename); +``` + +This function strips path separators (`/`, `\`), null bytes, leading/trailing whitespace, and rejects `.` and `..`. Returns an empty string if the filename is unsafe. + +### Receive content with a content receiver + +```cpp +svr.Post("/content_receiver", + [&](const Request &req, Response &res, const ContentReader &content_reader) { + if (req.is_multipart_form_data()) { + // NOTE: `content_reader` is blocking until every form data field is read + // This approach allows streaming processing of large files + std::vector items; + content_reader( + [&](const FormData &item) { + items.push_back(item); + return true; + }, + [&](const char *data, size_t data_length) { + items.back().content.append(data, data_length); + return true; + }); + + // Process the received items + for (const auto& item : items) { + if (item.filename.empty()) { + // Text field + std::cout << "Field: " << item.name << " = " << item.content << std::endl; + } else { + // File + std::cout << "File: " << item.name << " (" << item.filename << ") - " + << item.content.size() << " bytes" << std::endl; + } + } + } else { + std::string body; + content_reader([&](const char *data, size_t data_length) { + body.append(data, data_length); + return true; + }); + } + }); +``` + +`CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT` (default 1024) caps the number of +form-data parts only on the buffered path, where every part is accumulated into +`req.form`. The content receiver keeps nothing, so the cap does not apply here. +If your handler needs an upper bound on the number of parts, count them yourself +and return `false` from the callback to stop the parser. + +### Send content with the content provider + +```cpp +const size_t DATA_CHUNK_SIZE = 4; + +svr.Get("/stream", [&](const Request &req, Response &res) { + auto data = new std::string("abcdefg"); + + res.set_content_provider( + data->size(), // Content length + "text/plain", // Content type + [&, data](size_t offset, size_t length, DataSink &sink) { + const auto &d = *data; + sink.write(&d[offset], std::min(length, DATA_CHUNK_SIZE)); + return true; // return 'false' if you want to cancel the process. + }, + [data](bool success) { delete data; }); +}); +``` + +Without content length: + +```cpp +svr.Get("/stream", [&](const Request &req, Response &res) { + res.set_content_provider( + "text/plain", // Content type + [&](size_t offset, DataSink &sink) { + if (/* there is still data */) { + std::vector data; + // prepare data... + sink.write(data.data(), data.size()); + } else { + sink.done(); // No more data + } + return true; // return 'false' if you want to cancel the process. + }); +}); +``` + +### Chunked transfer encoding + +```cpp +svr.Get("/chunked", [&](const Request& req, Response& res) { + res.set_chunked_content_provider( + "text/plain", + [](size_t offset, DataSink &sink) { + sink.write("123", 3); + sink.write("345", 3); + sink.write("789", 3); + sink.done(); // No more data + return true; // return 'false' if you want to cancel the process. + } + ); +}); +``` + +With trailer: + +```cpp +svr.Get("/chunked", [&](const Request& req, Response& res) { + res.set_header("Trailer", "Dummy1, Dummy2"); + res.set_chunked_content_provider( + "text/plain", + [](size_t offset, DataSink &sink) { + sink.write("123", 3); + sink.write("345", 3); + sink.write("789", 3); + sink.done_with_trailer({ + {"Dummy1", "DummyVal1"}, + {"Dummy2", "DummyVal2"} + }); + return true; + } + ); +}); +``` + +### Send file content + +```cpp +svr.Get("/content", [&](const Request &req, Response &res) { + res.set_file_content("./path/to/content.html"); +}); + +svr.Get("/content", [&](const Request &req, Response &res) { + res.set_file_content("./path/to/content", "text/html"); +}); +``` + +### 'Expect: 100-continue' handler + +By default, the server accepts an `Expect: 100-continue` header and sends a `100 Continue` response when it starts reading the request body. If the request is answered without reading the body, `100 Continue` is not sent and the connection is closed after the response. + +The handler runs before `pre_routing_handler`. Returning `100` lets the request proceed; returning any other status sends that status as the final response and closes the connection. + +```cpp +// Send a '417 Expectation Failed' response. +svr.set_expect_100_continue_handler([](const Request &req, Response &res) { + return StatusCode::ExpectationFailed_417; +}); +``` + +```cpp +// Send a final status without reading the message body. +svr.set_expect_100_continue_handler([](const Request &req, Response &res) { + return res.status = StatusCode::Unauthorized_401; +}); +``` + +### Keep-Alive connection + +```cpp +svr.set_keep_alive_max_count(2); // Default is 100 +svr.set_keep_alive_timeout(10); // Default is 5 +``` + +### Timeout + +```c++ +svr.set_read_timeout(5, 0); // 5 seconds +svr.set_write_timeout(5, 0); // 5 seconds +svr.set_idle_interval(0, 100000); // 100 milliseconds + +// std::chrono is also supported +svr.set_read_timeout(std::chrono::seconds(5)); +svr.set_keep_alive_timeout(std::chrono::seconds(10)); +``` + +### Set maximum payload length for reading a request body + +```c++ +svr.set_payload_max_length(1024 * 1024 * 512); // 512MB +``` + +> [!NOTE] +> When the request body content type is 'www-form-urlencoded', the actual payload length shouldn't exceed `CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH`. + +### Server-Sent Events + +Please see [Server example](https://github.com/yhirose/cpp-httplib/blob/master/example/ssesvr.cc) and [Client example](https://github.com/yhirose/cpp-httplib/blob/master/example/ssecli.cc). + +### Default thread pool support + +`ThreadPool` is used as the **default** task queue, with dynamic scaling support. By default, it maintains a base thread count of 8 or `std::thread::hardware_concurrency() - 1` (whichever is greater), and can scale up to 4x that count under load. You can change these with `CPPHTTPLIB_THREAD_POOL_COUNT` and `CPPHTTPLIB_THREAD_POOL_MAX_COUNT`. + +When all threads are busy and a new task arrives, a temporary thread is spawned (up to the maximum). When a dynamic thread finishes its task and the queue is empty, or after an idle timeout, it exits automatically. The idle timeout defaults to 3 seconds, configurable via `CPPHTTPLIB_THREAD_POOL_IDLE_TIMEOUT`. + +If you want to set the thread counts at runtime: + +```cpp +svr.new_task_queue = [] { return new ThreadPool(/*base_threads=*/8, /*max_threads=*/64); }; +``` + +#### Max queued requests + +You can also provide an optional parameter to limit the maximum number +of pending requests, i.e. requests `accept()`ed by the listener but +still waiting to be serviced by worker threads. + +```cpp +svr.new_task_queue = [] { return new ThreadPool(/*base_threads=*/12, /*max_threads=*/0, /*max_queued_requests=*/18); }; +``` + +Default limit is 0 (unlimited). Once the limit is reached, the listener +will shutdown the client connection. + +#### Idle timeout for dynamic threads + +The idle timeout for dynamic threads can also be set at runtime via the +fourth parameter (in seconds): + +```cpp +svr.new_task_queue = [] { return new ThreadPool(/*base_threads=*/8, /*max_threads=*/64, /*max_queued_requests=*/0, /*idle_timeout_sec=*/10); }; +``` + +### Override the default thread pool with yours + +You can supply your own thread pool implementation according to your need. + +```cpp +class YourThreadPoolTaskQueue : public TaskQueue { +public: + YourThreadPoolTaskQueue(size_t n) { + pool_.start_with_thread_count(n); + } + + virtual bool enqueue(std::function fn) override { + /* Return true if the task was actually enqueued, or false + * if the caller must drop the corresponding connection. */ + return pool_.enqueue(fn); + } + + virtual void shutdown() override { + pool_.shutdown_gracefully(); + } + +private: + YourThreadPool pool_; +}; + +svr.new_task_queue = [] { + return new YourThreadPoolTaskQueue(12); +}; +``` + +## Client + +```c++ +#include +#include + +int main(void) +{ + httplib::Client cli("localhost", 1234); + + if (auto res = cli.Get("/hi")) { + if (res->status == StatusCode::OK_200) { + std::cout << res->body << std::endl; + } + } else { + auto err = res.error(); + std::cout << "HTTP error: " << httplib::to_string(err) << std::endl; + } +} +``` + +> [!TIP] +> Constructor with scheme-host-port string is now supported! + +```c++ +httplib::Client cli("localhost"); +httplib::Client cli("localhost:8080"); +httplib::Client cli("http://localhost"); +httplib::Client cli("http://localhost:8080"); +httplib::Client cli("https://localhost"); +httplib::SSLClient cli("localhost"); +``` + +### Error code + +Here is the list of errors from `Result::error()`. + +```c++ +enum class Error { + Success = 0, + Unknown, + Connection, + BindIPAddress, + Read, + Write, + ExceedRedirectCount, + Canceled, + SSLConnection, + SSLLoadingCerts, + SSLServerVerification, + SSLServerHostnameVerification, + UnsupportedMultipartBoundaryChars, + Compression, + ConnectionTimeout, + ProxyConnection, + ConnectionClosed, + Timeout, + ResourceExhaustion, + TooManyFormDataFiles, + ExceedMaxPayloadSize, + ExceedUriMaxLength, + ExceedMaxSocketDescriptorCount, + InvalidRequestLine, + InvalidHTTPMethod, + InvalidHTTPVersion, + InvalidHeaders, + MultipartParsing, + OpenFile, + Listen, + GetSockName, + UnsupportedAddressFamily, + HTTPParsing, + InvalidRangeHeader, + UnsupportedContentEncoding, +}; +``` + +### Client Logging + +#### Access Logging + +```cpp +cli.set_logger([](const httplib::Request& req, const httplib::Response& res) { + auto duration = std::chrono::duration_cast( + std::chrono::steady_clock::now() - start_time).count(); + std::cout << "✓ " << req.method << " " << req.path + << " -> " << res.status << " (" << res.body.size() << " bytes, " + << duration << "ms)" << std::endl; +}); +``` + +#### Error Logging + +```cpp +cli.set_error_logger([](const httplib::Error& err, const httplib::Request* req) { + std::cerr << "✗ "; + if (req) { + std::cerr << req->method << " " << req->path << " "; + } + std::cerr << "failed: " << httplib::to_string(err); + + // Add specific guidance based on error type + switch (err) { + case httplib::Error::Connection: + std::cerr << " (verify server is running and reachable)"; + break; + case httplib::Error::SSLConnection: + std::cerr << " (check SSL certificate and TLS configuration)"; + break; + case httplib::Error::ConnectionTimeout: + std::cerr << " (increase timeout or check network latency)"; + break; + case httplib::Error::Read: + std::cerr << " (server may have closed connection prematurely)"; + break; + default: + break; + } + std::cerr << std::endl; +}); +``` + +### GET with HTTP headers + +```c++ +httplib::Headers headers = { + { "Hello", "World!" } +}; +auto res = cli.Get("/hi", headers); +``` + +or + +```c++ +auto res = cli.Get("/hi", httplib::Headers{{"Hello", "World!"}}); +``` + +or + +```c++ +cli.set_default_headers({ + { "Hello", "World!" } +}); +auto res = cli.Get("/hi"); +``` + +### POST + +```c++ +res = cli.Post("/post", "text", "text/plain"); +res = cli.Post("/person", "name=john1¬e=coder", "application/x-www-form-urlencoded"); +``` + +### POST with parameters + +```c++ +httplib::Params params; +params.emplace("name", "john"); +params.emplace("note", "coder"); + +auto res = cli.Post("/post", params); +``` + or + +```c++ +httplib::Params params{ + { "name", "john" }, + { "note", "coder" } +}; + +auto res = cli.Post("/post", params); +``` + +### POST with Multipart Form Data + +```c++ +httplib::UploadFormDataItems items = { + { "text1", "text default", "", "" }, + { "text2", "aωb", "", "" }, + { "file1", "h\ne\n\nl\nl\no\n", "hello.txt", "text/plain" }, + { "file2", "{\n \"world\", true\n}\n", "world.json", "application/json" }, + { "file3", "", "", "application/octet-stream" }, +}; + +auto res = cli.Post("/multipart", items); +``` + +To upload files from disk without loading them entirely into memory, use `make_file_provider`. The file is sent with chunked transfer encoding. + +```cpp +httplib::FormDataProviderItems providers = { + httplib::make_file_provider("file1", "/path/to/large.bin", "large.bin", "application/octet-stream"), + httplib::make_file_provider("avatar", "/path/to/photo.jpg", "photo.jpg", "image/jpeg"), +}; + +auto res = cli.Post("/upload", {}, {}, providers); +``` + +### POST with a file body + +To POST a file as a raw binary body with `Content-Length`, use `make_file_body`. + +```cpp +auto [size, provider] = httplib::make_file_body("/path/to/data.bin"); +auto res = cli.Post("/upload", size, provider, "application/octet-stream"); +``` + +### PUT + +```c++ +res = cli.Put("/resource/foo", "text", "text/plain"); +``` + +### PATCH + +```c++ +res = cli.Patch("/resource/foo", "text", "text/plain"); +``` + +### DELETE + +```c++ +res = cli.Delete("/resource/foo"); +``` + +### OPTIONS + +```c++ +res = cli.Options("*"); +res = cli.Options("/resource/foo"); +``` + +### Timeout + +```c++ +cli.set_connection_timeout(0, 300000); // 300 milliseconds +cli.set_read_timeout(5, 0); // 5 seconds +cli.set_write_timeout(5, 0); // 5 seconds + +// This method works the same as curl's `--max-time` option +cli.set_max_timeout(5000); // 5 seconds + +// std::chrono is also supported +cli.set_connection_timeout(std::chrono::milliseconds(300)); +cli.set_read_timeout(std::chrono::seconds(5)); +cli.set_write_timeout(std::chrono::seconds(5)); +cli.set_max_timeout(std::chrono::seconds(5)); +``` + +### Set maximum payload length for reading a response body + +```c++ +cli.set_payload_max_length(1024 * 1024 * 512); // 512MB +``` + +### Receive content with a content receiver + +```c++ +std::string body; + +auto res = cli.Get("/large-data", + [&](const char *data, size_t data_length) { + body.append(data, data_length); + return true; + }); +``` + +```cpp +std::string body; + +auto res = cli.Get( + "/stream", Headers(), + [&](const Response &response) { + EXPECT_EQ(StatusCode::OK_200, response.status); + return true; // return 'false' if you want to cancel the request. + }, + [&](const char *data, size_t data_length) { + body.append(data, data_length); + return true; // return 'false' if you want to cancel the request. + }); +``` + +### Send content with a content provider + +```cpp +std::string body = ...; + +auto res = cli.Post( + "/stream", body.size(), + [](size_t offset, size_t length, DataSink &sink) { + sink.write(body.data() + offset, length); + return true; // return 'false' if you want to cancel the request. + }, + "text/plain"); +``` + +### Chunked transfer encoding + +```cpp +auto res = cli.Post( + "/stream", + [](size_t offset, DataSink &sink) { + sink.os << "chunked data 1"; + sink.os << "chunked data 2"; + sink.os << "chunked data 3"; + sink.done(); + return true; // return 'false' if you want to cancel the request. + }, + "text/plain"); +``` + +### With Progress Callback + +```cpp +httplib::Client cli(url, port); + +// prints: 0 / 000 bytes => 50% complete +auto res = cli.Get("/", [](size_t len, size_t total) { + printf("%lld / %lld bytes => %d%% complete\n", + len, total, + (int)(len*100/total)); + return true; // return 'false' if you want to cancel the request. +} +); +``` + +![progress](https://user-images.githubusercontent.com/236374/33138910-495c4ecc-cf86-11e7-8693-2fc6d09615c4.gif) + +### Authentication + +```cpp +// Basic Authentication +cli.set_basic_auth("user", "pass"); + +// Digest Authentication +cli.set_digest_auth("user", "pass"); + +// Bearer Token Authentication +cli.set_bearer_token_auth("token"); +``` + +> [!NOTE] +> OpenSSL is required for Digest Authentication. + +### Proxy server support + +```cpp +cli.set_proxy("host", port); + +// Basic Authentication +cli.set_proxy_basic_auth("user", "pass"); + +// Digest Authentication +cli.set_proxy_digest_auth("user", "pass"); + +// Bearer Token Authentication +cli.set_proxy_bearer_token_auth("pass"); +``` + +> [!NOTE] +> OpenSSL is required for Digest Authentication. + +#### Bypass the proxy for specific hosts (`NO_PROXY`) + +```cpp +cli.set_no_proxy({"internal.corp", "10.0.0.0/8", "*.dev.local"}); +``` + +Each pattern is `*`, a hostname suffix, an IP literal, or a CIDR block. +Hostname matching is case-insensitive with a dot-boundary rule. See the +[NO_PROXY cookbook](https://yhirose.github.io/cpp-httplib/en/cookbook/c16-proxy) +for details and for reading the variable from the environment. + +### Range + +```cpp +httplib::Client cli("httpcan.org"); + +auto res = cli.Get("/range/32", httplib::Headers{ + httplib::make_range_header({{1, 10}}) // 'Range: bytes=1-10' +}); +// res->status should be 206. +// res->body should be "bcdefghijk". +``` + +```cpp +httplib::make_range_header({{1, 10}, {20, -1}}) // 'Range: bytes=1-10, 20-' +httplib::make_range_header({{100, 199}, {500, 599}}) // 'Range: bytes=100-199, 500-599' +httplib::make_range_header({{0, 0}, {-1, 1}}) // 'Range: bytes=0-0, -1' +``` + +### Keep-Alive connection + +```cpp +httplib::Client cli("localhost", 1234); + +cli.Get("/hello"); // with "Connection: close" + +cli.set_keep_alive(true); +cli.Get("/world"); + +cli.set_keep_alive(false); +cli.Get("/last-request"); // with "Connection: close" +``` + +### Redirect + +```cpp +httplib::Client cli("yahoo.com"); + +auto res = cli.Get("/"); +res->status; // 301 + +cli.set_follow_location(true); +res = cli.Get("/"); +res->status; // 200 +``` + +### Use a specific network interface + +> [!NOTE] +> This feature is not available on Windows, yet. + +```cpp +cli.set_interface("eth0"); // Interface name, IP address or host name +``` + +The same method is available on `httplib::ws::WebSocketClient`. + +### Override the connection target for a hostname + +`set_hostname_addr_map` redirects where the socket connects, without changing +the identity of the request. The hostname the client was constructed with keeps +supplying the `Host` header, the SNI, and the name that the server certificate +is verified against, so this is a connection-level override only, not a way to +talk to a different origin. + +```cpp +httplib::Client cli("https://example.com"); + +// Connect to this IP address instead of resolving "example.com" +cli.set_hostname_addr_map({{"example.com", "192.168.1.10"}}); +``` + +A mapped value may be an IP literal or another hostname. An IP literal is used +as-is; anything else is resolved as a name, so a host that is only reachable +under a different name works too: + +```cpp +cli.set_hostname_addr_map({{"example.com", "internal.example.lan"}}); +``` + +An empty value is ignored, leaving the original hostname as the connection +target. + +The same method is available on `httplib::ws::WebSocketClient`. + +### Automatic Path Encoding + +The client automatically encodes special characters in URL paths by default: + +```cpp +httplib::Client cli("https://example.com"); + +// Automatic path encoding (default behavior) +cli.set_path_encode(true); +auto res = cli.Get("/path with spaces/file.txt"); // Automatically encodes spaces + +// Disable automatic path encoding +cli.set_path_encode(false); +auto res = cli.Get("/already%20encoded/path"); // Use pre-encoded paths +``` + +- `set_path_encode(bool on)` - Controls automatic encoding of special characters in URL paths + - `true` (default): Automatically encodes spaces, plus signs, newlines, and other special characters + - `false`: Sends paths as-is without encoding (useful for pre-encoded URLs) + +### Performance Note for Local Connections + +> [!WARNING] +> On Windows systems with improperly configured IPv6 settings, using "localhost" as the hostname may cause significant connection delays (up to 2 seconds per request) due to DNS resolution issues. This affects both client and server operations. For better performance when connecting to local services, use "127.0.0.1" instead of "localhost". +> +> See: https://github.com/yhirose/cpp-httplib/issues/366#issuecomment-593004264 + +```cpp +// May be slower on Windows due to DNS resolution delays +httplib::Client cli("localhost", 8080); +httplib::Server svr; +svr.listen("localhost", 8080); + +// Faster alternative for local connections +httplib::Client cli("127.0.0.1", 8080); +httplib::Server svr; +svr.listen("127.0.0.1", 8080); +``` + +## Ordered Headers, Query Parameters, and Form Data + +`Headers`, `Params`, `FormFields`, and `FormFiles` preserve the order entries were received (for a parsed request) or inserted (for one you build yourself). Earlier versions stored these in `std::multimap` or `std::unordered_multimap`, which either sorted entries by key or gave no ordering guarantee at all for repeated keys. RFC 9110 §5.3 and RFC 7578 §5.2 both require the original order to be preserved, so this is now guaranteed rather than incidental. + +```c++ +// A request with two Accept-Encoding lines... +// Accept-Encoding: gzip +// Accept-Encoding: br +// ...visits "gzip" before "br", not the other way around. +for (auto it = req.headers.equal_range("Accept-Encoding").first; + it != req.headers.end(); ++it) { + std::cout << it->second << std::endl; +} + +// get_header_value(key, id) reaches a specific one directly. +auto second = req.get_header_value("Accept-Encoding", 1); // "br" +``` + +`Headers` matches field names case-insensitively, as before. `Params`, `FormFields`, and `FormFiles` are case-sensitive. + +> [!NOTE] +> Iterators on these containers follow `std::vector` rules: inserting a new entry invalidates existing iterators. Code that keeps an iterator across a call to `insert()`/`emplace()` needs to re-fetch it afterward. + +## Payload Limit + +The maximum payload body size is limited to 100MB by default for both server and client. You can change it with `set_payload_max_length()` or by defining `CPPHTTPLIB_PAYLOAD_MAX_LENGTH` at compile time. Setting it to `0` disables the limit entirely. + +## Compression + +The server can apply compression to the following MIME type contents: + +- all text types except text/event-stream +- image/svg+xml +- application/javascript +- application/json +- application/xml +- application/protobuf +- application/xhtml+xml + +A response that already carries `Content-Encoding` is sent as it is. A handler serving content it encoded itself, an asset compressed at build time for instance, keeps its own coding and its own bytes: + +```c++ +svr.Get("/app.js", [](const Request & /*req*/, Response &res) { + res.set_header("Content-Encoding", "gzip"); + res.set_content(gzipped_asset, "application/javascript"); +}); +``` + +This holds for every kind of response, including the file-backed ones below. + +`Vary: Accept-Encoding` is added only to responses the server encoded itself. A handler that chooses between an encoded and an identity representation by reading `Accept-Encoding` should set the field itself, so that shared caches keep the two apart. + +### Static file compression + +Responses served from a file, whether through `set_mount_point()` or `Response::set_file_content()`, are sent as is by default. Turn compression on for them with: + +```c++ +svr.set_static_file_compression(true); +``` + +Only files within a size range are compressed, and both ends of it can be moved: + +```c++ +svr.set_static_file_compression_min_length(512); +svr.set_static_file_compression_max_length(1024 * 1024); +``` + +The lower bound defaults to 1400 bytes. A response that already fits in a single 1500-byte MTU is not delivered any faster for being smaller, and a file of a few bytes comes back larger than it went in, since gzip's header and trailer outweigh what deflate saves. `0` compresses everything down to a single byte, and `CPPHTTPLIB_STATIC_FILE_COMPRESSION_MIN_LENGTH` sets the default at compile time. An empty file is never compressed regardless. + +The upper bound defaults to 4MB, and exists for a different reason: the file is compressed per request, and the compressed bytes are held in memory until the response has been written, so the peak cost scales with the number of requests in flight. It is a bound on what one request can cost, not a statement about how well large files compress, which is why raising it is reasonable when the files are known and the traffic is not. `0` removes the limit, and `CPPHTTPLIB_STATIC_FILE_COMPRESSION_MAX_LENGTH` sets the default at compile time. + +A compressed response keeps its `Content-Length`, so `HEAD` still reports the size a `GET` would return. Two details are worth knowing: + +- Range requests are answered from the uncompressed representation, so `Content-Range` keeps naming the file's own bytes. +- The `ETag` carries the coding it belongs to (`W/"...-gzip"`), so a client that cached the compressed form revalidates against the right validator. + +Content providers registered with `set_content_provider()` are not covered. Feeding one through a compressor would hold each write back until the compressor's window filled, which breaks providers that produce their body incrementally. Use `set_chunked_content_provider()` to compress a generated body. + +### Zlib Support + +'gzip' compression is available with `CPPHTTPLIB_ZLIB_SUPPORT`. `libz` should be linked. + +### Brotli Support + +Brotli compression is available with `CPPHTTPLIB_BROTLI_SUPPORT`. Necessary libraries should be linked. +Please see https://github.com/google/brotli for more detail. + +### Zstd Support + +Zstd compression is available with `CPPHTTPLIB_ZSTD_SUPPORT`. Necessary libraries should be linked. +Please see https://github.com/facebook/zstd for more detail. + +### Default `Accept-Encoding` value + +The default `Accept-Encoding` value contains all possible compression types. So, the following two examples are same. + +```c++ +res = cli.Get("/resource/foo"); +res = cli.Get("/resource/foo", httplib::Headers{{"Accept-Encoding", "br, gzip, deflate, zstd"}}); +``` + +If we don't want a response without compression, we have to set `Accept-Encoding` to an empty string. This behavior is similar to curl. + +```c++ +res = cli.Get("/resource/foo", httplib::Headers{{"Accept-Encoding", ""}}); +``` + +### Compress request body on client + +```c++ +cli.set_compress(true); +res = cli.Post("/resource/foo", "...", "text/plain"); +``` + +### Compress response body on client + +```c++ +cli.set_decompress(false); +res = cli.Get("/resource/foo"); +res->body; // Compressed data + +``` + +Unix Domain Socket Support +-------------------------- + + +```c++ +// Server +httplib::Server svr; +svr.set_address_family(AF_UNIX).listen("./my-socket.sock", 80); + +// Client +httplib::Client cli("./my-socket.sock"); +cli.set_address_family(AF_UNIX); +``` + +"my-socket.sock" can be a relative path or an absolute path. Your application must have the appropriate permissions for the path. You can also use an abstract socket address on Linux. To use an abstract socket address, prepend a null byte ('\x00') to the path. + +This library automatically sets the Host header to "localhost" for Unix socket connections, similar to curl's behavior: + + +URI Encoding/Decoding Utilities +------------------------------- + +cpp-httplib provides utility functions for URI encoding and decoding: + +```cpp +#include + +std::string url = "https://example.com/search?q=hello world"; +std::string encoded = httplib::encode_uri(url); +std::string decoded = httplib::decode_uri(encoded); + +std::string param = "hello world"; +std::string encoded_component = httplib::encode_uri_component(param); +std::string decoded_component = httplib::decode_uri_component(encoded_component); +``` + +### Functions + +- `encode_uri(const std::string &value)` - Encodes a full URI, preserving reserved characters like `://`, `?`, `&`, `=` +- `decode_uri(const std::string &value)` - Decodes a URI-encoded string +- `encode_uri_component(const std::string &value)` - Encodes a URI component (query parameter, path segment), encoding all reserved characters +- `decode_uri_component(const std::string &value)` - Decodes a URI component + +Use `encode_uri()` for full URLs and `encode_uri_component()` for individual query parameters or path segments. + +## Stream API + +Process large responses without loading everything into memory. + +```c++ +httplib::Client cli("localhost", 8080); +cli.set_follow_location(true); +... + +auto result = httplib::stream::Get(cli, "/large-file"); +if (result) { + while (result.next()) { + process(result.data(), result.size()); // Process each chunk as it arrives + } +} + +// Or read the entire body at once +auto result2 = httplib::stream::Get(cli, "/file"); +if (result2) { + std::string body = result2.read_all(); +} +``` + +All HTTP methods are supported: `stream::Get`, `Post`, `Put`, `Patch`, `Delete`, `Head`, `Options`. + +See [README-stream.md](README-stream.md) for more details. + +## SSE Client + +```cpp +#include + +int main() { + httplib::Client cli("http://localhost:8080"); + httplib::sse::SSEClient sse(cli, "/events"); + + sse.on_message([](const httplib::sse::SSEMessage &msg) { + std::cout << "Event: " << msg.event << std::endl; + std::cout << "Data: " << msg.data << std::endl; + }); + + sse.start(); // Blocking, with auto-reconnect + return 0; +} +``` + +See [README-sse.md](README-sse.md) for more details. + +## WebSocket + +```cpp +// Server +httplib::Server svr; + +svr.WebSocket("/ws", [](const httplib::Request &req, httplib::ws::WebSocket &ws) { + std::string msg; + while (ws.read(msg)) { + ws.send("Echo: " + msg); + } +}); + +svr.listen("localhost", 8080); +``` + +```cpp +// Client +httplib::ws::WebSocketClient ws("ws://localhost:8080/ws"); + +if (ws.connect()) { + ws.send("Hello, WebSocket!"); + + std::string msg; + if (ws.read(msg)) { + std::cout << "Received: " << msg << std::endl; + } + + ws.close(); +} +``` + +SSL is also supported via `wss://` scheme (e.g. `WebSocketClient("wss://example.com/ws")`). Subprotocol negotiation (`Sec-WebSocket-Protocol`) is supported via `SubProtocolSelector` callback. + +> **Note:** WebSocket connections occupy a thread for their entire lifetime (plus an additional thread per connection for heartbeat pings). This thread-per-connection model is intended for small- to mid-scale workloads; large numbers of simultaneous WebSocket connections are outside the design target of this library. If you expect many concurrent WebSocket clients, configure a dynamic thread pool (`svr.new_task_queue = [] { return new ThreadPool(8, 64); };`) and measure carefully. + +> **WebSocket extensions are not supported.** `permessage-deflate` and other RFC 6455 extensions are not implemented. If a client proposes them via `Sec-WebSocket-Extensions`, the server silently declines them in its handshake response. + +> **Unresponsive-peer detection.** Heartbeat pings also serve as a liveness probe when `set_websocket_max_missed_pongs(n)` is set: if the client sends `n` consecutive pings without receiving a pong, it will close the connection. Disabled by default (`0`). + +See [README-websocket.md](README-websocket.md) for more details. + +## Socket Option Utility + +`set_socket_opt` is a convenience wrapper around `setsockopt` for setting integer socket options: + +```cpp +auto sock = svr.socket(); +httplib::set_socket_opt(sock, IPPROTO_TCP, TCP_NODELAY, 1); +``` + +> [!TIP] +> For most use cases, prefer `set_tcp_nodelay(true)` or `set_socket_options(callback)` on the Server/Client instead of calling `set_socket_opt` directly. + +## Split httplib.h into .h and .cc + +```console +$ ./split.py -h +usage: split.py [-h] [-e EXTENSION] [-o OUT] + +This script splits httplib.h into .h and .cc parts. + +optional arguments: + -h, --help show this help message and exit + -e EXTENSION, --extension EXTENSION + extension of the implementation file (default: cc) + -o OUT, --out OUT where to write the files (default: out) + +$ ./split.py +Wrote out/httplib.h and out/httplib.cc +``` + +## Dockerfile for Static HTTP Server + +Dockerfile for static HTTP server is available. Port number of this HTTP server is 80, and it serves static files from `/html` directory in the container. + +```bash +> docker build -t cpp-httplib-server . +... + +> docker run --rm -it -p 8080:80 -v ./docker/html:/html cpp-httplib-server +Serving HTTP on 0.0.0.0 port 80 ... +192.168.65.1 - - [31/Aug/2024:21:33:56 +0000] "GET / HTTP/1.1" 200 599 "-" "curl/8.7.1" +192.168.65.1 - - [31/Aug/2024:21:34:26 +0000] "GET / HTTP/1.1" 200 599 "-" "Mozilla/5.0 ..." +192.168.65.1 - - [31/Aug/2024:21:34:26 +0000] "GET /favicon.ico HTTP/1.1" 404 152 "-" "Mozilla/5.0 ..." +``` + +From Docker Hub + +```bash +> docker run --rm -it -p 8080:80 -v ./docker/html:/html yhirose4dockerhub/cpp-httplib-server +Serving HTTP on 0.0.0.0 port 80 ... +192.168.65.1 - - [31/Aug/2024:21:33:56 +0000] "GET / HTTP/1.1" 200 599 "-" "curl/8.7.1" +192.168.65.1 - - [31/Aug/2024:21:34:26 +0000] "GET / HTTP/1.1" 200 599 "-" "Mozilla/5.0 ..." +192.168.65.1 - - [31/Aug/2024:21:34:26 +0000] "GET /favicon.ico HTTP/1.1" 404 152 "-" "Mozilla/5.0 ..." +``` + +NOTE +---- + +### Regular Expression Stack Overflow + +> [!CAUTION] +> When using complex regex patterns in route handlers, be aware that certain patterns may cause stack overflow during pattern matching. This is a known issue with `std::regex` implementations and affects the `dispatch_request()` method. +> +> ```cpp +> // This pattern can cause stack overflow with large input +> svr.Get(".*", handler); +> ``` +> +> Consider using simpler patterns or path parameters to avoid this issue: +> +> ```cpp +> // Safer alternatives +> svr.Get("/users/:id", handler); // Path parameters +> svr.Get(R"(/api/v\d+/.*)", handler); // More specific patterns +> ``` + +### g++ + +g++ 4.8 and below cannot build this library since `` in the versions are [broken](https://stackoverflow.com/questions/12530406/is-gcc-4-8-or-earlier-buggy-about-regular-expressions). + +### Windows + +Include `httplib.h` before `Windows.h` or include `Windows.h` by defining `WIN32_LEAN_AND_MEAN` beforehand. + +```cpp +#include +#include +``` + +```cpp +#define WIN32_LEAN_AND_MEAN +#include +#include +``` + +> [!NOTE] +> cpp-httplib officially supports only the latest Visual Studio. It might work with former versions of Visual Studio, but I can no longer verify it. Pull requests are always welcome for the older versions of Visual Studio unless they break the C++11 conformance. + +> [!NOTE] +> Windows 8 or lower, Visual Studio 2015 or lower, and Cygwin and MSYS2 including MinGW are neither supported nor tested. + +## License + +MIT license (© 2026 Yuji Hirose) + +## Special Thanks To + +[These folks](https://github.com/yhirose/cpp-httplib/graphs/contributors) made great contributions to polish this library to totally another level from a simple toy! diff --git a/libs/cpp-httplib-0.57.1/benchmark/Makefile b/libs/cpp-httplib-0.57.1/benchmark/Makefile new file mode 100644 index 0000000..8f6d9ce --- /dev/null +++ b/libs/cpp-httplib-0.57.1/benchmark/Makefile @@ -0,0 +1,51 @@ +CXXFLAGS = -O2 -I.. + +CPPHTTPLIB_CXXFLAGS = -std=c++11 +CROW_CXXFLAGS = -std=c++17 + +CPPHTTPLIB_FLAGS = -DCPPHTTPLIB_THREAD_POOL_COUNT=16 + +BENCH = bombardier -c 10 -d 5s localhost:8080 +MONITOR = ali http://localhost:8080 +WAIT = while ! nc -z localhost 8080 >/dev/null 2>&1; do sleep 0.05; done + +# cpp-httplib +bench: server + @echo "--------------------\n cpp-httplib latest\n--------------------\n" + @./server & export PID=$$!; $(WAIT); $(BENCH); kill $${PID} + @echo "" + +monitor: server + @./server & export PID=$$!; $(MONITOR); kill $${PID} + +run : server + @./server + +server : cpp-httplib/main.cpp ../httplib.h + @g++ -o $@ $(CXXFLAGS) $(CPPHTTPLIB_CXXFLAGS) $(CPPHTTPLIB_FLAGS) cpp-httplib/main.cpp + +# crow +bench-crow: server-crow + @echo "-------------\n Crow v1.3.1\n-------------\n" + @./server-crow & export PID=$$!; $(WAIT); $(BENCH); kill $${PID} + @echo "" + +monitor-crow: server-crow + @./server-crow & export PID=$$!; $(MONITOR); kill $${PID} + +run-crow : server-crow + @./server-crow + +server-crow : crow/main.cpp crow/crow_all.h + @g++ -o $@ $(CXXFLAGS) $(CROW_CXXFLAGS) crow/main.cpp + +# misc +build: server server-crow + +bench-all: bench-crow bench + +issue: + bombardier -c 10 -d 30s localhost:8080 + +clean: + rm -rf server* diff --git a/libs/cpp-httplib-0.57.1/benchmark/ab.sh b/libs/cpp-httplib-0.57.1/benchmark/ab.sh new file mode 100755 index 0000000..6014b7b --- /dev/null +++ b/libs/cpp-httplib-0.57.1/benchmark/ab.sh @@ -0,0 +1,286 @@ +#!/usr/bin/env bash +# +# A/B throughput comparison between two git refs. +# +# Usage: ./ab.sh [--base REF] [--head REF] [--rounds N] [--duration S] +# [--connections N] [--threads N] [--path PATH] [--tls] +# [--large-mib N] [--timeout S] +# +# --path selects the workload. The harness serves: +# / small body via set_content(); the response line, the +# headers and the body already share a single write(), so +# this is the least sensitive case +# /large large body via set_content() +# /static/small.js 1 KiB file from a mount point, where the headers and the +# body are two separate writes +# /static/large.bin same, with the body large enough to dominate +# +# --large-mib sizes the two large workloads (default 1). +# +# --tls runs the same workload over HTTPS, which writes through +# SSLSocketStream instead of SocketStream. +# +# --timeout is bombardier's per-request timeout. Its 2s default aborts large +# TLS responses, and the run then fails on the non-2xx check. +# +# Absolute numbers from a single run are meaningless: on a quiet 8-core laptop +# the same binary varies by +/-20% run to run, and shared CI runners are worse. +# So both refs are built and then measured alternately in the same session, and +# only the ratio of the medians is reported. +# +# Requires: bombardier, python3, g++ (or $CXX), git. + +set -euo pipefail + +BASE_REF="master" +HEAD_REF="HEAD" +ROUNDS=5 +DURATION="5s" +CONNECTIONS=10 +THREADS="" +PORT=8080 +REQ_PATH="/" +TLS=0 +LARGE_MIB=1 +TIMEOUT="30s" + +while [ $# -gt 0 ]; do + case "$1" in + --base) BASE_REF="$2"; shift 2 ;; + --head) HEAD_REF="$2"; shift 2 ;; + --rounds) ROUNDS="$2"; shift 2 ;; + --duration) DURATION="$2"; shift 2 ;; + --connections) CONNECTIONS="$2"; shift 2 ;; + --threads) THREADS="$2"; shift 2 ;; + --path) REQ_PATH="$2"; shift 2 ;; + --large-mib) LARGE_MIB="$2"; shift 2 ;; + --timeout) TIMEOUT="$2"; shift 2 ;; + --tls) TLS=1; shift ;; + *) echo "Unknown option: $1" >&2; exit 1 ;; + esac +done + +command -v bombardier >/dev/null || { echo "Error: bombardier not found" >&2; exit 1; } +command -v python3 >/dev/null || { echo "Error: python3 not found" >&2; exit 1; } + +REPO_ROOT=$(git rev-parse --show-toplevel) +CXX=${CXX:-g++} + +# Default the thread pool to the core count. The committed benchmark Makefile +# hardcodes 16, which heavily oversubscribes a 2-4 vCPU CI runner and inflates +# the variance we are trying to see through. +if [ -z "$THREADS" ]; then + THREADS=$(python3 -c 'import os; print(os.cpu_count() or 4)') +fi + +WORKDIR=$(mktemp -d) +cleanup() { + pkill -f "$WORKDIR/.*/server-ab" 2>/dev/null || true + git -C "$REPO_ROOT" worktree remove --force "$WORKDIR/base" 2>/dev/null || true + git -C "$REPO_ROOT" worktree remove --force "$WORKDIR/head" 2>/dev/null || true + rm -rf "$WORKDIR" +} +trap cleanup EXIT + +BASE_SHA=$(git -C "$REPO_ROOT" rev-parse --short "$BASE_REF") +HEAD_SHA=$(git -C "$REPO_ROOT" rev-parse --short "$HEAD_REF") + +echo "==> base: $BASE_REF ($BASE_SHA)" +echo "==> head: $HEAD_REF ($HEAD_SHA)" +echo "==> rounds=$ROUNDS duration=$DURATION connections=$CONNECTIONS threads=$THREADS" +echo "==> path=$REQ_PATH tls=$TLS large=${LARGE_MIB}MiB" +echo "" + +if [ "$BASE_SHA" = "$HEAD_SHA" ]; then + echo "Note: base and head are the same commit; this measures harness noise." + echo "" +fi + +# --- Toolchain bits that depend on --tls --- +SCHEME="http" +INSECURE="" +TLS_CXXFLAGS="" +TLS_LDFLAGS="" +TLS_ARGS="" +if [ "$TLS" = "1" ]; then + SCHEME="https" + INSECURE="-k" + TLS_CXXFLAGS="-DCPPHTTPLIB_OPENSSL_SUPPORT" + TLS_LDFLAGS="-lssl -lcrypto" + if command -v pkg-config >/dev/null 2>&1 && pkg-config --exists openssl; then + TLS_CXXFLAGS="$TLS_CXXFLAGS $(pkg-config --cflags openssl)" + TLS_LDFLAGS="$(pkg-config --libs openssl)" + elif command -v brew >/dev/null 2>&1 && brew --prefix openssl >/dev/null 2>&1; then + OPENSSL_PREFIX=$(brew --prefix openssl) + TLS_CXXFLAGS="$TLS_CXXFLAGS -I$OPENSSL_PREFIX/include" + TLS_LDFLAGS="-L$OPENSSL_PREFIX/lib -lssl -lcrypto" + fi + if [ "$(uname -s)" = "Darwin" ]; then + TLS_LDFLAGS="$TLS_LDFLAGS -framework CoreFoundation -framework Security" + fi + TLS_ARGS="--cert $REPO_ROOT/test/cert.pem --key $REPO_ROOT/test/key.pem" + for f in "$REPO_ROOT/test/cert.pem" "$REPO_ROOT/test/key.pem"; do + [ -f "$f" ] || { echo "Error: $f not found" >&2; exit 1; } + done +fi + +# --- Build both refs --- +# The harness source always comes from the invoking worktree, so both refs run +# an identical workload and a ref that predates a harness change stays +# measurable. Only httplib.h varies, through -I. +HARNESS="$REPO_ROOT/benchmark/cpp-httplib/main.cpp" +[ -f "$HARNESS" ] || { echo "Error: $HARNESS not found" >&2; exit 1; } + +build() { + local name=$1 ref=$2 + git -C "$REPO_ROOT" worktree add --detach --quiet "$WORKDIR/$name" "$ref" + "$CXX" -o "$WORKDIR/$name/server-ab" -O2 -std=c++11 \ + -I"$WORKDIR/$name" \ + -DCPPHTTPLIB_THREAD_POOL_COUNT="$THREADS" \ + $TLS_CXXFLAGS \ + "$HARNESS" -lpthread $TLS_LDFLAGS +} + +echo "==> Building..." +build base "$BASE_REF" +build head "$HEAD_REF" + +# --- Measure one ref once, echo rps --- +measure() { + local name=$1 + local json rc + + "$WORKDIR/$name/server-ab" --port "$PORT" --dir "$WORKDIR/$name-www" \ + --large-mib "$LARGE_MIB" $TLS_ARGS >/dev/null 2>&1 & + local pid=$! + + # Wait for the listener (no dependency on nc) + local i + for i in $(seq 1 200); do + if (exec 3<>/dev/tcp/127.0.0.1/$PORT) 2>/dev/null; then exec 3>&- 3<&-; break; fi + sleep 0.05 + done + + set +e + json=$(bombardier -c "$CONNECTIONS" -d "$DURATION" -t "$TIMEOUT" -o json -p r $INSECURE \ + "$SCHEME://127.0.0.1:$PORT$REQ_PATH" 2>/dev/null) + rc=$? + set -e + + kill "$pid" 2>/dev/null || true + wait "$pid" 2>/dev/null || true + + # Wait for the port to be released before the next run + for i in $(seq 1 200); do + if ! (exec 3<>/dev/tcp/127.0.0.1/$PORT) 2>/dev/null; then break; fi + exec 3>&- 3<&- + sleep 0.05 + done + + if [ $rc -ne 0 ] || [ -z "$json" ]; then + echo "Error: bombardier failed for $name" >&2 + exit 1 + fi + + python3 -c ' +import json, sys +r = json.load(sys.stdin)["result"] +total = sum(r[k] for k in ("req1xx","req2xx","req3xx","req4xx","req5xx","others")) +bad = total - r["req2xx"] +if bad: + sys.stderr.write("Error: %d non-2xx/error responses\n" % bad) + sys.exit(1) +print("%.1f" % (total / r["timeTakenSeconds"])) +' <<<"$json" +} + +# --- Alternate, flipping the order each round to cancel ordering bias --- +BASE_RESULTS=() +HEAD_RESULTS=() + +echo "" +echo "==> Measuring..." +for ((r = 1; r <= ROUNDS; r++)); do + if (( r % 2 == 1 )); then order=("base" "head"); else order=("head" "base"); fi + line=" round $r:" + for name in "${order[@]}"; do + rps=$(measure "$name") + if [ "$name" = "base" ]; then BASE_RESULTS+=("$rps"); else HEAD_RESULTS+=("$rps"); fi + line="$line $name=$rps" + done + echo "$line" +done + +# --- Report --- +SUMMARY=$(python3 -c ' +import statistics, sys +from itertools import combinations + +base = [float(x) for x in sys.argv[1].split()] +head = [float(x) for x in sys.argv[2].split()] +bm, hm = statistics.median(base), statistics.median(head) + +def spread(v): + return (max(v) - min(v)) / statistics.median(v) * 100 + +def u_stat(a, b): + """Mann-Whitney U: number of (a, b) pairs where a > b, ties count a half.""" + return sum((x > y) + 0.5 * (x == y) for x in a for y in b) + +def exact_p(a, b): + """Two-sided permutation p-value. A single slow round cannot swing this + the way a min/max spread check can.""" + n1, n2 = len(a), len(b) + pooled = a + b + observed = abs(u_stat(a, b) - n1 * n2 / 2) + total = extreme = 0 + for idx in combinations(range(n1 + n2), n1): + s = set(idx) + ga = [pooled[i] for i in idx] + gb = [pooled[i] for i in range(n1 + n2) if i not in s] + total += 1 + if abs(u_stat(ga, gb) - n1 * n2 / 2) >= observed: + extreme += 1 + return extreme / total + +print("| | median req/s | min | max | spread |") +print("|---|---|---|---|---|") +print("| base | %.0f | %.0f | %.0f | %.1f%% |" % (bm, min(base), max(base), spread(base))) +print("| head | %.0f | %.0f | %.0f | %.1f%% |" % (hm, min(head), max(head), spread(head))) +print("") +print("**ratio: %.3fx** (%+.1f%%)" % (hm / bm, (hm / bm - 1) * 100)) +print("") + +if len(base) + len(head) > 20: + print("> %d rounds: skipping the permutation test (too many combinations)." + % len(base)) +else: + p = exact_p(base, head) + if p <= 0.05: + print("> Separation is consistent across rounds (permutation p = %.3f)." % p) + else: + print("> Not separated from noise (permutation p = %.3f). Inconclusive;" % p) + print("> raise --rounds or --duration, or run on a quieter machine.") + min_p = exact_p(list(range(len(base))), + list(range(len(base), len(base) + len(head)))) + if min_p > 0.05: + print(">") + print("> With %d rounds even perfect separation only reaches p = %.3f," + % (len(base), min_p)) + print("> so this test can never call a win. Use --rounds 4 or more.") +' "${BASE_RESULTS[*]}" "${HEAD_RESULTS[*]}") + +echo "" +echo "$SUMMARY" + +if [ -n "${GITHUB_STEP_SUMMARY:-}" ]; then + { + echo "## Benchmark A/B" + echo "" + echo "- base: \`$BASE_REF\` ($BASE_SHA)" + echo "- head: \`$HEAD_REF\` ($HEAD_SHA)" + echo "- rounds=$ROUNDS duration=$DURATION connections=$CONNECTIONS threads=$THREADS" + echo "" + echo "$SUMMARY" + } >> "$GITHUB_STEP_SUMMARY" +fi diff --git a/libs/cpp-httplib-0.57.1/benchmark/cpp-httplib/main.cpp b/libs/cpp-httplib-0.57.1/benchmark/cpp-httplib/main.cpp new file mode 100644 index 0000000..56987e6 --- /dev/null +++ b/libs/cpp-httplib-0.57.1/benchmark/cpp-httplib/main.cpp @@ -0,0 +1,139 @@ +#include "httplib.h" + +#include +#include +#include +#include + +#ifndef _WIN32 +#include +#include +#endif + +using namespace httplib; + +namespace { + +// The workloads differ in which part of the write path they exercise: +// +// / small body set through set_content(); the response line, +// the headers and the body already share a single write() +// /large large body set through set_content(); the body is copied +// into the header buffer before that single write(). +// --large-mib sets its size (and large.bin's). +// /static/small.js small file served from a mount point, where the headers +// and the body are two separate writes +// /static/large.bin same, with the body large enough to dominate +// +// Bodies are generated at startup so the repository carries no fixtures. + +const size_t SMALL_SIZE = 1024; +const size_t LARGE_SIZE_DEFAULT_MIB = 1; + +std::string filler(size_t n) { + std::string s; + s.reserve(n); + while (s.size() < n) { + s += "0123456789abcdef"; + } + s.resize(n); + return s; +} + +bool write_file(const std::string &path, const std::string &content) { + std::ofstream f(path.c_str(), std::ios::binary); + f.write(content.data(), static_cast(content.size())); + return f.good(); +} + +std::string default_dir() { + const char *tmp = std::getenv("TMPDIR"); + std::string base = tmp && *tmp ? tmp : "/tmp"; + if (!base.empty() && base[base.size() - 1] == '/') { + base.erase(base.size() - 1); + } + return base + "/cpp-httplib-bench"; +} + +bool make_dir(const std::string &path) { +#ifdef _WIN32 + return _mkdir(path.c_str()) == 0 || errno == EEXIST; +#else + return ::mkdir(path.c_str(), 0755) == 0 || errno == EEXIST; +#endif +} + +void setup(Server &svr, const std::string &large, const std::string &dir) { + svr.Get("/", [](const Request &, Response &res) { + res.set_content("Hello World!", "text/plain"); + }); + + svr.Get("/large", [&large](const Request &, Response &res) { + res.set_content(large, "application/octet-stream"); + }); + + svr.set_mount_point("/static", dir); +} + +} // namespace + +int main(int argc, char *argv[]) { + int port = 8080; + std::string dir = default_dir(); + std::string cert; + std::string key; + size_t large_mib = LARGE_SIZE_DEFAULT_MIB; + + for (int i = 1; i < argc; i++) { + auto last = i + 1 < argc; + if (!std::strcmp(argv[i], "--port") && last) { + port = std::atoi(argv[++i]); + } else if (!std::strcmp(argv[i], "--large-mib") && last) { + large_mib = static_cast(std::atoi(argv[++i])); + } else if (!std::strcmp(argv[i], "--dir") && last) { + dir = argv[++i]; + } else if (!std::strcmp(argv[i], "--cert") && last) { + cert = argv[++i]; + } else if (!std::strcmp(argv[i], "--key") && last) { + key = argv[++i]; + } else { + std::fprintf(stderr, + "usage: %s [--port N] [--dir PATH] [--large-mib N]" + " [--cert PATH --key PATH]\n", + argv[0]); + return 2; + } + } + + if (!make_dir(dir)) { + std::fprintf(stderr, "cannot create %s\n", dir.c_str()); + return 1; + } + + auto large = filler(large_mib * 1024 * 1024); + if (!write_file(dir + "/small.js", filler(SMALL_SIZE)) || + !write_file(dir + "/large.bin", large)) { + std::fprintf(stderr, "cannot write fixtures under %s\n", dir.c_str()); + return 1; + } + + if (!cert.empty()) { +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + SSLServer svr(cert.c_str(), key.c_str()); + if (!svr.is_valid()) { + std::fprintf(stderr, "cannot load %s / %s\n", cert.c_str(), key.c_str()); + return 1; + } + setup(svr, large, dir); + svr.listen("0.0.0.0", port); + return 0; +#else + std::fprintf(stderr, "built without CPPHTTPLIB_OPENSSL_SUPPORT\n"); + return 1; +#endif + } + + Server svr; + setup(svr, large, dir); + svr.listen("0.0.0.0", port); +} diff --git a/libs/cpp-httplib-0.57.1/benchmark/crow/crow_all.h b/libs/cpp-httplib-0.57.1/benchmark/crow/crow_all.h new file mode 100644 index 0000000..6de0dac --- /dev/null +++ b/libs/cpp-httplib-0.57.1/benchmark/crow/crow_all.h @@ -0,0 +1,13796 @@ +// SPDX-License-Identifier: BSD-3-Clause AND ISC AND MIT +/*BSD 3-Clause License + +Copyright (c) 2014-2017, ipkn + 2020-2026, CrowCpp +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 author nor the names of its + 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 HOLDER 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 Crow logo and other graphic material (excluding third party logos) used are +under exclusive Copyright (c) 2021-2022, Farook Al-Sammarraie (The-EDev), All +rights reserved. +*/ +#pragma once +#ifdef CROW_ENABLE_COMPRESSION + +#include +#include + +// http://zlib.net/manual.html +namespace crow // NOTE: Already documented in "crow/app.h" +{ +namespace compression { +// Values used in the 'windowBits' parameter for deflateInit2. +enum algorithm { + // 15 is the default value for deflate + DEFLATE = 15, + // windowBits can also be greater than 15 for optional gzip encoding. + // Add 16 to windowBits to write a simple gzip header and trailer around the + // compressed data instead of a zlib wrapper. + GZIP = 15 | 16, +}; + +inline std::string compress_string(std::string const &str, algorithm algo) { + std::string compressed_str; + z_stream stream{}; + // Initialize with the default values + if (::deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, algo, 8, + Z_DEFAULT_STRATEGY) == Z_OK) { + char buffer[8192]; + + stream.avail_in = str.size(); + // zlib does not take a const pointer. The data is not altered. + stream.next_in = + const_cast(reinterpret_cast(str.c_str())); + + int code = Z_OK; + do { + stream.avail_out = sizeof(buffer); + stream.next_out = reinterpret_cast(&buffer[0]); + + code = ::deflate(&stream, Z_FINISH); + // Successful and non-fatal error code returned by deflate when used with + // Z_FINISH flush + if (code == Z_OK || code == Z_STREAM_END) { + std::copy(&buffer[0], &buffer[sizeof(buffer) - stream.avail_out], + std::back_inserter(compressed_str)); + } + + } while (code == Z_OK); + + if (code != Z_STREAM_END) compressed_str.clear(); + + ::deflateEnd(&stream); + } + + return compressed_str; +} + +inline std::string decompress_string(std::string const &deflated_string) { + std::string inflated_string; + Bytef tmp[8192]; + + z_stream zstream{}; + zstream.avail_in = deflated_string.size(); + // Nasty const_cast but zlib won't alter its contents + zstream.next_in = const_cast( + reinterpret_cast(deflated_string.c_str())); + // Initialize with automatic header detection, for gzip support + if (::inflateInit2(&zstream, MAX_WBITS | 32) == Z_OK) { + do { + zstream.avail_out = sizeof(tmp); + zstream.next_out = &tmp[0]; + + auto ret = ::inflate(&zstream, Z_NO_FLUSH); + if (ret == Z_OK || ret == Z_STREAM_END) { + std::copy(&tmp[0], &tmp[sizeof(tmp) - zstream.avail_out], + std::back_inserter(inflated_string)); + } else { + // Something went wrong with inflate; make sure we return an empty + // string + inflated_string.clear(); + break; + } + + } while (zstream.avail_out == 0); + + // Free zlib's internal memory + ::inflateEnd(&zstream); + } + + return inflated_string; +} +} // namespace compression +} // namespace crow + +#endif + +namespace crow { +constexpr const char VERSION[] = "master"; +} + +/* + * SHA1 Wikipedia Page: http://en.wikipedia.org/wiki/SHA-1 + * + * Copyright (c) 2012-22 SAURAV MOHAPATRA + * + * 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" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * \file TinySHA1.hpp + * \author SAURAV MOHAPATRA + * \date 2012-22 + * \brief TinySHA1 - a header only implementation of the SHA1 algorithm in C++. + * Based on the implementation in boost::uuid::details. + * + * In this file are defined: + * - sha1::SHA1 + */ +#ifndef _TINY_SHA1_HPP_ +#define _TINY_SHA1_HPP_ +#include +#include +#include +#include + +/** + * \namespace sha1 + * \brief Here is defined the SHA1 class + */ +namespace sha1 { +/** + * \class SHA1 + * \brief A tiny SHA1 algorithm implementation used internally in the + * Crow server (specifically in crow/websocket.h). + */ +class SHA1 { +public: + typedef uint32_t digest32_t[5]; + typedef uint8_t digest8_t[20]; + inline static uint32_t LeftRotate(uint32_t value, size_t count) { + return (value << count) ^ (value >> (32 - count)); + } + SHA1() { reset(); } + virtual ~SHA1() {} + SHA1(const SHA1 &s) { *this = s; } + const SHA1 &operator=(const SHA1 &s) { + memcpy(m_digest, s.m_digest, 5 * sizeof(uint32_t)); + memcpy(m_block, s.m_block, 64); + m_blockByteIndex = s.m_blockByteIndex; + m_byteCount = s.m_byteCount; + return *this; + } + SHA1 &reset() { + m_digest[0] = 0x67452301; + m_digest[1] = 0xEFCDAB89; + m_digest[2] = 0x98BADCFE; + m_digest[3] = 0x10325476; + m_digest[4] = 0xC3D2E1F0; + m_blockByteIndex = 0; + m_byteCount = 0; + return *this; + } + SHA1 &processByte(uint8_t octet) { + this->m_block[this->m_blockByteIndex++] = octet; + ++this->m_byteCount; + if (m_blockByteIndex == 64) { + this->m_blockByteIndex = 0; + processBlock(); + } + return *this; + } + SHA1 &processBlock(const void *const start, const void *const end) { + const uint8_t *begin = static_cast(start); + const uint8_t *finish = static_cast(end); + while (begin != finish) { + processByte(*begin); + begin++; + } + return *this; + } + SHA1 &processBytes(const void *const data, size_t len) { + const uint8_t *block = static_cast(data); + processBlock(block, block + len); + return *this; + } + const uint32_t *getDigest(digest32_t digest) { + size_t bitCount = this->m_byteCount * 8; + processByte(0x80); + if (this->m_blockByteIndex > 56) { + while (m_blockByteIndex != 0) { + processByte(0); + } + while (m_blockByteIndex < 56) { + processByte(0); + } + } else { + while (m_blockByteIndex < 56) { + processByte(0); + } + } + processByte(0); + processByte(0); + processByte(0); + processByte(0); + processByte(static_cast((bitCount >> 24) & 0xFF)); + processByte(static_cast((bitCount >> 16) & 0xFF)); + processByte(static_cast((bitCount >> 8) & 0xFF)); + processByte(static_cast((bitCount) & 0xFF)); + + memcpy(digest, m_digest, 5 * sizeof(uint32_t)); + return digest; + } + const uint8_t *getDigestBytes(digest8_t digest) { + digest32_t d32; + getDigest(d32); + size_t di = 0; + digest[di++] = ((d32[0] >> 24) & 0xFF); + digest[di++] = ((d32[0] >> 16) & 0xFF); + digest[di++] = ((d32[0] >> 8) & 0xFF); + digest[di++] = ((d32[0]) & 0xFF); + + digest[di++] = ((d32[1] >> 24) & 0xFF); + digest[di++] = ((d32[1] >> 16) & 0xFF); + digest[di++] = ((d32[1] >> 8) & 0xFF); + digest[di++] = ((d32[1]) & 0xFF); + + digest[di++] = ((d32[2] >> 24) & 0xFF); + digest[di++] = ((d32[2] >> 16) & 0xFF); + digest[di++] = ((d32[2] >> 8) & 0xFF); + digest[di++] = ((d32[2]) & 0xFF); + + digest[di++] = ((d32[3] >> 24) & 0xFF); + digest[di++] = ((d32[3] >> 16) & 0xFF); + digest[di++] = ((d32[3] >> 8) & 0xFF); + digest[di++] = ((d32[3]) & 0xFF); + + digest[di++] = ((d32[4] >> 24) & 0xFF); + digest[di++] = ((d32[4] >> 16) & 0xFF); + digest[di++] = ((d32[4] >> 8) & 0xFF); + digest[di++] = ((d32[4]) & 0xFF); + return digest; + } + +protected: + void processBlock() { + uint32_t w[80]; + for (size_t i = 0; i < 16; i++) { + w[i] = (m_block[i * 4 + 0] << 24); + w[i] |= (m_block[i * 4 + 1] << 16); + w[i] |= (m_block[i * 4 + 2] << 8); + w[i] |= (m_block[i * 4 + 3]); + } + for (size_t i = 16; i < 80; i++) { + w[i] = LeftRotate((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1); + } + + uint32_t a = m_digest[0]; + uint32_t b = m_digest[1]; + uint32_t c = m_digest[2]; + uint32_t d = m_digest[3]; + uint32_t e = m_digest[4]; + + for (std::size_t i = 0; i < 80; ++i) { + uint32_t f = 0; + uint32_t k = 0; + + if (i < 20) { + f = (b & c) | (~b & d); + k = 0x5A827999; + } else if (i < 40) { + f = b ^ c ^ d; + k = 0x6ED9EBA1; + } else if (i < 60) { + f = (b & c) | (b & d) | (c & d); + k = 0x8F1BBCDC; + } else { + f = b ^ c ^ d; + k = 0xCA62C1D6; + } + uint32_t temp = LeftRotate(a, 5) + f + e + k + w[i]; + e = d; + d = c; + c = LeftRotate(b, 30); + b = a; + a = temp; + } + + m_digest[0] += a; + m_digest[1] += b; + m_digest[2] += c; + m_digest[3] += d; + m_digest[4] += e; + } + +private: + digest32_t m_digest; + uint8_t m_block[64]; + size_t m_blockByteIndex; + size_t m_byteCount; +}; +} // namespace sha1 +#endif + +#include +#include +#include +#include +#include +#include +#include + +namespace crow { + +// ---------------------------------------------------------------------------- +// qs_parse (modified) +// https://github.com/bartgrantham/qs_parse +// ---------------------------------------------------------------------------- +/* Similar to strncmp, but handles URL-encoding for either string */ +int qs_strncmp(const char *s, const char *qs, size_t n); + +/* Finds the beginning of each key/value pair and stores a pointer in qs_kv. + * Also decodes the value portion of the k/v pair *in-place*. In a future + * enhancement it will also have a compile-time option of sorting qs_kv + * alphabetically by key. */ +size_t qs_parse(char *qs, char *qs_kv[], size_t qs_kv_size, bool parse_url); + +/* Used by qs_parse to decode the value portion of a k/v pair */ +int qs_decode(char *qs); + +/* Looks up the value according to the key on a pre-processed query string + * A future enhancement will be a compile-time option to look up the key + * in a pre-sorted qs_kv array via a binary search. */ +// char * qs_k2v(const char * key, char * qs_kv[], int qs_kv_size); +char *qs_k2v(const char *key, char *const *qs_kv, size_t qs_kv_size, int nth); + +/* Non-destructive lookup of value, based on key. User provides the + * destinaton string and length. */ +char *qs_scanvalue(const char *key, const char *qs, char *val, size_t val_len); + +// TODO: implement sorting of the qs_kv array; for now ensure it's not compiled +#undef _qsSORTING + +// isxdigit _is_ available in , but let's avoid another header instead +#define CROW_QS_ISHEX(x) \ + ((((x) >= '0' && (x) <= '9') || ((x) >= 'A' && (x) <= 'F') || \ + ((x) >= 'a' && (x) <= 'f')) \ + ? 1 \ + : 0) +#define CROW_QS_HEX2DEC(x) \ + (((x) >= '0' && (x) <= '9') ? (x) - 48 \ + : ((x) >= 'A' && (x) <= 'F') ? (x) - 55 \ + : ((x) >= 'a' && (x) <= 'f') ? (x) - 87 \ + : 0) +#define CROW_QS_ISQSCHR(x) \ + ((((x) == '=') || ((x) == '#') || ((x) == '&') || ((x) == '\0')) ? 0 : 1) + +inline int qs_strncmp(const char *s, const char *qs, size_t n) { + unsigned char u1, u2, unyb, lnyb; + + while (n-- > 0) { + u1 = static_cast(*s++); + u2 = static_cast(*qs++); + + if (!CROW_QS_ISQSCHR(u1)) { u1 = '\0'; } + if (!CROW_QS_ISQSCHR(u2)) { u2 = '\0'; } + + if (u1 == '+') { u1 = ' '; } + if (u1 == '%') // easier/safer than scanf + { + unyb = static_cast(*s++); + lnyb = static_cast(*s++); + if (CROW_QS_ISHEX(unyb) && CROW_QS_ISHEX(lnyb)) + u1 = (CROW_QS_HEX2DEC(unyb) * 16) + CROW_QS_HEX2DEC(lnyb); + else + u1 = '\0'; + } + + if (u2 == '+') { u2 = ' '; } + if (u2 == '%') // easier/safer than scanf + { + unyb = static_cast(*qs++); + lnyb = static_cast(*qs++); + if (CROW_QS_ISHEX(unyb) && CROW_QS_ISHEX(lnyb)) + u2 = (CROW_QS_HEX2DEC(unyb) * 16) + CROW_QS_HEX2DEC(lnyb); + else + u2 = '\0'; + } + + if (u1 != u2) return u1 - u2; + if (u1 == '\0') return 0; + } + if (CROW_QS_ISQSCHR(*qs)) + return -1; + else + return 0; +} + +inline size_t qs_parse(char *qs, char *qs_kv[], size_t qs_kv_size, + bool parse_url = true) { + size_t i, j; + char *substr_ptr; + + for (i = 0; i < qs_kv_size; i++) + qs_kv[i] = NULL; + + // find the beginning of the k/v substrings or the fragment + substr_ptr = parse_url ? qs + strcspn(qs, "?#") : qs; + if (parse_url) { + if (substr_ptr[0] != '\0') + substr_ptr++; + else + return 0; // no query or fragment + } + + i = 0; + while (i < qs_kv_size) { + qs_kv[i] = substr_ptr; + j = strcspn(substr_ptr, "&"); + if (substr_ptr[j] == '\0') { + i++; + break; + } // x &'s -> means x iterations of this loop -> means *x+1* k/v pairs + substr_ptr += j + 1; + i++; + } + + // we only decode the values in place, the keys could have '='s in them + // which will hose our ability to distinguish keys from values later + for (j = 0; j < i; j++) { + substr_ptr = qs_kv[j] + strcspn(qs_kv[j], "=&#"); + if (substr_ptr[0] == '&' || + substr_ptr[0] == '\0') // blank value: skip decoding + substr_ptr[0] = '\0'; + else + qs_decode(++substr_ptr); + } + +#ifdef _qsSORTING +// TODO: qsort qs_kv, using qs_strncmp() for the comparison +#endif + + return i; +} + +inline int qs_decode(char *qs) { + int i = 0, j = 0; + + while (CROW_QS_ISQSCHR(qs[j])) { + if (qs[j] == '+') { + qs[i] = ' '; + } else if (qs[j] == '%') // easier/safer than scanf + { + if (!CROW_QS_ISHEX(qs[j + 1]) || !CROW_QS_ISHEX(qs[j + 2])) { + qs[i] = '\0'; + return i; + } + qs[i] = (CROW_QS_HEX2DEC(qs[j + 1]) * 16) + CROW_QS_HEX2DEC(qs[j + 2]); + j += 2; + } else { + qs[i] = qs[j]; + } + i++; + j++; + } + qs[i] = '\0'; + + return i; +} + +inline char *qs_k2v(const char *key, char *const *qs_kv, size_t qs_kv_size, + int nth = 0) { + size_t i; + size_t key_len, skip; + + key_len = strlen(key); + +#ifdef _qsSORTING +// TODO: binary search for key in the sorted qs_kv +#else // _qsSORTING + for (i = 0; i < qs_kv_size; i++) { + // we rely on the unambiguous '=' to find the value in our k/v pair + if (qs_strncmp(key, qs_kv[i], key_len) == 0) { + skip = strcspn(qs_kv[i], "="); + if (qs_kv[i][skip] == '=') skip++; + // return (zero-char value) ? ptr to trailing '\0' : ptr to value + if (nth == 0) + return qs_kv[i] + skip; + else + --nth; + } + } +#endif // _qsSORTING + + return nullptr; +} + +inline std::unique_ptr> +qs_dict_name2kv(const char *dict_name, char *const *qs_kv, size_t qs_kv_size, + int nth = 0) { + size_t i; + size_t name_len, skip_to_eq, skip_to_brace_open, skip_to_brace_close; + + name_len = strlen(dict_name); + +#ifdef _qsSORTING +// TODO: binary search for key in the sorted qs_kv +#else // _qsSORTING + for (i = 0; i < qs_kv_size; i++) { + if (strncmp(dict_name, qs_kv[i], name_len) == 0) { + skip_to_eq = strcspn(qs_kv[i], "="); + if (qs_kv[i][skip_to_eq] == '=') skip_to_eq++; + skip_to_brace_open = strcspn(qs_kv[i], "["); + if (qs_kv[i][skip_to_brace_open] == '[') skip_to_brace_open++; + skip_to_brace_close = strcspn(qs_kv[i], "]"); + + if (skip_to_brace_open <= skip_to_brace_close && skip_to_brace_open > 0 && + skip_to_brace_close > 0 && nth == 0) { + auto key = std::string(qs_kv[i] + skip_to_brace_open, + skip_to_brace_close - skip_to_brace_open); + auto value = std::string(qs_kv[i] + skip_to_eq); + return std::unique_ptr>( + new std::pair(key, value)); + } else { + --nth; + } + } + } +#endif // _qsSORTING + + return nullptr; +} + +inline char *qs_scanvalue(const char *key, const char *qs, char *val, + size_t val_len) { + const char *tmp = strchr(qs, '?'); + + // find the beginning of the k/v substrings + if (tmp != nullptr) qs = tmp + 1; + + const size_t key_len = strlen(key); + while (*qs != '#' && *qs != '\0') { + if (qs_strncmp(key, qs, key_len) == 0) break; + qs += strcspn(qs, "&"); + if (*qs == '&') qs++; + } + + if (qs[0] == '\0') return nullptr; + + qs += strcspn(qs, "=&#"); + if (qs[0] == '=') { + qs++; + size_t i = strcspn(qs, "&=#"); +#ifdef _MSC_VER + strncpy_s(val, val_len, qs, + (val_len - 1) < (i + 1) ? (val_len - 1) : (i + 1)); +#else + strncpy(val, qs, (val_len - 1) < (i + 1) ? (val_len - 1) : (i + 1)); +#endif + qs_decode(val); + } else { + if (val_len > 0) val[0] = '\0'; + } + + return val; +} +} // namespace crow +// ---------------------------------------------------------------------------- + +namespace crow { +struct request; +/// A class to represent any data coming after the `?` in the request URL into +/// key-value pairs. +class query_string { +public: + static const int MAX_KEY_VALUE_PAIRS_COUNT = 256; + + query_string() = default; + + query_string(const query_string &qs) : url_(qs.url_) { + for (auto p : qs.key_value_pairs_) { + key_value_pairs_.push_back((char *)(p - qs.url_.c_str() + url_.c_str())); + } + } + + query_string &operator=(const query_string &qs) { + url_ = qs.url_; + key_value_pairs_.clear(); + for (auto p : qs.key_value_pairs_) { + key_value_pairs_.push_back((char *)(p - qs.url_.c_str() + url_.c_str())); + } + return *this; + } + + query_string &operator=(query_string &&qs) noexcept { + key_value_pairs_ = std::move(qs.key_value_pairs_); + char *old_data = (char *)qs.url_.c_str(); + url_ = std::move(qs.url_); + for (auto &p : key_value_pairs_) { + p += (char *)url_.c_str() - old_data; + } + return *this; + } + + query_string(std::string params, bool url = true) : url_(std::move(params)) { + if (url_.empty()) return; + + key_value_pairs_.resize(MAX_KEY_VALUE_PAIRS_COUNT); + size_t count = qs_parse(&url_[0], &key_value_pairs_[0], + MAX_KEY_VALUE_PAIRS_COUNT, url); + + key_value_pairs_.resize(count); + key_value_pairs_.shrink_to_fit(); + } + + void clear() { + key_value_pairs_.clear(); + url_.clear(); + } + + friend std::ostream &operator<<(std::ostream &os, const query_string &qs) { + os << "[ "; + for (size_t i = 0; i < qs.key_value_pairs_.size(); ++i) { + if (i) os << ", "; + os << qs.key_value_pairs_[i]; + } + os << " ]"; + return os; + } + + /// Get a value from a name, used for `?name=value`. + + /// + /// Note: this method returns the value of the first occurrence of the key + /// only, to return all occurrences, see \ref get_list(). + char *get(const std::string &name) const { + char *ret = + qs_k2v(name.c_str(), key_value_pairs_.data(), key_value_pairs_.size()); + return ret; + } + + /// Works similar to \ref get() except it removes the item from the query + /// string. + char *pop(const std::string &name) { + char *ret = get(name); + if (ret != nullptr) { + const std::string key_name = name + '='; + for (unsigned int i = 0; i < key_value_pairs_.size(); i++) { + std::string str_item(key_value_pairs_[i]); + if (str_item.find(key_name) == 0) { + key_value_pairs_.erase(key_value_pairs_.begin() + i); + break; + } + } + } + return ret; + } + + /// Returns a list of values, passed as + /// `?name[]=value1&name[]=value2&...name[]=valuen` with n being the size of + /// the list. + + /// + /// Note: Square brackets in the above example are controlled by + /// `use_brackets` boolean (true by default). If set to false, the example + /// becomes `?name=value1,name=value2...name=valuen` + std::vector get_list(const std::string &name, + bool use_brackets = true) const { + std::vector ret; + std::string plus = name + (use_brackets ? "[]" : ""); + char *element = nullptr; + + int count = 0; + while (1) { + element = qs_k2v(plus.c_str(), key_value_pairs_.data(), + key_value_pairs_.size(), count++); + if (!element) break; + ret.push_back(element); + } + return ret; + } + + /// Similar to \ref get_list() but it removes the + std::vector pop_list(const std::string &name, + bool use_brackets = true) { + std::vector ret = get_list(name, use_brackets); + const size_t name_len = name.length(); + if (!ret.empty()) { + for (unsigned int i = 0; i < key_value_pairs_.size(); i++) { + std::string str_item(key_value_pairs_[i]); + if (str_item.find(name) == 0) { + if (use_brackets && str_item.find("[]=", name_len) == name_len) { + key_value_pairs_.erase(key_value_pairs_.begin() + i--); + } else if (!use_brackets && + str_item.find('=', name_len) == name_len) { + key_value_pairs_.erase(key_value_pairs_.begin() + i--); + } + } + } + } + return ret; + } + + /// Works similar to \ref get_list() except the brackets are mandatory must + /// not be empty. + + /// + /// For example calling `get_dict(yourname)` on + /// `?yourname[sub1]=42&yourname[sub2]=84` would give a map containing `{sub1 + /// : 42, sub2 : 84}`. + /// + /// if your query string has both empty brackets and ones with a key inside, + /// use pop_list() to get all the values without a key before running this + /// method. + std::unordered_map + get_dict(const std::string &name) const { + std::unordered_map ret; + + int count = 0; + while (1) { + if (auto element = qs_dict_name2kv(name.c_str(), key_value_pairs_.data(), + key_value_pairs_.size(), count++)) + ret.insert(*element); + else + break; + } + return ret; + } + + /// Works the same as \ref get_dict() but removes the values from the query + /// string. + std::unordered_map + pop_dict(const std::string &name) { + const std::string name_value = name + '['; + std::unordered_map ret = get_dict(name); + if (!ret.empty()) { + for (unsigned int i = 0; i < key_value_pairs_.size(); i++) { + std::string str_item(key_value_pairs_[i]); + if (str_item.find(name_value) == 0) { + key_value_pairs_.erase(key_value_pairs_.begin() + i--); + } + } + } + return ret; + } + + std::vector keys() const { + std::vector keys; + keys.reserve(key_value_pairs_.size()); + + for (const char *const element : key_value_pairs_) { + const char *delimiter = strchr(element, '='); + if (delimiter) + keys.emplace_back(element, delimiter); + else + keys.emplace_back(element); + } + + return keys; + } + +private: + std::string url_; + std::vector key_value_pairs_; +}; + +} // namespace crow + +// This file is generated from nginx/conf/mime.types using nginx_mime2cpp.py on +// 2021-12-03. +#include +#include + +namespace crow { +const std::unordered_map mime_types{ + {"gz", "application/gzip"}, + {"shtml", "text/html"}, + {"htm", "text/html"}, + {"html", "text/html"}, + {"css", "text/css"}, + {"xml", "text/xml"}, + {"gif", "image/gif"}, + {"jpg", "image/jpeg"}, + {"jpeg", "image/jpeg"}, + {"js", "application/javascript"}, + {"atom", "application/atom+xml"}, + {"rss", "application/rss+xml"}, + {"mml", "text/mathml"}, + {"txt", "text/plain"}, + {"jad", "text/vnd.sun.j2me.app-descriptor"}, + {"wml", "text/vnd.wap.wml"}, + {"htc", "text/x-component"}, + {"avif", "image/avif"}, + {"png", "image/png"}, + {"svgz", "image/svg+xml"}, + {"svg", "image/svg+xml"}, + {"tiff", "image/tiff"}, + {"tif", "image/tiff"}, + {"wbmp", "image/vnd.wap.wbmp"}, + {"webp", "image/webp"}, + {"ico", "image/x-icon"}, + {"jng", "image/x-jng"}, + {"bmp", "image/x-ms-bmp"}, + {"woff", "font/woff"}, + {"woff2", "font/woff2"}, + {"ear", "application/java-archive"}, + {"war", "application/java-archive"}, + {"jar", "application/java-archive"}, + {"json", "application/json"}, + {"hqx", "application/mac-binhex40"}, + {"doc", "application/msword"}, + {"pdf", "application/pdf"}, + {"ai", "application/postscript"}, + {"eps", "application/postscript"}, + {"ps", "application/postscript"}, + {"rtf", "application/rtf"}, + {"m3u8", "application/vnd.apple.mpegurl"}, + {"kml", "application/vnd.google-earth.kml+xml"}, + {"kmz", "application/vnd.google-earth.kmz"}, + {"xls", "application/vnd.ms-excel"}, + {"eot", "application/vnd.ms-fontobject"}, + {"ppt", "application/vnd.ms-powerpoint"}, + {"odg", "application/vnd.oasis.opendocument.graphics"}, + {"odp", "application/vnd.oasis.opendocument.presentation"}, + {"ods", "application/vnd.oasis.opendocument.spreadsheet"}, + {"odt", "application/vnd.oasis.opendocument.text"}, + {"pptx", "application/" + "vnd.openxmlformats-officedocument.presentationml.presentation"}, + {"xlsx", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, + {"docx", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, + {"wmlc", "application/vnd.wap.wmlc"}, + {"wasm", "application/wasm"}, + {"7z", "application/x-7z-compressed"}, + {"cco", "application/x-cocoa"}, + {"jardiff", "application/x-java-archive-diff"}, + {"jnlp", "application/x-java-jnlp-file"}, + {"run", "application/x-makeself"}, + {"pm", "application/x-perl"}, + {"pl", "application/x-perl"}, + {"pdb", "application/x-pilot"}, + {"prc", "application/x-pilot"}, + {"rar", "application/x-rar-compressed"}, + {"rpm", "application/x-redhat-package-manager"}, + {"sea", "application/x-sea"}, + {"swf", "application/x-shockwave-flash"}, + {"sit", "application/x-stuffit"}, + {"tk", "application/x-tcl"}, + {"tcl", "application/x-tcl"}, + {"crt", "application/x-x509-ca-cert"}, + {"pem", "application/x-x509-ca-cert"}, + {"der", "application/x-x509-ca-cert"}, + {"xpi", "application/x-xpinstall"}, + {"xhtml", "application/xhtml+xml"}, + {"xspf", "application/xspf+xml"}, + {"zip", "application/zip"}, + {"dll", "application/octet-stream"}, + {"exe", "application/octet-stream"}, + {"bin", "application/octet-stream"}, + {"deb", "application/octet-stream"}, + {"dmg", "application/octet-stream"}, + {"img", "application/octet-stream"}, + {"iso", "application/octet-stream"}, + {"msm", "application/octet-stream"}, + {"msp", "application/octet-stream"}, + {"msi", "application/octet-stream"}, + {"kar", "audio/midi"}, + {"midi", "audio/midi"}, + {"mid", "audio/midi"}, + {"mp3", "audio/mpeg"}, + {"ogg", "audio/ogg"}, + {"m4a", "audio/x-m4a"}, + {"ra", "audio/x-realaudio"}, + {"3gp", "video/3gpp"}, + {"3gpp", "video/3gpp"}, + {"ts", "video/mp2t"}, + {"mp4", "video/mp4"}, + {"mpg", "video/mpeg"}, + {"mpeg", "video/mpeg"}, + {"mov", "video/quicktime"}, + {"webm", "video/webm"}, + {"flv", "video/x-flv"}, + {"m4v", "video/x-m4v"}, + {"mng", "video/x-mng"}, + {"asf", "video/x-ms-asf"}, + {"asx", "video/x-ms-asf"}, + {"wmv", "video/x-ms-wmv"}, + {"avi", "video/x-msvideo"}}; +} + +// settings for crow +// TODO(ipkn) replace with runtime config. libucl? + +/* #ifdef - enables debug mode */ +// #define CROW_ENABLE_DEBUG + +/* #ifdef - enables logging */ +#define CROW_ENABLE_LOGGING + +/* #ifdef - enforces section 5.2 and 6.1 of RFC6455 (only accepting masked + * messages from clients) */ +// #define CROW_ENFORCE_WS_SPEC + +/* #define - specifies log level */ +/* + Debug = 0 + Info = 1 + Warning = 2 + Error = 3 + Critical = 4 + + default to INFO +*/ +#ifndef CROW_LOG_LEVEL +#define CROW_LOG_LEVEL 1 +#endif + +#ifndef CROW_STATIC_DIRECTORY +#define CROW_STATIC_DIRECTORY "static/" +#endif +#ifndef CROW_STATIC_ENDPOINT +#define CROW_STATIC_ENDPOINT "/static/" +#endif + +// compiler flags + +#if defined(_MSC_VER) +#if _MSC_VER < 1900 +#define CROW_MSVC_WORKAROUND +#define constexpr const +#define noexcept throw() +#endif +#endif + +#ifdef CROW_USE_BOOST +#include +#include +#ifdef CROW_ENABLE_SSL +#include +#endif +#else +#ifndef ASIO_STANDALONE +#define ASIO_STANDALONE +#endif +#include +#include +#ifdef CROW_ENABLE_SSL +#include +#endif +#endif + +#if (defined(CROW_USE_BOOST) && BOOST_VERSION >= 107000) || \ + (ASIO_VERSION >= 101008) +#define GET_IO_CONTEXT(s) ((asio::io_context &)(s).get_executor().context()) +#else +#define GET_IO_CONTEXT(s) ((s).get_io_service()) +#endif + +namespace crow { +#ifdef CROW_USE_BOOST +namespace asio = boost::asio; +using error_code = boost::system::error_code; +#else +using error_code = asio::error_code; +#endif +using tcp = asio::ip::tcp; +using stream_protocol = asio::local::stream_protocol; + +/// A wrapper for the asio::ip::tcp::socket and asio::ssl::stream +struct SocketAdaptor { + using context = void; + SocketAdaptor(asio::io_context &io_context, context *) + : socket_(io_context) {} + + asio::io_context &get_io_context() { return GET_IO_CONTEXT(socket_); } + + /// Get the TCP socket handling data transfers, regardless of what layer is + /// handling transfers on top of the socket. + tcp::socket &raw_socket() { return socket_; } + + /// Get the object handling data transfers, this can be either a TCP socket or + /// an SSL stream (if SSL is enabled). + tcp::socket &socket() { return socket_; } + + tcp::endpoint remote_endpoint() const { return socket_.remote_endpoint(); } + + std::string address() const { + return socket_.remote_endpoint().address().to_string(); + } + + bool is_open() const { return socket_.is_open(); } + + void close() { + error_code ec; + socket_.close(ec); + } + + void shutdown_readwrite() { + error_code ec; + socket_.shutdown(asio::socket_base::shutdown_type::shutdown_both, ec); + } + + void shutdown_write() { + error_code ec; + socket_.shutdown(asio::socket_base::shutdown_type::shutdown_send, ec); + } + + void shutdown_read() { + error_code ec; + socket_.shutdown(asio::socket_base::shutdown_type::shutdown_receive, ec); + } + + template void start(F f) { f(error_code()); } + + tcp::socket socket_; +}; + +struct UnixSocketAdaptor { + using context = void; + UnixSocketAdaptor(asio::io_context &io_context, context *) + : socket_(io_context) {} + + asio::io_context &get_io_context() { return GET_IO_CONTEXT(socket_); } + + stream_protocol::socket &raw_socket() { return socket_; } + + stream_protocol::socket &socket() { return socket_; } + + stream_protocol::endpoint remote_endpoint() { + return socket_.local_endpoint(); + } + + std::string address() const { return ""; } + + bool is_open() { return socket_.is_open(); } + + void close() { + error_code ec; + socket_.close(ec); + } + + void shutdown_readwrite() { + error_code ec; + socket_.shutdown(asio::socket_base::shutdown_type::shutdown_both, ec); + } + + void shutdown_write() { + error_code ec; + socket_.shutdown(asio::socket_base::shutdown_type::shutdown_send, ec); + } + + void shutdown_read() { + error_code ec; + socket_.shutdown(asio::socket_base::shutdown_type::shutdown_receive, ec); + } + + template void start(F f) { f(error_code()); } + + stream_protocol::socket socket_; +}; + +#ifdef CROW_ENABLE_SSL +struct SSLAdaptor { + using context = asio::ssl::context; + using ssl_socket_t = asio::ssl::stream; + SSLAdaptor(asio::io_context &io_context, context *ctx) + : ssl_socket_(new ssl_socket_t(io_context, *ctx)) {} + + asio::ssl::stream &socket() { return *ssl_socket_; } + + tcp::socket::lowest_layer_type &raw_socket() { + return ssl_socket_->lowest_layer(); + } + + tcp::endpoint remote_endpoint() { return raw_socket().remote_endpoint(); } + + std::string address() const { + return ssl_socket_->lowest_layer().remote_endpoint().address().to_string(); + } + + bool is_open() { return ssl_socket_ ? raw_socket().is_open() : false; } + + void close() { + if (is_open()) { + error_code ec; + raw_socket().close(ec); + } + } + + void shutdown_readwrite() { + if (is_open()) { + error_code ec; + raw_socket().shutdown(asio::socket_base::shutdown_type::shutdown_both, + ec); + } + } + + void shutdown_write() { + if (is_open()) { + error_code ec; + raw_socket().shutdown(asio::socket_base::shutdown_type::shutdown_send, + ec); + } + } + + void shutdown_read() { + if (is_open()) { + error_code ec; + raw_socket().shutdown(asio::socket_base::shutdown_type::shutdown_receive, + ec); + } + } + + asio::io_context &get_io_context() { return GET_IO_CONTEXT(raw_socket()); } + + template void start(F f) { + ssl_socket_->async_handshake(asio::ssl::stream_base::server, + [f](const error_code &ec) { f(ec); }); + } + + std::unique_ptr> ssl_socket_; +}; +#endif +} // namespace crow + +#include +#include +#include +#include +#include +#include + +namespace crow { +enum class LogLevel { +#ifndef ERROR +#ifndef DEBUG + DEBUG = 0, + INFO, + WARNING, + ERROR, + CRITICAL, +#endif +#endif + + Debug = 0, + Info, + Warning, + Error, + Critical, +}; + +class ILogHandler { +public: + virtual ~ILogHandler() = default; + + virtual void log(const std::string &message, LogLevel level) = 0; +}; + +class CerrLogHandler : public ILogHandler { +public: + void log(const std::string &message, LogLevel level) override { + std::string log_msg; + log_msg.reserve(message.length() + 1 + 32 + 3 + 8 + 2); + log_msg.append("(").append(timestamp()).append(") ["); + + switch (level) { + case LogLevel::Debug: log_msg.append("DEBUG "); break; + case LogLevel::Info: log_msg.append("INFO "); break; + case LogLevel::Warning: log_msg.append("WARNING "); break; + case LogLevel::Error: log_msg.append("ERROR "); break; + case LogLevel::Critical: log_msg.append("CRITICAL"); break; + } + + log_msg.append("] ").append(message); + + std::cerr << log_msg << std::endl; + } + +private: + static std::string timestamp() { + char date[32]; + time_t t = time(0); + + tm my_tm; + +#if defined(_MSC_VER) || defined(__MINGW32__) +#ifdef CROW_USE_LOCALTIMEZONE + localtime_s(&my_tm, &t); +#else + gmtime_s(&my_tm, &t); +#endif +#else +#ifdef CROW_USE_LOCALTIMEZONE + localtime_r(&t, &my_tm); +#else + gmtime_r(&t, &my_tm); +#endif +#endif + + size_t sz = strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", &my_tm); + return std::string(date, date + sz); + } +}; + +class logger { +public: + logger(LogLevel level) : level_(level) {} + ~logger() { +#ifdef CROW_ENABLE_LOGGING + if (level_ >= get_current_log_level()) { + get_handler_ref()->log(stringstream_.str(), level_); + } +#endif + } + + // + template logger &operator<<(T const &value) { +#ifdef CROW_ENABLE_LOGGING + if (level_ >= get_current_log_level()) { stringstream_ << value; } +#endif + return *this; + } + + // + static void setLogLevel(LogLevel level) { get_log_level_ref() = level; } + + static void setHandler(ILogHandler *handler) { get_handler_ref() = handler; } + + static LogLevel get_current_log_level() { return get_log_level_ref(); } + +private: + // + static LogLevel &get_log_level_ref() { + static LogLevel current_level = static_cast(CROW_LOG_LEVEL); + return current_level; + } + static ILogHandler *&get_handler_ref() { + static CerrLogHandler default_handler; + static ILogHandler *current_handler = &default_handler; + return current_handler; + } + + // + std::ostringstream stringstream_; + LogLevel level_; +}; +} // namespace crow + +#define CROW_LOG_CRITICAL \ + if (crow::logger::get_current_log_level() <= crow::LogLevel::Critical) \ + crow::logger(crow::LogLevel::Critical) +#define CROW_LOG_ERROR \ + if (crow::logger::get_current_log_level() <= crow::LogLevel::Error) \ + crow::logger(crow::LogLevel::Error) +#define CROW_LOG_WARNING \ + if (crow::logger::get_current_log_level() <= crow::LogLevel::Warning) \ + crow::logger(crow::LogLevel::Warning) +#define CROW_LOG_INFO \ + if (crow::logger::get_current_log_level() <= crow::LogLevel::Info) \ + crow::logger(crow::LogLevel::Info) +#define CROW_LOG_DEBUG \ + if (crow::logger::get_current_log_level() <= crow::LogLevel::Debug) \ + crow::logger(crow::LogLevel::Debug) + +#include + +namespace crow { +/// An abstract class that allows any other class to be returned by a handler. +struct returnable { + std::string content_type; + virtual std::string dump() const = 0; + + returnable(std::string ctype) : content_type{ctype} {} + + virtual ~returnable() {} +}; +} // namespace crow + +#ifdef CROW_USE_BOOST +#include +#ifdef CROW_ENABLE_SSL +#include +#endif +#else +#ifndef ASIO_STANDALONE +#define ASIO_STANDALONE +#endif +#include +#ifdef CROW_ENABLE_SSL +#include +#endif +#endif + +namespace crow { +#ifdef CROW_USE_BOOST +namespace asio = boost::asio; +using error_code = boost::system::error_code; +#else +using error_code = asio::error_code; +#endif +using tcp = asio::ip::tcp; +using stream_protocol = asio::local::stream_protocol; + +struct TCPAcceptor { + using endpoint = tcp::endpoint; + tcp::acceptor acceptor_; + TCPAcceptor(asio::io_context &io_context) : acceptor_(io_context) {} + + int16_t port() const { return acceptor_.local_endpoint().port(); } + std::string address() const { + return acceptor_.local_endpoint().address().to_string(); + } + std::string url_display(bool ssl_used) const { + auto address = acceptor_.local_endpoint().address(); + return (ssl_used ? "https://" : "http://") + + (address.is_v4() ? address.to_string() + : "[" + address.to_string() + "]") + + ":" + std::to_string(acceptor_.local_endpoint().port()); + } + tcp::acceptor &raw_acceptor() { return acceptor_; } + endpoint local_endpoint() const { return acceptor_.local_endpoint(); } + inline static tcp::acceptor::reuse_address reuse_address_option() { + return tcp::acceptor::reuse_address(true); + } +}; + +struct UnixSocketAcceptor { + using endpoint = stream_protocol::endpoint; + stream_protocol::acceptor acceptor_; + UnixSocketAcceptor(asio::io_context &io_context) : acceptor_(io_context) {} + + int16_t port() const { return 0; } + std::string address() const { return acceptor_.local_endpoint().path(); } + std::string url_display(bool) const { + return acceptor_.local_endpoint().path(); + } + stream_protocol::acceptor &raw_acceptor() { return acceptor_; } + endpoint local_endpoint() const { return acceptor_.local_endpoint(); } + inline static stream_protocol::acceptor::reuse_address + reuse_address_option() { + // reuse addr must be false + // (https://github.com/chriskohlhoff/asio/issues/622) + return stream_protocol::acceptor::reuse_address(false); + } +}; +} // namespace crow + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +// TODO(EDev): Adding C++20's [[likely]] and [[unlikely]] attributes might be +// useful +#if defined(__GNUG__) || defined(__clang__) +#define CROW_LIKELY(X) __builtin_expect(!!(X), 1) +#define CROW_UNLIKELY(X) __builtin_expect(!!(X), 0) +#else +#define CROW_LIKELY(X) (X) +#define CROW_UNLIKELY(X) (X) +#endif + +namespace crow { +/// @cond SKIP +namespace black_magic { +#ifndef CROW_MSVC_WORKAROUND +/// Out of Range Exception for const_str +struct OutOfRange { + OutOfRange(unsigned /*pos*/, unsigned /*length*/) {} +}; +/// Helper function to throw an exception if i is larger than len +constexpr unsigned requires_in_range(unsigned i, unsigned len) { + return i >= len ? throw OutOfRange(i, len) : i; +} + +/// A constant string implementation. +class const_str { + const char *const begin_; + unsigned size_; + +public: + template + constexpr const_str(const char (&arr)[N]) : begin_(arr), size_(N - 1) { + static_assert(N >= 1, "not a string literal"); + } + constexpr char operator[](unsigned i) const { + return requires_in_range(i, size_), begin_[i]; + } + + constexpr operator const char *() const { return begin_; } + + constexpr const char *begin() const { return begin_; } + constexpr const char *end() const { return begin_ + size_; } + + constexpr unsigned size() const { return size_; } +}; + +constexpr unsigned find_closing_tag(const_str s, unsigned p) { + return s[p] == '>' ? p : find_closing_tag(s, p + 1); +} + +/// Check that the CROW_ROUTE string is valid +constexpr bool is_valid(const_str s, unsigned i = 0, int f = 0) { + return i == s.size() ? f == 0 + : f < 0 || f >= 2 ? false + : s[i] == '<' ? is_valid(s, i + 1, f + 1) + : s[i] == '>' ? is_valid(s, i + 1, f - 1) + : is_valid(s, i + 1, f); +} + +constexpr bool is_equ_p(const char *a, const char *b, unsigned n) { + return *a == 0 && *b == 0 && n == 0 ? true + : (*a == 0 || *b == 0) ? false + : n == 0 ? true + : *a != *b ? false + : is_equ_p(a + 1, b + 1, n - 1); +} + +constexpr bool is_equ_n(const_str a, unsigned ai, const_str b, unsigned bi, + unsigned n) { + return ai + n > a.size() || bi + n > b.size() ? false + : n == 0 ? true + : a[ai] != b[bi] ? false + : is_equ_n(a, ai + 1, b, bi + 1, n - 1); +} + +constexpr bool is_int(const_str s, unsigned i) { + return is_equ_n(s, i, "", 0, 5); +} + +constexpr bool is_uint(const_str s, unsigned i) { + return is_equ_n(s, i, "", 0, 6); +} + +constexpr bool is_float(const_str s, unsigned i) { + return is_equ_n(s, i, "", 0, 7) || is_equ_n(s, i, "", 0, 8); +} + +constexpr bool is_str(const_str s, unsigned i) { + return is_equ_n(s, i, "", 0, 5) || is_equ_n(s, i, "", 0, 8); +} + +constexpr bool is_path(const_str s, unsigned i) { + return is_equ_n(s, i, "", 0, 6); +} +#endif +template struct parameter_tag { + static const int value = 0; +}; +#define CROW_INTERNAL_PARAMETER_TAG(t, i) \ + template <> struct parameter_tag { \ + static const int value = i; \ + } +CROW_INTERNAL_PARAMETER_TAG(int, 1); +CROW_INTERNAL_PARAMETER_TAG(char, 1); +CROW_INTERNAL_PARAMETER_TAG(short, 1); +CROW_INTERNAL_PARAMETER_TAG(long, 1); +CROW_INTERNAL_PARAMETER_TAG(long long, 1); +CROW_INTERNAL_PARAMETER_TAG(unsigned int, 2); +CROW_INTERNAL_PARAMETER_TAG(unsigned char, 2); +CROW_INTERNAL_PARAMETER_TAG(unsigned short, 2); +CROW_INTERNAL_PARAMETER_TAG(unsigned long, 2); +CROW_INTERNAL_PARAMETER_TAG(unsigned long long, 2); +CROW_INTERNAL_PARAMETER_TAG(double, 3); +CROW_INTERNAL_PARAMETER_TAG(std::string, 4); +#undef CROW_INTERNAL_PARAMETER_TAG +template struct compute_parameter_tag_from_args_list; + +template <> struct compute_parameter_tag_from_args_list<> { + static const int value = 0; +}; + +template +struct compute_parameter_tag_from_args_list { + static const int sub_value = + compute_parameter_tag_from_args_list::value; + static const int value = + parameter_tag::type>::value + ? sub_value * 6 + parameter_tag::type>::value + : sub_value; +}; + +static inline bool is_parameter_tag_compatible(uint64_t a, uint64_t b) { + if (a == 0) return b == 0; + if (b == 0) return a == 0; + int sa = a % 6; + int sb = a % 6; + if (sa == 5) sa = 4; + if (sb == 5) sb = 4; + if (sa != sb) return false; + return is_parameter_tag_compatible(a / 6, b / 6); +} + +static inline unsigned find_closing_tag_runtime(const char *s, unsigned p) { + return s[p] == 0 ? throw std::runtime_error("unmatched tag <") + : s[p] == '>' ? p + : find_closing_tag_runtime(s, p + 1); +} + +static inline uint64_t get_parameter_tag_runtime(const char *s, + unsigned p = 0) { + return s[p] == 0 ? 0 + : s[p] == '<' + ? (std::strncmp(s + p, "", 5) == 0 + ? get_parameter_tag_runtime( + s, find_closing_tag_runtime(s, p)) * + 6 + + 1 + : std::strncmp(s + p, "", 6) == 0 + ? get_parameter_tag_runtime( + s, find_closing_tag_runtime(s, p)) * + 6 + + 2 + : (std::strncmp(s + p, "", 7) == 0 || + std::strncmp(s + p, "", 8) == 0) + ? get_parameter_tag_runtime( + s, find_closing_tag_runtime(s, p)) * + 6 + + 3 + : (std::strncmp(s + p, "", 5) == 0 || + std::strncmp(s + p, "", 8) == 0) + ? get_parameter_tag_runtime( + s, find_closing_tag_runtime(s, p)) * + 6 + + 4 + : std::strncmp(s + p, "", 6) == 0 + ? get_parameter_tag_runtime( + s, find_closing_tag_runtime(s, p)) * + 6 + + 5 + : throw std::runtime_error("invalid parameter type")) + : get_parameter_tag_runtime(s, p + 1); +} +#ifndef CROW_MSVC_WORKAROUND +constexpr uint64_t get_parameter_tag(const_str s, unsigned p = 0) { + return p == s.size() ? 0 + : s[p] == '<' + ? (is_int(s, p) + ? get_parameter_tag(s, find_closing_tag(s, p)) * 6 + 1 + : is_uint(s, p) + ? get_parameter_tag(s, find_closing_tag(s, p)) * 6 + 2 + : is_float(s, p) + ? get_parameter_tag(s, find_closing_tag(s, p)) * 6 + 3 + : is_str(s, p) + ? get_parameter_tag(s, find_closing_tag(s, p)) * 6 + 4 + : is_path(s, p) + ? get_parameter_tag(s, find_closing_tag(s, p)) * 6 + 5 + : throw std::runtime_error("invalid parameter type")) + : get_parameter_tag(s, p + 1); +} +#endif + +template struct S { + template using push = S; + template using push_back = S; + template